Permalink
Browse files

Feature: Wintype-specific options in configuration files

- Add support of window-type-specific options (fade, shadow, and
  opacity) in configuration file parsing. Syntax shown in
  compton.sample.conf.

- Replace wintype_name() with an array of window type names. Code
  clean-up.
  • Loading branch information...
1 parent ee9e90e commit 564e55e22cdcb8c442df72157a82fbb2a05867dc @richardgv richardgv committed Sep 25, 2012
Showing with 85 additions and 88 deletions.
  1. +6 −0 compton.sample.conf
  2. +67 −88 src/compton.c
  3. +12 −0 src/compton.h
View
@@ -27,3 +27,9 @@ fade-out-step = 0.03
# Other
mark-wmwin-focused = true;
+
+# Window type settings
+wintypes:
+{
+ tooltip = { fade = true; shadow = false; opacity = 0.75; };
+}
View
@@ -14,6 +14,24 @@
* Shared
*/
+const char *WINTYPES[NUM_WINTYPES] = {
+ "unknown",
+ "desktop",
+ "dock",
+ "toolbar",
+ "menu",
+ "utility",
+ "splash",
+ "dialog",
+ "normal",
+ "dropdown_menu",
+ "popup_menu",
+ "tooltip",
+ "notify",
+ "combo",
+ "dnd",
+};
+
struct timeval time_start = { 0, 0 };
win *list;
@@ -142,8 +160,8 @@ double shadow_red = 0.0, shadow_green = 0.0, shadow_blue = 0.0;
Bool synchronize = False;
// Temporary options
-Bool shadow_enable = False;
-Bool fading_enable = False;
+int shadow_enable = 0;
+int fading_enable = 0;
Bool no_dock_shadow = False;
Bool no_dnd_shadow = False;
double menu_opacity = 1.0;
@@ -1477,63 +1495,6 @@ repair_win(Display *dpy, win *w) {
w->damaged = 1;
}
-#ifdef DEBUG_WINTYPE
-static const char *
-wintype_name(wintype type) {
- const char *t;
-
- switch (type) {
- case WINTYPE_DESKTOP:
- t = "desktop";
- break;
- case WINTYPE_DOCK:
- t = "dock";
- break;
- case WINTYPE_TOOLBAR:
- t = "toolbar";
- break;
- case WINTYPE_MENU:
- t = "menu";
- break;
- case WINTYPE_UTILITY:
- t = "utility";
- break;
- case WINTYPE_SPLASH:
- t = "slash";
- break;
- case WINTYPE_DIALOG:
- t = "dialog";
- break;
- case WINTYPE_NORMAL:
- t = "normal";
- break;
- case WINTYPE_DROPDOWN_MENU:
- t = "dropdown";
- break;
- case WINTYPE_POPUP_MENU:
- t = "popup";
- break;
- case WINTYPE_TOOLTIP:
- t = "tooltip";
- break;
- case WINTYPE_NOTIFY:
- t = "notification";
- break;
- case WINTYPE_COMBO:
- t = "combo";
- break;
- case WINTYPE_DND:
- t = "dnd";
- break;
- default:
- t = "unknown";
- break;
- }
-
- return t;
-}
-#endif
-
static wintype
get_wintype_prop(Display *dpy, Window wid) {
Atom actual;
@@ -1632,7 +1593,7 @@ map_win(Display *dpy, Window id,
#ifdef DEBUG_WINTYPE
printf("map_win(%#010lx): type %s\n",
- w->id, wintype_name(w->window_type));
+ w->id, WINTYPES[w->window_type]);
#endif
// Get window name and class if we are tracking them
@@ -3170,8 +3131,10 @@ parse_config(char *cpath) {
if (config_lookup_bool(&cfg, "clear-shadow", &ival))
clear_shadow = ival;
// -c (shadow_enable)
- if (config_lookup_bool(&cfg, "shadow", &ival))
- shadow_enable = ival;
+ if (config_lookup_bool(&cfg, "shadow", &ival) && ival) {
+ shadow_enable = 2;
+ wintype_arr_enable(win_type_shadow);
+ }
// -C (no_dock_shadow)
if (config_lookup_bool(&cfg, "no-dock-shadow", &ival))
no_dock_shadow = ival;
@@ -3181,8 +3144,10 @@ parse_config(char *cpath) {
// -m (menu_opacity)
config_lookup_float(&cfg, "menu-opacity", &menu_opacity);
// -f (fading_enable)
- if (config_lookup_bool(&cfg, "fading", &ival))
- fading_enable = ival;
+ if (config_lookup_bool(&cfg, "fading", &ival) && ival) {
+ fading_enable = 2;
+ wintype_arr_enable(win_type_fade);
+ }
// --shadow-red
config_lookup_float(&cfg, "shadow-red", &shadow_red);
// --shadow-green
@@ -3199,22 +3164,39 @@ parse_config(char *cpath) {
mark_wmwin_focused = ival;
// --shadow-exclude
{
- config_setting_t *shadow_blacklist_setting =
+ config_setting_t *setting =
config_lookup(&cfg, "shadow-exclude");
- if (shadow_blacklist_setting) {
+ if (setting) {
// Parse an array of shadow-exclude
- if (config_setting_is_array(shadow_blacklist_setting)) {
- int i = config_setting_length(shadow_blacklist_setting);
+ if (config_setting_is_array(setting)) {
+ int i = config_setting_length(setting);
while (i--) {
condlst_add(&shadow_blacklist,
- config_setting_get_string_elem(shadow_blacklist_setting, i));
+ config_setting_get_string_elem(setting, i));
}
}
// Treat it as a single pattern if it's a string
- else if (CONFIG_TYPE_STRING ==
- config_setting_type(shadow_blacklist_setting)) {
+ else if (CONFIG_TYPE_STRING == config_setting_type(setting)) {
condlst_add(&shadow_blacklist,
- config_setting_get_string(shadow_blacklist_setting));
+ config_setting_get_string(setting));
+ }
+ }
+ }
+ // Wintype settings
+ {
+ wintype i;
+
+ for (i = 0; i < NUM_WINTYPES; ++i) {
+ char *str = mstrjoin("wintypes.", WINTYPES[i]);
+ config_setting_t *setting = config_lookup(&cfg, str);
+ free(str);
+ if (setting) {
+ if (config_setting_lookup_bool(setting, "shadow", &ival))
+ win_type_shadow[i] = (Bool) ival;
+ if (config_setting_lookup_bool(setting, "fade", &ival))
+ win_type_fade[i] = (Bool) ival;
+ config_setting_lookup_float(setting, "opacity",
+ &win_type_opacity[i]);
}
}
}
@@ -3284,7 +3266,8 @@ get_cfg(int argc, char *const *argv) {
fade_out_step = normalize_d(atof(optarg)) * OPAQUE;
break;
case 'c':
- shadow_enable = True;
+ if (2 != shadow_enable)
+ shadow_enable = 1;
break;
case 'C':
no_dock_shadow = True;
@@ -3293,7 +3276,8 @@ get_cfg(int argc, char *const *argv) {
menu_opacity = atof(optarg);
break;
case 'f':
- fading_enable = True;
+ if (2 != fading_enable)
+ fading_enable = 1;
break;
case 'F':
fade_trans = True;
@@ -3385,20 +3369,15 @@ get_cfg(int argc, char *const *argv) {
if (OPAQUE == inactive_opacity) {
inactive_opacity = 0;
}
- if (shadow_enable) {
- for (i = 0; i < NUM_WINTYPES; ++i) {
- win_type_shadow[i] = True;
- }
- win_type_shadow[WINTYPE_DESKTOP] = False;
- if (no_dock_shadow)
- win_type_shadow[WINTYPE_DOCK] = False;
- if (no_dnd_shadow)
- win_type_shadow[WINTYPE_DND] = False;
- }
- if (fading_enable) {
- for (i = 0; i < NUM_WINTYPES; ++i) {
- win_type_fade[i] = True;
- }
+ if (1 == shadow_enable)
+ wintype_arr_enable(win_type_shadow);
+ win_type_shadow[WINTYPE_DESKTOP] = False;
+ if (no_dock_shadow)
+ win_type_shadow[WINTYPE_DOCK] = False;
+ if (no_dnd_shadow)
+ win_type_shadow[WINTYPE_DND] = False;
+ if (1 == fading_enable) {
+ wintype_arr_enable(win_type_fade);
}
if (1.0 != menu_opacity) {
win_type_opacity[WINTYPE_DROPDOWN_MENU] = menu_opacity;
View
@@ -273,6 +273,18 @@ set_ignore(Display *dpy, unsigned long sequence);
static int
should_ignore(Display *dpy, unsigned long sequence);
+/**
+ * Set a Bool array of all wintypes to true.
+ */
+static void
+wintype_arr_enable(Bool arr[]) {
+ wintype i;
+
+ for (i = 0; i < NUM_WINTYPES; ++i) {
+ arr[i] = True;
+ }
+}
+
/**
* Allocate the space and copy a string.
*/

0 comments on commit 564e55e

Please sign in to comment.