From 4a6937826c2815385baeca8e02365422853dd4e5 Mon Sep 17 00:00:00 2001 From: o9000 Date: Fri, 20 Nov 2015 23:28:37 +0100 Subject: [PATCH] Cleanup indentation with clang-format and changed a few variable names --- .clang-format | 66 +++ .gitignore | 2 + CMakeLists.txt | 2 +- src/battery/battery.c | 136 ++--- src/battery/battery.h | 44 +- src/battery/dummy.c | 12 +- src/battery/freebsd.c | 20 +- src/battery/linux.c | 149 ++--- src/battery/openbsd.c | 12 +- src/clock/clock.c | 149 ++--- src/clock/clock.h | 7 +- src/config.c | 907 +++++++++++++++---------------- src/config.h | 6 +- src/freespace/freespace.c | 21 +- src/freespace/freespace.h | 2 +- src/launcher/apps-common.c | 23 +- src/launcher/icon-theme-common.c | 163 +++--- src/launcher/icon-theme-common.h | 2 +- src/launcher/launcher.c | 161 +++--- src/launcher/launcher.h | 12 +- src/launcher/xsettings-client.c | 251 +++++---- src/launcher/xsettings-client.h | 27 +- src/launcher/xsettings-common.c | 115 ++-- src/launcher/xsettings-common.h | 102 ++-- src/panel.c | 681 ++++++++++++----------- src/panel.h | 152 +++--- src/server.c | 309 +++++------ src/server.h | 32 +- src/systray/systraybar.c | 627 +++++++++++++++------ src/systray/systraybar.h | 45 +- src/taskbar/task.c | 590 ++++++++++---------- src/taskbar/task.h | 58 +- src/taskbar/taskbar.c | 340 ++++++------ src/taskbar/taskbar.h | 63 +-- src/taskbar/taskbarname.c | 111 ++-- src/taskbar/taskbarname.h | 6 +- src/tint.c | 839 ++++++++++++++-------------- src/tooltip/tooltip.c | 143 +++-- src/tooltip/tooltip.h | 22 +- src/util/area.c | 292 +++++----- src/util/area.h | 24 +- src/util/common.c | 327 ++++++----- src/util/common.h | 102 ++-- src/util/strnatcmp.c | 200 ++++--- src/util/strnatcmp.h | 1 - src/util/timer.c | 191 +++---- src/util/timer.h | 67 +-- src/util/uevent.c | 59 +- src/util/window.c | 211 +++---- src/util/window.h | 50 +- tint2.files | 1 + 51 files changed, 4145 insertions(+), 3789 deletions(-) create mode 100644 .clang-format create mode 100644 .gitignore diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..4a6074e --- /dev/null +++ b/.clang-format @@ -0,0 +1,66 @@ +# works with clang-format-3.7 +# +# Most controversial fields are UseTab, IndentWidth, ContinuationIndentWidth, ColumnLimit, BreakBeforeBraces + +#BasedOnStyle: Google +AccessModifierOffset: 0 +AlignAfterOpenBracket: true +AlignConsecutiveAssignments: false +#AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: true +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: false +BinPackParameters: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Linux +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +ColumnLimit: 120 +CommentPragmas: '' +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 0 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DerivePointerBinding: false +DisableFormat: false +ForEachMacros: ['foreach'] +IndentCaseLabels: false +IndentFunctionDeclarationAfterType: false +IndentWidth: 4 +IndentWrappedFunctionNames: false +Language: Cpp +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 1000 +PenaltyBreakComment: 100 +PenaltyBreakFirstLessLess: 0 +PenaltyBreakString: 100 +PenaltyExcessCharacter: 100 +PenaltyReturnTypeOnItsOwnLine: 2000 +PointerAlignment: Right +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 4 +UseTab: ForIndentation diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..beb54d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +*.user diff --git a/CMakeLists.txt b/CMakeLists.txt index 155672e..96e68f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,7 +170,7 @@ endif( RT_LIBRARY ) target_link_libraries( tint2 m ) add_dependencies( tint2 version ) -set_target_properties( tint2 PROPERTIES COMPILE_FLAGS "-Wall -fno-strict-aliasing -pthread ${ASAN_C_FLAGS}" ) +set_target_properties( tint2 PROPERTIES COMPILE_FLAGS "-Wall -Wshadow -Wpointer-arith -fno-strict-aliasing -pthread ${ASAN_C_FLAGS}" ) set_target_properties( tint2 PROPERTIES LINK_FLAGS "-pthread -fno-strict-aliasing ${ASAN_L_FLAGS}" ) install( TARGETS tint2 DESTINATION bin ) diff --git a/src/battery/battery.c b/src/battery/battery.c index 2c0c7bb..71aacb4 100644 --- a/src/battery/battery.c +++ b/src/battery/battery.c @@ -34,10 +34,10 @@ PangoFontDescription *bat1_font_desc; PangoFontDescription *bat2_font_desc; struct batstate battery_state; -int battery_enabled; -int battery_tooltip_enabled; +gboolean battery_enabled; +gboolean battery_tooltip_enabled; int percentage_hide; -static timeout* battery_timeout; +static timeout *battery_timeout; static char buf_bat_percentage[10]; static char buf_bat_time[20]; @@ -54,7 +54,7 @@ char *battery_uwheel_command; char *battery_dwheel_command; int battery_found; -void update_battery_tick(void* arg) +void update_battery_tick(void *arg) { if (!battery_enabled) return; @@ -64,7 +64,7 @@ void update_battery_tick(void* arg) gboolean old_ac_connected = battery_state.ac_connected; int16_t old_hours = battery_state.time.hours; int8_t old_minutes = battery_state.time.minutes; - + if (!battery_found) { init_battery(); old_ac_connected = battery_state.ac_connected; @@ -81,48 +81,44 @@ void update_battery_tick(void* arg) tint_exec(ac_disconnected_cmd); } - if (old_found == battery_found && - old_percentage == battery_state.percentage && - old_hours == battery_state.time.hours && - old_minutes == battery_state.time.minutes) { + if (old_found == battery_found && old_percentage == battery_state.percentage && + old_hours == battery_state.time.hours && old_minutes == battery_state.time.minutes) { return; } - if (battery_state.percentage < battery_low_status && - battery_state.state == BATTERY_DISCHARGING && + if (battery_state.percentage < battery_low_status && battery_state.state == BATTERY_DISCHARGING && !battery_low_cmd_sent) { tint_exec(battery_low_cmd); battery_low_cmd_sent = 1; } - if (battery_state.percentage > battery_low_status && - battery_state.state == BATTERY_CHARGING && + if (battery_state.percentage > battery_low_status && battery_state.state == BATTERY_CHARGING && battery_low_cmd_sent) { battery_low_cmd_sent = 0; } int i; - for (i = 0; i < nb_panel; i++) { + for (i = 0; i < num_panels; i++) { if (!battery_found) { - if (panel1[i].battery.area.on_screen == 1) { - hide(&panel1[i].battery.area); - panel_refresh = 1; + if (panels[i].battery.area.on_screen) { + hide(&panels[i].battery.area); + panel_refresh = TRUE; } } else { if (battery_state.percentage >= percentage_hide) { - if (panel1[i].battery.area.on_screen == 1) { - hide(&panel1[i].battery.area); - panel_refresh = 1; + if (panels[i].battery.area.on_screen) { + hide(&panels[i].battery.area); + panel_refresh = TRUE; } } else { - if (panel1[i].battery.area.on_screen == 0) { - show(&panel1[i].battery.area); - panel_refresh = 1; + if (panels[i].battery.area.on_screen == 0) { + show(&panels[i].battery.area); + panel_refresh = TRUE; } } } - if (panel1[i].battery.area.on_screen == 1) { - panel1[i].battery.area.resize_needed = 1; - panel_refresh = 1; + if (panels[i].battery.area.on_screen) { + panels[i].battery.area.resize_needed = 1; + panel_refresh = TRUE; } } } @@ -200,13 +196,14 @@ void init_battery() update_battery(); } -char* battery_get_tooltip(void* obj) { +char *battery_get_tooltip(void *obj) +{ return battery_os_tooltip(); } void init_battery_panel(void *p) { - Panel *panel = (Panel*)p; + Panel *panel = (Panel *)p; Battery *battery = &panel->battery; if (!battery_enabled) @@ -217,28 +214,25 @@ void init_battery_panel(void *p) if (!bat2_font_desc) bat2_font_desc = pango_font_description_from_string(DEFAULT_FONT); - if (battery->area.bg == 0) + if (!battery->area.bg) battery->area.bg = &g_array_index(backgrounds, Background, 0); battery->area.parent = p; battery->area.panel = p; battery->area._draw_foreground = draw_battery; - battery->area.size_mode = LAYOUT_FIXED; - battery->area._resize = resize_battery; - battery->area.on_screen = 1; - battery->area.resize_needed = 1; - battery->area.has_mouse_over_effect = battery_lclick_command || - battery_mclick_command || - battery_rclick_command || - battery_uwheel_command || - battery_dwheel_command; - battery->area.has_mouse_press_effect = battery->area.has_mouse_over_effect; + battery->area.size_mode = LAYOUT_FIXED; + battery->area._resize = resize_battery; + battery->area.on_screen = TRUE; + battery->area.resize_needed = 1; + battery->area.has_mouse_over_effect = battery_lclick_command || battery_mclick_command || battery_rclick_command || + battery_uwheel_command || battery_dwheel_command; + battery->area.has_mouse_press_effect = battery->area.has_mouse_over_effect; if (battery_tooltip_enabled) battery->area._get_tooltip_text = battery_get_tooltip; } - -int update_battery() { +int update_battery() +{ int err; /* reset */ @@ -257,13 +251,12 @@ int update_battery() { return err; } - -void draw_battery (void *obj, cairo_t *c) +void draw_battery(void *obj, cairo_t *c) { Battery *battery = obj; PangoLayout *layout; - layout = pango_cairo_create_layout (c); + layout = pango_cairo_create_layout(c); // draw layout pango_layout_set_font_description(layout, bat1_font_desc); @@ -273,10 +266,10 @@ void draw_battery (void *obj, cairo_t *c) pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE); pango_layout_set_text(layout, buf_bat_percentage, strlen(buf_bat_percentage)); - cairo_set_source_rgba(c, battery->font.rgb[0], battery->font.rgb[1], battery->font.rgb[2], battery->font.alpha); + cairo_set_source_rgba(c, battery->font.rgb[0], battery->font.rgb[1], battery->font.rgb[2], battery->font.alpha); pango_cairo_update_layout(c, layout); - draw_text(layout, c, 0, battery->bat1_posy, &battery->font, ((Panel*)battery->area.panel)->font_shadow); + draw_text(layout, c, 0, battery->bat1_posy, &battery->font, ((Panel *)battery->area.panel)->font_shadow); pango_layout_set_font_description(layout, bat2_font_desc); pango_layout_set_indent(layout, 0); @@ -286,14 +279,13 @@ void draw_battery (void *obj, cairo_t *c) pango_layout_set_width(layout, battery->area.width * PANGO_SCALE); pango_cairo_update_layout(c, layout); - draw_text(layout, c, 0, battery->bat2_posy, &battery->font, ((Panel*)battery->area.panel)->font_shadow); + draw_text(layout, c, 0, battery->bat2_posy, &battery->font, ((Panel *)battery->area.panel)->font_shadow); pango_cairo_show_layout(c, layout); g_object_unref(layout); } - -int resize_battery(void *obj) +gboolean resize_battery(void *obj) { Battery *battery = obj; Panel *panel = battery->area.panel; @@ -301,28 +293,39 @@ int resize_battery(void *obj) int bat_time_height, bat_time_width, bat_time_height_ink; int ret = 0; - battery->area.redraw_needed = 1; - + battery->area.redraw_needed = TRUE; + snprintf(buf_bat_percentage, sizeof(buf_bat_percentage), "%d%%", battery_state.percentage); if (battery_state.state == BATTERY_FULL) { strcpy(buf_bat_time, "Full"); } else { snprintf(buf_bat_time, sizeof(buf_bat_time), "%02d:%02d", battery_state.time.hours, battery_state.time.minutes); } - get_text_size2(bat1_font_desc, &bat_percentage_height_ink, &bat_percentage_height, &bat_percentage_width, - panel->area.height, panel->area.width, buf_bat_percentage, strlen(buf_bat_percentage), + get_text_size2(bat1_font_desc, + &bat_percentage_height_ink, + &bat_percentage_height, + &bat_percentage_width, + panel->area.height, + panel->area.width, + buf_bat_percentage, + strlen(buf_bat_percentage), PANGO_WRAP_WORD_CHAR, PANGO_ELLIPSIZE_NONE); - get_text_size2(bat2_font_desc, &bat_time_height_ink, &bat_time_height, &bat_time_width, - panel->area.height, panel->area.width, buf_bat_time, strlen(buf_bat_time), + get_text_size2(bat2_font_desc, + &bat_time_height_ink, + &bat_time_height, + &bat_time_width, + panel->area.height, + panel->area.width, + buf_bat_time, + strlen(buf_bat_time), PANGO_WRAP_WORD_CHAR, PANGO_ELLIPSIZE_NONE); if (panel_horizontal) { int new_size = (bat_percentage_width > bat_time_width) ? bat_percentage_width : bat_time_width; new_size += 2 * battery->area.paddingxlr + 2 * battery->area.bg->border.width; - if (new_size > battery->area.width || - new_size < battery->area.width - 2) { + if (new_size > battery->area.width || new_size < battery->area.width - 2) { // we try to limit the number of resize battery->area.width = new_size; battery->bat1_posy = (battery->area.height - bat_percentage_height - bat_time_height) / 2; @@ -330,11 +333,10 @@ int resize_battery(void *obj) ret = 1; } } else { - int new_size = bat_percentage_height + bat_time_height + - (2 * (battery->area.paddingxlr + battery->area.bg->border.width)); - if (new_size > battery->area.height || - new_size < battery->area.height - 2) { - battery->area.height = new_size; + int new_size = + bat_percentage_height + bat_time_height + (2 * (battery->area.paddingxlr + battery->area.bg->border.width)); + if (new_size > battery->area.height || new_size < battery->area.height - 2) { + battery->area.height = new_size; battery->bat1_posy = (battery->area.height - bat_percentage_height - bat_time_height - 2) / 2; battery->bat2_posy = battery->bat1_posy + bat_percentage_height + 2; ret = 1; @@ -347,19 +349,19 @@ void battery_action(int button) { char *command = 0; switch (button) { - case 1: + case 1: command = battery_lclick_command; break; - case 2: + case 2: command = battery_mclick_command; break; - case 3: + case 3: command = battery_rclick_command; break; - case 4: + case 4: command = battery_uwheel_command; break; - case 5: + case 5: command = battery_dwheel_command; break; } diff --git a/src/battery/battery.h b/src/battery/battery.h index 740fa03..8c5f3e8 100644 --- a/src/battery/battery.h +++ b/src/battery/battery.h @@ -16,7 +16,6 @@ #include "common.h" #include "area.h" - // battery drawing parameter (per panel) typedef struct Battery { // always start with area @@ -27,12 +26,7 @@ typedef struct Battery { int bat2_posy; } Battery; -enum chargestate { - BATTERY_UNKNOWN, - BATTERY_CHARGING, - BATTERY_DISCHARGING, - BATTERY_FULL -}; +enum chargestate { BATTERY_UNKNOWN, BATTERY_CHARGING, BATTERY_DISCHARGING, BATTERY_FULL }; typedef struct battime { int16_t hours; @@ -50,8 +44,8 @@ typedef struct batstate { extern struct batstate battery_state; extern PangoFontDescription *bat1_font_desc; extern PangoFontDescription *bat2_font_desc; -extern int battery_enabled; -extern int battery_tooltip_enabled; +extern gboolean battery_enabled; +extern gboolean battery_tooltip_enabled; extern int percentage_hide; extern int8_t battery_low_status; @@ -66,21 +60,23 @@ extern char *battery_rclick_command; extern char *battery_uwheel_command; extern char *battery_dwheel_command; -static inline gchar* chargestate2str(enum chargestate state) { - switch(state) { - case BATTERY_CHARGING: - return "Charging"; - case BATTERY_DISCHARGING: - return "Discharging"; - case BATTERY_FULL: - return "Full"; - case BATTERY_UNKNOWN: - default: - return "Unknown"; +static inline gchar *chargestate2str(enum chargestate state) +{ + switch (state) { + case BATTERY_CHARGING: + return "Charging"; + case BATTERY_DISCHARGING: + return "Discharging"; + case BATTERY_FULL: + return "Full"; + case BATTERY_UNKNOWN: + default: + return "Unknown"; }; } -static inline void batstate_set_time(struct batstate *state, int seconds) { +static inline void batstate_set_time(struct batstate *state, int seconds) +{ state->time.hours = seconds / 3600; seconds -= 3600 * state->time.hours; state->time.minutes = seconds / 60; @@ -94,7 +90,7 @@ void default_battery(); // freed memory void cleanup_battery(); -void update_battery_tick(void* arg); +void update_battery_tick(void *arg); int update_battery(); void init_battery(); @@ -103,7 +99,7 @@ void init_battery_panel(void *panel); void reinit_battery(); void draw_battery(void *obj, cairo_t *c); -int resize_battery(void *obj); +gboolean resize_battery(void *obj); void battery_action(int button); @@ -111,6 +107,6 @@ void battery_action(int button); gboolean battery_os_init(); void battery_os_free(); int battery_os_update(struct batstate *state); -char* battery_os_tooltip(); +char *battery_os_tooltip(); #endif diff --git a/src/battery/dummy.c b/src/battery/dummy.c index 1639692..0d08fe1 100644 --- a/src/battery/dummy.c +++ b/src/battery/dummy.c @@ -23,18 +23,22 @@ #warning tint2 has no battery support for this operating system! -gboolean battery_os_init() { +gboolean battery_os_init() +{ return FALSE; } -void battery_os_free() { +void battery_os_free() +{ return; } -int battery_os_update(struct batstate *state) { +int battery_os_update(struct batstate *state) +{ return -1; } -char* battery_os_tooltip() { +char *battery_os_tooltip() +{ return strdup("Operating System not supported"); } diff --git a/src/battery/freebsd.c b/src/battery/freebsd.c index 00165a5..30fc96a 100644 --- a/src/battery/freebsd.c +++ b/src/battery/freebsd.c @@ -24,26 +24,29 @@ #include "common.h" #include "battery.h" -gboolean battery_os_init() { +gboolean battery_os_init() +{ int sysctl_out = 0; size_t len = sizeof(sysctl_out); return (sysctlbyname("hw.acpi.battery.state", &sysctl_out, &len, NULL, 0) == 0) || - (sysctlbyname("hw.acpi.battery.time", &sysctl_out, &len, NULL, 0) == 0) || - (sysctlbyname("hw.acpi.battery.life", &sysctl_out, &len, NULL, 0) == 0); + (sysctlbyname("hw.acpi.battery.time", &sysctl_out, &len, NULL, 0) == 0) || + (sysctlbyname("hw.acpi.battery.life", &sysctl_out, &len, NULL, 0) == 0); } -void battery_os_free() { +void battery_os_free() +{ return; } -int battery_os_update(struct batstate *state) { +int battery_os_update(struct batstate *state) +{ int sysctl_out = 0; size_t len = sizeof(sysctl_out); gboolean err = 0; if (sysctlbyname("hw.acpi.battery.state", &sysctl_out, &len, NULL, 0) == 0) { - switch(sysctl_out) { + switch (sysctl_out) { case 1: state->state = BATTERY_DISCHARGING; break; @@ -71,11 +74,12 @@ int battery_os_update(struct batstate *state) { if (sysctlbyname("hw.acpi.acline", &sysctl_out, &len, NULL, 0) == 0) state->ac_connected = sysctl_out; - + return err; } -char* battery_os_tooltip() { +char *battery_os_tooltip() +{ GString *tooltip = g_string_new(""); gchar *result; diff --git a/src/battery/linux.c b/src/battery/linux.c index fe96408..1bf8c2e 100644 --- a/src/battery/linux.c +++ b/src/battery/linux.c @@ -33,65 +33,63 @@ enum psy_type { struct psy_battery { /* generic properties */ - gchar* name; - gint64 timestamp; + gchar *name; + gint64 timestamp; /* sysfs files */ - gchar* path_present; - gchar* path_energy_now; - gchar* path_energy_full; - gchar* path_power_now; - gchar* path_status; + gchar *path_present; + gchar *path_energy_now; + gchar *path_energy_full; + gchar *path_power_now; + gchar *path_status; /* sysfs hints */ - gboolean energy_in_uamp; - gboolean power_in_uamp; + gboolean energy_in_uamp; + gboolean power_in_uamp; /* values */ - gboolean present; - gint energy_now; - gint energy_full; - gint power_now; - enum chargestate status; + gboolean present; + gint energy_now; + gint energy_full; + gint power_now; + enum chargestate status; }; struct psy_mains { /* generic properties */ - gchar* name; + gchar *name; /* sysfs files */ - gchar* path_online; + gchar *path_online; /* values */ - gboolean online; + gboolean online; }; -static void uevent_battery_update() { +static void uevent_battery_update() +{ update_battery_tick(NULL); } -static struct uevent_notify psy_change = { - UEVENT_CHANGE, - "power_supply", - NULL, - uevent_battery_update -}; +static struct uevent_notify psy_change = {UEVENT_CHANGE, "power_supply", NULL, uevent_battery_update}; -static void uevent_battery_plug() { +static void uevent_battery_plug() +{ printf("reinitialize batteries after HW change\n"); reinit_battery(); } -static struct uevent_notify psy_plug = { - UEVENT_ADD | UEVENT_REMOVE, - "power_supply", - NULL, - uevent_battery_plug -}; +static struct uevent_notify psy_plug = {UEVENT_ADD | UEVENT_REMOVE, "power_supply", NULL, uevent_battery_plug}; -#define RETURN_ON_ERROR(err) if (error) { g_error_free(err); return FALSE; } +#define RETURN_ON_ERROR(err) \ + if (error) { \ + g_error_free(err); \ + return FALSE; \ + } static GList *batteries = NULL; static GList *mains = NULL; -static guint8 energy_to_percent(gint energy_now, gint energy_full) { +static guint8 energy_to_percent(gint energy_now, gint energy_full) +{ return 0.5 + ((energy_now <= energy_full ? energy_now : energy_full) * 100.0) / energy_full; } -static enum psy_type power_supply_get_type(const gchar *entryname) { +static enum psy_type power_supply_get_type(const gchar *entryname) +{ gchar *path_type = g_build_filename("/sys/class/power_supply", entryname, "type", NULL); GError *error = NULL; gchar *type; @@ -119,7 +117,8 @@ static enum psy_type power_supply_get_type(const gchar *entryname) { return PSY_UNKNOWN; } -static gboolean init_linux_battery(struct psy_battery *bat) { +static gboolean init_linux_battery(struct psy_battery *bat) +{ const gchar *entryname = bat->name; bat->energy_in_uamp = FALSE; @@ -181,7 +180,8 @@ err0: return FALSE; } -static gboolean init_linux_mains(struct psy_mains *ac) { +static gboolean init_linux_mains(struct psy_mains *ac) +{ const gchar *entryname = ac->name; ac->path_online = g_build_filename("/sys/class/power_supply", entryname, "online", NULL); @@ -193,7 +193,8 @@ static gboolean init_linux_mains(struct psy_mains *ac) { return TRUE; } -static void psy_battery_free(gpointer data) { +static void psy_battery_free(gpointer data) +{ struct psy_battery *bat = data; g_free(bat->name); g_free(bat->path_status); @@ -204,14 +205,16 @@ static void psy_battery_free(gpointer data) { g_free(bat); } -static void psy_mains_free(gpointer data) { +static void psy_mains_free(gpointer data) +{ struct psy_mains *ac = data; g_free(ac->name); g_free(ac->path_online); g_free(ac); } -void battery_os_free() { +void battery_os_free() +{ uevent_unregister_notifier(&psy_change); uevent_unregister_notifier(&psy_plug); @@ -221,7 +224,8 @@ void battery_os_free() { mains = NULL; } -static void add_battery(const char *entryname) { +static void add_battery(const char *entryname) +{ struct psy_battery *bat = g_malloc0(sizeof(*bat)); bat->name = g_strdup(entryname); @@ -234,7 +238,8 @@ static void add_battery(const char *entryname) { } } -static void add_mains(const char *entryname) { +static void add_mains(const char *entryname) +{ struct psy_mains *ac = g_malloc0(sizeof(*ac)); ac->name = g_strdup(entryname); @@ -247,7 +252,8 @@ static void add_mains(const char *entryname) { } } -gboolean battery_os_init() { +gboolean battery_os_init() +{ GDir *directory = 0; GError *error = NULL; const char *entryname; @@ -260,15 +266,15 @@ gboolean battery_os_init() { while ((entryname = g_dir_read_name(directory))) { enum psy_type type = power_supply_get_type(entryname); - switch(type) { - case PSY_BATTERY: - add_battery(entryname); - break; - case PSY_MAINS: - add_mains(entryname); - break; - default: - break; + switch (type) { + case PSY_BATTERY: + add_battery(entryname); + break; + case PSY_MAINS: + add_mains(entryname); + break; + default: + break; } } @@ -280,7 +286,8 @@ gboolean battery_os_init() { return batteries != NULL; } -static gint estimate_power_usage(struct psy_battery *bat, gint old_energy_now, gint64 old_timestamp) { +static gint estimate_power_usage(struct psy_battery *bat, gint old_energy_now, gint64 old_timestamp) +{ gint64 diff_power = ABS(bat->energy_now - old_energy_now); gint64 diff_time = bat->timestamp - old_timestamp; @@ -290,7 +297,8 @@ static gint estimate_power_usage(struct psy_battery *bat, gint old_energy_now, g return power; } -static gboolean update_linux_battery(struct psy_battery *bat) { +static gboolean update_linux_battery(struct psy_battery *bat) +{ GError *error = NULL; gchar *data; gsize datalen; @@ -358,8 +366,8 @@ static gboolean update_linux_battery(struct psy_battery *bat) { return TRUE; } - -static gboolean update_linux_mains(struct psy_mains *ac) { +static gboolean update_linux_mains(struct psy_mains *ac) +{ GError *error = NULL; gchar *data; gsize datalen; @@ -374,7 +382,8 @@ static gboolean update_linux_mains(struct psy_mains *ac) { return TRUE; } -int battery_os_update(struct batstate *state) { +int battery_os_update(struct batstate *state) +{ GList *l; gint64 total_energy_now = 0; @@ -432,27 +441,33 @@ int battery_os_update(struct batstate *state) { return 0; } -static gchar* energy_human_readable(struct psy_battery *bat) { +static gchar *energy_human_readable(struct psy_battery *bat) +{ gint now = bat->energy_now; gint full = bat->energy_full; gchar unit = bat->energy_in_uamp ? 'A' : 'W'; if (full >= 1000000) { return g_strdup_printf("%d.%d / %d.%d %ch", - now / 1000000, (now % 1000000) / 100000, - full / 1000000, (full % 1000000) / 100000, - unit); + now / 1000000, + (now % 1000000) / 100000, + full / 1000000, + (full % 1000000) / 100000, + unit); } else if (full >= 1000) { return g_strdup_printf("%d.%d / %d.%d m%ch", - now / 1000, (now % 1000) / 100, - full / 1000, (full % 1000) / 100, - unit); + now / 1000, + (now % 1000) / 100, + full / 1000, + (full % 1000) / 100, + unit); } else { return g_strdup_printf("%d / %d ยต%ch", now, full, unit); } } -static gchar* power_human_readable(struct psy_battery *bat) { +static gchar *power_human_readable(struct psy_battery *bat) +{ gint power = bat->power_now; gchar unit = bat->power_in_uamp ? 'A' : 'W'; @@ -467,7 +482,8 @@ static gchar* power_human_readable(struct psy_battery *bat) { } } -char* battery_os_tooltip() { +char *battery_os_tooltip() +{ GList *l; GString *tooltip = g_string_new(""); gchar *result; @@ -491,8 +507,7 @@ char* battery_os_tooltip() { guint8 percentage = energy_to_percent(bat->energy_now, bat->energy_full); - g_string_append_printf(tooltip, "\t%s: %s (%u %%)\n\tPower: %s", - state, energy, percentage, power); + g_string_append_printf(tooltip, "\t%s: %s (%u %%)\n\tPower: %s", state, energy, percentage, power); g_free(power); g_free(energy); diff --git a/src/battery/openbsd.c b/src/battery/openbsd.c index 8abea3c..dac0992 100644 --- a/src/battery/openbsd.c +++ b/src/battery/openbsd.c @@ -29,7 +29,8 @@ int apm_fd = -1; -gboolean battery_os_init() { +gboolean battery_os_init() +{ if (apm_fd > 0) close(apm_fd); @@ -43,13 +44,15 @@ gboolean battery_os_init() { } } -void battery_os_free() { +void battery_os_free() +{ if ((apm_fd != -1) && (close(apm_fd) == -1)) warn("cannot close /dev/apm"); apm_fd = -1; } -int battery_os_update(struct batstate *state) { +int battery_os_update(struct batstate *state) +{ struct apm_power_info info; if (apm_fd > 0 && ioctl(apm_fd, APM_IOC_GETPOWER, &(info)) == 0) { @@ -81,7 +84,8 @@ int battery_os_update(struct batstate *state) { return 0; } -char* battery_os_tooltip() { +char *battery_os_tooltip() +{ GString *tooltip = g_string_new(""); gchar *result; diff --git a/src/clock/clock.c b/src/clock/clock.c index 8822919..c40e77c 100644 --- a/src/clock/clock.c +++ b/src/clock/clock.c @@ -31,7 +31,6 @@ #include "timer.h" #include "common.h" - char *time1_format; char *time1_timezone; char *time2_format; @@ -50,8 +49,7 @@ static char buf_time[256]; static char buf_date[256]; static char buf_tooltip[512]; int clock_enabled; -static timeout* clock_timeout; - +static timeout *clock_timeout; void default_clock() { @@ -104,19 +102,18 @@ void cleanup_clock() clock_timeout = NULL; } - -void update_clocks_sec(void* arg) +void update_clocks_sec(void *arg) { gettimeofday(&time_clock, 0); int i; if (time1_format) { - for (i=0 ; i < nb_panel ; i++) - panel1[i].clock.area.resize_needed = 1; + for (i = 0; i < num_panels; i++) + panels[i].clock.area.resize_needed = 1; } - panel_refresh = 1; + panel_refresh = TRUE; } -void update_clocks_min(void* arg) +void update_clocks_min(void *arg) { // remember old_sec because after suspend/hibernate the clock should be updated directly, and not // on next minute change @@ -125,26 +122,29 @@ void update_clocks_min(void* arg) if (time_clock.tv_sec % 60 == 0 || time_clock.tv_sec - old_sec > 60) { int i; if (time1_format) { - for (i=0 ; i < nb_panel ; i++) - panel1[i].clock.area.resize_needed = 1; + for (i = 0; i < num_panels; i++) + panels[i].clock.area.resize_needed = 1; } - panel_refresh = 1; + panel_refresh = TRUE; } } -struct tm* clock_gettime_for_tz(const char* timezone) { +struct tm *clock_gettime_for_tz(const char *timezone) +{ if (timezone) { - const char* old_tz = getenv("TZ"); + const char *old_tz = getenv("TZ"); setenv("TZ", timezone, 1); - struct tm* result = localtime(&time_clock.tv_sec); - if (old_tz) setenv("TZ", old_tz, 1); - else unsetenv("TZ"); + struct tm *result = localtime(&time_clock.tv_sec); + if (old_tz) + setenv("TZ", old_tz, 1); + else + unsetenv("TZ"); return result; - } - else return localtime(&time_clock.tv_sec); + } else + return localtime(&time_clock.tv_sec); } -char* clock_get_tooltip(void* obj) +char *clock_get_tooltip(void *obj) { strftime(buf_tooltip, sizeof(buf_tooltip), time_tooltip_format, clock_gettime_for_tz(time_tooltip_timezone)); return strdup(buf_tooltip); @@ -162,8 +162,7 @@ int time_format_needs_sec_ticks(char *time_format) void init_clock() { if (!clock_timeout) { - if (time_format_needs_sec_ticks(time1_format) || - time_format_needs_sec_ticks(time2_format)) { + if (time_format_needs_sec_ticks(time1_format) || time_format_needs_sec_ticks(time2_format)) { clock_timeout = add_timeout(10, 1000, update_clocks_sec, 0, &clock_timeout); } else { clock_timeout = add_timeout(10, 1000, update_clocks_min, 0, &clock_timeout); @@ -171,12 +170,11 @@ void init_clock() } } - void init_clock_panel(void *p) { - Panel *panel =(Panel*)p; + Panel *panel = (Panel *)p; Clock *clock = &panel->clock; - + if (!time1_font_desc) time1_font_desc = pango_font_description_from_string(DEFAULT_FONT); if (!time2_font_desc) @@ -185,20 +183,18 @@ void init_clock_panel(void *p) clock->area.bg = &g_array_index(backgrounds, Background, 0); clock->area.parent = p; clock->area.panel = p; - clock->area.has_mouse_press_effect = clock->area.has_mouse_over_effect = clock_lclick_command || - clock_mclick_command || - clock_rclick_command || - clock_uwheel_command || - clock_dwheel_command; + clock->area.has_mouse_press_effect = clock->area.has_mouse_over_effect = + clock_lclick_command || clock_mclick_command || clock_rclick_command || clock_uwheel_command || + clock_dwheel_command; clock->area._draw_foreground = draw_clock; - clock->area.size_mode = LAYOUT_FIXED; - clock->area._resize = resize_clock; + clock->area.size_mode = LAYOUT_FIXED; + clock->area._resize = resize_clock; // check consistency if (!time1_format) return; - clock->area.resize_needed = 1; - clock->area.on_screen = 1; + clock->area.resize_needed = 1; + clock->area.on_screen = TRUE; if (time_tooltip_format) { clock->area._get_tooltip_text = clock_get_tooltip; @@ -206,83 +202,94 @@ void init_clock_panel(void *p) } } - -void draw_clock (void *obj, cairo_t *c) +void draw_clock(void *obj, cairo_t *c) { Clock *clock = obj; PangoLayout *layout; - layout = pango_cairo_create_layout (c); + layout = pango_cairo_create_layout(c); // draw layout - pango_layout_set_font_description (layout, time1_font_desc); - pango_layout_set_width (layout, clock->area.width * PANGO_SCALE); - pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); + pango_layout_set_font_description(layout, time1_font_desc); + pango_layout_set_width(layout, clock->area.width * PANGO_SCALE); + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR); pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE); - pango_layout_set_text (layout, buf_time, strlen(buf_time)); + pango_layout_set_text(layout, buf_time, strlen(buf_time)); - cairo_set_source_rgba (c, clock->font.rgb[0], clock->font.rgb[1], clock->font.rgb[2], clock->font.alpha); + cairo_set_source_rgba(c, clock->font.rgb[0], clock->font.rgb[1], clock->font.rgb[2], clock->font.alpha); - pango_cairo_update_layout (c, layout); - draw_text(layout, c, 0, clock->time1_posy, &clock->font, ((Panel*)clock->area.panel)->font_shadow); + pango_cairo_update_layout(c, layout); + draw_text(layout, c, 0, clock->time1_posy, &clock->font, ((Panel *)clock->area.panel)->font_shadow); if (time2_format) { - pango_layout_set_font_description (layout, time2_font_desc); + pango_layout_set_font_description(layout, time2_font_desc); pango_layout_set_indent(layout, 0); - pango_layout_set_text (layout, buf_date, strlen(buf_date)); - pango_layout_set_width (layout, clock->area.width * PANGO_SCALE); + pango_layout_set_text(layout, buf_date, strlen(buf_date)); + pango_layout_set_width(layout, clock->area.width * PANGO_SCALE); - pango_cairo_update_layout (c, layout); - draw_text(layout, c, 0, clock->time2_posy, &clock->font, ((Panel*)clock->area.panel)->font_shadow); + pango_cairo_update_layout(c, layout); + draw_text(layout, c, 0, clock->time2_posy, &clock->font, ((Panel *)clock->area.panel)->font_shadow); } - g_object_unref (layout); + g_object_unref(layout); } - -int resize_clock (void *obj) +gboolean resize_clock(void *obj) { Clock *clock = obj; Panel *panel = clock->area.panel; int time_height_ink, time_height, time_width, date_height_ink, date_height, date_width, ret = 0; - clock->area.redraw_needed = 1; - + clock->area.redraw_needed = TRUE; + date_height = date_width = 0; strftime(buf_time, sizeof(buf_time), time1_format, clock_gettime_for_tz(time1_timezone)); - get_text_size2(time1_font_desc, &time_height_ink, &time_height, &time_width, panel->area.height, panel->area.width, buf_time, strlen(buf_time), + get_text_size2(time1_font_desc, + &time_height_ink, + &time_height, + &time_width, + panel->area.height, + panel->area.width, + buf_time, + strlen(buf_time), PANGO_WRAP_WORD_CHAR, PANGO_ELLIPSIZE_NONE); if (time2_format) { strftime(buf_date, sizeof(buf_date), time2_format, clock_gettime_for_tz(time2_timezone)); - get_text_size2(time2_font_desc, &date_height_ink, &date_height, &date_width, panel->area.height, panel->area.width, buf_date, strlen(buf_date), + get_text_size2(time2_font_desc, + &date_height_ink, + &date_height, + &date_width, + panel->area.height, + panel->area.width, + buf_date, + strlen(buf_date), PANGO_WRAP_WORD_CHAR, PANGO_ELLIPSIZE_NONE); } if (panel_horizontal) { int new_size = (time_width > date_width) ? time_width : date_width; - new_size += (2*clock->area.paddingxlr) + (2*clock->area.bg->border.width); - if (new_size > clock->area.width || new_size < (clock->area.width-6)) { - // we try to limit the number of resizes + new_size += (2 * clock->area.paddingxlr) + (2 * clock->area.bg->border.width); + if (new_size > clock->area.width || new_size < (clock->area.width - 6)) { + // we try to limit the number of resizes clock->area.width = new_size + 1; clock->time1_posy = (clock->area.height - time_height) / 2; if (time2_format) { - clock->time1_posy -= (date_height)/2; + clock->time1_posy -= (date_height) / 2; clock->time2_posy = clock->time1_posy + time_height; } ret = 1; } - } - else { + } else { int new_size = time_height + date_height + (2 * (clock->area.paddingxlr + clock->area.bg->border.width)); if (new_size != clock->area.height) { - // we try to limit the number of resizes - clock->area.height = new_size; + // we try to limit the number of resizes + clock->area.height = new_size; clock->time1_posy = (clock->area.height - time_height) / 2; if (time2_format) { - clock->time1_posy -= (date_height)/2; + clock->time1_posy -= (date_height) / 2; clock->time2_posy = clock->time1_posy + time_height; } ret = 1; @@ -292,27 +299,25 @@ int resize_clock (void *obj) return ret; } - void clock_action(int button) { char *command = 0; switch (button) { - case 1: + case 1: command = clock_lclick_command; break; - case 2: + case 2: command = clock_mclick_command; break; - case 3: + case 3: command = clock_rclick_command; break; - case 4: + case 4: command = clock_uwheel_command; break; - case 5: + case 5: command = clock_dwheel_command; break; } tint_exec(command); } - diff --git a/src/clock/clock.h b/src/clock/clock.h index 5c72ffb..25e5cfe 100644 --- a/src/clock/clock.h +++ b/src/clock/clock.h @@ -13,7 +13,6 @@ #include "common.h" #include "area.h" - typedef struct Clock { // always start with area Area area; @@ -23,7 +22,6 @@ typedef struct Clock { int time2_posy; } Clock; - extern char *time1_format; extern char *time1_timezone; extern char *time2_format; @@ -39,7 +37,6 @@ extern char *clock_uwheel_command; extern char *clock_dwheel_command; extern int clock_enabled; - // default global data void default_clock(); @@ -50,9 +47,9 @@ void cleanup_clock(); void init_clock(); void init_clock_panel(void *panel); -void draw_clock (void *obj, cairo_t *c); +void draw_clock(void *obj, cairo_t *c); -int resize_clock (void *obj); +gboolean resize_clock(void *obj); void clock_action(int button); diff --git a/src/config.c b/src/config.c index d1b49a1..7b5355c 100644 --- a/src/config.c +++ b/src/config.c @@ -75,7 +75,6 @@ static int read_border_color_hover; static int read_bg_color_press; static int read_border_color_press; - void default_config() { config_path = NULL; @@ -91,37 +90,35 @@ void cleanup_config() snapshot_path = NULL; } - -void get_action (char *event, int *action) +void get_action(char *event, MouseAction *action) { - if (strcmp (event, "none") == 0) + if (strcmp(event, "none") == 0) *action = NONE; - else if (strcmp (event, "close") == 0) + else if (strcmp(event, "close") == 0) *action = CLOSE; - else if (strcmp (event, "toggle") == 0) + else if (strcmp(event, "toggle") == 0) *action = TOGGLE; - else if (strcmp (event, "iconify") == 0) + else if (strcmp(event, "iconify") == 0) *action = ICONIFY; - else if (strcmp (event, "shade") == 0) + else if (strcmp(event, "shade") == 0) *action = SHADE; - else if (strcmp (event, "toggle_iconify") == 0) + else if (strcmp(event, "toggle_iconify") == 0) *action = TOGGLE_ICONIFY; - else if (strcmp (event, "maximize_restore") == 0) + else if (strcmp(event, "maximize_restore") == 0) *action = MAXIMIZE_RESTORE; - else if (strcmp (event, "desktop_left") == 0) + else if (strcmp(event, "desktop_left") == 0) *action = DESKTOP_LEFT; - else if (strcmp (event, "desktop_right") == 0) + else if (strcmp(event, "desktop_right") == 0) *action = DESKTOP_RIGHT; - else if (strcmp (event, "next_task") == 0) + else if (strcmp(event, "next_task") == 0) *action = NEXT_TASK; - else if (strcmp (event, "prev_task") == 0) + else if (strcmp(event, "prev_task") == 0) *action = PREV_TASK; else fprintf(stderr, "Error: unrecognized action '%s'. Please fix your config file.\n", event); } - -int get_task_status(char* status) +int get_task_status(char *status) { if (strcmp(status, "active") == 0) return TASK_ACTIVE; @@ -132,19 +129,18 @@ int get_task_status(char* status) return -1; } - -int config_get_monitor(char* monitor) +int config_get_monitor(char *monitor) { if (strcmp(monitor, "all") != 0) { - char* endptr; + char *endptr; int ret_int = strtol(monitor, &endptr, 10); if (*endptr == 0) - return ret_int-1; + return ret_int - 1; else { // monitor specified by name, not by index int i, j; - for (i=0; idata; - load_launcher_app_dir(dir); - g_free(dir); - } - g_list_free(subdirs); + subdirs = g_list_sort(subdirs, compare_strings); + GList *l; + for (l = subdirs; l; l = g_list_next(l)) { + gchar *dir = (gchar *)l->data; + load_launcher_app_dir(dir); + g_free(dir); + } + g_list_free(subdirs); - files = g_list_sort(files, compare_strings); - for (l = files; l; l = g_list_next(l)) { - gchar *file = (gchar *)l->data; - panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, strdup(file)); - g_free(file); - } - g_list_free(files); + files = g_list_sort(files, compare_strings); + for (l = files; l; l = g_list_next(l)) { + gchar *file = (gchar *)l->data; + panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, strdup(file)); + g_free(file); + } + g_list_free(files); } -void add_entry (char *key, char *value) +void add_entry(char *key, char *value) { - char *value1=0, *value2=0, *value3=0; + char *value1 = 0, *value2 = 0, *value3 = 0; /* Background and border */ - if (strcmp (key, "rounded") == 0) { + if (strcmp(key, "rounded") == 0) { // 'rounded' is the first parameter => alloc a new background if (backgrounds->len > 0) { - Background *bg = &g_array_index(backgrounds, Background, backgrounds->len-1); + Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); if (!read_bg_color_hover) - memcpy(&bg->fill_color_hover, &bg->fill_color, sizeof(Color)); + memcpy(&bg->fill_color_hover, &bg->fill_color, sizeof(Color)); if (!read_border_color_hover) - memcpy(&bg->border_color_hover, &bg->border, sizeof(Color)); + memcpy(&bg->border_color_hover, &bg->border, sizeof(Color)); if (!read_bg_color_press) - memcpy(&bg->fill_color_pressed, &bg->fill_color_hover, sizeof(Color)); + memcpy(&bg->fill_color_pressed, &bg->fill_color_hover, sizeof(Color)); if (!read_border_color_press) - memcpy(&bg->border_color_pressed, &bg->border_color_hover, sizeof(Color)); + memcpy(&bg->border_color_pressed, &bg->border_color_hover, sizeof(Color)); } Background bg; init_background(&bg); - bg.border.radius = atoi(value); + bg.border.radius = atoi(value); g_array_append_val(backgrounds, bg); read_bg_color_hover = 0; read_border_color_hover = 0; read_bg_color_press = 0; read_border_color_press = 0; - } - else if (strcmp (key, "border_width") == 0) { - g_array_index(backgrounds, Background, backgrounds->len-1).border.width = atoi(value); - } - else if (strcmp (key, "background_color") == 0) { - Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); + } else if (strcmp(key, "border_width") == 0) { + g_array_index(backgrounds, Background, backgrounds->len - 1).border.width = atoi(value); + } else if (strcmp(key, "background_color") == 0) { + Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); extract_values(value, &value1, &value2, &value3); - get_color (value1, bg->fill_color.rgb); - if (value2) bg->fill_color.alpha = (atoi (value2) / 100.0); - else bg->fill_color.alpha = 0.5; - } - else if (strcmp (key, "border_color") == 0) { - Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); + get_color(value1, bg->fill_color.rgb); + if (value2) + bg->fill_color.alpha = (atoi(value2) / 100.0); + else + bg->fill_color.alpha = 0.5; + } else if (strcmp(key, "border_color") == 0) { + Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); extract_values(value, &value1, &value2, &value3); - get_color (value1, bg->border.color.rgb); - if (value2) bg->border.color.alpha = (atoi (value2) / 100.0); - else bg->border.color.alpha = 0.5; - } - else if (strcmp (key, "background_color_hover") == 0) { - Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); + get_color(value1, bg->border.color.rgb); + if (value2) + bg->border.color.alpha = (atoi(value2) / 100.0); + else + bg->border.color.alpha = 0.5; + } else if (strcmp(key, "background_color_hover") == 0) { + Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); extract_values(value, &value1, &value2, &value3); - get_color (value1, bg->fill_color_hover.rgb); - if (value2) bg->fill_color_hover.alpha = (atoi (value2) / 100.0); - else bg->fill_color_hover.alpha = 0.5; - read_bg_color_hover = 1; - } - else if (strcmp (key, "border_color_hover") == 0) { - Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); + get_color(value1, bg->fill_color_hover.rgb); + if (value2) + bg->fill_color_hover.alpha = (atoi(value2) / 100.0); + else + bg->fill_color_hover.alpha = 0.5; + read_bg_color_hover = 1; + } else if (strcmp(key, "border_color_hover") == 0) { + Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); extract_values(value, &value1, &value2, &value3); - get_color (value1, bg->border_color_hover.rgb); - if (value2) bg->border_color_hover.alpha = (atoi (value2) / 100.0); - else bg->border_color_hover.alpha = 0.5; + get_color(value1, bg->border_color_hover.rgb); + if (value2) + bg->border_color_hover.alpha = (atoi(value2) / 100.0); + else + bg->border_color_hover.alpha = 0.5; read_border_color_hover = 1; - } - else if (strcmp (key, "background_color_pressed") == 0) { - Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); + } else if (strcmp(key, "background_color_pressed") == 0) { + Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); extract_values(value, &value1, &value2, &value3); - get_color (value1, bg->fill_color_pressed.rgb); - if (value2) bg->fill_color_pressed.alpha = (atoi (value2) / 100.0); - else bg->fill_color_pressed.alpha = 0.5; + get_color(value1, bg->fill_color_pressed.rgb); + if (value2) + bg->fill_color_pressed.alpha = (atoi(value2) / 100.0); + else + bg->fill_color_pressed.alpha = 0.5; read_bg_color_press = 1; - } - else if (strcmp (key, "border_color_pressed") == 0) { - Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); + } else if (strcmp(key, "border_color_pressed") == 0) { + Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); extract_values(value, &value1, &value2, &value3); - get_color (value1, bg->border_color_pressed.rgb); - if (value2) bg->border_color_pressed.alpha = (atoi (value2) / 100.0); - else bg->border_color_pressed.alpha = 0.5; + get_color(value1, bg->border_color_pressed.rgb); + if (value2) + bg->border_color_pressed.alpha = (atoi(value2) / 100.0); + else + bg->border_color_pressed.alpha = 0.5; read_border_color_press = 1; } /* Panel */ - else if (strcmp (key, "panel_monitor") == 0) { + else if (strcmp(key, "panel_monitor") == 0) { panel_config.monitor = config_get_monitor(value); - } - else if (strcmp (key, "panel_size") == 0) { + } else if (strcmp(key, "panel_size") == 0) { extract_values(value, &value1, &value2, &value3); char *b; - if ((b = strchr (value1, '%'))) { + if ((b = strchr(value1, '%'))) { b[0] = '\0'; - panel_config.pourcentx = 1; + panel_config.fractional_width = 1; } panel_config.area.width = atoi(value1); if (panel_config.area.width == 0) { // full width mode panel_config.area.width = 100; - panel_config.pourcentx = 1; + panel_config.fractional_width = 1; } if (value2) { - if ((b = strchr (value2, '%'))) { + if ((b = strchr(value2, '%'))) { b[0] = '\0'; - panel_config.pourcenty = 1; + panel_config.fractional_height = 1; } panel_config.area.height = atoi(value2); } - } - else if (strcmp (key, "panel_items") == 0) { + } else if (strcmp(key, "panel_items") == 0) { new_config_file = 1; panel_items_order = strdup(value); int j; @@ -317,7 +316,7 @@ void add_entry (char *key, char *value) #endif clock_enabled = 0; taskbar_enabled = 0; - for (j=0 ; j < strlen(panel_items_order) ; j++) { + for (j = 0; j < strlen(panel_items_order); j++) { if (panel_items_order[j] == 'L') launcher_enabled = 1; if (panel_items_order[j] == 'T') @@ -337,323 +336,302 @@ void add_entry (char *key, char *value) if (panel_items_order[j] == 'C') clock_enabled = 1; } - } - else if (strcmp (key, "panel_margin") == 0) { + } else if (strcmp(key, "panel_margin") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config.marginx = atoi (value1); - if (value2) panel_config.marginy = atoi (value2); - } - else if (strcmp (key, "panel_padding") == 0) { + panel_config.marginx = atoi(value1); + if (value2) + panel_config.marginy = atoi(value2); + } else if (strcmp(key, "panel_padding") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config.area.paddingxlr = panel_config.area.paddingx = atoi (value1); - if (value2) panel_config.area.paddingy = atoi (value2); - if (value3) panel_config.area.paddingx = atoi (value3); - } - else if (strcmp (key, "panel_position") == 0) { + panel_config.area.paddingxlr = panel_config.area.paddingx = atoi(value1); + if (value2) + panel_config.area.paddingy = atoi(value2); + if (value3) + panel_config.area.paddingx = atoi(value3); + } else if (strcmp(key, "panel_position") == 0) { extract_values(value, &value1, &value2, &value3); - if (strcmp (value1, "top") == 0) panel_position = TOP; + if (strcmp(value1, "top") == 0) + panel_position = TOP; else { - if (strcmp (value1, "bottom") == 0) panel_position = BOTTOM; - else panel_position = CENTER; + if (strcmp(value1, "bottom") == 0) + panel_position = BOTTOM; + else + panel_position = CENTER; } - if (!value2) panel_position |= CENTER; + if (!value2) + panel_position |= CENTER; else { - if (strcmp (value2, "left") == 0) panel_position |= LEFT; + if (strcmp(value2, "left") == 0) + panel_position |= LEFT; else { - if (strcmp (value2, "right") == 0) panel_position |= RIGHT; - else panel_position |= CENTER; + if (strcmp(value2, "right") == 0) + panel_position |= RIGHT; + else + panel_position |= CENTER; } } - if (!value3) panel_horizontal = 1; + if (!value3) + panel_horizontal = 1; else { - if (strcmp (value3, "vertical") == 0) panel_horizontal = 0; - else panel_horizontal = 1; + if (strcmp(value3, "vertical") == 0) + panel_horizontal = 0; + else + panel_horizontal = 1; } - } - else if (strcmp (key, "font_shadow") == 0) - panel_config.font_shadow = atoi (value); - else if (strcmp (key, "panel_background_id") == 0) { - int id = atoi (value); + } else if (strcmp(key, "font_shadow") == 0) + panel_config.font_shadow = atoi(value); + else if (strcmp(key, "panel_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.area.bg = &g_array_index(backgrounds, Background, id); - } - else if (strcmp (key, "wm_menu") == 0) - wm_menu = atoi (value); - else if (strcmp (key, "panel_dock") == 0) - panel_dock = atoi (value); - else if (strcmp (key, "urgent_nb_of_blink") == 0) - max_tick_urgent = atoi (value); - else if (strcmp (key, "panel_layer") == 0) { + } else if (strcmp(key, "wm_menu") == 0) + wm_menu = atoi(value); + else if (strcmp(key, "panel_dock") == 0) + panel_dock = atoi(value); + else if (strcmp(key, "urgent_nb_of_blink") == 0) + max_tick_urgent = atoi(value); + else if (strcmp(key, "panel_layer") == 0) { if (strcmp(value, "bottom") == 0) panel_layer = BOTTOM_LAYER; else if (strcmp(value, "top") == 0) panel_layer = TOP_LAYER; else panel_layer = NORMAL_LAYER; - } - else if (strcmp (key, "disable_transparency") == 0) { - server.disable_transparency = atoi (value); - } - else if (strcmp (key, "panel_window_name") == 0) { + } else if (strcmp(key, "disable_transparency") == 0) { + server.disable_transparency = atoi(value); + } else if (strcmp(key, "panel_window_name") == 0) { if (strlen(value) > 0) { free(panel_window_name); - panel_window_name = strdup (value); + panel_window_name = strdup(value); } } /* Battery */ - else if (strcmp (key, "battery_low_status") == 0) { + else if (strcmp(key, "battery_low_status") == 0) { #ifdef ENABLE_BATTERY battery_low_status = atoi(value); if (battery_low_status < 0 || battery_low_status > 100) battery_low_status = 0; #endif - } - else if (strcmp(key, "battery_lclick_command") == 0) { + } else if (strcmp(key, "battery_lclick_command") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) battery_lclick_command = strdup(value); #endif - } - else if (strcmp(key, "battery_mclick_command") == 0) { + } else if (strcmp(key, "battery_mclick_command") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) battery_mclick_command = strdup(value); #endif - } - else if (strcmp(key, "battery_rclick_command") == 0) { + } else if (strcmp(key, "battery_rclick_command") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) battery_rclick_command = strdup(value); #endif - } - else if (strcmp(key, "battery_uwheel_command") == 0) { + } else if (strcmp(key, "battery_uwheel_command") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) battery_uwheel_command = strdup(value); #endif - } - else if (strcmp(key, "battery_dwheel_command") == 0) { + } else if (strcmp(key, "battery_dwheel_command") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) battery_dwheel_command = strdup(value); #endif - } - else if (strcmp (key, "battery_low_cmd") == 0) { + } else if (strcmp(key, "battery_low_cmd") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) - battery_low_cmd = strdup (value); + battery_low_cmd = strdup(value); #endif - } - else if (strcmp (key, "ac_connected_cmd") == 0) { + } else if (strcmp(key, "ac_connected_cmd") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) - ac_connected_cmd = strdup (value); + ac_connected_cmd = strdup(value); #endif - } - else if (strcmp (key, "ac_disconnected_cmd") == 0) { + } else if (strcmp(key, "ac_disconnected_cmd") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) - ac_disconnected_cmd = strdup (value); + ac_disconnected_cmd = strdup(value); #endif - } - else if (strcmp (key, "bat1_font") == 0) { + } else if (strcmp(key, "bat1_font") == 0) { #ifdef ENABLE_BATTERY - bat1_font_desc = pango_font_description_from_string (value); + bat1_font_desc = pango_font_description_from_string(value); #endif - } - else if (strcmp (key, "bat2_font") == 0) { + } else if (strcmp(key, "bat2_font") == 0) { #ifdef ENABLE_BATTERY - bat2_font_desc = pango_font_description_from_string (value); + bat2_font_desc = pango_font_description_from_string(value); #endif - } - else if (strcmp (key, "battery_font_color") == 0) { + } else if (strcmp(key, "battery_font_color") == 0) { #ifdef ENABLE_BATTERY extract_values(value, &value1, &value2, &value3); - get_color (value1, panel_config.battery.font.rgb); - if (value2) panel_config.battery.font.alpha = (atoi (value2) / 100.0); - else panel_config.battery.font.alpha = 0.5; + get_color(value1, panel_config.battery.font.rgb); + if (value2) + panel_config.battery.font.alpha = (atoi(value2) / 100.0); + else + panel_config.battery.font.alpha = 0.5; #endif - } - else if (strcmp (key, "battery_padding") == 0) { + } else if (strcmp(key, "battery_padding") == 0) { #ifdef ENABLE_BATTERY extract_values(value, &value1, &value2, &value3); - panel_config.battery.area.paddingxlr = panel_config.battery.area.paddingx = atoi (value1); - if (value2) panel_config.battery.area.paddingy = atoi (value2); - if (value3) panel_config.battery.area.paddingx = atoi (value3); + panel_config.battery.area.paddingxlr = panel_config.battery.area.paddingx = atoi(value1); + if (value2) + panel_config.battery.area.paddingy = atoi(value2); + if (value3) + panel_config.battery.area.paddingx = atoi(value3); #endif - } - else if (strcmp (key, "battery_background_id") == 0) { + } else if (strcmp(key, "battery_background_id") == 0) { #ifdef ENABLE_BATTERY - int id = atoi (value); + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.battery.area.bg = &g_array_index(backgrounds, Background, id); #endif - } - else if (strcmp (key, "battery_hide") == 0) { + } else if (strcmp(key, "battery_hide") == 0) { #ifdef ENABLE_BATTERY - percentage_hide = atoi (value); + percentage_hide = atoi(value); if (percentage_hide == 0) percentage_hide = 101; #endif - } - else if (strcmp (key, "battery_tooltip") == 0) { + } else if (strcmp(key, "battery_tooltip") == 0) { #ifdef ENABLE_BATTERY battery_tooltip_enabled = atoi(value); #endif } /* Clock */ - else if (strcmp (key, "time1_format") == 0) { + else if (strcmp(key, "time1_format") == 0) { if (new_config_file == 0) { clock_enabled = 1; if (panel_items_order) { - gchar* tmp = g_strconcat(panel_items_order, "C", NULL); + gchar *tmp = g_strconcat(panel_items_order, "C", NULL); free(panel_items_order); panel_items_order = strdup(tmp); g_free(tmp); - } - else + } else panel_items_order = strdup("C"); } if (strlen(value) > 0) { - time1_format = strdup (value); + time1_format = strdup(value); clock_enabled = 1; } - } - else if (strcmp (key, "time2_format") == 0) { + } else if (strcmp(key, "time2_format") == 0) { if (strlen(value) > 0) - time2_format = strdup (value); - } - else if (strcmp (key, "time1_font") == 0) { - time1_font_desc = pango_font_description_from_string (value); - } - else if (strcmp(key, "time1_timezone") == 0) { + time2_format = strdup(value); + } else if (strcmp(key, "time1_font") == 0) { + time1_font_desc = pango_font_description_from_string(value); + } else if (strcmp(key, "time1_timezone") == 0) { if (strlen(value) > 0) time1_timezone = strdup(value); - } - else if (strcmp(key, "time2_timezone") == 0) { + } else if (strcmp(key, "time2_timezone") == 0) { if (strlen(value) > 0) time2_timezone = strdup(value); - } - else if (strcmp (key, "time2_font") == 0) { - time2_font_desc = pango_font_description_from_string (value); - } - else if (strcmp (key, "clock_font_color") == 0) { + } else if (strcmp(key, "time2_font") == 0) { + time2_font_desc = pango_font_description_from_string(value); + } else if (strcmp(key, "clock_font_color") == 0) { extract_values(value, &value1, &value2, &value3); - get_color (value1, panel_config.clock.font.rgb); - if (value2) panel_config.clock.font.alpha = (atoi (value2) / 100.0); - else panel_config.clock.font.alpha = 0.5; - } - else if (strcmp (key, "clock_padding") == 0) { + get_color(value1, panel_config.clock.font.rgb); + if (value2) + panel_config.clock.font.alpha = (atoi(value2) / 100.0); + else + panel_config.clock.font.alpha = 0.5; + } else if (strcmp(key, "clock_padding") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config.clock.area.paddingxlr = panel_config.clock.area.paddingx = atoi (value1); - if (value2) panel_config.clock.area.paddingy = atoi (value2); - if (value3) panel_config.clock.area.paddingx = atoi (value3); - } - else if (strcmp (key, "clock_background_id") == 0) { - int id = atoi (value); + panel_config.clock.area.paddingxlr = panel_config.clock.area.paddingx = atoi(value1); + if (value2) + panel_config.clock.area.paddingy = atoi(value2); + if (value3) + panel_config.clock.area.paddingx = atoi(value3); + } else if (strcmp(key, "clock_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.clock.area.bg = &g_array_index(backgrounds, Background, id); - } - else if (strcmp(key, "clock_tooltip") == 0) { + } else if (strcmp(key, "clock_tooltip") == 0) { if (strlen(value) > 0) - time_tooltip_format = strdup (value); - } - else if (strcmp(key, "clock_tooltip_timezone") == 0) { + time_tooltip_format = strdup(value); + } else if (strcmp(key, "clock_tooltip_timezone") == 0) { if (strlen(value) > 0) time_tooltip_timezone = strdup(value); - } - else if (strcmp(key, "clock_lclick_command") == 0) { + } else if (strcmp(key, "clock_lclick_command") == 0) { if (strlen(value) > 0) clock_lclick_command = strdup(value); - } - else if (strcmp(key, "clock_mclick_command") == 0) { + } else if (strcmp(key, "clock_mclick_command") == 0) { if (strlen(value) > 0) clock_mclick_command = strdup(value); - } - else if (strcmp(key, "clock_rclick_command") == 0) { + } else if (strcmp(key, "clock_rclick_command") == 0) { if (strlen(value) > 0) clock_rclick_command = strdup(value); - } - else if (strcmp(key, "clock_uwheel_command") == 0) { + } else if (strcmp(key, "clock_uwheel_command") == 0) { if (strlen(value) > 0) clock_uwheel_command = strdup(value); - } - else if (strcmp(key, "clock_dwheel_command") == 0) { + } else if (strcmp(key, "clock_dwheel_command") == 0) { if (strlen(value) > 0) clock_dwheel_command = strdup(value); } /* Taskbar */ - else if (strcmp (key, "taskbar_mode") == 0) { - if (strcmp (value, "multi_desktop") == 0) panel_mode = MULTI_DESKTOP; - else panel_mode = SINGLE_DESKTOP; - } - else if (strcmp (key, "taskbar_distribute_size") == 0) { + else if (strcmp(key, "taskbar_mode") == 0) { + if (strcmp(value, "multi_desktop") == 0) + taskbar_mode = MULTI_DESKTOP; + else + taskbar_mode = SINGLE_DESKTOP; + } else if (strcmp(key, "taskbar_distribute_size") == 0) { taskbar_distribute_size = atoi(value); - } - else if (strcmp (key, "taskbar_padding") == 0) { + } else if (strcmp(key, "taskbar_padding") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config.g_taskbar.area.paddingxlr = panel_config.g_taskbar.area.paddingx = atoi (value1); - if (value2) panel_config.g_taskbar.area.paddingy = atoi (value2); - if (value3) panel_config.g_taskbar.area.paddingx = atoi (value3); - } - else if (strcmp (key, "taskbar_background_id") == 0) { - int id = atoi (value); + panel_config.g_taskbar.area.paddingxlr = panel_config.g_taskbar.area.paddingx = atoi(value1); + if (value2) + panel_config.g_taskbar.area.paddingy = atoi(value2); + if (value3) + panel_config.g_taskbar.area.paddingx = atoi(value3); + } else if (strcmp(key, "taskbar_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.background[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, id); if (panel_config.g_taskbar.background[TASKBAR_ACTIVE] == 0) panel_config.g_taskbar.background[TASKBAR_ACTIVE] = panel_config.g_taskbar.background[TASKBAR_NORMAL]; - } - else if (strcmp (key, "taskbar_active_background_id") == 0) { - int id = atoi (value); + } else if (strcmp(key, "taskbar_active_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.background[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, id); - } - else if (strcmp (key, "taskbar_name") == 0) { - taskbarname_enabled = atoi (value); - } - else if (strcmp (key, "taskbar_name_padding") == 0) { + } else if (strcmp(key, "taskbar_name") == 0) { + taskbarname_enabled = atoi(value); + } else if (strcmp(key, "taskbar_name_padding") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config.g_taskbar.area_name.paddingxlr = panel_config.g_taskbar.area_name.paddingx = atoi (value1); - if (value2) panel_config.g_taskbar.area_name.paddingy = atoi (value2); - } - else if (strcmp (key, "taskbar_name_background_id") == 0) { - int id = atoi (value); + panel_config.g_taskbar.area_name.paddingxlr = panel_config.g_taskbar.area_name.paddingx = atoi(value1); + if (value2) + panel_config.g_taskbar.area_name.paddingy = atoi(value2); + } else if (strcmp(key, "taskbar_name_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.background_name[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, id); if (panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] == 0) - panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] = panel_config.g_taskbar.background_name[TASKBAR_NORMAL]; - } - else if (strcmp (key, "taskbar_name_active_background_id") == 0) { - int id = atoi (value); + panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] = + panel_config.g_taskbar.background_name[TASKBAR_NORMAL]; + } else if (strcmp(key, "taskbar_name_active_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, id); - } - else if (strcmp (key, "taskbar_name_font") == 0) { + } else if (strcmp(key, "taskbar_name_font") == 0) { panel_config.taskbarname_font_desc = pango_font_description_from_string(value); - } - else if (strcmp (key, "taskbar_name_font_color") == 0) { + } else if (strcmp(key, "taskbar_name_font_color") == 0) { extract_values(value, &value1, &value2, &value3); - get_color (value1, taskbarname_font.rgb); - if (value2) taskbarname_font.alpha = (atoi (value2) / 100.0); - else taskbarname_font.alpha = 0.5; - } - else if (strcmp (key, "taskbar_name_active_font_color") == 0) { + get_color(value1, taskbarname_font.rgb); + if (value2) + taskbarname_font.alpha = (atoi(value2) / 100.0); + else + taskbarname_font.alpha = 0.5; + } else if (strcmp(key, "taskbar_name_active_font_color") == 0) { extract_values(value, &value1, &value2, &value3); - get_color (value1, taskbarname_active_font.rgb); - if (value2) taskbarname_active_font.alpha = (atoi (value2) / 100.0); - else taskbarname_active_font.alpha = 0.5; - } - else if (strcmp (key, "taskbar_hide_inactive_tasks") == 0) { - hide_inactive_tasks = atoi (value); - } - else if (strcmp (key, "taskbar_hide_different_monitor") == 0) { - hide_task_diff_monitor = atoi (value); - } - else if (strcmp (key, "taskbar_sort_order") == 0) { + get_color(value1, taskbarname_active_font.rgb); + if (value2) + taskbarname_active_font.alpha = (atoi(value2) / 100.0); + else + taskbarname_active_font.alpha = 0.5; + } else if (strcmp(key, "taskbar_hide_inactive_tasks") == 0) { + hide_inactive_tasks = atoi(value); + } else if (strcmp(key, "taskbar_hide_different_monitor") == 0) { + hide_task_diff_monitor = atoi(value); + } else if (strcmp(key, "taskbar_sort_order") == 0) { if (strcmp(value, "center") == 0) { taskbar_sort_method = TASKBAR_SORT_CENTER; } else if (strcmp(value, "title") == 0) { @@ -661,8 +639,7 @@ void add_entry (char *key, char *value) } else { taskbar_sort_method = TASKBAR_NOSORT; } - } - else if (strcmp (key, "task_align") == 0) { + } else if (strcmp(key, "task_align") == 0) { if (strcmp(value, "center") == 0) { taskbar_alignment = ALIGN_CENTER; } else if (strcmp(value, "right") == 0) { @@ -673,48 +650,46 @@ void add_entry (char *key, char *value) } /* Task */ - else if (strcmp (key, "task_text") == 0) - panel_config.g_task.text = atoi (value); - else if (strcmp (key, "task_icon") == 0) - panel_config.g_task.icon = atoi (value); - else if (strcmp (key, "task_centered") == 0) - panel_config.g_task.centered = atoi (value); - else if (strcmp (key, "task_width") == 0) { + else if (strcmp(key, "task_text") == 0) + panel_config.g_task.text = atoi(value); + else if (strcmp(key, "task_icon") == 0) + panel_config.g_task.icon = atoi(value); + else if (strcmp(key, "task_centered") == 0) + panel_config.g_task.centered = atoi(value); + else if (strcmp(key, "task_width") == 0) { // old parameter : just for backward compatibility - panel_config.g_task.maximum_width = atoi (value); + panel_config.g_task.maximum_width = atoi(value); panel_config.g_task.maximum_height = 30; - } - else if (strcmp (key, "task_maximum_size") == 0) { + } else if (strcmp(key, "task_maximum_size") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config.g_task.maximum_width = atoi (value1); + panel_config.g_task.maximum_width = atoi(value1); panel_config.g_task.maximum_height = 30; if (value2) - panel_config.g_task.maximum_height = atoi (value2); - } - else if (strcmp (key, "task_padding") == 0) { + panel_config.g_task.maximum_height = atoi(value2); + } else if (strcmp(key, "task_padding") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config.g_task.area.paddingxlr = panel_config.g_task.area.paddingx = atoi (value1); - if (value2) panel_config.g_task.area.paddingy = atoi (value2); - if (value3) panel_config.g_task.area.paddingx = atoi (value3); - } - else if (strcmp (key, "task_font") == 0) { - panel_config.g_task.font_desc = pango_font_description_from_string (value); - } - else if (g_regex_match_simple("task.*_font_color", key, 0, 0)) { - gchar** split = g_regex_split_simple("_", key, 0, 0); + panel_config.g_task.area.paddingxlr = panel_config.g_task.area.paddingx = atoi(value1); + if (value2) + panel_config.g_task.area.paddingy = atoi(value2); + if (value3) + panel_config.g_task.area.paddingx = atoi(value3); + } else if (strcmp(key, "task_font") == 0) { + panel_config.g_task.font_desc = pango_font_description_from_string(value); + } else if (g_regex_match_simple("task.*_font_color", key, 0, 0)) { + gchar **split = g_regex_split_simple("_", key, 0, 0); int status = g_strv_length(split) == 3 ? TASK_NORMAL : get_task_status(split[1]); g_strfreev(split); if (status >= 0) { extract_values(value, &value1, &value2, &value3); float alpha = 1; - if (value2) alpha = (atoi (value2) / 100.0); - get_color (value1, panel_config.g_task.font[status].rgb); + if (value2) + alpha = (atoi(value2) / 100.0); + get_color(value1, panel_config.g_task.font[status].rgb); panel_config.g_task.font[status].alpha = alpha; - panel_config.g_task.config_font_mask |= (1<= 0) { @@ -722,185 +697,170 @@ void add_entry (char *key, char *value) panel_config.g_task.alpha[status] = atoi(value1); panel_config.g_task.saturation[status] = atoi(value2); panel_config.g_task.brightness[status] = atoi(value3); - panel_config.g_task.config_asb_mask |= (1<= 0) { - int id = atoi (value); + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_task.background[status] = &g_array_index(backgrounds, Background, id); - panel_config.g_task.config_background_mask |= (1<len && id >= 0) ? id : 0; systray.area.bg = &g_array_index(backgrounds, Background, id); - } - else if (strcmp(key, "systray_sort") == 0) { + } else if (strcmp(key, "systray_sort") == 0) { if (strcmp(value, "descending") == 0) systray.sort = SYSTRAY_SORT_DESCENDING; else if (strcmp(value, "ascending") == 0) systray.sort = SYSTRAY_SORT_ASCENDING; else if (strcmp(value, "left2right") == 0) systray.sort = SYSTRAY_SORT_LEFT2RIGHT; - else if (strcmp(value, "right2left") == 0) + else if (strcmp(value, "right2left") == 0) systray.sort = SYSTRAY_SORT_RIGHT2LEFT; - } - else if (strcmp(key, "systray_icon_size") == 0) { + } else if (strcmp(key, "systray_icon_size") == 0) { systray_max_icon_size = atoi(value); - } - else if (strcmp(key, "systray_icon_asb") == 0) { + } else if (strcmp(key, "systray_icon_asb") == 0) { extract_values(value, &value1, &value2, &value3); systray.alpha = atoi(value1); systray.saturation = atoi(value2); systray.brightness = atoi(value3); - } - else if (strcmp(key, "systray_monitor") == 0) { + } else if (strcmp(key, "systray_monitor") == 0) { systray_monitor = atoi(value) - 1; } /* Launcher */ - else if (strcmp (key, "launcher_padding") == 0) { + else if (strcmp(key, "launcher_padding") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config.launcher.area.paddingxlr = panel_config.launcher.area.paddingx = atoi (value1); - if (value2) panel_config.launcher.area.paddingy = atoi (value2); - if (value3) panel_config.launcher.area.paddingx = atoi (value3); - } - else if (strcmp (key, "launcher_background_id") == 0) { - int id = atoi (value); + panel_config.launcher.area.paddingxlr = panel_config.launcher.area.paddingx = atoi(value1); + if (value2) + panel_config.launcher.area.paddingy = atoi(value2); + if (value3) + panel_config.launcher.area.paddingx = atoi(value3); + } else if (strcmp(key, "launcher_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.launcher.area.bg = &g_array_index(backgrounds, Background, id); - } - else if (strcmp (key, "launcher_icon_background_id") == 0) { - int id = atoi (value); + } else if (strcmp(key, "launcher_icon_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; launcher_icon_bg = &g_array_index(backgrounds, Background, id); - } - else if (strcmp(key, "launcher_icon_size") == 0) { + } else if (strcmp(key, "launcher_icon_size") == 0) { launcher_max_icon_size = atoi(value); - } - else if (strcmp(key, "launcher_item_app") == 0) { + } else if (strcmp(key, "launcher_item_app") == 0) { char *app = expand_tilde(value); panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, app); - } - else if (strcmp(key, "launcher_apps_dir") == 0) { + } else if (strcmp(key, "launcher_apps_dir") == 0) { char *path = expand_tilde(value); load_launcher_app_dir(path); free(path); - } - else if (strcmp(key, "launcher_icon_theme") == 0) { + } else if (strcmp(key, "launcher_icon_theme") == 0) { // if XSETTINGS manager running, tint2 use it. if (icon_theme_name_config) free(icon_theme_name_config); icon_theme_name_config = strdup(value); - } - else if (strcmp(key, "launcher_icon_theme_override") == 0) { + } else if (strcmp(key, "launcher_icon_theme_override") == 0) { launcher_icon_theme_override = atoi(value); - } - else if (strcmp(key, "launcher_icon_asb") == 0) { + } else if (strcmp(key, "launcher_icon_asb") == 0) { extract_values(value, &value1, &value2, &value3); launcher_alpha = atoi(value1); launcher_saturation = atoi(value2); launcher_brightness = atoi(value3); - } - else if (strcmp(key, "launcher_tooltip") == 0) { + } else if (strcmp(key, "launcher_tooltip") == 0) { launcher_tooltip_enabled = atoi(value); - } - else if (strcmp(key, "startup_notifications") == 0) { + } else if (strcmp(key, "startup_notifications") == 0) { startup_notifications = atoi(value); } /* Tooltip */ - else if (strcmp (key, "tooltip_show_timeout") == 0) { - int timeout_msec = 1000*atof(value); + else if (strcmp(key, "tooltip_show_timeout") == 0) { + int timeout_msec = 1000 * atof(value); g_tooltip.show_timeout_msec = timeout_msec; - } - else if (strcmp (key, "tooltip_hide_timeout") == 0) { - int timeout_msec = 1000*atof(value); + } else if (strcmp(key, "tooltip_hide_timeout") == 0) { + int timeout_msec = 1000 * atof(value); g_tooltip.hide_timeout_msec = timeout_msec; - } - else if (strcmp (key, "tooltip_padding") == 0) { + } else if (strcmp(key, "tooltip_padding") == 0) { extract_values(value, &value1, &value2, &value3); - if (value1) g_tooltip.paddingx = atoi(value1); - if (value2) g_tooltip.paddingy = atoi(value2); - } - else if (strcmp (key, "tooltip_background_id") == 0) { - int id = atoi (value); + if (value1) + g_tooltip.paddingx = atoi(value1); + if (value2) + g_tooltip.paddingy = atoi(value2); + } else if (strcmp(key, "tooltip_background_id") == 0) { + int id = atoi(value); id = (id < backgrounds->len && id >= 0) ? id : 0; g_tooltip.bg = &g_array_index(backgrounds, Background, id); - } - else if (strcmp (key, "tooltip_font_color") == 0) { + } else if (strcmp(key, "tooltip_font_color") == 0) { extract_values(value, &value1, &value2, &value3); - get_color(value1, g_tooltip.font_color.rgb); - if (value2) g_tooltip.font_color.alpha = (atoi (value2) / 100.0); - else g_tooltip.font_color.alpha = 0.1; - } - else if (strcmp (key, "tooltip_font") == 0) { + get_color(value1, g_tooltip.font_color.rgb); + if (value2) + g_tooltip.font_color.alpha = (atoi(value2) / 100.0); + else + g_tooltip.font_color.alpha = 0.1; + } else if (strcmp(key, "tooltip_font") == 0) { g_tooltip.font_desc = pango_font_description_from_string(value); } /* Mouse actions */ - else if (strcmp (key, "mouse_left") == 0) - get_action (value, &mouse_left); - else if (strcmp (key, "mouse_middle") == 0) - get_action (value, &mouse_middle); - else if (strcmp (key, "mouse_right") == 0) - get_action (value, &mouse_right); - else if (strcmp (key, "mouse_scroll_up") == 0) - get_action (value, &mouse_scroll_up); - else if (strcmp (key, "mouse_scroll_down") == 0) - get_action (value, &mouse_scroll_down); - else if (strcmp (key, "mouse_effects") == 0) + else if (strcmp(key, "mouse_left") == 0) + get_action(value, &mouse_left); + else if (strcmp(key, "mouse_middle") == 0) + get_action(value, &mouse_middle); + else if (strcmp(key, "mouse_right") == 0) + get_action(value, &mouse_right); + else if (strcmp(key, "mouse_scroll_up") == 0) + get_action(value, &mouse_scroll_up); + else if (strcmp(key, "mouse_scroll_down") == 0) + get_action(value, &mouse_scroll_down); + else if (strcmp(key, "mouse_effects") == 0) panel_config.mouse_effects = atoi(value); else if (strcmp(key, "mouse_hover_icon_asb") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.mouse_over_alpha = atoi(value1); panel_config.mouse_over_saturation = atoi(value2); panel_config.mouse_over_brightness = atoi(value3); - } - else if (strcmp(key, "mouse_pressed_icon_asb") == 0) { + } else if (strcmp(key, "mouse_pressed_icon_asb") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.mouse_pressed_alpha = atoi(value1); panel_config.mouse_pressed_saturation = atoi(value2); panel_config.mouse_pressed_brightness = atoi(value3); } - /* autohide options */ else if (strcmp(key, "autohide") == 0) panel_autohide = atoi(value); else if (strcmp(key, "autohide_show_timeout") == 0) - panel_autohide_show_timeout = 1000*atof(value); + panel_autohide_show_timeout = 1000 * atof(value); else if (strcmp(key, "autohide_hide_timeout") == 0) - panel_autohide_hide_timeout = 1000*atof(value); + panel_autohide_hide_timeout = 1000 * atof(value); else if (strcmp(key, "strut_policy") == 0) { if (strcmp(value, "follow_size") == 0) panel_strut_policy = STRUT_FOLLOW_SIZE; @@ -908,8 +868,7 @@ void add_entry (char *key, char *value) panel_strut_policy = STRUT_NONE; else panel_strut_policy = STRUT_MINIMUM; - } - else if (strcmp(key, "autohide_height") == 0) { + } else if (strcmp(key, "autohide_height") == 0) { panel_autohide_height = atoi(value); if (panel_autohide_height == 0) { // autohide need height > 0 @@ -923,12 +882,11 @@ void add_entry (char *key, char *value) systray_enabled = atoi(value); if (systray_enabled) { if (panel_items_order) { - gchar* tmp = g_strconcat(panel_items_order, "S", NULL); + gchar *tmp = g_strconcat(panel_items_order, "S", NULL); free(panel_items_order); panel_items_order = strdup(tmp); g_free(tmp); - } - else + } else panel_items_order = strdup("S"); } } @@ -939,12 +897,11 @@ void add_entry (char *key, char *value) battery_enabled = atoi(value); if (battery_enabled) { if (panel_items_order) { - gchar* tmp = g_strconcat(panel_items_order, "B", NULL); + gchar *tmp = g_strconcat(panel_items_order, "B", NULL); free(panel_items_order); panel_items_order = strdup(tmp); g_free(tmp); - } - else + } else panel_items_order = strdup("B"); } } @@ -953,103 +910,111 @@ void add_entry (char *key, char *value) else fprintf(stderr, "tint2 : invalid option \"%s\",\n upgrade tint2 or correct your config file\n", key); - if (value1) free (value1); - if (value2) free (value2); - if (value3) free (value3); + if (value1) + free(value1); + if (value2) + free(value2); + if (value3) + free(value3); } - -int config_read () +gboolean config_read_file(const char *path) { - const gchar * const * system_dirs; + FILE *fp; + char line[512]; + char *key, *value; + + if ((fp = fopen(path, "r")) == NULL) + return 0; + + while (fgets(line, sizeof(line), fp) != NULL) { + if (parse_line(line, &key, &value)) { + add_entry(key, value); + free(key); + free(value); + } + } + fclose(fp); + + // append Taskbar item + if (new_config_file == 0) { + taskbar_enabled = 1; + if (panel_items_order) { + gchar *tmp = g_strconcat("T", panel_items_order, NULL); + free(panel_items_order); + panel_items_order = strdup(tmp); + g_free(tmp); + } else + panel_items_order = strdup("T"); + } + + if (backgrounds->len > 0) { + Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); + if (!read_bg_color_hover) + memcpy(&bg->fill_color_hover, &bg->fill_color, sizeof(Color)); + if (!read_border_color_hover) + memcpy(&bg->border_color_hover, &bg->border, sizeof(Color)); + if (!read_bg_color_press) + memcpy(&bg->fill_color_pressed, &bg->fill_color_hover, sizeof(Color)); + if (!read_border_color_press) + memcpy(&bg->border_color_pressed, &bg->border_color_hover, sizeof(Color)); + } + + return 1; +} + +gboolean config_read_default_path() +{ + const gchar *const *system_dirs; gchar *path1; - gint i; // follow XDG specification // check tint2rc in user directory - path1 = g_build_filename (g_get_user_config_dir(), "tint2", "tint2rc", NULL); - if (g_file_test (path1, G_FILE_TEST_EXISTS)) { - i = config_read_file (path1); + path1 = g_build_filename(g_get_user_config_dir(), "tint2", "tint2rc", NULL); + if (g_file_test(path1, G_FILE_TEST_EXISTS)) { + gboolean result = config_read_file(path1); config_path = strdup(path1); g_free(path1); - return i; + return result; } g_free(path1); // copy tint2rc from system directory to user directory gchar *path2 = 0; system_dirs = g_get_system_config_dirs(); - for (i = 0; system_dirs[i]; i++) { + for (int i = 0; system_dirs[i]; i++) { path2 = g_build_filename(system_dirs[i], "tint2", "tint2rc", NULL); - if (g_file_test(path2, G_FILE_TEST_EXISTS)) break; + if (g_file_test(path2, G_FILE_TEST_EXISTS)) + break; g_free(path2); path2 = 0; } if (path2) { // copy file in user directory (path1) - gchar *dir = g_build_filename (g_get_user_config_dir(), "tint2", NULL); - if (!g_file_test (dir, G_FILE_TEST_IS_DIR)) g_mkdir(dir, 0777); + gchar *dir = g_build_filename(g_get_user_config_dir(), "tint2", NULL); + if (!g_file_test(dir, G_FILE_TEST_IS_DIR)) + g_mkdir(dir, 0777); g_free(dir); - path1 = g_build_filename (g_get_user_config_dir(), "tint2", "tint2rc", NULL); + path1 = g_build_filename(g_get_user_config_dir(), "tint2", "tint2rc", NULL); copy_file(path2, path1); g_free(path2); - i = config_read_file (path1); + gboolean result = config_read_file(path1); config_path = strdup(path1); g_free(path1); - return i; + return result; } return 0; } - -int config_read_file (const char *path) +gboolean config_read() { - FILE *fp; - char line[512]; - char *key, *value; - - if ((fp = fopen(path, "r")) == NULL) return 0; - - while (fgets(line, sizeof(line), fp) != NULL) { - if (parse_line(line, &key, &value)) { - add_entry (key, value); - free (key); - free (value); - } - } - fclose (fp); - - // append Taskbar item - if (new_config_file == 0) { - taskbar_enabled = 1; - if (panel_items_order) { - gchar* tmp = g_strconcat("T", panel_items_order, NULL); - free(panel_items_order); - panel_items_order = strdup(tmp); - g_free(tmp); - } - else - panel_items_order = strdup("T"); - } - - if (backgrounds->len > 0) { - Background *bg = &g_array_index(backgrounds, Background, backgrounds->len-1); - if (!read_bg_color_hover) - memcpy(&bg->fill_color_hover, &bg->fill_color, sizeof(Color)); - if (!read_border_color_hover) - memcpy(&bg->border_color_hover, &bg->border, sizeof(Color)); - if (!read_bg_color_press) - memcpy(&bg->fill_color_pressed, &bg->fill_color_hover, sizeof(Color)); - if (!read_border_color_press) - memcpy(&bg->border_color_pressed, &bg->border_color_hover, sizeof(Color)); - } - - return 1; + if (config_path) + return config_read_file(config_path); + return config_read_default_path(); } #endif - diff --git a/src/config.h b/src/config.h index 0999fb6..2d812f5 100644 --- a/src/config.h +++ b/src/config.h @@ -9,6 +9,8 @@ #ifndef CONFIG_H #define CONFIG_H +#include + extern char *config_path; extern char *snapshot_path; @@ -18,8 +20,6 @@ void default_config(); // freed memory void cleanup_config(); -int config_read_file (const char *path); -int config_read (); +gboolean config_read(); #endif - diff --git a/src/freespace/freespace.c b/src/freespace/freespace.c index f6ba12f..9b8ca37 100644 --- a/src/freespace/freespace.c +++ b/src/freespace/freespace.c @@ -17,7 +17,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **************************************************************************/ - #include #include #include @@ -33,20 +32,21 @@ void init_freespace_panel(void *p) { - Panel *panel = (Panel*)p; + Panel *panel = (Panel *)p; FreeSpace *freespace = &panel->freespace; - if (freespace->area.bg == 0) + if (!freespace->area.bg) freespace->area.bg = &g_array_index(backgrounds, Background, 0); freespace->area.parent = p; freespace->area.panel = p; freespace->area.size_mode = LAYOUT_FIXED; freespace->area.resize_needed = 1; - freespace->area.on_screen = 1; + freespace->area.on_screen = TRUE; freespace->area._resize = resize_freespace; } -int freespace_get_max_size(Panel *p) { +int freespace_get_max_size(Panel *p) +{ // Get space used by every element except the freespace GList *walk; int size = 0; @@ -70,9 +70,10 @@ int freespace_get_max_size(Panel *p) { return size; } -int resize_freespace(void *obj) { - FreeSpace *freespace = (FreeSpace*)obj; - Panel *panel = (Panel*)freespace->area.panel; +gboolean resize_freespace(void *obj) +{ + FreeSpace *freespace = (FreeSpace *)obj; + Panel *panel = (Panel *)freespace->area.panel; if (!freespace->area.on_screen) return 0; @@ -87,7 +88,7 @@ int resize_freespace(void *obj) { freespace->area.height = size; } - freespace->area.redraw_needed = 1; - panel_refresh = 1; + freespace->area.redraw_needed = TRUE; + panel_refresh = TRUE; return 1; } diff --git a/src/freespace/freespace.h b/src/freespace/freespace.h index 053e963..fcefd56 100644 --- a/src/freespace/freespace.h +++ b/src/freespace/freespace.h @@ -15,6 +15,6 @@ typedef struct FreeSpace { void cleanup_freespace(); void init_freespace_panel(void *panel); -int resize_freespace(void *obj); +gboolean resize_freespace(void *obj); #endif diff --git a/src/launcher/apps-common.c b/src/launcher/apps-common.c index a158a8c..72ebdbb 100644 --- a/src/launcher/apps-common.c +++ b/src/launcher/apps-common.c @@ -52,7 +52,9 @@ void expand_exec(DesktopEntry *entry, const char *path) // %c -> Name // %k -> path if (entry->exec) { - char *exec2 = calloc(strlen(entry->exec) + (entry->name ? strlen(entry->name) : 1) + (entry->icon ? strlen(entry->icon) : 1) + 100, 1); + char *exec2 = calloc(strlen(entry->exec) + (entry->name ? strlen(entry->name) : 1) + + (entry->icon ? strlen(entry->icon) : 1) + 100, + 1); char *p, *q; // p will never point to an escaped char for (p = entry->exec, q = exec2; *p; p++, q++) { @@ -63,12 +65,14 @@ void expand_exec(DesktopEntry *entry, const char *path) if (*p == '%') // For % we delete the backslash, i.e. write % over it q--; *q = *p; - if (!*p) break; + if (!*p) + break; continue; } if (*p == '%') { p++; - if (!*p) break; + if (!*p) + break; if (*p == 'i' && entry->icon != NULL) { sprintf(q, "--icon '%s'", entry->icon); q += strlen("--icon ''"); @@ -113,16 +117,19 @@ int read_desktop_file(const char *path, DesktopEntry *entry) return 0; } - gchar **languages = (gchar **)g_get_language_names(); + const gchar **languages = (const gchar **)g_get_language_names(); // lang_index is the index of the language for the best Name key in the language vector // lang_index_default is a constant that encodes the Name key without a language int lang_index, lang_index_default; #define LANG_DBG 0 - if (LANG_DBG) printf("Languages:"); + if (LANG_DBG) + printf("Languages:"); for (i = 0; languages[i]; i++) { - if (LANG_DBG) printf(" %s", languages[i]); + if (LANG_DBG) + printf(" %s", languages[i]); } - if (LANG_DBG) printf("\n"); + if (LANG_DBG) + printf("\n"); lang_index_default = i; // we currently do not know about any Name key at all, so use an invalid index lang_index = lang_index_default + 1; @@ -160,7 +167,7 @@ int read_desktop_file(const char *path, DesktopEntry *entry) } } } - fclose (fp); + fclose(fp); // From this point: // entry->name, entry->icon, entry->exec will never be empty strings (can be NULL though) diff --git a/src/launcher/icon-theme-common.c b/src/launcher/icon-theme-common.c index f81d21e..7651a5d 100644 --- a/src/launcher/icon-theme-common.c +++ b/src/launcher/icon-theme-common.c @@ -38,7 +38,6 @@ typedef struct IconThemeDir { int threshold; } IconThemeDir; - int parse_theme_line(char *line, char **key, char **value) { return parse_dektop_line(line, key, value); @@ -67,7 +66,7 @@ const GSList *get_icon_locations() return icon_locations; } -IconTheme *make_theme(char *name) +IconTheme *make_theme(const char *name) { IconTheme *theme = calloc(1, sizeof(IconTheme)); theme->name = strdup(name); @@ -76,8 +75,8 @@ IconTheme *make_theme(char *name) return theme; } -//TODO Use UTF8 when parsing the file -IconTheme *load_theme_from_index(char *file_name, char *name) +// TODO Use UTF8 when parsing the file +IconTheme *load_theme_from_index(const char *file_name, const char *name) { IconTheme *theme; FILE *f; @@ -168,9 +167,8 @@ IconTheme *load_theme_from_index(char *file_name, char *name) current_dir = NULL; line[line_len - 1] = '\0'; char *dir_name = line + 1; - GSList* dir_item = theme->list_directories; - while (dir_item != NULL) - { + GSList *dir_item = theme->list_directories; + while (dir_item != NULL) { IconThemeDir *dir = dir_item->data; if (strcmp(dir->name, dir_name) == 0) { current_dir = dir; @@ -186,7 +184,7 @@ IconTheme *load_theme_from_index(char *file_name, char *name) return theme; } -void load_theme_from_fs_dir(IconTheme *theme, char *dir_name) +void load_theme_from_fs_dir(IconTheme *theme, const char *dir_name) { gchar *file_name = g_build_filename(dir_name, "index.theme", NULL); if (g_file_test(file_name, G_FILE_TEST_EXISTS)) { @@ -226,12 +224,11 @@ void load_theme_from_fs_dir(IconTheme *theme, char *dir_name) } } -IconTheme *load_theme_from_fs(char *name, IconTheme *theme) +IconTheme *load_theme_from_fs(const char *name, IconTheme *theme) { gchar *dir_name = NULL; - const GSList *location; - for (location = get_icon_locations(); location; location = g_slist_next(location)) { - gchar *path = (gchar*) location->data; + for (const GSList *location = get_icon_locations(); location; location = g_slist_next(location)) { + gchar *path = (gchar *)location->data; dir_name = g_build_filename(path, name, NULL); if (g_file_test(dir_name, G_FILE_TEST_IS_DIR)) { if (!theme) { @@ -246,7 +243,7 @@ IconTheme *load_theme_from_fs(char *name, IconTheme *theme) return theme; } -IconTheme *load_theme(char *name) +IconTheme *load_theme(const char *name) { // Look for name/index.theme in $HOME/.icons, /usr/share/icons, /usr/share/pixmaps (stop at the first found) // Parse index.theme -> list of IconThemeDir with attributes @@ -256,9 +253,8 @@ IconTheme *load_theme(char *name) return NULL; gchar *file_name = NULL; - const GSList *location; - for (location = get_icon_locations(); location; location = g_slist_next(location)) { - gchar *path = (gchar*) location->data; + for (const GSList *location = get_icon_locations(); location; location = g_slist_next(location)) { + gchar *path = (gchar *)location->data; file_name = g_build_filename(path, name, "index.theme", NULL); if (!g_file_test(file_name, G_FILE_TEST_EXISTS)) { g_free(file_name); @@ -283,14 +279,12 @@ void free_icon_theme(IconTheme *theme) return; free(theme->name); theme->name = NULL; - GSList *l_inherits; - for (l_inherits = theme->list_inherits; l_inherits ; l_inherits = l_inherits->next) { + for (GSList *l_inherits = theme->list_inherits; l_inherits; l_inherits = l_inherits->next) { free(l_inherits->data); } g_slist_free(theme->list_inherits); theme->list_inherits = NULL; - GSList *l_dir; - for (l_dir = theme->list_directories; l_dir ; l_dir = l_dir->next) { + for (GSList *l_dir = theme->list_directories; l_dir; l_dir = l_dir->next) { IconThemeDir *dir = (IconThemeDir *)l_dir->data; free(dir->name); free(l_dir->data); @@ -303,15 +297,14 @@ void free_themes(IconThemeWrapper *themes) { if (!themes) return; - GSList *l; - for (l = themes->themes; l ; l = l->next) { - IconTheme *theme = (IconTheme*) l->data; + for (GSList *l = themes->themes; l; l = l->next) { + IconTheme *theme = (IconTheme *)l->data; free_icon_theme(theme); free(theme); } g_slist_free(themes->themes); - for (l = themes->themes_fallback; l ; l = l->next) { - IconTheme *theme = (IconTheme*) l->data; + for (GSList *l = themes->themes_fallback; l; l = l->next) { + IconTheme *theme = (IconTheme *)l->data; free_icon_theme(theme); free(theme); } @@ -328,21 +321,24 @@ void test_launcher_read_theme_file() return; } printf("Loaded theme: %s\n", theme->name); - GSList* item = theme->list_inherits; - while (item != NULL) - { - printf("Inherits:%s\n", (char*)item->data); + GSList *item = theme->list_inherits; + while (item != NULL) { + printf("Inherits:%s\n", (char *)item->data); item = g_slist_next(item); } item = theme->list_directories; - while (item != NULL) - { + while (item != NULL) { IconThemeDir *dir = item->data; printf("Dir:%s Size=%d MinSize=%d MaxSize=%d Threshold=%d Type=%s\n", - dir->name, dir->size, dir->min_size, dir->max_size, dir->threshold, - dir->type == ICON_DIR_TYPE_FIXED ? "Fixed" : - dir->type == ICON_DIR_TYPE_SCALABLE ? "Scalable" : - dir->type == ICON_DIR_TYPE_THRESHOLD ? "Threshold" : "?????"); + dir->name, + dir->size, + dir->min_size, + dir->max_size, + dir->threshold, + dir->type == ICON_DIR_TYPE_FIXED ? "Fixed" : dir->type == ICON_DIR_TYPE_SCALABLE + ? "Scalable" + : dir->type == ICON_DIR_TYPE_THRESHOLD ? "Threshold" + : "?????"); item = g_slist_next(item); } fprintf(stdout, "\033[0m"); @@ -350,7 +346,7 @@ void test_launcher_read_theme_file() gboolean str_list_contains(const GSList *list, const char *value) { - const GSList* item = list; + const GSList *item = list; while (item != NULL) { if (g_str_equal(item->data, value)) { return TRUE; @@ -369,18 +365,17 @@ void load_themes_helper(const char *name, GSList **themes, GSList **queued) // Load wrapper->themes while (queue) { - char *name = queue->data; - queue = g_slist_remove(queue, name); + char *queued_name = queue->data; + queue = g_slist_remove(queue, queued_name); - fprintf(stderr, " '%s',", name); - IconTheme *theme = load_theme(name); + fprintf(stderr, " '%s',", queued_name); + IconTheme *theme = load_theme(queued_name); if (theme != NULL) { *themes = g_slist_append(*themes, theme); - GSList* item = theme->list_inherits; + GSList *item = theme->list_inherits; int pos = 0; - while (item != NULL) - { + while (item != NULL) { char *parent = item->data; if (!str_list_contains(*queued, parent)) { queue = g_slist_insert(queue, strdup(parent), pos); @@ -391,13 +386,13 @@ void load_themes_helper(const char *name, GSList **themes, GSList **queued) } } - free(name); + free(queued_name); } fprintf(stderr, "\n"); // Free the queue GSList *l; - for (l = queue; l ; l = l->next) + for (l = queue; l; l = l->next) free(l->data); g_slist_free(queue); } @@ -420,14 +415,13 @@ IconThemeWrapper *load_themes(const char *icon_theme_name) // Load wrapper->themes_fallback const GSList *location; for (location = get_icon_locations(); location; location = g_slist_next(location)) { - gchar *path = (gchar*) location->data; + gchar *path = (gchar *)location->data; GDir *d = g_dir_open(path, 0, NULL); if (d) { const gchar *name; while ((name = g_dir_read_name(d))) { gchar *file_name = g_build_filename(path, name, "index.theme", NULL); - if (g_file_test(file_name, G_FILE_TEST_EXISTS) && - !g_file_test(file_name, G_FILE_TEST_IS_DIR)) { + if (g_file_test(file_name, G_FILE_TEST_EXISTS) && !g_file_test(file_name, G_FILE_TEST_IS_DIR)) { load_themes_helper(name, &wrapper->themes_fallback, &queued); } g_free(file_name); @@ -438,7 +432,7 @@ IconThemeWrapper *load_themes(const char *icon_theme_name) // Free the queued list GSList *l; - for (l = queued; l ; l = l->next) + for (l = queued; l; l = l->next) free(l->data); g_slist_free(queued); @@ -482,8 +476,8 @@ int directory_size_distance(IconThemeDir *dir, int size) gint compare_theme_directories(gconstpointer a, gconstpointer b, gpointer size_query) { int size = GPOINTER_TO_INT(size_query); - const IconThemeDir *da = (const IconThemeDir*)a; - const IconThemeDir *db = (const IconThemeDir*)b; + const IconThemeDir *da = (const IconThemeDir *)a; + const IconThemeDir *db = (const IconThemeDir *)b; return abs(da->size - size) - abs(db->size - size); } @@ -509,9 +503,8 @@ char *get_icon_path_helper(GSList *themes, const char *icon_name, int size) extensions = g_slist_append(extensions, ".svg"); #endif // if the icon name already contains one of the extensions (e.g. vlc.png instead of vlc) add a special entry - GSList *ext; - for (ext = extensions; ext; ext = g_slist_next(ext)) { - char *extension = (char*) ext->data; + for (GSList *ext = extensions; ext; ext = g_slist_next(ext)) { + char *extension = (char *)ext->data; if (strlen(icon_name) > strlen(extension) && strcmp(extension, icon_name + strlen(icon_name) - strlen(extension)) == 0) { extensions = g_slist_append(extensions, ""); @@ -540,33 +533,33 @@ char *get_icon_path_helper(GSList *themes, const char *icon_name, int size) char *file_name = calloc(file_name_size, 1); for (theme = themes; theme; theme = g_slist_next(theme)) { - ((IconTheme*)theme->data)->list_directories = g_slist_sort_with_data(((IconTheme*)theme->data)->list_directories, - compare_theme_directories, - GINT_TO_POINTER(size)); + ((IconTheme *)theme->data)->list_directories = + g_slist_sort_with_data(((IconTheme *)theme->data)->list_directories, + compare_theme_directories, + GINT_TO_POINTER(size)); GSList *dir; - for (dir = ((IconTheme*)theme->data)->list_directories; dir; dir = g_slist_next(dir)) { + for (dir = ((IconTheme *)theme->data)->list_directories; dir; dir = g_slist_next(dir)) { // Closest match - gboolean possible = directory_size_distance((IconThemeDir*)dir->data, size) < minimal_size && + gboolean possible = directory_size_distance((IconThemeDir *)dir->data, size) < minimal_size && (!best_file_theme ? TRUE : theme == best_file_theme); // Next larger match - possible = possible || - (((IconThemeDir*)dir->data)->size >= size && - (next_larger_size == -1 || ((IconThemeDir*)dir->data)->size < next_larger_size) && - (!next_larger_theme ? 1 : theme == next_larger_theme)); + possible = possible || (((IconThemeDir *)dir->data)->size >= size && + (next_larger_size == -1 || ((IconThemeDir *)dir->data)->size < next_larger_size) && + (!next_larger_theme ? 1 : theme == next_larger_theme)); if (!possible) continue; const GSList *base; for (base = basenames; base; base = g_slist_next(base)) { - GSList *ext; - for (ext = extensions; ext; ext = g_slist_next(ext)) { - char *base_name = (char*) base->data; - char *theme_name = ((IconTheme*)theme->data)->name; - char *dir_name = ((IconThemeDir*)dir->data)->name; - char *extension = (char*) ext->data; - if (strlen(base_name) + strlen(theme_name) + - strlen(dir_name) + strlen(icon_name) + strlen(extension) + 100 > file_name_size) { - file_name_size = strlen(base_name) + strlen(theme_name) + - strlen(dir_name) + strlen(icon_name) + strlen(extension) + 100; + for (GSList *ext = extensions; ext; ext = g_slist_next(ext)) { + char *base_name = (char *)base->data; + char *theme_name = ((IconTheme *)theme->data)->name; + char *dir_name = ((IconThemeDir *)dir->data)->name; + char *extension = (char *)ext->data; + if (strlen(base_name) + strlen(theme_name) + strlen(dir_name) + strlen(icon_name) + + strlen(extension) + 100 > + file_name_size) { + file_name_size = strlen(base_name) + strlen(theme_name) + strlen(dir_name) + strlen(icon_name) + + strlen(extension) + 100; file_name = realloc(file_name, file_name_size); } file_name[0] = 0; @@ -578,27 +571,28 @@ char *get_icon_path_helper(GSList *themes, const char *icon_name, int size) if (DEBUG_ICON_SEARCH) printf("found: %s\n", file_name); // Closest match - if (directory_size_distance((IconThemeDir*)dir->data, size) < minimal_size && (!best_file_theme ? 1 : theme == best_file_theme)) { + if (directory_size_distance((IconThemeDir *)dir->data, size) < minimal_size && + (!best_file_theme ? 1 : theme == best_file_theme)) { if (best_file_name) { free(best_file_name); best_file_name = NULL; } best_file_name = strdup(file_name); - minimal_size = directory_size_distance((IconThemeDir*)dir->data, size); + minimal_size = directory_size_distance((IconThemeDir *)dir->data, size); best_file_theme = theme; if (DEBUG_ICON_SEARCH) printf("best_file_name = %s; minimal_size = %d\n", best_file_name, minimal_size); } // Next larger match - if (((IconThemeDir*)dir->data)->size >= size && - (next_larger_size == -1 || ((IconThemeDir*)dir->data)->size < next_larger_size) && + if (((IconThemeDir *)dir->data)->size >= size && + (next_larger_size == -1 || ((IconThemeDir *)dir->data)->size < next_larger_size) && (!next_larger_theme ? 1 : theme == next_larger_theme)) { if (next_larger) { free(next_larger); next_larger = NULL; } next_larger = strdup(file_name); - next_larger_size = ((IconThemeDir*)dir->data)->size; + next_larger_size = ((IconThemeDir *)dir->data)->size; next_larger_theme = theme; if (DEBUG_ICON_SEARCH) printf("next_larger = %s; next_larger_size = %d\n", next_larger, next_larger_size); @@ -622,14 +616,11 @@ char *get_icon_path_helper(GSList *themes, const char *icon_name, int size) // Look in unthemed icons { - const GSList *base; - for (base = basenames; base; base = g_slist_next(base)) { - GSList *ext; - for (ext = extensions; ext; ext = g_slist_next(ext)) { - char *base_name = (char*) base->data; - char *extension = (char*) ext->data; - char *file_name = calloc(strlen(base_name) + strlen(icon_name) + - strlen(extension) + 100, 1); + for (const GSList *base = basenames; base; base = g_slist_next(base)) { + for (GSList *ext = extensions; ext; ext = g_slist_next(ext)) { + char *base_name = (char *)base->data; + char *extension = (char *)ext->data; + file_name = calloc(strlen(base_name) + strlen(icon_name) + strlen(extension) + 100, 1); // filename = directory/iconname.extension sprintf(file_name, "%s/%s%s", base_name, icon_name, extension); if (DEBUG_ICON_SEARCH) diff --git a/src/launcher/icon-theme-common.h b/src/launcher/icon-theme-common.h index e3f853f..0185f2e 100644 --- a/src/launcher/icon-theme-common.h +++ b/src/launcher/icon-theme-common.h @@ -17,7 +17,7 @@ typedef struct IconThemeWrapper { typedef struct IconTheme { char *name; - GSList *list_inherits; // each item is a char* (theme name) + GSList *list_inherits; // each item is a char* (theme name) GSList *list_directories; // each item is an IconThemeDir* } IconTheme; diff --git a/src/launcher/launcher.c b/src/launcher/launcher.c index f73ce2e..1f15067 100644 --- a/src/launcher/launcher.c +++ b/src/launcher/launcher.c @@ -74,7 +74,6 @@ void default_launcher() launcher_icon_bg = NULL; } - void init_launcher() { if (launcher_enabled) { @@ -83,10 +82,9 @@ void init_launcher() } } - void init_launcher_panel(void *p) { - Panel *panel =(Panel*)p; + Panel *panel = (Panel *)p; Launcher *launcher = &panel->launcher; launcher->area.parent = p; @@ -95,7 +93,7 @@ void init_launcher_panel(void *p) launcher->area.size_mode = LAYOUT_FIXED; launcher->area._resize = resize_launcher; launcher->area.resize_needed = 1; - launcher->area.redraw_needed = 1; + launcher->area.redraw_needed = TRUE; if (!launcher->area.bg) launcher->area.bg = &g_array_index(backgrounds, Background, 0); @@ -106,14 +104,13 @@ void init_launcher_panel(void *p) if (launcher->list_apps == NULL) return; - launcher->area.on_screen = 1; - panel_refresh = 1; + launcher->area.on_screen = TRUE; + panel_refresh = TRUE; launcher_load_themes(launcher); launcher_load_icons(launcher); } - void cleanup_launcher() { int i; @@ -123,13 +120,13 @@ void cleanup_launcher() xsettings_client_destroy(xsettings_client); xsettings_client = NULL; - for (i = 0; i < nb_panel; i++) { - Panel *panel = &panel1[i]; + for (i = 0; i < num_panels; i++) { + Panel *panel = &panels[i]; Launcher *launcher = &panel->launcher; cleanup_launcher_theme(launcher); } - for (l = panel_config.launcher.list_apps; l ; l = l->next) { + for (l = panel_config.launcher.list_apps; l; l = l->next) { free(l->data); } g_slist_free(panel_config.launcher.list_apps); @@ -144,13 +141,12 @@ void cleanup_launcher() launcher_enabled = 0; } - void cleanup_launcher_theme(Launcher *launcher) { free_area(&launcher->area); GSList *l; - for (l = launcher->list_icons; l ; l = l->next) { - LauncherIcon *launcherIcon = (LauncherIcon*)l->data; + for (l = launcher->list_icons; l; l = l->next) { + LauncherIcon *launcherIcon = (LauncherIcon *)l->data; if (launcherIcon) { free_icon(launcherIcon->image); free_icon(launcherIcon->image_hover); @@ -169,13 +165,12 @@ void cleanup_launcher_theme(Launcher *launcher) launcher->list_themes = NULL; } - -int resize_launcher(void *obj) +gboolean resize_launcher(void *obj) { Launcher *launcher = obj; GSList *l; int count, icon_size; - int icons_per_column=1, icons_per_row=1, marging=0; + int icons_per_column = 1, icons_per_row = 1, margin = 0; if (panel_horizontal) { icon_size = launcher->area.height; @@ -187,7 +182,7 @@ int resize_launcher(void *obj) icon_size = launcher_max_icon_size; // Resize icons if necessary - for (l = launcher->list_icons; l ; l = l->next) { + for (l = launcher->list_icons; l; l = l->next) { LauncherIcon *launcherIcon = (LauncherIcon *)l->data; if (launcherIcon->icon_size != icon_size || !launcherIcon->image) { launcherIcon->icon_size = icon_size; @@ -195,7 +190,8 @@ int resize_launcher(void *obj) launcherIcon->area.height = launcherIcon->icon_size; // Get the path for an icon file with the new size - char *new_icon_path = get_icon_path(launcher->list_themes, launcherIcon->icon_name, launcherIcon->icon_size); + char *new_icon_path = + get_icon_path(launcher->list_themes, launcherIcon->icon_name, launcherIcon->icon_size); if (!new_icon_path) { // Draw a blank icon free_icon(launcherIcon->image); @@ -234,46 +230,47 @@ int resize_launcher(void *obj) } if (panel_config.mouse_effects) { - launcherIcon->image_hover = adjust_icon(launcherIcon->image, panel_config.mouse_over_alpha, panel_config.mouse_over_saturation, panel_config.mouse_over_brightness); - launcherIcon->image_pressed = adjust_icon(launcherIcon->image, panel_config.mouse_pressed_alpha, panel_config.mouse_pressed_saturation, panel_config.mouse_pressed_brightness); + launcherIcon->image_hover = adjust_icon(launcherIcon->image, + panel_config.mouse_over_alpha, + panel_config.mouse_over_saturation, + panel_config.mouse_over_brightness); + launcherIcon->image_pressed = adjust_icon(launcherIcon->image, + panel_config.mouse_pressed_alpha, + panel_config.mouse_pressed_saturation, + panel_config.mouse_pressed_brightness); } } - + count = g_slist_length(launcher->list_icons); if (panel_horizontal) { if (!count) { launcher->area.width = 0; } else { - int height = launcher->area.height - 2*launcher->area.bg->border.width - 2*launcher->area.paddingy; + int height = launcher->area.height - 2 * launcher->area.bg->border.width - 2 * launcher->area.paddingy; // here icons_per_column always higher than 0 - icons_per_column = (height+launcher->area.paddingx) / (icon_size+launcher->area.paddingx); - marging = height - (icons_per_column-1)*(icon_size+launcher->area.paddingx) - icon_size; - icons_per_row = count / icons_per_column + (count%icons_per_column != 0); - launcher->area.width = (2 * launcher->area.bg->border.width) + - (2 * launcher->area.paddingxlr) + - (icon_size * icons_per_row) + - ((icons_per_row-1) * launcher->area.paddingx); + icons_per_column = (height + launcher->area.paddingx) / (icon_size + launcher->area.paddingx); + margin = height - (icons_per_column - 1) * (icon_size + launcher->area.paddingx) - icon_size; + icons_per_row = count / icons_per_column + (count % icons_per_column != 0); + launcher->area.width = (2 * launcher->area.bg->border.width) + (2 * launcher->area.paddingxlr) + + (icon_size * icons_per_row) + ((icons_per_row - 1) * launcher->area.paddingx); } - } - else { + } else { if (!count) { launcher->area.height = 0; } else { - int width = launcher->area.width - 2*launcher->area.bg->border.width - 2*launcher->area.paddingy; + int width = launcher->area.width - 2 * launcher->area.bg->border.width - 2 * launcher->area.paddingy; // here icons_per_row always higher than 0 - icons_per_row = (width+launcher->area.paddingx) / (icon_size+launcher->area.paddingx); - marging = width - (icons_per_row-1)*(icon_size+launcher->area.paddingx) - icon_size; - icons_per_column = count / icons_per_row+ (count%icons_per_row != 0); - launcher->area.height = (2 * launcher->area.bg->border.width) + - (2 * launcher->area.paddingxlr) + - (icon_size * icons_per_column) + - ((icons_per_column-1) * launcher->area.paddingx); + icons_per_row = (width + launcher->area.paddingx) / (icon_size + launcher->area.paddingx); + margin = width - (icons_per_row - 1) * (icon_size + launcher->area.paddingx) - icon_size; + icons_per_column = count / icons_per_row + (count % icons_per_row != 0); + launcher->area.height = (2 * launcher->area.bg->border.width) + (2 * launcher->area.paddingxlr) + + (icon_size * icons_per_column) + ((icons_per_column - 1) * launcher->area.paddingx); } } int i, posx, posy; - int start = launcher->area.bg->border.width + launcher->area.paddingy + marging/2; + int start = launcher->area.bg->border.width + launcher->area.paddingy + margin / 2; if (panel_horizontal) { posy = start; posx = launcher->area.bg->border.width + launcher->area.paddingxlr; @@ -282,16 +279,16 @@ int resize_launcher(void *obj) posy = launcher->area.bg->border.width + launcher->area.paddingxlr; } - for (i=1, l = launcher->list_icons; l ; i++, l = l->next) { - LauncherIcon *launcherIcon = (LauncherIcon*)l->data; - + for (i = 1, l = launcher->list_icons; l; i++, l = l->next) { + LauncherIcon *launcherIcon = (LauncherIcon *)l->data; + launcherIcon->y = posy; launcherIcon->x = posx; - launcherIcon->area.posy = ((Area*)launcherIcon->area.parent)->posy + launcherIcon->y; - launcherIcon->area.posx = ((Area*)launcherIcon->area.parent)->posx + launcherIcon->x; + launcherIcon->area.posy = ((Area *)launcherIcon->area.parent)->posy + launcherIcon->y; + launcherIcon->area.posx = ((Area *)launcherIcon->area.parent)->posx + launcherIcon->x; launcherIcon->area.width = launcherIcon->icon_size; launcherIcon->area.height = launcherIcon->icon_size; - //printf("launcher %d : %d,%d\n", i, posx, posy); + // printf("launcher %d : %d,%d\n", i, posx, posy); if (panel_horizontal) { if (i % icons_per_column) { posy += icon_size + launcher->area.paddingx; @@ -316,22 +313,22 @@ int resize_launcher(void *obj) // in a stack; we need to layout them in a kind of table void launcher_icon_on_change_layout(void *obj) { - LauncherIcon *launcherIcon = (LauncherIcon*)obj; - launcherIcon->area.posy = ((Area*)launcherIcon->area.parent)->posy + launcherIcon->y; - launcherIcon->area.posx = ((Area*)launcherIcon->area.parent)->posx + launcherIcon->x; + LauncherIcon *launcherIcon = (LauncherIcon *)obj; + launcherIcon->area.posy = ((Area *)launcherIcon->area.parent)->posy + launcherIcon->y; + launcherIcon->area.posx = ((Area *)launcherIcon->area.parent)->posx + launcherIcon->x; launcherIcon->area.width = launcherIcon->icon_size; launcherIcon->area.height = launcherIcon->icon_size; } -char* launcher_icon_get_tooltip_text(void *obj) +char *launcher_icon_get_tooltip_text(void *obj) { - LauncherIcon *launcherIcon = (LauncherIcon*)obj; + LauncherIcon *launcherIcon = (LauncherIcon *)obj; return strdup(launcherIcon->icon_tooltip); } void draw_launcher_icon(void *obj, cairo_t *c) { - LauncherIcon *launcherIcon = (LauncherIcon*)obj; + LauncherIcon *launcherIcon = (LauncherIcon *)obj; Imlib_Image image; // Render @@ -343,7 +340,7 @@ void draw_launcher_icon(void *obj, cairo_t *c) else image = launcherIcon->image; } else { - image = launcherIcon->image; + image = launcherIcon->image; } imlib_context_set_image(image); render_image(launcherIcon->area.pix, 0, 0); @@ -353,19 +350,25 @@ Imlib_Image scale_icon(Imlib_Image original, int icon_size) { Imlib_Image icon_scaled; if (original) { - imlib_context_set_image (original); - icon_scaled = imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), icon_size, icon_size); + imlib_context_set_image(original); + icon_scaled = + imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), icon_size, icon_size); - imlib_context_set_image (icon_scaled); + imlib_context_set_image(icon_scaled); imlib_image_set_has_alpha(1); - DATA32* data = imlib_image_get_data(); - adjust_asb(data, icon_size, icon_size, launcher_alpha, (float)launcher_saturation/100, (float)launcher_brightness/100); + DATA32 *data = imlib_image_get_data(); + adjust_asb(data, + icon_size, + icon_size, + launcher_alpha, + (float)launcher_saturation / 100, + (float)launcher_brightness / 100); imlib_image_put_back_data(data); - imlib_context_set_image (icon_scaled); + imlib_context_set_image(icon_scaled); } else { icon_scaled = imlib_create_image(icon_size, icon_size); - imlib_context_set_image (icon_scaled); + imlib_context_set_image(icon_scaled); imlib_context_set_color(255, 255, 255, 255); imlib_image_fill_rectangle(0, 0, icon_size, icon_size); } @@ -380,18 +383,18 @@ void free_icon(Imlib_Image icon) } } -void launcher_action(LauncherIcon *icon, XEvent* evt) +void launcher_action(LauncherIcon *icon, XEvent *evt) { char *cmd = calloc(strlen(icon->cmd) + 10, 1); sprintf(cmd, "(%s&)", icon->cmd); #if HAVE_SN - SnLauncherContext* ctx = 0; + SnLauncherContext *ctx = 0; Time time; if (startup_notifications) { ctx = sn_launcher_context_new(server.sn_dsp, server.screen); sn_launcher_context_set_name(ctx, icon->icon_tooltip); sn_launcher_context_set_description(ctx, "Application launched from tint2"); - sn_launcher_context_set_binary_name (ctx, icon->cmd); + sn_launcher_context_set_binary_name(ctx, icon->cmd); // Get a timestamp from the X event if (evt->type == ButtonPress || evt->type == ButtonRelease) { time = evt->xbutton.time; @@ -408,7 +411,7 @@ void launcher_action(LauncherIcon *icon, XEvent* evt) if (pid < 0) { fprintf(stderr, "Could not fork\n"); } else if (pid == 0) { - // Child process +// Child process #if HAVE_SN if (startup_notifications) { sn_launcher_context_setup_child_process(ctx); @@ -426,10 +429,10 @@ void launcher_action(LauncherIcon *icon, XEvent* evt) #endif // HAVE_SN exit(1); } else { - // Parent process +// Parent process #if HAVE_SN if (startup_notifications) { - g_tree_insert(server.pids, GINT_TO_POINTER (pid), ctx); + g_tree_insert(server.pids, GINT_TO_POINTER(pid), ctx); } #endif // HAVE_SN } @@ -440,7 +443,7 @@ void launcher_action(LauncherIcon *icon, XEvent* evt) void launcher_load_icons(Launcher *launcher) { // Load apps (.desktop style launcher items) - GSList* app = launcher->list_apps; + GSList *app = launcher->list_apps; while (app != NULL) { DesktopEntry entry; read_desktop_file(app->data, &entry); @@ -451,11 +454,11 @@ void launcher_load_icons(Launcher *launcher) launcherIcon->area.size_mode = LAYOUT_FIXED; launcherIcon->area._resize = NULL; launcherIcon->area.resize_needed = 0; - launcherIcon->area.redraw_needed = 1; + launcherIcon->area.redraw_needed = TRUE; launcherIcon->area.has_mouse_over_effect = 1; launcherIcon->area.has_mouse_press_effect = 1; launcherIcon->area.bg = launcher_icon_bg; - launcherIcon->area.on_screen = 1; + launcherIcon->area.on_screen = TRUE; launcherIcon->area._on_change_layout = launcher_icon_on_change_layout; if (launcher_tooltip_enabled) { launcherIcon->area._get_tooltip_text = launcher_icon_get_tooltip_text; @@ -469,25 +472,19 @@ void launcher_load_icons(Launcher *launcher) launcherIcon->icon_tooltip = entry.name ? strdup(entry.name) : strdup(entry.exec); free_desktop_entry(&entry); launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon); - add_area(&launcherIcon->area, (Area*)launcher); + add_area(&launcherIcon->area, (Area *)launcher); } app = g_slist_next(app); } } - // Populates the list_themes list void launcher_load_themes(Launcher *launcher) { - launcher->list_themes = load_themes(launcher_icon_theme_override - ? (icon_theme_name_config - ? icon_theme_name_config - : icon_theme_name_xsettings - ? icon_theme_name_xsettings - : "hicolor") - : (icon_theme_name_xsettings - ? icon_theme_name_xsettings - : icon_theme_name_config - ? icon_theme_name_config - : "hicolor")); + launcher->list_themes = + load_themes(launcher_icon_theme_override + ? (icon_theme_name_config ? icon_theme_name_config + : icon_theme_name_xsettings ? icon_theme_name_xsettings : "hicolor") + : (icon_theme_name_xsettings ? icon_theme_name_xsettings + : icon_theme_name_config ? icon_theme_name_config : "hicolor")); } diff --git a/src/launcher/launcher.h b/src/launcher/launcher.h index 14d602c..be22683 100644 --- a/src/launcher/launcher.h +++ b/src/launcher/launcher.h @@ -15,8 +15,8 @@ typedef struct Launcher { // always start with area Area area; - GSList *list_apps; // List of char*, each is a path to a app.desktop file - GSList *list_icons; // List of LauncherIcon* + GSList *list_apps; // List of char*, each is a path to a app.desktop file + GSList *list_icons; // List of LauncherIcon* IconThemeWrapper *list_themes; } Launcher; @@ -41,7 +41,7 @@ extern int launcher_tooltip_enabled; extern int launcher_alpha; extern int launcher_saturation; extern int launcher_brightness; -extern char *icon_theme_name_xsettings; // theme name +extern char *icon_theme_name_xsettings; // theme name extern char *icon_theme_name_config; extern int launcher_icon_theme_override; extern XSettingsClient *xsettings_client; @@ -57,14 +57,14 @@ void init_launcher_panel(void *panel); void cleanup_launcher(); void cleanup_launcher_theme(Launcher *launcher); -int resize_launcher(void *obj); -void draw_launcher (void *obj, cairo_t *c); +gboolean resize_launcher(void *obj); +void draw_launcher(void *obj, cairo_t *c); // Populates the list_icons list void launcher_load_icons(Launcher *launcher); // Populates the list_themes list void launcher_load_themes(Launcher *launcher); -void launcher_action(LauncherIcon *icon, XEvent* e); +void launcher_action(LauncherIcon *icon, XEvent *e); void test_launcher_read_desktop_file(); void test_launcher_read_theme_file(); diff --git a/src/launcher/xsettings-client.c b/src/launcher/xsettings-client.c index 72fa941..d7c71fc 100644 --- a/src/launcher/xsettings-client.c +++ b/src/launcher/xsettings-client.c @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL RED HAT * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Owen Taylor, Red Hat, Inc. @@ -26,15 +26,14 @@ #include #include -#include /* For CARD16 */ +#include /* For CARD16 */ #include "xsettings-client.h" #include "server.h" #include "panel.h" #include "launcher.h" -struct _XSettingsClient -{ +struct _XSettingsClient { Display *display; int screen; XSettingsNotifyFunc notify; @@ -45,10 +44,9 @@ struct _XSettingsClient XSettingsList *settings; }; - -void xsettings_notify_cb (const char *name, XSettingsAction action, XSettingsSetting *setting, void *data) +void xsettings_notify_cb(const char *name, XSettingsAction action, XSettingsSetting *setting, void *data) { - //printf("xsettings_notify_cb\n"); + // printf("xsettings_notify_cb\n"); if ((action == XSETTINGS_ACTION_NEW || action == XSETTINGS_ACTION_CHANGED) && name != NULL && setting != NULL) { if (!strcmp(name, "Net/IconThemeName") && setting->type == XSETTINGS_TYPE_STRING) { if (icon_theme_name_xsettings) { @@ -57,10 +55,10 @@ void xsettings_notify_cb (const char *name, XSettingsAction action, XSettingsSet free(icon_theme_name_xsettings); } icon_theme_name_xsettings = strdup(setting->data.v_string); - + int i; - for (i = 0 ; i < nb_panel ; i++) { - Launcher *launcher = &panel1[i].launcher; + for (i = 0; i < num_panels; i++) { + Launcher *launcher = &panels[i].launcher; cleanup_launcher_theme(launcher); launcher_load_themes(launcher); launcher_load_icons(launcher); @@ -70,8 +68,7 @@ void xsettings_notify_cb (const char *name, XSettingsAction action, XSettingsSet } } - -static void notify_changes (XSettingsClient *client, XSettingsList *old_list) +static void notify_changes(XSettingsClient *client, XSettingsList *old_list) { XSettingsList *old_iter = old_list; XSettingsList *new_iter = client->settings; @@ -83,21 +80,19 @@ static void notify_changes (XSettingsClient *client, XSettingsList *old_list) int cmp; if (old_iter && new_iter) - cmp = strcmp (old_iter->setting->name, new_iter->setting->name); + cmp = strcmp(old_iter->setting->name, new_iter->setting->name); else if (old_iter) cmp = -1; else cmp = 1; if (cmp < 0) { - client->notify (old_iter->setting->name, XSETTINGS_ACTION_DELETED, NULL, client->cb_data); - } - else if (cmp == 0) { - if (!xsettings_setting_equal (old_iter->setting, new_iter->setting)) - client->notify (old_iter->setting->name, XSETTINGS_ACTION_CHANGED, new_iter->setting, client->cb_data); - } - else { - client->notify (new_iter->setting->name, XSETTINGS_ACTION_NEW, new_iter->setting, client->cb_data); + client->notify(old_iter->setting->name, XSETTINGS_ACTION_DELETED, NULL, client->cb_data); + } else if (cmp == 0) { + if (!xsettings_setting_equal(old_iter->setting, new_iter->setting)) + client->notify(old_iter->setting->name, XSETTINGS_ACTION_CHANGED, new_iter->setting, client->cb_data); + } else { + client->notify(new_iter->setting->name, XSETTINGS_ACTION_NEW, new_iter->setting, client->cb_data); } if (old_iter) @@ -107,8 +102,7 @@ static void notify_changes (XSettingsClient *client, XSettingsList *old_list) } } - -static int ignore_errors (Display *display, XErrorEvent *event) +static int ignore_errors(Display *display, XErrorEvent *event) { return True; } @@ -117,11 +111,11 @@ static char local_byte_order = '\0'; #define BYTES_LEFT(buffer) ((buffer)->data + (buffer)->len - (buffer)->pos) -static XSettingsResult fetch_card16 (XSettingsBuffer *buffer, CARD16 *result) +static XSettingsResult fetch_card16(XSettingsBuffer *buffer, CARD16 *result) { CARD16 x; - if (BYTES_LEFT (buffer) < 2) + if (BYTES_LEFT(buffer) < 2) return XSETTINGS_ACCESS; x = *(CARD16 *)buffer->pos; @@ -135,25 +129,23 @@ static XSettingsResult fetch_card16 (XSettingsBuffer *buffer, CARD16 *result) return XSETTINGS_SUCCESS; } - -static XSettingsResult fetch_ushort (XSettingsBuffer *buffer, unsigned short *result) +static XSettingsResult fetch_ushort(XSettingsBuffer *buffer, unsigned short *result) { CARD16 x; - XSettingsResult r; + XSettingsResult r; - r = fetch_card16 (buffer, &x); + r = fetch_card16(buffer, &x); if (r == XSETTINGS_SUCCESS) *result = x; return r; } - -static XSettingsResult fetch_card32 (XSettingsBuffer *buffer, CARD32 *result) +static XSettingsResult fetch_card32(XSettingsBuffer *buffer, CARD32 *result) { CARD32 x; - if (BYTES_LEFT (buffer) < 4) + if (BYTES_LEFT(buffer) < 4) return XSETTINGS_ACCESS; x = *(CARD32 *)buffer->pos; @@ -167,9 +159,9 @@ static XSettingsResult fetch_card32 (XSettingsBuffer *buffer, CARD32 *result) return XSETTINGS_SUCCESS; } -static XSettingsResult fetch_card8 (XSettingsBuffer *buffer, CARD8 *result) +static XSettingsResult fetch_card8(XSettingsBuffer *buffer, CARD8 *result) { - if (BYTES_LEFT (buffer) < 1) + if (BYTES_LEFT(buffer) < 1) return XSETTINGS_ACCESS; *result = *(CARD8 *)buffer->pos; @@ -178,9 +170,9 @@ static XSettingsResult fetch_card8 (XSettingsBuffer *buffer, CARD8 *result) return XSETTINGS_SUCCESS; } -#define XSETTINGS_PAD(n,m) ((n + m - 1) & (~(m-1))) +#define XSETTINGS_PAD(n, m) ((n + m - 1) & (~(m - 1))) -static XSettingsList *parse_settings (unsigned char *data, size_t len) +static XSettingsList *parse_settings(unsigned char *data, size_t len) { XSettingsBuffer buffer; XSettingsResult result = XSETTINGS_SUCCESS; @@ -190,26 +182,26 @@ static XSettingsList *parse_settings (unsigned char *data, size_t len) CARD32 i; XSettingsSetting *setting = NULL; - local_byte_order = xsettings_byte_order (); + local_byte_order = xsettings_byte_order(); buffer.byte_order = local_byte_order; buffer.pos = buffer.data = data; buffer.len = len; - result = fetch_card8 (&buffer, (CARD8*)&buffer.byte_order); + result = fetch_card8(&buffer, (CARD8 *)&buffer.byte_order); if (buffer.byte_order != MSBFirst && buffer.byte_order != LSBFirst) { - fprintf (stderr, "Invalid byte order %x in XSETTINGS property\n", buffer.byte_order); + fprintf(stderr, "Invalid byte order %x in XSETTINGS property\n", buffer.byte_order); result = XSETTINGS_FAILED; goto out; } buffer.pos += 3; - result = fetch_card32 (&buffer, &serial); + result = fetch_card32(&buffer, &serial); if (result != XSETTINGS_SUCCESS) goto out; - result = fetch_card32 (&buffer, &n_entries); + result = fetch_card32(&buffer, &n_entries); if (result != XSETTINGS_SUCCESS) goto out; @@ -219,131 +211,130 @@ static XSettingsList *parse_settings (unsigned char *data, size_t len) CARD32 v_int; size_t pad_len; - result = fetch_card8 (&buffer, &type); + result = fetch_card8(&buffer, &type); if (result != XSETTINGS_SUCCESS) goto out; buffer.pos += 1; - result = fetch_card16 (&buffer, &name_len); + result = fetch_card16(&buffer, &name_len); if (result != XSETTINGS_SUCCESS) goto out; pad_len = XSETTINGS_PAD(name_len, 4); - if (BYTES_LEFT (&buffer) < pad_len) { + if (BYTES_LEFT(&buffer) < pad_len) { result = XSETTINGS_ACCESS; goto out; } - setting = calloc (1, sizeof *setting); + setting = calloc(1, sizeof *setting); if (!setting) { result = XSETTINGS_NO_MEM; goto out; } setting->type = XSETTINGS_TYPE_INT; /* No allocated memory */ - setting->name = calloc (name_len + 1, 1); + setting->name = calloc(name_len + 1, 1); if (!setting->name) { result = XSETTINGS_NO_MEM; goto out; } - memcpy (setting->name, buffer.pos, name_len); + memcpy(setting->name, buffer.pos, name_len); setting->name[name_len] = '\0'; buffer.pos += pad_len; - result = fetch_card32 (&buffer, &v_int); + result = fetch_card32(&buffer, &v_int); if (result != XSETTINGS_SUCCESS) goto out; setting->last_change_serial = v_int; switch (type) { - case XSETTINGS_TYPE_INT: - result = fetch_card32 (&buffer, &v_int); + case XSETTINGS_TYPE_INT: + result = fetch_card32(&buffer, &v_int); if (result != XSETTINGS_SUCCESS) goto out; setting->data.v_int = (INT32)v_int; break; - case XSETTINGS_TYPE_STRING: - result = fetch_card32 (&buffer, &v_int); + case XSETTINGS_TYPE_STRING: + result = fetch_card32(&buffer, &v_int); if (result != XSETTINGS_SUCCESS) goto out; - pad_len = XSETTINGS_PAD (v_int, 4); + pad_len = XSETTINGS_PAD(v_int, 4); if (v_int + 1 == 0 || /* Guard against wrap-around */ - BYTES_LEFT (&buffer) < pad_len) { + BYTES_LEFT(&buffer) < pad_len) { result = XSETTINGS_ACCESS; goto out; } - setting->data.v_string = calloc (v_int + 1, 1); + setting->data.v_string = calloc(v_int + 1, 1); if (!setting->data.v_string) { result = XSETTINGS_NO_MEM; goto out; } - memcpy (setting->data.v_string, buffer.pos, v_int); + memcpy(setting->data.v_string, buffer.pos, v_int); setting->data.v_string[v_int] = '\0'; buffer.pos += pad_len; break; - case XSETTINGS_TYPE_COLOR: - result = fetch_ushort (&buffer, &setting->data.v_color.red); + case XSETTINGS_TYPE_COLOR: + result = fetch_ushort(&buffer, &setting->data.v_color.red); if (result != XSETTINGS_SUCCESS) goto out; - result = fetch_ushort (&buffer, &setting->data.v_color.green); + result = fetch_ushort(&buffer, &setting->data.v_color.green); if (result != XSETTINGS_SUCCESS) goto out; - result = fetch_ushort (&buffer, &setting->data.v_color.blue); + result = fetch_ushort(&buffer, &setting->data.v_color.blue); if (result != XSETTINGS_SUCCESS) goto out; - result = fetch_ushort (&buffer, &setting->data.v_color.alpha); + result = fetch_ushort(&buffer, &setting->data.v_color.alpha); if (result != XSETTINGS_SUCCESS) goto out; break; - default: + default: /* Quietly ignore unknown types */ break; } setting->type = type; - result = xsettings_list_insert (&settings, setting); + result = xsettings_list_insert(&settings, setting); if (result != XSETTINGS_SUCCESS) - goto out; + goto out; setting = NULL; } - out: +out: if (result != XSETTINGS_SUCCESS) { switch (result) { - case XSETTINGS_NO_MEM: + case XSETTINGS_NO_MEM: fprintf(stderr, "Out of memory reading XSETTINGS property\n"); break; - case XSETTINGS_ACCESS: + case XSETTINGS_ACCESS: fprintf(stderr, "Invalid XSETTINGS property (read off end)\n"); break; - case XSETTINGS_DUPLICATE_ENTRY: - fprintf (stderr, "Duplicate XSETTINGS entry for '%s'\n", setting->name); - case XSETTINGS_FAILED: - case XSETTINGS_SUCCESS: - case XSETTINGS_NO_ENTRY: + case XSETTINGS_DUPLICATE_ENTRY: + fprintf(stderr, "Duplicate XSETTINGS entry for '%s'\n", setting->name); + case XSETTINGS_FAILED: + case XSETTINGS_SUCCESS: + case XSETTINGS_NO_ENTRY: break; } if (setting) - xsettings_setting_free (setting); + xsettings_setting_free(setting); - xsettings_list_free (settings); + xsettings_list_free(settings); settings = NULL; } return settings; } - -static void read_settings (XSettingsClient *client) +static void read_settings(XSettingsClient *client) { Atom type; int format; @@ -352,55 +343,67 @@ static void read_settings (XSettingsClient *client) unsigned char *data; int result; - int (*old_handler) (Display *, XErrorEvent *); + int (*old_handler)(Display *, XErrorEvent *); XSettingsList *old_list = client->settings; client->settings = NULL; - old_handler = XSetErrorHandler (ignore_errors); - result = XGetWindowProperty (client->display, client->manager_window, server.atom._XSETTINGS_SETTINGS, 0, LONG_MAX, False, server.atom._XSETTINGS_SETTINGS, &type, &format, &n_items, &bytes_after, &data); - XSetErrorHandler (old_handler); + old_handler = XSetErrorHandler(ignore_errors); + result = XGetWindowProperty(client->display, + client->manager_window, + server.atom._XSETTINGS_SETTINGS, + 0, + LONG_MAX, + False, + server.atom._XSETTINGS_SETTINGS, + &type, + &format, + &n_items, + &bytes_after, + &data); + XSetErrorHandler(old_handler); if (result == Success && type == server.atom._XSETTINGS_SETTINGS) { if (format != 8) { - fprintf (stderr, "Invalid format for XSETTINGS property %d", format); - } - else - client->settings = parse_settings (data, n_items); - XFree (data); + fprintf(stderr, "Invalid format for XSETTINGS property %d", format); + } else + client->settings = parse_settings(data, n_items); + XFree(data); } - notify_changes (client, old_list); - xsettings_list_free (old_list); + notify_changes(client, old_list); + xsettings_list_free(old_list); } - -static void check_manager_window (XSettingsClient *client) +static void check_manager_window(XSettingsClient *client) { if (client->manager_window && client->watch) - client->watch (client->manager_window, False, 0, client->cb_data); + client->watch(client->manager_window, False, 0, client->cb_data); - XGrabServer (client->display); + XGrabServer(client->display); - client->manager_window = XGetSelectionOwner (server.dsp, server.atom._XSETTINGS_SCREEN); + client->manager_window = XGetSelectionOwner(server.dsp, server.atom._XSETTINGS_SCREEN); if (client->manager_window) - XSelectInput (server.dsp, client->manager_window, PropertyChangeMask | StructureNotifyMask); + XSelectInput(server.dsp, client->manager_window, PropertyChangeMask | StructureNotifyMask); - XUngrabServer (client->display); - XFlush (client->display); + XUngrabServer(client->display); + XFlush(client->display); if (client->manager_window && client->watch) - client->watch (client->manager_window, True, PropertyChangeMask | StructureNotifyMask, client->cb_data); + client->watch(client->manager_window, True, PropertyChangeMask | StructureNotifyMask, client->cb_data); - read_settings (client); + read_settings(client); } - -XSettingsClient *xsettings_client_new (Display *display, int screen, XSettingsNotifyFunc notify, XSettingsWatchFunc watch, void *cb_data) +XSettingsClient *xsettings_client_new(Display *display, + int screen, + XSettingsNotifyFunc notify, + XSettingsWatchFunc watch, + void *cb_data) { XSettingsClient *client; - client = calloc (1, sizeof *client); + client = calloc(1, sizeof *client); if (!client) return NULL; @@ -414,68 +417,60 @@ XSettingsClient *xsettings_client_new (Display *display, int screen, XSettingsNo client->settings = NULL; if (client->watch) - client->watch (RootWindow (display, screen), True, StructureNotifyMask, client->cb_data); + client->watch(RootWindow(display, screen), True, StructureNotifyMask, client->cb_data); - check_manager_window (client); + check_manager_window(client); if (client->manager_window == None) { printf("NO XSETTINGS manager, tint2 use config 'launcher_icon_theme'.\n"); - free (client); + free(client); return NULL; - } - else + } else return client; } - -void xsettings_client_destroy (XSettingsClient *client) +void xsettings_client_destroy(XSettingsClient *client) { if (client->watch) - client->watch (RootWindow (client->display, client->screen), False, 0, client->cb_data); + client->watch(RootWindow(client->display, client->screen), False, 0, client->cb_data); if (client->manager_window && client->watch) - client->watch (client->manager_window, False, 0, client->cb_data); + client->watch(client->manager_window, False, 0, client->cb_data); - xsettings_list_free (client->settings); - free (client); + xsettings_list_free(client->settings); + free(client); } - -XSettingsResult xsettings_client_get_setting (XSettingsClient *client, const char *name, XSettingsSetting **setting) +XSettingsResult xsettings_client_get_setting(XSettingsClient *client, const char *name, XSettingsSetting **setting) { - XSettingsSetting *search = xsettings_list_lookup (client->settings, name); + XSettingsSetting *search = xsettings_list_lookup(client->settings, name); if (search) { - *setting = xsettings_setting_copy (search); + *setting = xsettings_setting_copy(search); return *setting ? XSETTINGS_SUCCESS : XSETTINGS_NO_MEM; - } - else + } else return XSETTINGS_NO_ENTRY; } - -Bool xsettings_client_process_event (XSettingsClient *client, XEvent *xev) +Bool xsettings_client_process_event(XSettingsClient *client, XEvent *xev) { /* The checks here will not unlikely cause us to reread * the properties from the manager window a number of * times when the manager changes from A->B. But manager changes * are going to be pretty rare. */ - if (xev->xany.window == RootWindow (server.dsp, server.screen)) { + if (xev->xany.window == RootWindow(server.dsp, server.screen)) { if (xev->xany.type == ClientMessage && xev->xclient.message_type == server.atom.MANAGER) { - check_manager_window (client); + check_manager_window(client); return True; } - } - else if (xev->xany.window == client->manager_window) { + } else if (xev->xany.window == client->manager_window) { if (xev->xany.type == DestroyNotify) { - check_manager_window (client); + check_manager_window(client); return True; - } - else if (xev->xany.type == PropertyNotify) { - read_settings (client); + } else if (xev->xany.type == PropertyNotify) { + read_settings(client); return True; } } return False; } - diff --git a/src/launcher/xsettings-client.h b/src/launcher/xsettings-client.h index 5a40e0e..c20e961 100644 --- a/src/launcher/xsettings-client.h +++ b/src/launcher/xsettings-client.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL RED HAT * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Owen Taylor, Red Hat, Inc. @@ -32,23 +32,22 @@ extern "C" { typedef struct _XSettingsClient XSettingsClient; -typedef enum -{ - XSETTINGS_ACTION_NEW, - XSETTINGS_ACTION_CHANGED, - XSETTINGS_ACTION_DELETED -} XSettingsAction; +typedef enum { XSETTINGS_ACTION_NEW, XSETTINGS_ACTION_CHANGED, XSETTINGS_ACTION_DELETED } XSettingsAction; -typedef void (*XSettingsNotifyFunc) (const char *name, XSettingsAction action, XSettingsSetting *setting, void *cb_data); -typedef void (*XSettingsWatchFunc) (Window window, Bool is_start, long mask, void *cb_data); +typedef void (*XSettingsNotifyFunc)(const char *name, XSettingsAction action, XSettingsSetting *setting, void *cb_data); +typedef void (*XSettingsWatchFunc)(Window window, Bool is_start, long mask, void *cb_data); -XSettingsClient *xsettings_client_new (Display *display, int screen, XSettingsNotifyFunc notify, XSettingsWatchFunc watch, void *cb_data); -void xsettings_client_destroy (XSettingsClient *client); -Bool xsettings_client_process_event (XSettingsClient *client, XEvent *xev); +XSettingsClient *xsettings_client_new(Display *display, + int screen, + XSettingsNotifyFunc notify, + XSettingsWatchFunc watch, + void *cb_data); +void xsettings_client_destroy(XSettingsClient *client); +Bool xsettings_client_process_event(XSettingsClient *client, XEvent *xev); -void xsettings_notify_cb (const char *name, XSettingsAction action, XSettingsSetting *setting, void *data); +void xsettings_notify_cb(const char *name, XSettingsAction action, XSettingsSetting *setting, void *data); -XSettingsResult xsettings_client_get_setting (XSettingsClient *client, const char *name, XSettingsSetting **setting); +XSettingsResult xsettings_client_get_setting(XSettingsClient *client, const char *name, XSettingsSetting **setting); #ifdef __cplusplus } diff --git a/src/launcher/xsettings-common.c b/src/launcher/xsettings-common.c index c7637e4..348d7ad 100644 --- a/src/launcher/xsettings-common.c +++ b/src/launcher/xsettings-common.c @@ -24,31 +24,29 @@ #include "stdlib.h" #include -#include /* For CARD32 */ +#include /* For CARD32 */ #include "xsettings-common.h" -XSettingsSetting * -xsettings_setting_copy (XSettingsSetting *setting) +XSettingsSetting *xsettings_setting_copy(XSettingsSetting *setting) { XSettingsSetting *result; size_t str_len; - result = calloc (1, sizeof *result); + result = calloc(1, sizeof *result); if (!result) return NULL; - str_len = strlen (setting->name); - result->name = calloc (str_len + 1, 1); + str_len = strlen(setting->name); + result->name = calloc(str_len + 1, 1); if (!result->name) goto err; - memcpy (result->name, setting->name, str_len + 1); + memcpy(result->name, setting->name, str_len + 1); result->type = setting->type; - switch (setting->type) - { + switch (setting->type) { case XSETTINGS_TYPE_INT: result->data.v_int = setting->data.v_int; break; @@ -56,12 +54,12 @@ xsettings_setting_copy (XSettingsSetting *setting) result->data.v_color = setting->data.v_color; break; case XSETTINGS_TYPE_STRING: - str_len = strlen (setting->data.v_string); - result->data.v_string = calloc (str_len + 1, 1); + str_len = strlen(setting->data.v_string); + result->data.v_string = calloc(str_len + 1, 1); if (!result->data.v_string) goto err; - memcpy (result->data.v_string, setting->data.v_string, str_len + 1); + memcpy(result->data.v_string, setting->data.v_string, str_len + 1); break; default: break; @@ -73,31 +71,28 @@ xsettings_setting_copy (XSettingsSetting *setting) err: if (result->name) - free (result->name); - free (result); + free(result->name); + free(result); return NULL; } -XSettingsList * -xsettings_list_copy (XSettingsList *list) +XSettingsList *xsettings_list_copy(XSettingsList *list) { XSettingsList *new = NULL; XSettingsList *old_iter = list; XSettingsList *new_iter = NULL; - while (old_iter) - { + while (old_iter) { XSettingsList *new_node; - new_node = calloc (1, sizeof *new_node); + new_node = calloc(1, sizeof *new_node); if (!new_node) goto error; - new_node->setting = xsettings_setting_copy (old_iter->setting); - if (!new_node->setting) - { - free (new_node); + new_node->setting = xsettings_setting_copy(old_iter->setting); + if (!new_node->setting) { + free(new_node); goto error; } @@ -114,22 +109,19 @@ xsettings_list_copy (XSettingsList *list) return new; error: - xsettings_list_free (new); + xsettings_list_free(new); return NULL; } -int -xsettings_setting_equal (XSettingsSetting *setting_a, - XSettingsSetting *setting_b) +int xsettings_setting_equal(XSettingsSetting *setting_a, XSettingsSetting *setting_b) { if (setting_a->type != setting_b->type) return 0; - if (strcmp (setting_a->name, setting_b->name) != 0) + if (strcmp(setting_a->name, setting_b->name) != 0) return 0; - switch (setting_a->type) - { + switch (setting_a->type) { case XSETTINGS_TYPE_INT: return setting_a->data.v_int == setting_b->data.v_int; case XSETTINGS_TYPE_COLOR: @@ -138,7 +130,7 @@ xsettings_setting_equal (XSettingsSetting *setting_a, setting_a->data.v_color.blue == setting_b->data.v_color.blue && setting_a->data.v_color.alpha == setting_b->data.v_color.alpha); case XSETTINGS_TYPE_STRING: - return strcmp (setting_a->data.v_string, setting_b->data.v_string) == 0; + return strcmp(setting_a->data.v_string, setting_b->data.v_string) == 0; default: break; } @@ -146,55 +138,48 @@ xsettings_setting_equal (XSettingsSetting *setting_a, return 0; } -void -xsettings_setting_free (XSettingsSetting *setting) +void xsettings_setting_free(XSettingsSetting *setting) { if (setting->type == XSETTINGS_TYPE_STRING) - free (setting->data.v_string); + free(setting->data.v_string); if (setting->name) - free (setting->name); + free(setting->name); - free (setting); + free(setting); } -void -xsettings_list_free (XSettingsList *list) +void xsettings_list_free(XSettingsList *list) { - while (list) - { + while (list) { XSettingsList *next = list->next; - xsettings_setting_free (list->setting); - free (list); + xsettings_setting_free(list->setting); + free(list); list = next; } } -XSettingsResult -xsettings_list_insert (XSettingsList **list, - XSettingsSetting *setting) +XSettingsResult xsettings_list_insert(XSettingsList **list, XSettingsSetting *setting) { XSettingsList *node; XSettingsList *iter; XSettingsList *last = NULL; - node = calloc (1, sizeof *node); + node = calloc(1, sizeof *node); if (!node) return XSETTINGS_NO_MEM; node->setting = setting; iter = *list; - while (iter) - { - int cmp = strcmp (setting->name, iter->setting->name); + while (iter) { + int cmp = strcmp(setting->name, iter->setting->name); if (cmp < 0) break; - else if (cmp == 0) - { - free (node); + else if (cmp == 0) { + free(node); return XSETTINGS_DUPLICATE_ENTRY; } @@ -212,25 +197,21 @@ xsettings_list_insert (XSettingsList **list, return XSETTINGS_SUCCESS; } -XSettingsResult -xsettings_list_delete (XSettingsList **list, - const char *name) +XSettingsResult xsettings_list_delete(XSettingsList **list, const char *name) { XSettingsList *iter; XSettingsList *last = NULL; iter = *list; - while (iter) - { - if (strcmp (name, iter->setting->name) == 0) - { + while (iter) { + if (strcmp(name, iter->setting->name) == 0) { if (last) last->next = iter->next; else *list = iter->next; - xsettings_setting_free (iter->setting); - free (iter); + xsettings_setting_free(iter->setting); + free(iter); return XSETTINGS_SUCCESS; } @@ -242,16 +223,13 @@ xsettings_list_delete (XSettingsList **list, return XSETTINGS_FAILED; } -XSettingsSetting * -xsettings_list_lookup (XSettingsList *list, - const char *name) +XSettingsSetting *xsettings_list_lookup(XSettingsList *list, const char *name) { XSettingsList *iter; iter = list; - while (iter) - { - if (strcmp (name, iter->setting->name) == 0) + while (iter) { + if (strcmp(name, iter->setting->name) == 0) return iter->setting; iter = iter->next; @@ -260,8 +238,7 @@ xsettings_list_lookup (XSettingsList *list, return NULL; } -char -xsettings_byte_order (void) +char xsettings_byte_order(void) { CARD32 myint = 0x01020304; return (*(char *)&myint == 1) ? MSBFirst : LSBFirst; diff --git a/src/launcher/xsettings-common.h b/src/launcher/xsettings-common.h index 5f129ff..fb0bc83 100644 --- a/src/launcher/xsettings-common.h +++ b/src/launcher/xsettings-common.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL RED HAT * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Owen Taylor, Red Hat, Inc. @@ -27,82 +27,72 @@ extern "C" { #endif /* __cplusplus */ -typedef struct _XSettingsBuffer XSettingsBuffer; -typedef struct _XSettingsColor XSettingsColor; -typedef struct _XSettingsList XSettingsList; +typedef struct _XSettingsBuffer XSettingsBuffer; +typedef struct _XSettingsColor XSettingsColor; +typedef struct _XSettingsList XSettingsList; typedef struct _XSettingsSetting XSettingsSetting; /* Types of settings possible. Enum values correspond to * protocol values. */ -typedef enum -{ - XSETTINGS_TYPE_INT = 0, - XSETTINGS_TYPE_STRING = 1, - XSETTINGS_TYPE_COLOR = 2, - XSETTINGS_TYPE_NONE = 0xff +typedef enum { + XSETTINGS_TYPE_INT = 0, + XSETTINGS_TYPE_STRING = 1, + XSETTINGS_TYPE_COLOR = 2, + XSETTINGS_TYPE_NONE = 0xff } XSettingsType; -typedef enum -{ - XSETTINGS_SUCCESS, - XSETTINGS_NO_MEM, - XSETTINGS_ACCESS, - XSETTINGS_FAILED, - XSETTINGS_NO_ENTRY, - XSETTINGS_DUPLICATE_ENTRY +typedef enum { + XSETTINGS_SUCCESS, + XSETTINGS_NO_MEM, + XSETTINGS_ACCESS, + XSETTINGS_FAILED, + XSETTINGS_NO_ENTRY, + XSETTINGS_DUPLICATE_ENTRY } XSettingsResult; -struct _XSettingsBuffer -{ - char byte_order; - size_t len; - unsigned char *data; - unsigned char *pos; +struct _XSettingsBuffer { + char byte_order; + size_t len; + unsigned char *data; + unsigned char *pos; }; -struct _XSettingsColor -{ - unsigned short red, green, blue, alpha; +struct _XSettingsColor { + unsigned short red, green, blue, alpha; }; -struct _XSettingsList -{ - XSettingsSetting *setting; - XSettingsList *next; +struct _XSettingsList { + XSettingsSetting *setting; + XSettingsList *next; }; -struct _XSettingsSetting -{ - char *name; - XSettingsType type; - - union { - int v_int; - char *v_string; - XSettingsColor v_color; - } data; +struct _XSettingsSetting { + char *name; + XSettingsType type; - unsigned long last_change_serial; + union { + int v_int; + char *v_string; + XSettingsColor v_color; + } data; + + unsigned long last_change_serial; }; -XSettingsSetting *xsettings_setting_copy (XSettingsSetting *setting); -void xsettings_setting_free (XSettingsSetting *setting); -int xsettings_setting_equal (XSettingsSetting *setting_a, - XSettingsSetting *setting_b); +XSettingsSetting *xsettings_setting_copy(XSettingsSetting *setting); +void xsettings_setting_free(XSettingsSetting *setting); +int xsettings_setting_equal(XSettingsSetting *setting_a, XSettingsSetting *setting_b); -void xsettings_list_free (XSettingsList *list); -XSettingsList *xsettings_list_copy (XSettingsList *list); -XSettingsResult xsettings_list_insert (XSettingsList **list, - XSettingsSetting *setting); -XSettingsSetting *xsettings_list_lookup (XSettingsList *list, - const char *name); -XSettingsResult xsettings_list_delete (XSettingsList **list, - const char *name); +void xsettings_list_free(XSettingsList *list); +XSettingsList *xsettings_list_copy(XSettingsList *list); +XSettingsResult xsettings_list_insert(XSettingsList **list, XSettingsSetting *setting); +XSettingsSetting *xsettings_list_lookup(XSettingsList *list, const char *name); +XSettingsResult xsettings_list_delete(XSettingsList **list, const char *name); -char xsettings_byte_order (void); +char xsettings_byte_order(void); -#define XSETTINGS_PAD(n,m) ((n + m - 1) & (~(m-1))) +#define XSETTINGS_PAD(n, m) ((n + m - 1) & (~(m - 1))) #ifdef __cplusplus } diff --git a/src/panel.c b/src/panel.c index 02c9c96..ce3ce83 100644 --- a/src/panel.c +++ b/src/panel.c @@ -16,6 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **************************************************************************/ +#include #include #include #include @@ -33,65 +34,63 @@ #include "panel.h" #include "tooltip.h" - int signal_pending; -// -------------------------------------------------- -// mouse events -int mouse_left; -int mouse_middle; -int mouse_right; -int mouse_scroll_up; -int mouse_scroll_down; -int mouse_tilt_left; -int mouse_tilt_right; -int panel_mode; -int wm_menu; -int panel_dock; -int panel_layer; -int panel_position; -int panel_horizontal; -int panel_refresh; -int task_dragged; +MouseAction mouse_left; +MouseAction mouse_middle; +MouseAction mouse_right; +MouseAction mouse_scroll_up; +MouseAction mouse_scroll_down; +MouseAction mouse_tilt_left; +MouseAction mouse_tilt_right; + +TaskbarMode taskbar_mode; +gboolean wm_menu; +gboolean panel_dock; +Layer panel_layer; +PanelPosition panel_position; +gboolean panel_horizontal; +gboolean panel_refresh; +gboolean task_dragged; char *panel_window_name = NULL; -int panel_autohide; +gboolean panel_autohide; int panel_autohide_show_timeout; int panel_autohide_hide_timeout; int panel_autohide_height; -int panel_strut_policy; +Strut panel_strut_policy; char *panel_items_order; -int max_tick_urgent; +int max_tick_urgent; // panel's initial config Panel panel_config; // panels (one panel per monitor) -Panel *panel1; -int nb_panel; +Panel *panels; +int num_panels; -GArray* backgrounds; +GArray *backgrounds; Imlib_Image default_icon; void default_panel() { - panel1 = 0; - nb_panel = 0; + panels = NULL; + num_panels = 0; default_icon = NULL; - task_dragged = 0; - panel_horizontal = 1; + task_dragged = FALSE; + panel_horizontal = TRUE; panel_position = CENTER; panel_items_order = NULL; - panel_autohide = 0; + panel_autohide = FALSE; panel_autohide_show_timeout = 0; panel_autohide_hide_timeout = 0; - panel_autohide_height = 5; // for vertical panels this is of course the width + panel_autohide_height = 5; // for vertical panels this is of course the width panel_strut_policy = STRUT_FOLLOW_SIZE; - panel_dock = 0; // default not in the dock - panel_layer = BOTTOM_LAYER; // default is bottom layer + panel_dock = FALSE; // default not in the dock + panel_layer = BOTTOM_LAYER; // default is bottom layer panel_window_name = strdup("tint2"); - wm_menu = 0; + wm_menu = FALSE; max_tick_urgent = 14; mouse_left = TOGGLE_ICONIFY; backgrounds = g_array_new(0, 0, sizeof(Background)); @@ -104,7 +103,7 @@ void default_panel() panel_config.mouse_pressed_saturation = 0; panel_config.mouse_pressed_brightness = 0; - // append full transparency background + // First background is always fully transparent Background transparent_bg; init_background(&transparent_bg); g_array_append_val(backgrounds, transparent_bg); @@ -112,15 +111,13 @@ void default_panel() void cleanup_panel() { - if (!panel1) + if (!panels) return; cleanup_taskbar(); - int i; - Panel *p; - for (i = 0; i < nb_panel; i++) { - p = &panel1[i]; + for (int i = 0; i < num_panels; i++) { + Panel *p = &panels[i]; free_area(&p->area); if (p->temp_pmap) @@ -139,8 +136,8 @@ void cleanup_panel() panel_items_order = NULL; free(panel_window_name); panel_window_name = NULL; - free(panel1); - panel1 = NULL; + free(panels); + panels = NULL; if (backgrounds) g_array_free(backgrounds, 1); backgrounds = NULL; @@ -152,11 +149,8 @@ void cleanup_panel() void init_panel() { - int i, k; - Panel *p; - - if (panel_config.monitor > (server.nb_monitor-1)) { - // server.nb_monitor minimum value is 1 (see get_monitors()) + if (panel_config.monitor > (server.num_monitors - 1)) { + // server.num_monitors minimum value is 1 (see get_monitors()) fprintf(stderr, "warning : monitor not found. tint2 default to all monitors.\n"); panel_config.monitor = 0; } @@ -172,18 +166,22 @@ void init_panel() // number of panels (one monitor or 'all' monitors) if (panel_config.monitor >= 0) - nb_panel = 1; + num_panels = 1; else - nb_panel = server.nb_monitor; + num_panels = server.num_monitors; - panel1 = calloc(nb_panel, sizeof(Panel)); - for (i=0 ; i < nb_panel ; i++) { - memcpy(&panel1[i], &panel_config, sizeof(Panel)); + panels = calloc(num_panels, sizeof(Panel)); + for (int i = 0; i < num_panels; i++) { + memcpy(&panels[i], &panel_config, sizeof(Panel)); } - fprintf(stderr, "tint2 : nb monitor %d, nb monitor used %d, nb desktop %d\n", server.nb_monitor, nb_panel, server.nb_desktop); - for (i=0 ; i < nb_panel ; i++) { - p = &panel1[i]; + fprintf(stderr, + "tint2 : nb monitor %d, nb monitor used %d, nb desktop %d\n", + server.num_monitors, + num_panels, + server.num_desktops); + for (int i = 0; i < num_panels; i++) { + Panel *p = &panels[i]; if (panel_config.monitor < 0) p->monitor = i; @@ -191,14 +189,14 @@ void init_panel() p->area.bg = &g_array_index(backgrounds, Background, 0); p->area.parent = p; p->area.panel = p; - p->area.on_screen = 1; + p->area.on_screen = TRUE; p->area.resize_needed = 1; p->area.size_mode = LAYOUT_DYNAMIC; p->area._resize = resize_panel; init_panel_size_and_position(p); // add children according to panel_items - for (k=0 ; k < strlen(panel_items_order) ; k++) { - if (panel_items_order[k] == 'L') + for (int k = 0; k < strlen(panel_items_order); k++) { + if (panel_items_order[k] == 'L') init_launcher_panel(p); if (panel_items_order[k] == 'T') init_taskbar_panel(p); @@ -206,7 +204,7 @@ void init_panel() if (panel_items_order[k] == 'B') init_battery_panel(p); #endif - if (panel_items_order[k] == 'S' && systray_on_monitor(i, nb_panel)) { + if (panel_items_order[k] == 'S' && systray_on_monitor(i, num_panels)) { init_systray_panel(p); refresh_systray = 1; } @@ -218,35 +216,44 @@ void init_panel() set_panel_items_order(p); // catch some events - XSetWindowAttributes att = { .colormap=server.colormap, .background_pixel=0, .border_pixel=0 }; - unsigned long mask = CWEventMask|CWColormap|CWBackPixel|CWBorderPixel; - p->main_win = XCreateWindow(server.dsp, server.root_win, p->posx, p->posy, p->area.width, p->area.height, 0, server.depth, InputOutput, server.visual, mask, &att); + XSetWindowAttributes att = {.colormap = server.colormap, .background_pixel = 0, .border_pixel = 0}; + unsigned long mask = CWEventMask | CWColormap | CWBackPixel | CWBorderPixel; + p->main_win = XCreateWindow(server.dsp, + server.root_win, + p->posx, + p->posy, + p->area.width, + p->area.height, + 0, + server.depth, + InputOutput, + server.visual, + mask, + &att); - long event_mask = ExposureMask|ButtonPressMask|ButtonReleaseMask|ButtonMotionMask; - if (p->mouse_effects || - p->g_task.tooltip_enabled || - p->clock.area._get_tooltip_text || + long event_mask = ExposureMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask; + if (p->mouse_effects || p->g_task.tooltip_enabled || p->clock.area._get_tooltip_text || (launcher_enabled && launcher_tooltip_enabled)) - event_mask |= PointerMotionMask|LeaveWindowMask; + event_mask |= PointerMotionMask | LeaveWindowMask; if (panel_autohide) - event_mask |= LeaveWindowMask|EnterWindowMask; - XChangeWindowAttributes(server.dsp, p->main_win, CWEventMask, &(XSetWindowAttributes){.event_mask=event_mask}); + event_mask |= LeaveWindowMask | EnterWindowMask; + XChangeWindowAttributes(server.dsp, p->main_win, CWEventMask, &(XSetWindowAttributes){.event_mask = event_mask}); if (!server.gc) { XGCValues gcv; server.gc = XCreateGC(server.dsp, p->main_win, 0, &gcv); } - //printf("panel %d : %d, %d, %d, %d\n", i, p->posx, p->posy, p->area.width, p->area.height); + // printf("panel %d : %d, %d, %d, %d\n", i, p->posx, p->posy, p->area.width, p->area.height); set_panel_properties(p); set_panel_background(p); - if (snapshot_path == 0) { + if (!snapshot_path) { // if we are not in 'snapshot' mode then map new panel - XMapWindow (server.dsp, p->main_win); + XMapWindow(server.dsp, p->main_win); } if (panel_autohide) autohide_trigger_hide(p); - + visible_taskbar(p); } @@ -254,68 +261,69 @@ void init_panel() active_task(); } - void init_panel_size_and_position(Panel *panel) { // detect panel size if (panel_horizontal) { - if (panel->pourcentx) + if (panel->fractional_width) panel->area.width = (float)server.monitor[panel->monitor].width * panel->area.width / 100; - if (panel->pourcenty) + if (panel->fractional_height) panel->area.height = (float)server.monitor[panel->monitor].height * panel->area.height / 100; if (panel->area.width + panel->marginx > server.monitor[panel->monitor].width) panel->area.width = server.monitor[panel->monitor].width - panel->marginx; - if (panel->area.bg->border.radius > panel->area.height/2) { + if (panel->area.bg->border.radius > panel->area.height / 2) { printf("panel_background_id rounded is too big... please fix your tint2rc\n"); g_array_append_val(backgrounds, *panel->area.bg); - panel->area.bg = &g_array_index(backgrounds, Background, backgrounds->len-1); - panel->area.bg->border.radius = panel->area.height/2; + panel->area.bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); + panel->area.bg->border.radius = panel->area.height / 2; } - } - else { + } else { int old_panel_height = panel->area.height; - if (panel->pourcentx) + if (panel->fractional_width) panel->area.height = (float)server.monitor[panel->monitor].height * panel->area.width / 100; else panel->area.height = panel->area.width; - if (panel->pourcenty) + + if (panel->fractional_height) panel->area.width = (float)server.monitor[panel->monitor].width * old_panel_height / 100; else panel->area.width = old_panel_height; + if (panel->area.height + panel->marginy > server.monitor[panel->monitor].height) panel->area.height = server.monitor[panel->monitor].height - panel->marginy; - if (panel->area.bg->border.radius > panel->area.width/2) { + + if (panel->area.bg->border.radius > panel->area.width / 2) { printf("panel_background_id rounded is too big... please fix your tint2rc\n"); g_array_append_val(backgrounds, *panel->area.bg); - panel->area.bg = &g_array_index(backgrounds, Background, backgrounds->len-1); - panel->area.bg->border.radius = panel->area.width/2; + panel->area.bg = &g_array_index(backgrounds, Background, backgrounds->len - 1); + panel->area.bg->border.radius = panel->area.width / 2; } } // panel position determined here if (panel_position & LEFT) { panel->posx = server.monitor[panel->monitor].x + panel->marginx; - } - else { + } else { if (panel_position & RIGHT) { - panel->posx = server.monitor[panel->monitor].x + server.monitor[panel->monitor].width - panel->area.width - panel->marginx; - } - else { + panel->posx = server.monitor[panel->monitor].x + server.monitor[panel->monitor].width - panel->area.width - + panel->marginx; + } else { if (panel_horizontal) - panel->posx = server.monitor[panel->monitor].x + ((server.monitor[panel->monitor].width - panel->area.width) / 2); + panel->posx = + server.monitor[panel->monitor].x + ((server.monitor[panel->monitor].width - panel->area.width) / 2); else panel->posx = server.monitor[panel->monitor].x + panel->marginx; } } if (panel_position & TOP) { panel->posy = server.monitor[panel->monitor].y + panel->marginy; - } - else { + } else { if (panel_position & BOTTOM) { - panel->posy = server.monitor[panel->monitor].y + server.monitor[panel->monitor].height - panel->area.height - panel->marginy; - } - else { - panel->posy = server.monitor[panel->monitor].y + ((server.monitor[panel->monitor].height - panel->area.height) / 2); + panel->posy = server.monitor[panel->monitor].y + server.monitor[panel->monitor].height - + panel->area.height - panel->marginy; + } else { + panel->posy = + server.monitor[panel->monitor].y + ((server.monitor[panel->monitor].height - panel->area.height) / 2); } } @@ -324,41 +332,38 @@ void init_panel_size_and_position(Panel *panel) if (panel_horizontal) { panel->hidden_width = panel->area.width; panel->hidden_height = panel->area.height - diff; - } - else { + } else { panel->hidden_width = panel->area.width - diff; panel->hidden_height = panel->area.height; } - // printf("panel : posx %d, posy %d, width %d, height %d\n", panel->posx, panel->posy, panel->area.width, panel->area.height); + // printf("panel : posx %d, posy %d, width %d, height %d\n", panel->posx, panel->posy, panel->area.width, + // panel->area.height); } - -int resize_panel(void *obj) +gboolean resize_panel(void *obj) { - Panel *panel = (Panel*)obj; + Panel *panel = (Panel *)obj; relayout_with_constraint(&panel->area, 0); - - //printf("resize_panel\n"); - if (panel_mode != MULTI_DESKTOP && taskbar_enabled) { + + // printf("resize_panel\n"); + if (taskbar_mode != MULTI_DESKTOP && taskbar_enabled) { // propagate width/height on hidden taskbar - int i, width, height; - width = panel->taskbar[server.desktop].area.width; - height = panel->taskbar[server.desktop].area.height; - for (i=0 ; i < panel->nb_desktop ; i++) { + int width = panel->taskbar[server.desktop].area.width; + int height = panel->taskbar[server.desktop].area.height; + for (int i = 0; i < panel->num_desktops; i++) { panel->taskbar[i].area.width = width; panel->taskbar[i].area.height = height; panel->taskbar[i].area.resize_needed = 1; } } - if (panel_mode == MULTI_DESKTOP && taskbar_enabled && taskbar_distribute_size) { + if (taskbar_mode == MULTI_DESKTOP && taskbar_enabled && taskbar_distribute_size) { // Distribute the available space between taskbars // Compute the total available size, and the total size requested by the taskbars int total_size = 0; int total_name_size = 0; int total_items = 0; - int i; - for (i = 0; i < panel->nb_desktop; i++) { + for (int i = 0; i < panel->num_desktops; i++) { if (panel_horizontal) { total_size += panel->taskbar[i].area.width; } else { @@ -368,7 +373,7 @@ int resize_panel(void *obj) Taskbar *taskbar = &panel->taskbar[i]; GList *l; for (l = taskbar->area.children; l; l = l->next) { - Area *child = l->data; + Area *child = (Area *)l->data; if (!child->on_screen) continue; total_items++; @@ -376,7 +381,7 @@ int resize_panel(void *obj) if (taskbarname_enabled) { if (taskbar->area.children) { total_items--; - Area *name = taskbar->area.children->data; + Area *name = (Area *)taskbar->area.children->data; if (panel_horizontal) { total_name_size += name->width; } else { @@ -390,13 +395,13 @@ int resize_panel(void *obj) if (total_items) { int actual_name_size; if (total_name_size <= total_size) { - actual_name_size = total_name_size / panel->nb_desktop; + actual_name_size = total_name_size / panel->num_desktops; } else { - actual_name_size = total_size / panel->nb_desktop; + actual_name_size = total_size / panel->num_desktops; } total_size -= total_name_size; - for (i = 0; i < panel->nb_desktop; i++) { + for (int i = 0; i < panel->num_desktops; i++) { Taskbar *taskbar = &panel->taskbar[i]; int requested_size = (2 * taskbar->area.bg->border.width) + (2 * taskbar->area.paddingxlr); @@ -405,7 +410,7 @@ int resize_panel(void *obj) if (taskbarname_enabled) l = l->next; for (; l; l = l->next) { - Area *child = l->data; + Area *child = (Area *)l->data; if (!child->on_screen) continue; items++; @@ -432,11 +437,10 @@ int resize_panel(void *obj) } if (panel->freespace.area.on_screen) resize_freespace(&panel->freespace); - return 0; + return FALSE; } - -void update_strut(Panel* p) +void update_strut(Panel *p) { if (panel_strut_policy == STRUT_NONE) { XDeleteProperty(server.dsp, p->main_win, server.atom._NET_WM_STRUT); @@ -450,7 +454,7 @@ void update_strut(Panel* p) int d3; XGetGeometry(server.dsp, server.root_win, &d2, &d3, &d3, &screen_width, &screen_height, &d1, &d1); Monitor monitor = server.monitor[p->monitor]; - long struts [12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + long struts[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; if (panel_horizontal) { int height = p->area.height + p->marginy; if (panel_strut_policy == STRUT_MINIMUM || (panel_strut_policy == STRUT_FOLLOW_SIZE && p->is_hidden)) @@ -460,15 +464,13 @@ void update_strut(Panel* p) struts[8] = p->posx; // p->area.width - 1 allowed full screen on monitor 2 struts[9] = p->posx + p->area.width - 1; - } - else { + } else { struts[3] = height + screen_height - monitor.y - monitor.height; struts[10] = p->posx; // p->area.width - 1 allowed full screen on monitor 2 struts[11] = p->posx + p->area.width - 1; } - } - else { + } else { int width = p->area.width + p->marginx; if (panel_strut_policy == STRUT_MINIMUM || (panel_strut_policy == STRUT_FOLLOW_SIZE && p->is_hidden)) width = p->hidden_width; @@ -477,8 +479,7 @@ void update_strut(Panel* p) struts[4] = p->posy; // p->area.width - 1 allowed full screen on monitor 2 struts[5] = p->posy + p->area.height - 1; - } - else { + } else { struts[1] = width + screen_width - monitor.x - monitor.width; struts[6] = p->posy; // p->area.width - 1 allowed full screen on monitor 2 @@ -486,35 +487,46 @@ void update_strut(Panel* p) } } // Old specification : fluxbox need _NET_WM_STRUT. - XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STRUT, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 4); - XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 12); + XChangeProperty(server.dsp, + p->main_win, + server.atom._NET_WM_STRUT, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char *)&struts, + 4); + XChangeProperty(server.dsp, + p->main_win, + server.atom._NET_WM_STRUT_PARTIAL, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char *)&struts, + 12); } - void set_panel_items_order(Panel *p) { - int k, j; - if (p->area.children) { g_list_free(p->area.children); p->area.children = 0; } - for (k=0 ; k < strlen(panel_items_order) ; k++) { + for (int k = 0; k < strlen(panel_items_order); k++) { if (panel_items_order[k] == 'L') { p->area.children = g_list_append(p->area.children, &p->launcher); p->launcher.area.resize_needed = 1; } if (panel_items_order[k] == 'T') { - for (j=0 ; j < p->nb_desktop ; j++) + for (int j = 0; j < p->num_desktops; j++) p->area.children = g_list_append(p->area.children, &p->taskbar[j]); } #ifdef ENABLE_BATTERY - if (panel_items_order[k] == 'B') + if (panel_items_order[k] == 'B') p->area.children = g_list_append(p->area.children, &p->battery); #endif - int i = p - panel1; - if (panel_items_order[k] == 'S' && systray_on_monitor(i, nb_panel)) { + int i = p - panels; + if (panel_items_order[k] == 'S' && systray_on_monitor(i, num_panels)) { p->area.children = g_list_append(p->area.children, &systray); } if (panel_items_order[k] == 'C') @@ -525,36 +537,69 @@ void set_panel_items_order(Panel *p) initialize_positions(&p->area, 0); } - void set_panel_properties(Panel *p) { - XStoreName (server.dsp, p->main_win, panel_window_name); - XSetIconName (server.dsp, p->main_win, panel_window_name); + XStoreName(server.dsp, p->main_win, panel_window_name); + XSetIconName(server.dsp, p->main_win, panel_window_name); gsize len; gchar *name = g_locale_to_utf8(panel_window_name, -1, NULL, &len, NULL); if (name != NULL) { - XChangeProperty(server.dsp, p->main_win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len); - XChangeProperty(server.dsp, p->main_win, server.atom._NET_WM_ICON_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len); + XChangeProperty(server.dsp, + p->main_win, + server.atom._NET_WM_NAME, + server.atom.UTF8_STRING, + 8, + PropModeReplace, + (unsigned char *)name, + (int)len); + XChangeProperty(server.dsp, + p->main_win, + server.atom._NET_WM_ICON_NAME, + server.atom.UTF8_STRING, + 8, + PropModeReplace, + (unsigned char *)name, + (int)len); g_free(name); } // Dock - long val = (!panel_dock && panel_layer == NORMAL_LAYER) - ? server.atom._NET_WM_WINDOW_TYPE_SPLASH - : server.atom._NET_WM_WINDOW_TYPE_DOCK; - XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &val, 1); + long val = (!panel_dock && panel_layer == NORMAL_LAYER) ? server.atom._NET_WM_WINDOW_TYPE_SPLASH + : server.atom._NET_WM_WINDOW_TYPE_DOCK; + XChangeProperty(server.dsp, + p->main_win, + server.atom._NET_WM_WINDOW_TYPE, + XA_ATOM, + 32, + PropModeReplace, + (unsigned char *)&val, + 1); val = ALLDESKTOP; - XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_DESKTOP, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1); + XChangeProperty(server.dsp, + p->main_win, + server.atom._NET_WM_DESKTOP, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char *)&val, + 1); Atom state[4]; state[0] = server.atom._NET_WM_STATE_SKIP_PAGER; state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR; state[2] = server.atom._NET_WM_STATE_STICKY; state[3] = panel_layer == BOTTOM_LAYER ? server.atom._NET_WM_STATE_BELOW : server.atom._NET_WM_STATE_ABOVE; - int nb_atoms = panel_layer == NORMAL_LAYER ? 3 : 4; - XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nb_atoms); + int num_atoms = panel_layer == NORMAL_LAYER ? 3 : 4; + XChangeProperty(server.dsp, + p->main_win, + server.atom._NET_WM_STATE, + XA_ATOM, + 32, + PropModeReplace, + (unsigned char *)state, + num_atoms); XWMHints wmhints; memset(&wmhints, 0, sizeof(wmhints)); @@ -571,12 +616,26 @@ void set_panel_properties(Panel *p) XSetWMHints(server.dsp, p->main_win, &wmhints); // Undecorated - long prop[5] = { 2, 0, 0, 0, 0 }; - XChangeProperty(server.dsp, p->main_win, server.atom._MOTIF_WM_HINTS, server.atom._MOTIF_WM_HINTS, 32, PropModeReplace, (unsigned char *) prop, 5); + long prop[5] = {2, 0, 0, 0, 0}; + XChangeProperty(server.dsp, + p->main_win, + server.atom._MOTIF_WM_HINTS, + server.atom._MOTIF_WM_HINTS, + 32, + PropModeReplace, + (unsigned char *)prop, + 5); // XdndAware - Register for Xdnd events - Atom version=4; - XChangeProperty(server.dsp, p->main_win, server.atom.XdndAware, XA_ATOM, 32, PropModeReplace, (unsigned char*)&version, 1); + Atom version = 4; + XChangeProperty(server.dsp, + p->main_win, + server.atom.XdndAware, + XA_ATOM, + 32, + PropModeReplace, + (unsigned char *)&version, + 1); update_strut(p); @@ -585,7 +644,7 @@ void set_panel_properties(Panel *p) int minwidth = panel_autohide ? p->hidden_width : p->area.width; int minheight = panel_autohide ? p->hidden_height : p->area.height; XSizeHints size_hints; - size_hints.flags = PPosition|PMinSize|PMaxSize; + size_hints.flags = PPosition | PMinSize | PMaxSize; size_hints.min_width = minwidth; size_hints.max_width = p->area.width; size_hints.min_height = minheight; @@ -593,29 +652,28 @@ void set_panel_properties(Panel *p) XSetWMNormalHints(server.dsp, p->main_win, &size_hints); // Set WM_CLASS - XClassHint* classhint = XAllocClassHint(); - classhint->res_name = "tint2"; - classhint->res_class = "Tint2"; + XClassHint *classhint = XAllocClassHint(); + classhint->res_name = (char *)"tint2"; + classhint->res_class = (char *)"Tint2"; XSetClassHint(server.dsp, p->main_win, classhint); XFree(classhint); } - void set_panel_background(Panel *p) { - if (p->area.pix) XFreePixmap (server.dsp, p->area.pix); - p->area.pix = XCreatePixmap (server.dsp, server.root_win, p->area.width, p->area.height, server.depth); + if (p->area.pix) + XFreePixmap(server.dsp, p->area.pix); + p->area.pix = XCreatePixmap(server.dsp, server.root_win, p->area.width, p->area.height, server.depth); - int xoff=0, yoff=0; + int xoff = 0, yoff = 0; if (panel_horizontal && panel_position & BOTTOM) - yoff = p->area.height-p->hidden_height; + yoff = p->area.height - p->hidden_height; else if (!panel_horizontal && panel_position & RIGHT) - xoff = p->area.width-p->hidden_width; + xoff = p->area.width - p->hidden_width; if (server.real_transparency) { clear_pixmap(p->area.pix, 0, 0, p->area.width, p->area.height); - } - else { + } else { get_root_pixmap(); // copy background (server.root_pmap) in panel.area.pix Window dummy; @@ -630,110 +688,107 @@ void set_panel_background(Panel *p) } // draw background panel - cairo_surface_t *cs; - cairo_t *c; - cs = cairo_xlib_surface_create (server.dsp, p->area.pix, server.visual, p->area.width, p->area.height); - c = cairo_create (cs); + cairo_surface_t *cs = cairo_xlib_surface_create(server.dsp, p->area.pix, server.visual, p->area.width, p->area.height); + cairo_t *c = cairo_create(cs); draw_background(&p->area, c); - cairo_destroy (c); - cairo_surface_destroy (cs); + cairo_destroy(c); + cairo_surface_destroy(cs); if (panel_autohide) { - if (p->hidden_pixmap) XFreePixmap(server.dsp, p->hidden_pixmap); + if (p->hidden_pixmap) + XFreePixmap(server.dsp, p->hidden_pixmap); p->hidden_pixmap = XCreatePixmap(server.dsp, server.root_win, p->hidden_width, p->hidden_height, server.depth); - XCopyArea(server.dsp, p->area.pix, p->hidden_pixmap, server.gc, xoff, yoff, p->hidden_width, p->hidden_height, 0, 0); + XCopyArea(server.dsp, + p->area.pix, + p->hidden_pixmap, + server.gc, + xoff, + yoff, + p->hidden_width, + p->hidden_height, + 0, + 0); } // redraw panel's object - GList *l0; - Area *a; - for (l0 = p->area.children; l0 ; l0 = l0->next) { - a = l0->data; + for (GList *l = p->area.children; l; l = l->next) { + Area *a = (Area *)l->data; schedule_redraw(a); } - + // reset task/taskbar 'state_pix' - int i, k; - Taskbar *tskbar; - for (i=0 ; i < p->nb_desktop ; i++) { - tskbar = &p->taskbar[i]; - for (k=0; kstate_pix[k]) XFreePixmap(server.dsp, tskbar->state_pix[k]); - tskbar->state_pix[k] = 0; - if (tskbar->bar_name.state_pix[k]) XFreePixmap(server.dsp, tskbar->bar_name.state_pix[k]); - tskbar->bar_name.state_pix[k] = 0; + Taskbar *taskbar; + for (int i = 0; i < p->num_desktops; i++) { + taskbar = &p->taskbar[i]; + for (int k = 0; k < TASKBAR_STATE_COUNT; ++k) { + if (taskbar->state_pix[k]) + XFreePixmap(server.dsp, taskbar->state_pix[k]); + taskbar->state_pix[k] = 0; + if (taskbar->bar_name.state_pix[k]) + XFreePixmap(server.dsp, taskbar->bar_name.state_pix[k]); + taskbar->bar_name.state_pix[k] = 0; } - tskbar->area.pix = 0; - tskbar->bar_name.area.pix = 0; - l0 = tskbar->area.children; - if (taskbarname_enabled) l0 = l0->next; - for (; l0 ; l0 = l0->next) { - set_task_redraw((Task *)l0->data); + taskbar->area.pix = 0; + taskbar->bar_name.area.pix = 0; + GList *l = taskbar->area.children; + if (taskbarname_enabled) + l = l->next; + for (; l; l = l->next) { + set_task_redraw((Task *)l->data); } } } - Panel *get_panel(Window win) { - int i; - for (i=0 ; i < nb_panel ; i++) { - if (panel1[i].main_win == win) { - return &panel1[i]; + for (int i = 0; i < num_panels; i++) { + if (panels[i].main_win == win) { + return &panels[i]; } } return 0; } - -Taskbar *click_taskbar (Panel *panel, int x, int y) +Taskbar *click_taskbar(Panel *panel, int x, int y) { - Taskbar *tskbar; - int i; - if (panel_horizontal) { - for (i=0; i < panel->nb_desktop ; i++) { - tskbar = &panel->taskbar[i]; - if (tskbar->area.on_screen && x >= tskbar->area.posx && x <= (tskbar->area.posx + tskbar->area.width)) - return tskbar; + for (int i = 0; i < panel->num_desktops; i++) { + Taskbar *taskbar = &panel->taskbar[i]; + if (taskbar->area.on_screen && x >= taskbar->area.posx && x <= (taskbar->area.posx + taskbar->area.width)) + return taskbar; } - } - else { - for (i=0; i < panel->nb_desktop ; i++) { - tskbar = &panel->taskbar[i]; - if (tskbar->area.on_screen && y >= tskbar->area.posy && y <= (tskbar->area.posy + tskbar->area.height)) - return tskbar; + } else { + for (int i = 0; i < panel->num_desktops; i++) { + Taskbar *taskbar = &panel->taskbar[i]; + if (taskbar->area.on_screen && y >= taskbar->area.posy && y <= (taskbar->area.posy + taskbar->area.height)) + return taskbar; } } return NULL; } - -Task *click_task (Panel *panel, int x, int y) +Task *click_task(Panel *panel, int x, int y) { - GList *l0; - Taskbar *tskbar; - - if ( (tskbar = click_taskbar(panel, x, y)) ) { + Taskbar *taskbar = click_taskbar(panel, x, y); + if (taskbar) { if (panel_horizontal) { - Task *tsk; - l0 = tskbar->area.children; - if (taskbarname_enabled) l0 = l0->next; - for (; l0 ; l0 = l0->next) { - tsk = l0->data; - if (tsk->area.on_screen && x >= tsk->area.posx && x <= (tsk->area.posx + tsk->area.width)) { - return tsk; + GList *l = taskbar->area.children; + if (taskbarname_enabled) + l = l->next; + for (; l; l = l->next) { + Task *task = (Task *)l->data; + if (task->area.on_screen && x >= task->area.posx && x <= (task->area.posx + task->area.width)) { + return task; } } - } - else { - Task *tsk; - l0 = tskbar->area.children; - if (taskbarname_enabled) l0 = l0->next; - for (; l0 ; l0 = l0->next) { - tsk = l0->data; - if (tsk->area.on_screen && y >= tsk->area.posy && y <= (tsk->area.posy + tsk->area.height)) { - return tsk; + } else { + GList *l = taskbar->area.children; + if (taskbarname_enabled) + l = l->next; + for (; l; l = l->next) { + Task *task = (Task *)l->data; + if (task->area.on_screen && y >= task->area.posy && y <= (task->area.posy + task->area.height)) { + return task; } } } @@ -741,36 +796,29 @@ Task *click_task (Panel *panel, int x, int y) return NULL; } - -Launcher *click_launcher (Panel *panel, int x, int y) +Launcher *click_launcher(Panel *panel, int x, int y) { Launcher *launcher = &panel->launcher; - + if (panel_horizontal) { if (launcher->area.on_screen && x >= launcher->area.posx && x <= (launcher->area.posx + launcher->area.width)) return launcher; - } - else { + } else { if (launcher->area.on_screen && y >= launcher->area.posy && y <= (launcher->area.posy + launcher->area.height)) return launcher; } return NULL; } - -LauncherIcon *click_launcher_icon (Panel *panel, int x, int y) +LauncherIcon *click_launcher_icon(Panel *panel, int x, int y) { - GSList *l0; - Launcher *launcher; + Launcher *launcher = click_launcher(panel, x, y); - //printf("Click x=%d y=%d\n", x, y); - if ( (launcher = click_launcher(panel, x, y)) ) { - LauncherIcon *icon; - for (l0 = launcher->list_icons; l0 ; l0 = l0->next) { - icon = l0->data; + if (launcher) { + for (GSList *l = launcher->list_icons; l; l = l->next) { + LauncherIcon *icon = (LauncherIcon *)l->data; if (x >= (launcher->area.posx + icon->x) && x <= (launcher->area.posx + icon->x + icon->icon_size) && y >= (launcher->area.posy + icon->y) && y <= (launcher->area.posy + icon->y + icon->icon_size)) { - //printf("Hit rect x=%d y=%d xmax=%d ymax=%d\n", launcher->area.posx + icon->x, launcher->area.posy + icon->y, launcher->area.posx + icon->x + icon->width, launcher->area.posy + icon->y + icon->height); return icon; } } @@ -778,62 +826,57 @@ LauncherIcon *click_launcher_icon (Panel *panel, int x, int y) return NULL; } - -int click_padding(Panel *panel, int x, int y) +gboolean click_padding(Panel *panel, int x, int y) { if (panel_horizontal) { - if (x < panel->area.paddingxlr || x > panel->area.width-panel->area.paddingxlr) - return 1; - } - else { - if (y < panel->area.paddingxlr || y > panel->area.height-panel->area.paddingxlr) - return 1; - } - return 0; -} - - -int click_clock(Panel *panel, int x, int y) -{ - Clock clk = panel->clock; - if (panel_horizontal) { - if (clk.area.on_screen && x >= clk.area.posx && x <= (clk.area.posx + clk.area.width)) + if (x < panel->area.paddingxlr || x > panel->area.width - panel->area.paddingxlr) return TRUE; } else { - if (clk.area.on_screen && y >= clk.area.posy && y <= (clk.area.posy + clk.area.height)) + if (y < panel->area.paddingxlr || y > panel->area.height - panel->area.paddingxlr) return TRUE; } return FALSE; } +int click_clock(Panel *panel, int x, int y) +{ + Clock *clock = &panel->clock; + if (panel_horizontal) { + if (clock->area.on_screen && x >= clock->area.posx && x <= (clock->area.posx + clock->area.width)) + return TRUE; + } else { + if (clock->area.on_screen && y >= clock->area.posy && y <= (clock->area.posy + clock->area.height)) + return TRUE; + } + return FALSE; +} #ifdef ENABLE_BATTERY int click_battery(Panel *panel, int x, int y) { - Battery bat = panel->battery; + Battery *bat = &panel->battery; if (panel_horizontal) { - if (bat.area.on_screen && x >= bat.area.posx && x <= (bat.area.posx + bat.area.width)) + if (bat->area.on_screen && x >= bat->area.posx && x <= (bat->area.posx + bat->area.width)) return TRUE; } else { - if (bat.area.on_screen && y >= bat.area.posy && y <= (bat.area.posy + bat.area.height)) + if (bat->area.on_screen && y >= bat->area.posy && y <= (bat->area.posy + bat->area.height)) return TRUE; } return FALSE; } #endif - -Area* click_area(Panel *panel, int x, int y) +Area *click_area(Panel *panel, int x, int y) { - Area* result = &panel->area; - Area* new_result = result; + Area *result = &panel->area; + Area *new_result = result; do { result = new_result; - GList* it = result->children; + GList *it = result->children; while (it) { - Area* a = (Area*)it->data; - if (a->on_screen && x >= a->posx && x <= (a->posx + a->width) - && y >= a->posy && y <= (a->posy + a->height)) { + Area *a = (Area *)it->data; + if (a->on_screen && x >= a->posx && x <= (a->posx + a->width) && y >= a->posy && + y <= (a->posy + a->height)) { new_result = a; break; } @@ -843,75 +886,88 @@ Area* click_area(Panel *panel, int x, int y) return result; } - -void stop_autohide_timeout(Panel* p) +void stop_autohide_timeout(Panel *p) { stop_timeout(p->autohide_timeout); } - -void autohide_show(void* p) +void autohide_show(void *p) { - Panel* panel = p; + Panel *panel = (Panel *)p; stop_autohide_timeout(panel); panel->is_hidden = 0; - XMapSubwindows(server.dsp, panel->main_win); // systray windows + XMapSubwindows(server.dsp, panel->main_win); // systray windows if (panel_horizontal) { if (panel_position & TOP) XResizeWindow(server.dsp, panel->main_win, panel->area.width, panel->area.height); else - XMoveResizeWindow(server.dsp, panel->main_win, panel->posx, panel->posy, panel->area.width, panel->area.height); - } - else { + XMoveResizeWindow(server.dsp, + panel->main_win, + panel->posx, + panel->posy, + panel->area.width, + panel->area.height); + } else { if (panel_position & LEFT) XResizeWindow(server.dsp, panel->main_win, panel->area.width, panel->area.height); else - XMoveResizeWindow(server.dsp, panel->main_win, panel->posx, panel->posy, panel->area.width, panel->area.height); + XMoveResizeWindow(server.dsp, + panel->main_win, + panel->posx, + panel->posy, + panel->area.width, + panel->area.height); } if (panel_strut_policy == STRUT_FOLLOW_SIZE) - update_strut(p); - refresh_systray = 1; // ugly hack, because we actually only need to call XSetBackgroundPixmap - panel_refresh = 1; + update_strut(panel); + refresh_systray = TRUE; // ugly hack, because we actually only need to call XSetBackgroundPixmap + panel_refresh = TRUE; } - -void autohide_hide(void* p) +void autohide_hide(void *p) { - Panel* panel = p; + Panel *panel = (Panel *)p; stop_autohide_timeout(panel); - panel->is_hidden = 1; + panel->is_hidden = TRUE; if (panel_strut_policy == STRUT_FOLLOW_SIZE) - update_strut(p); + update_strut(panel); - XUnmapSubwindows(server.dsp, panel->main_win); // systray windows + XUnmapSubwindows(server.dsp, panel->main_win); // systray windows int diff = (panel_horizontal ? panel->area.height : panel->area.width) - panel_autohide_height; - //printf("autohide_hide : diff %d, w %d, h %d\n", diff, panel->hidden_width, panel->hidden_height); + // printf("autohide_hide : diff %d, w %d, h %d\n", diff, panel->hidden_width, panel->hidden_height); if (panel_horizontal) { if (panel_position & TOP) XResizeWindow(server.dsp, panel->main_win, panel->hidden_width, panel->hidden_height); else - XMoveResizeWindow(server.dsp, panel->main_win, panel->posx, panel->posy+diff, panel->hidden_width, panel->hidden_height); - } - else { + XMoveResizeWindow(server.dsp, + panel->main_win, + panel->posx, + panel->posy + diff, + panel->hidden_width, + panel->hidden_height); + } else { if (panel_position & LEFT) XResizeWindow(server.dsp, panel->main_win, panel->hidden_width, panel->hidden_height); else - XMoveResizeWindow(server.dsp, panel->main_win, panel->posx+diff, panel->posy, panel->hidden_width, panel->hidden_height); + XMoveResizeWindow(server.dsp, + panel->main_win, + panel->posx + diff, + panel->posy, + panel->hidden_width, + panel->hidden_height); } - panel_refresh = 1; + panel_refresh = TRUE; } - -void autohide_trigger_show(Panel* p) +void autohide_trigger_show(Panel *p) { if (!p) return; change_timeout(&p->autohide_timeout, panel_autohide_show_timeout, 0, autohide_show, p); } - -void autohide_trigger_hide(Panel* p) +void autohide_trigger_hide(Panel *p) { if (!p) return; @@ -920,7 +976,8 @@ void autohide_trigger_hide(Panel* p) int xr, yr, xw, yw; unsigned int mask; if (XQueryPointer(server.dsp, p->main_win, &root, &child, &xr, &yr, &xw, &yw, &mask)) - if (child) return; // mouse over one of the system tray icons + if (child) + return; // mouse over one of the system tray icons change_timeout(&p->autohide_timeout, panel_autohide_hide_timeout, 0, autohide_hide, p); } diff --git a/src/panel.h b/src/panel.h index 42b591c..543d73a 100644 --- a/src/panel.h +++ b/src/panel.h @@ -26,72 +26,78 @@ #include "battery.h" #endif - extern int signal_pending; // -------------------------------------------------- // mouse events -extern int mouse_left; -extern int mouse_middle; -extern int mouse_right; -extern int mouse_scroll_up; -extern int mouse_scroll_down; -extern int mouse_tilt_left; -extern int mouse_tilt_right; +extern MouseAction mouse_left; +extern MouseAction mouse_middle; +extern MouseAction mouse_right; +extern MouseAction mouse_scroll_up; +extern MouseAction mouse_scroll_down; +extern MouseAction mouse_tilt_left; +extern MouseAction mouse_tilt_right; -//panel mode -enum { SINGLE_DESKTOP=0, MULTI_DESKTOP }; -enum { BOTTOM_LAYER, NORMAL_LAYER, TOP_LAYER }; -extern int panel_mode; -extern int wm_menu; -extern int panel_dock; -extern int panel_layer; +// panel mode +typedef enum TaskbarMode { + SINGLE_DESKTOP = 0, + MULTI_DESKTOP, +} TaskbarMode; + +typedef enum Layer { + BOTTOM_LAYER, + NORMAL_LAYER, + TOP_LAYER, +} Layer; + +// panel position +typedef enum PanelPosition { + LEFT = 0x01, + RIGHT = 0x02, + CENTER = 0X04, + TOP = 0X08, + BOTTOM = 0x10, +} PanelPosition; + +typedef enum Strut { + STRUT_MINIMUM, + STRUT_FOLLOW_SIZE, + STRUT_NONE, +} Strut; + +extern TaskbarMode taskbar_mode; +extern gboolean wm_menu; +extern gboolean panel_dock; +extern Layer panel_layer; extern char *panel_window_name; - -//panel position -enum { LEFT=0x01, RIGHT=0x02, CENTER=0X04, TOP=0X08, BOTTOM=0x10 }; -extern int panel_position; -extern int panel_horizontal; - -extern int panel_refresh; -extern int task_dragged; - -//panel autohide -enum { STRUT_MINIMUM, STRUT_FOLLOW_SIZE, STRUT_NONE }; -extern int panel_autohide; +extern PanelPosition panel_position; +extern gboolean panel_horizontal; +extern gboolean panel_refresh; +extern gboolean task_dragged; +extern gboolean panel_autohide; extern int panel_autohide_show_timeout; extern int panel_autohide_hide_timeout; -extern int panel_autohide_height; // for vertical panels this is of course the width -extern int panel_strut_policy; +extern int panel_autohide_height; // for vertical panels this is of course the width +extern Strut panel_strut_policy; extern char *panel_items_order; - -extern int max_tick_urgent; - -extern GArray* backgrounds; - +extern int max_tick_urgent; +extern GArray *backgrounds; extern Imlib_Image default_icon; // TODO maybe this should be a config option #define DEFAULT_FONT "sans 10" - -// tint2 use one panel per monitor and one taskbar per desktop. -typedef struct { - // always start with area - // area.list own all objects of the panel according to config file +typedef struct Panel { Area area; - // -------------------------------------------------- - // panel Window main_win; Pixmap temp_pmap; // position relative to root window int posx, posy; int marginx, marginy; - int pourcentx, pourcenty; - // location of the panel (monitor number) + int fractional_width, fractional_height; int monitor; int font_shadow; - int mouse_effects; + gboolean mouse_effects; // Mouse effects for icons int mouse_over_alpha; int mouse_over_saturation; @@ -100,46 +106,34 @@ typedef struct { int mouse_pressed_saturation; int mouse_pressed_brightness; - // -------------------------------------------------- - // task and taskbar parameter per panel - Global_taskbar g_taskbar; - Global_task g_task; + // Per-panel parameters and states for Taskbar and Task + GlobalTaskbar g_taskbar; + GlobalTask g_task; - // -------------------------------------------------- - // taskbar point to the first taskbar in panel.area.list. - // number of tasbar == nb_desktop. taskbar[i] is for desktop(i). - // taskbar[i] is used to loop over taskbar, - // while panel->area.list is used to loop over all panel's objects + // Array of Taskbar, with num_desktops items Taskbar *taskbar; - int nb_desktop; + int num_desktops; PangoFontDescription *taskbarname_font_desc; - // -------------------------------------------------- - // clock Clock clock; - // -------------------------------------------------- - // battery #ifdef ENABLE_BATTERY Battery battery; #endif Launcher launcher; - FreeSpace freespace; - // autohide - int is_hidden; + // Autohide + gboolean is_hidden; int hidden_width, hidden_height; Pixmap hidden_pixmap; - timeout* autohide_timeout; + timeout *autohide_timeout; } Panel; - extern Panel panel_config; -extern Panel *panel1; -extern int nb_panel; - +extern Panel *panels; +extern int num_panels; // default global data void default_panel(); @@ -152,7 +146,7 @@ void cleanup_panel(); void init_panel(); void init_panel_size_and_position(Panel *panel); -int resize_panel(void *obj); +gboolean resize_panel(void *obj); void render_panel(Panel *panel); void set_panel_items_order(Panel *p); @@ -164,22 +158,22 @@ void set_panel_background(Panel *p); // detect witch panel Panel *get_panel(Window win); -Taskbar *click_taskbar (Panel *panel, int x, int y); -Task *click_task (Panel *panel, int x, int y); -Launcher *click_launcher (Panel *panel, int x, int y); -LauncherIcon *click_launcher_icon (Panel *panel, int x, int y); -int click_padding(Panel *panel, int x, int y); -int click_clock(Panel *panel, int x, int y); +Taskbar *click_taskbar(Panel *panel, int x, int y); +Task *click_task(Panel *panel, int x, int y); +Launcher *click_launcher(Panel *panel, int x, int y); +LauncherIcon *click_launcher_icon(Panel *panel, int x, int y); +gboolean click_padding(Panel *panel, int x, int y); +gboolean click_clock(Panel *panel, int x, int y); #ifdef ENABLE_BATTERY -int click_battery(Panel *panel, int x, int y); +gboolean click_battery(Panel *panel, int x, int y); #endif -Area* click_area(Panel *panel, int x, int y); +Area *click_area(Panel *panel, int x, int y); -void autohide_show(void* p); -void autohide_hide(void* p); -void autohide_trigger_show(Panel* p); -void autohide_trigger_hide(Panel* p); +void autohide_show(void *p); +void autohide_hide(void *p); +void autohide_trigger_show(Panel *p); +void autohide_trigger_hide(Panel *p); #endif diff --git a/src/server.c b/src/server.c index dff25cc..73f6c89 100644 --- a/src/server.c +++ b/src/server.c @@ -21,7 +21,6 @@ #include #include - #include #include #include @@ -32,53 +31,55 @@ Server_global server; -void server_catch_error (Display *d, XErrorEvent *ev){} - -void server_init_atoms () +void server_catch_error(Display *d, XErrorEvent *ev) { - server.atom._XROOTPMAP_ID = XInternAtom (server.dsp, "_XROOTPMAP_ID", False); - server.atom._XROOTMAP_ID = XInternAtom (server.dsp, "_XROOTMAP_ID", False); - server.atom._NET_CURRENT_DESKTOP = XInternAtom (server.dsp, "_NET_CURRENT_DESKTOP", False); - server.atom._NET_NUMBER_OF_DESKTOPS = XInternAtom (server.dsp, "_NET_NUMBER_OF_DESKTOPS", False); - server.atom._NET_DESKTOP_NAMES = XInternAtom (server.dsp, "_NET_DESKTOP_NAMES", False); - server.atom._NET_DESKTOP_GEOMETRY = XInternAtom (server.dsp, "_NET_DESKTOP_GEOMETRY", False); - server.atom._NET_DESKTOP_VIEWPORT = XInternAtom (server.dsp, "_NET_DESKTOP_VIEWPORT", False); - server.atom._NET_ACTIVE_WINDOW = XInternAtom (server.dsp, "_NET_ACTIVE_WINDOW", False); - server.atom._NET_WM_WINDOW_TYPE = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE", False); - server.atom._NET_WM_STATE_SKIP_PAGER = XInternAtom (server.dsp, "_NET_WM_STATE_SKIP_PAGER", False); - server.atom._NET_WM_STATE_SKIP_TASKBAR = XInternAtom (server.dsp, "_NET_WM_STATE_SKIP_TASKBAR", False); - server.atom._NET_WM_STATE_STICKY = XInternAtom (server.dsp, "_NET_WM_STATE_STICKY", False); - server.atom._NET_WM_STATE_DEMANDS_ATTENTION = XInternAtom (server.dsp, "_NET_WM_STATE_DEMANDS_ATTENTION", False); - server.atom._NET_WM_WINDOW_TYPE_DOCK = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_DOCK", False); - server.atom._NET_WM_WINDOW_TYPE_DESKTOP = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_DESKTOP", False); - server.atom._NET_WM_WINDOW_TYPE_TOOLBAR = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_TOOLBAR", False); - server.atom._NET_WM_WINDOW_TYPE_MENU = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_MENU", False); - server.atom._NET_WM_WINDOW_TYPE_SPLASH = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_SPLASH", False); - server.atom._NET_WM_WINDOW_TYPE_DIALOG = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_DIALOG", False); - server.atom._NET_WM_WINDOW_TYPE_NORMAL = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_NORMAL", False); - server.atom._NET_WM_DESKTOP = XInternAtom (server.dsp, "_NET_WM_DESKTOP", False); - server.atom.WM_STATE = XInternAtom (server.dsp, "WM_STATE", False); - server.atom._NET_WM_STATE = XInternAtom (server.dsp, "_NET_WM_STATE", False); - server.atom._NET_WM_STATE_MAXIMIZED_VERT = XInternAtom (server.dsp, "_NET_WM_STATE_MAXIMIZED_VERT", False); - server.atom._NET_WM_STATE_MAXIMIZED_HORZ = XInternAtom (server.dsp, "_NET_WM_STATE_MAXIMIZED_HORZ", False); - server.atom._NET_WM_STATE_SHADED = XInternAtom (server.dsp, "_NET_WM_STATE_SHADED", False); - server.atom._NET_WM_STATE_HIDDEN = XInternAtom (server.dsp, "_NET_WM_STATE_HIDDEN", False); - server.atom._NET_WM_STATE_BELOW = XInternAtom (server.dsp, "_NET_WM_STATE_BELOW", False); - server.atom._NET_WM_STATE_ABOVE = XInternAtom (server.dsp, "_NET_WM_STATE_ABOVE", False); - server.atom._NET_WM_STATE_MODAL = XInternAtom (server.dsp, "_NET_WM_STATE_MODAL", False); - server.atom._NET_CLIENT_LIST = XInternAtom (server.dsp, "_NET_CLIENT_LIST", False); - server.atom._NET_WM_VISIBLE_NAME = XInternAtom (server.dsp, "_NET_WM_VISIBLE_NAME", False); - server.atom._NET_WM_NAME = XInternAtom (server.dsp, "_NET_WM_NAME", False); - server.atom._NET_WM_STRUT = XInternAtom (server.dsp, "_NET_WM_STRUT", False); - server.atom._NET_WM_ICON = XInternAtom (server.dsp, "_NET_WM_ICON", False); - server.atom._NET_WM_ICON_GEOMETRY = XInternAtom(server.dsp, "_NET_WM_ICON_GEOMETRY", False ); - server.atom._NET_WM_ICON_NAME = XInternAtom(server.dsp, "_NET_WM_ICON_NAME", False ); - server.atom._NET_CLOSE_WINDOW = XInternAtom (server.dsp, "_NET_CLOSE_WINDOW", False); - server.atom.UTF8_STRING = XInternAtom (server.dsp, "UTF8_STRING", False); - server.atom._NET_SUPPORTING_WM_CHECK = XInternAtom (server.dsp, "_NET_SUPPORTING_WM_CHECK", False); - server.atom._NET_WM_CM_S0 = XInternAtom (server.dsp, "_NET_WM_CM_S0", False); - server.atom._NET_SUPPORTING_WM_CHECK = XInternAtom (server.dsp, "_NET_WM_NAME", False); - server.atom._NET_WM_STRUT_PARTIAL = XInternAtom (server.dsp, "_NET_WM_STRUT_PARTIAL", False); +} + +void server_init_atoms() +{ + server.atom._XROOTPMAP_ID = XInternAtom(server.dsp, "_XROOTPMAP_ID", False); + server.atom._XROOTMAP_ID = XInternAtom(server.dsp, "_XROOTMAP_ID", False); + server.atom._NET_CURRENT_DESKTOP = XInternAtom(server.dsp, "_NET_CURRENT_DESKTOP", False); + server.atom._NET_NUMBER_OF_DESKTOPS = XInternAtom(server.dsp, "_NET_NUMBER_OF_DESKTOPS", False); + server.atom._NET_DESKTOP_NAMES = XInternAtom(server.dsp, "_NET_DESKTOP_NAMES", False); + server.atom._NET_DESKTOP_GEOMETRY = XInternAtom(server.dsp, "_NET_DESKTOP_GEOMETRY", False); + server.atom._NET_DESKTOP_VIEWPORT = XInternAtom(server.dsp, "_NET_DESKTOP_VIEWPORT", False); + server.atom._NET_ACTIVE_WINDOW = XInternAtom(server.dsp, "_NET_ACTIVE_WINDOW", False); + server.atom._NET_WM_WINDOW_TYPE = XInternAtom(server.dsp, "_NET_WM_WINDOW_TYPE", False); + server.atom._NET_WM_STATE_SKIP_PAGER = XInternAtom(server.dsp, "_NET_WM_STATE_SKIP_PAGER", False); + server.atom._NET_WM_STATE_SKIP_TASKBAR = XInternAtom(server.dsp, "_NET_WM_STATE_SKIP_TASKBAR", False); + server.atom._NET_WM_STATE_STICKY = XInternAtom(server.dsp, "_NET_WM_STATE_STICKY", False); + server.atom._NET_WM_STATE_DEMANDS_ATTENTION = XInternAtom(server.dsp, "_NET_WM_STATE_DEMANDS_ATTENTION", False); + server.atom._NET_WM_WINDOW_TYPE_DOCK = XInternAtom(server.dsp, "_NET_WM_WINDOW_TYPE_DOCK", False); + server.atom._NET_WM_WINDOW_TYPE_DESKTOP = XInternAtom(server.dsp, "_NET_WM_WINDOW_TYPE_DESKTOP", False); + server.atom._NET_WM_WINDOW_TYPE_TOOLBAR = XInternAtom(server.dsp, "_NET_WM_WINDOW_TYPE_TOOLBAR", False); + server.atom._NET_WM_WINDOW_TYPE_MENU = XInternAtom(server.dsp, "_NET_WM_WINDOW_TYPE_MENU", False); + server.atom._NET_WM_WINDOW_TYPE_SPLASH = XInternAtom(server.dsp, "_NET_WM_WINDOW_TYPE_SPLASH", False); + server.atom._NET_WM_WINDOW_TYPE_DIALOG = XInternAtom(server.dsp, "_NET_WM_WINDOW_TYPE_DIALOG", False); + server.atom._NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(server.dsp, "_NET_WM_WINDOW_TYPE_NORMAL", False); + server.atom._NET_WM_DESKTOP = XInternAtom(server.dsp, "_NET_WM_DESKTOP", False); + server.atom.WM_STATE = XInternAtom(server.dsp, "WM_STATE", False); + server.atom._NET_WM_STATE = XInternAtom(server.dsp, "_NET_WM_STATE", False); + server.atom._NET_WM_STATE_MAXIMIZED_VERT = XInternAtom(server.dsp, "_NET_WM_STATE_MAXIMIZED_VERT", False); + server.atom._NET_WM_STATE_MAXIMIZED_HORZ = XInternAtom(server.dsp, "_NET_WM_STATE_MAXIMIZED_HORZ", False); + server.atom._NET_WM_STATE_SHADED = XInternAtom(server.dsp, "_NET_WM_STATE_SHADED", False); + server.atom._NET_WM_STATE_HIDDEN = XInternAtom(server.dsp, "_NET_WM_STATE_HIDDEN", False); + server.atom._NET_WM_STATE_BELOW = XInternAtom(server.dsp, "_NET_WM_STATE_BELOW", False); + server.atom._NET_WM_STATE_ABOVE = XInternAtom(server.dsp, "_NET_WM_STATE_ABOVE", False); + server.atom._NET_WM_STATE_MODAL = XInternAtom(server.dsp, "_NET_WM_STATE_MODAL", False); + server.atom._NET_CLIENT_LIST = XInternAtom(server.dsp, "_NET_CLIENT_LIST", False); + server.atom._NET_WM_VISIBLE_NAME = XInternAtom(server.dsp, "_NET_WM_VISIBLE_NAME", False); + server.atom._NET_WM_NAME = XInternAtom(server.dsp, "_NET_WM_NAME", False); + server.atom._NET_WM_STRUT = XInternAtom(server.dsp, "_NET_WM_STRUT", False); + server.atom._NET_WM_ICON = XInternAtom(server.dsp, "_NET_WM_ICON", False); + server.atom._NET_WM_ICON_GEOMETRY = XInternAtom(server.dsp, "_NET_WM_ICON_GEOMETRY", False); + server.atom._NET_WM_ICON_NAME = XInternAtom(server.dsp, "_NET_WM_ICON_NAME", False); + server.atom._NET_CLOSE_WINDOW = XInternAtom(server.dsp, "_NET_CLOSE_WINDOW", False); + server.atom.UTF8_STRING = XInternAtom(server.dsp, "UTF8_STRING", False); + server.atom._NET_SUPPORTING_WM_CHECK = XInternAtom(server.dsp, "_NET_SUPPORTING_WM_CHECK", False); + server.atom._NET_WM_CM_S0 = XInternAtom(server.dsp, "_NET_WM_CM_S0", False); + server.atom._NET_SUPPORTING_WM_CHECK = XInternAtom(server.dsp, "_NET_WM_NAME", False); + server.atom._NET_WM_STRUT_PARTIAL = XInternAtom(server.dsp, "_NET_WM_STRUT_PARTIAL", False); server.atom.WM_NAME = XInternAtom(server.dsp, "WM_NAME", False); server.atom.__SWM_VROOT = XInternAtom(server.dsp, "__SWM_VROOT", False); server.atom._MOTIF_WM_HINTS = XInternAtom(server.dsp, "_MOTIF_WM_HINTS", False); @@ -116,7 +117,6 @@ void server_init_atoms () server.atom.TARGETS = XInternAtom(server.dsp, "TARGETS", False); } - void cleanup_server() { if (server.colormap) @@ -126,8 +126,7 @@ void cleanup_server() XFreeColormap(server.dsp, server.colormap32); server.colormap32 = 0; if (server.monitor) { - int i; - for (i = 0; i < server.nb_monitor; ++i) { + for (int i = 0; i < server.num_monitors; ++i) { g_strfreev(server.monitor[i].names); server.monitor[i].names = NULL; } @@ -140,8 +139,7 @@ void cleanup_server() server.disable_transparency = 0; } - -void send_event32 (Window win, Atom at, long data1, long data2, long data3) +void send_event32(Window win, Atom at, long data1, long data2, long data3) { XEvent event; @@ -159,11 +157,10 @@ void send_event32 (Window win, Atom at, long data1, long data2, long data3) event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; - XSendEvent(server.dsp, server.root_win, False, SubstructureRedirectMask|SubstructureNotifyMask, &event); + XSendEvent(server.dsp, server.root_win, False, SubstructureRedirectMask | SubstructureNotifyMask, &event); } - -int get_property32 (Window win, Atom at, Atom type) +int get_property32(Window win, Atom at, Atom type) { Atom type_ret; int format_ret = 0, data = 0; @@ -172,61 +169,82 @@ int get_property32 (Window win, Atom at, Atom type) unsigned char *prop_value = 0; int result; - if (!win) return 0; + if (!win) + return 0; - result = XGetWindowProperty(server.dsp, win, at, 0, 0x7fffffff, False, type, &type_ret, &format_ret, &nitems_ret, &bafter_ret, &prop_value); + result = XGetWindowProperty(server.dsp, + win, + at, + 0, + 0x7fffffff, + False, + type, + &type_ret, + &format_ret, + &nitems_ret, + &bafter_ret, + &prop_value); if (result == Success && prop_value) { - data = ((gulong*)prop_value)[0]; - XFree (prop_value); + data = ((gulong *)prop_value)[0]; + XFree(prop_value); } return data; } - -void *server_get_property (Window win, Atom at, Atom type, int *num_results) +void *server_get_property(Window win, Atom at, Atom type, int *num_results) { Atom type_ret; int format_ret = 0; unsigned long nitems_ret = 0; unsigned long bafter_ret = 0; unsigned char *prop_value; - int result; - if (!win) return 0; + if (!win) + return NULL; - result = XGetWindowProperty(server.dsp, win, at, 0, 0x7fffffff, False, type, &type_ret, &format_ret, &nitems_ret, &bafter_ret, &prop_value); + int result = XGetWindowProperty(server.dsp, + win, + at, + 0, + 0x7fffffff, + False, + type, + &type_ret, + &format_ret, + &nitems_ret, + &bafter_ret, + &prop_value); // Send fill_color resultcount - if (num_results) *num_results = (int)nitems_ret; + if (num_results) + *num_results = (int)nitems_ret; - if (result == Success && prop_value) return prop_value; - else return 0; + if (result == Success && prop_value) + return prop_value; + else + return NULL; } - void get_root_pixmap() { Pixmap ret = None; - unsigned long *res; - Atom pixmap_atoms[] = { server.atom._XROOTPMAP_ID, server.atom._XROOTMAP_ID }; - int i; - - for (i=0; ix < m2->x) { return -1; - } - else if (m1->x > m2->x) { + } else if (m1->x > m2->x) { return 1; - } - else if (m1->y < m2->y) { + } else if (m1->y < m2->y) { return -1; - } - else if (m1->y > m2->y) { + } else if (m1->y > m2->y) { return 1; - } - else { + } else { return 0; } } - -int compareMonitorIncluded(const void *monitor1, const void *monitor2) +int monitor_includes_monitor(const void *monitor1, const void *monitor2) { - Monitor *m1 = (Monitor*)monitor1; - Monitor *m2 = (Monitor*)monitor2; + const Monitor *m1 = (const Monitor *)monitor1; + const Monitor *m2 = (const Monitor *)monitor2; - if (m1->x >= m2->x && m1->y >= m2->y && (m1->x+m1->width) <= (m2->x+m2->width) && (m1->y+m1->height) <= (m2->y+m2->height)) { + if (m1->x >= m2->x && m1->y >= m2->y && (m1->x + m1->width) <= (m2->x + m2->width) && + (m1->y + m1->height) <= (m2->y + m2->height)) { // m1 included inside m2 return 1; - } - else { + } else { return -1; } } - void get_monitors() { - int i, j, nbmonitor; if (XineramaIsActive(server.dsp)) { - XineramaScreenInfo *info = XineramaQueryScreens(server.dsp, &nbmonitor); + int num_monitors; + XineramaScreenInfo *info = XineramaQueryScreens(server.dsp, &num_monitors); XRRScreenResources *res = XRRGetScreenResourcesCurrent(server.dsp, server.root_win); - if (res && res->ncrtc >= nbmonitor) { + if (res && res->ncrtc >= num_monitors) { // use xrandr to identify monitors (does not work with proprietery nvidia drivers) // Workaround for issue https://gitlab.com/o9000/tint2/issues/353 // on some recent configs, XRRGetScreenResourcesCurrent returns a fantom monitor at last position { int i = res->ncrtc - 1; - XRRCrtcInfo* crtc_info = XRRGetCrtcInfo(server.dsp, res, res->crtcs[i]); + XRRCrtcInfo *crtc_info = XRRGetCrtcInfo(server.dsp, res, res->crtcs[i]); if (!(crtc_info->x || crtc_info->y || crtc_info->width || crtc_info->height)) { res->ncrtc -= 1; } XRRFreeCrtcInfo(crtc_info); } - printf("xRandr: Found crtc's: %d\n", res->ncrtc ); + printf("xRandr: Found crtc's: %d\n", res->ncrtc); server.monitor = calloc(res->ncrtc, sizeof(Monitor)); - for (i=0; incrtc; ++i) { - XRRCrtcInfo* crtc_info = XRRGetCrtcInfo(server.dsp, res, res->crtcs[i]); + for (int i = 0; i < res->ncrtc; ++i) { + XRRCrtcInfo *crtc_info = XRRGetCrtcInfo(server.dsp, res, res->crtcs[i]); server.monitor[i].x = crtc_info->x; server.monitor[i].y = crtc_info->y; server.monitor[i].width = crtc_info->width; server.monitor[i].height = crtc_info->height; - server.monitor[i].names = calloc((crtc_info->noutput+1), sizeof(gchar*)); - for (j=0; jnoutput; ++j) { - XRROutputInfo* output_info = XRRGetOutputInfo(server.dsp, res, crtc_info->outputs[j]); + server.monitor[i].names = calloc((crtc_info->noutput + 1), sizeof(gchar *)); + for (int j = 0; j < crtc_info->noutput; ++j) { + XRROutputInfo *output_info = XRRGetOutputInfo(server.dsp, res, crtc_info->outputs[j]); printf("xRandr: Linking output %s with crtc %d\n", output_info->name, i); server.monitor[i].names[j] = g_strdup(output_info->name); XRRFreeOutputInfo(output_info); } - server.monitor[i].names[j] = 0; + server.monitor[i].names[crtc_info->noutput] = NULL; XRRFreeCrtcInfo(crtc_info); } - nbmonitor = res->ncrtc; - } - else if (info && nbmonitor > 0) { - server.monitor = calloc(nbmonitor, sizeof(Monitor)); - for (i=0 ; i < nbmonitor ; i++) { + num_monitors = res->ncrtc; + } else if (info && num_monitors > 0) { + server.monitor = calloc(num_monitors, sizeof(Monitor)); + for (int i = 0; i < num_monitors; i++) { server.monitor[i].x = info[i].x_org; server.monitor[i].y = info[i].y_org; server.monitor[i].width = info[i].width; @@ -329,48 +339,48 @@ void get_monitors() } // ordered monitor - qsort(server.monitor, nbmonitor, sizeof(Monitor), compareMonitorIncluded); + qsort(server.monitor, num_monitors, sizeof(Monitor), monitor_includes_monitor); // remove monitor included into another one - i = 0; - while (i < nbmonitor) { - for (j=0; j < i ; j++) { - if (compareMonitorIncluded(&server.monitor[i], &server.monitor[j]) > 0) { + int i = 0; + while (i < num_monitors) { + for (int j = 0; j < i; j++) { + if (monitor_includes_monitor(&server.monitor[i], &server.monitor[j]) > 0) { goto next; } } i++; } -next: - for (j=i; j 0) break; + for (int i = 0; i < 15; i++) { + server.num_desktops = server_get_number_of_desktops(); + if (server.num_desktops > 0) + break; sleep(1); } - if (server.nb_desktop == 0) { - server.nb_desktop = 1; + if (server.num_desktops == 0) { + server.num_desktops = 1; fprintf(stderr, "warning : WM doesn't respect NETWM specs. tint2 default to 1 desktop.\n"); } } - void server_init_visual() { // inspired by freedesktops fdclock ;) - XVisualInfo *xvi; - XVisualInfo templ = { .screen=server.screen, .depth=32, .class=TrueColor }; + XVisualInfo templ = {.screen = server.screen, .depth = 32, .class = TrueColor}; int nvi; - xvi = XGetVisualInfo(server.dsp, VisualScreenMask|VisualDepthMask|VisualClassMask, &templ, &nvi); + XVisualInfo *xvi = XGetVisualInfo(server.dsp, VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nvi); - Visual *visual = 0; + Visual *visual = NULL; if (xvi) { - int i; XRenderPictFormat *format; - for (i = 0; i < nvi; i++) { + for (int i = 0; i < nvi; i++) { format = XRenderFindVisualFormat(server.dsp, xvi[i].visual); if (format->type == PictTypeDirect && format->direct.alphaMask) { visual = xvi[i].visual; @@ -421,7 +427,7 @@ void server_init_visual() } } } - XFree (xvi); + XFree(xvi); // check composite manager server.composite_manager = XGetSelectionOwner(server.dsp, server.atom._NET_WM_CM_S0); @@ -435,18 +441,17 @@ void server_init_visual() server.colormap32 = XCreateColormap(server.dsp, server.root_win, visual, AllocNone); } - if (!server.disable_transparency && visual && server.composite_manager != None && snapshot_path == 0) { + if (!server.disable_transparency && visual && server.composite_manager != None && !snapshot_path) { XSetWindowAttributes attrs; attrs.event_mask = StructureNotifyMask; - XChangeWindowAttributes (server.dsp, server.composite_manager, CWEventMask, &attrs); + XChangeWindowAttributes(server.dsp, server.composite_manager, CWEventMask, &attrs); server.real_transparency = 1; server.depth = 32; printf("real transparency on... depth: %d\n", server.depth); server.colormap = XCreateColormap(server.dsp, server.root_win, visual, AllocNone); server.visual = visual; - } - else { + } else { // no composite manager or snapshot mode => fake transparency server.real_transparency = 0; server.depth = DefaultDepth(server.dsp, server.screen); diff --git a/src/server.h b/src/server.h index 5cf3a1d..042aae9 100644 --- a/src/server.h +++ b/src/server.h @@ -18,8 +18,7 @@ #endif #include -typedef struct Global_atom -{ +typedef struct Global_atom { Atom _XROOTPMAP_ID; Atom _XROOTMAP_ID; Atom _NET_CURRENT_DESKTOP; @@ -91,20 +90,15 @@ typedef struct Global_atom Atom TARGETS; } Global_atom; - - -typedef struct Monitor -{ +typedef struct Monitor { int x; int y; int width; int height; - gchar** names; + gchar **names; } Monitor; - -typedef struct -{ +typedef struct { Display *dsp; Window root_win; Window composite_manager; @@ -114,9 +108,9 @@ typedef struct int desktop; int screen; int depth; - int nb_desktop; + int num_desktops; // number of monitor (without monitor included into another one) - int nb_monitor; + int num_monitors; Monitor *monitor; int got_root_win; Visual *visual; @@ -133,19 +127,17 @@ typedef struct #endif // HAVE_SN } Server_global; - extern Server_global server; - // freed memory void cleanup_server(); -void send_event32 (Window win, Atom at, long data1, long data2, long data3); -int get_property32 (Window win, Atom at, Atom type); -void *server_get_property (Window win, Atom at, Atom type, int *num_results); -Atom server_get_atom (char *atom_name); -void server_catch_error (Display *d, XErrorEvent *ev); -void server_init_atoms (); +void send_event32(Window win, Atom at, long data1, long data2, long data3); +int get_property32(Window win, Atom at, Atom type); +void *server_get_property(Window win, Atom at, Atom type, int *num_results); +Atom server_get_atom(char *atom_name); +void server_catch_error(Display *d, XErrorEvent *ev); +void server_init_atoms(); void server_init_visual(); // detect root background diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 897c50d..c9af9a0 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -29,7 +29,6 @@ #include #include - #include "systraybar.h" #include "server.h" #include "panel.h" @@ -37,9 +36,9 @@ GSList *icons; /* defined in the systray spec */ -#define SYSTEM_TRAY_REQUEST_DOCK 0 -#define SYSTEM_TRAY_BEGIN_MESSAGE 1 -#define SYSTEM_TRAY_CANCEL_MESSAGE 2 +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +#define SYSTEM_TRAY_CANCEL_MESSAGE 2 // selection window Window net_sel_win = None; @@ -85,7 +84,7 @@ void cleanup_systray() systray_enabled = 0; systray_max_icon_size = 0; systray_monitor = 0; - systray.area.on_screen = 0; + systray.area.on_screen = FALSE; free_area(&systray.area); if (render_background) { XFreePixmap(server.dsp, render_background); @@ -108,7 +107,6 @@ void init_systray() } } - void init_systray_panel(void *p) { Panel *panel = (Panel *)p; @@ -118,13 +116,12 @@ void init_systray_panel(void *p) systray.area.bg = &g_array_index(backgrounds, Background, 0); show(&systray.area); systray.area.resize_needed = 1; - systray.area.redraw_needed = 1; + systray.area.redraw_needed = TRUE; panel->area.resize_needed = 1; - panel_refresh = 1; + panel_refresh = TRUE; refresh_systray = 1; } - void draw_systray(void *obj, cairo_t *c) { if (systray_profile) @@ -132,15 +129,24 @@ void draw_systray(void *obj, cairo_t *c) if (systray_composited) { if (render_background) XFreePixmap(server.dsp, render_background); - render_background = XCreatePixmap(server.dsp, server.root_win, systray.area.width, systray.area.height, server.depth); - XCopyArea(server.dsp, systray.area.pix, render_background, server.gc, 0, 0, systray.area.width, systray.area.height, 0, 0); + render_background = + XCreatePixmap(server.dsp, server.root_win, systray.area.width, systray.area.height, server.depth); + XCopyArea(server.dsp, + systray.area.pix, + render_background, + server.gc, + 0, + 0, + systray.area.width, + systray.area.height, + 0, + 0); } refresh_systray = 1; } - -int resize_systray(void *obj) +gboolean resize_systray(void *obj) { if (systray_profile) fprintf(stderr, "[%f] %s:%d\n", profiling_get_time(), __FUNCTION__, __LINE__); @@ -158,12 +164,19 @@ int resize_systray(void *obj) if (systray.icon_size > 0) { long icon_size = systray.icon_size; - XChangeProperty(server.dsp, net_sel_win, server.atom._NET_SYSTEM_TRAY_ICON_SIZE, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &icon_size, 1); + XChangeProperty(server.dsp, + net_sel_win, + server.atom._NET_SYSTEM_TRAY_ICON_SIZE, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char *)&icon_size, + 1); } count = 0; - for (l = systray.list_icons; l ; l = l->next) { - if (((TrayWindow*)l->data)->hide) + for (l = systray.list_icons; l; l = l->next) { + if (((TrayWindow *)l->data)->hide) continue; count++; } @@ -171,19 +184,25 @@ int resize_systray(void *obj) fprintf(stderr, BLUE "%s:%d number of icons = %d\n" RESET, __FUNCTION__, __LINE__, count); if (panel_horizontal) { - int height = sysbar->area.height - 2*sysbar->area.bg->border.width - 2*sysbar->area.paddingy; + int height = sysbar->area.height - 2 * sysbar->area.bg->border.width - 2 * sysbar->area.paddingy; // here icons_per_column always higher than 0 - sysbar->icons_per_column = (height+sysbar->area.paddingx) / (sysbar->icon_size+sysbar->area.paddingx); - sysbar->marging = height - (sysbar->icons_per_column-1)*(sysbar->icon_size+sysbar->area.paddingx) - sysbar->icon_size; - sysbar->icons_per_row = count / sysbar->icons_per_column + (count%sysbar->icons_per_column != 0); - systray.area.width = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + (sysbar->icon_size * sysbar->icons_per_row) + ((sysbar->icons_per_row-1) * systray.area.paddingx); + sysbar->icons_per_column = (height + sysbar->area.paddingx) / (sysbar->icon_size + sysbar->area.paddingx); + sysbar->margin = + height - (sysbar->icons_per_column - 1) * (sysbar->icon_size + sysbar->area.paddingx) - sysbar->icon_size; + sysbar->icons_per_row = count / sysbar->icons_per_column + (count % sysbar->icons_per_column != 0); + systray.area.width = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + + (sysbar->icon_size * sysbar->icons_per_row) + + ((sysbar->icons_per_row - 1) * systray.area.paddingx); } else { - int width = sysbar->area.width - 2*sysbar->area.bg->border.width - 2*sysbar->area.paddingy; + int width = sysbar->area.width - 2 * sysbar->area.bg->border.width - 2 * sysbar->area.paddingy; // here icons_per_row always higher than 0 - sysbar->icons_per_row = (width+sysbar->area.paddingx) / (sysbar->icon_size+sysbar->area.paddingx); - sysbar->marging = width - (sysbar->icons_per_row-1)*(sysbar->icon_size+sysbar->area.paddingx) - sysbar->icon_size; - sysbar->icons_per_column = count / sysbar->icons_per_row+ (count%sysbar->icons_per_row != 0); - systray.area.height = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + (sysbar->icon_size * sysbar->icons_per_column) + ((sysbar->icons_per_column-1) * systray.area.paddingx); + sysbar->icons_per_row = (width + sysbar->area.paddingx) / (sysbar->icon_size + sysbar->area.paddingx); + sysbar->margin = + width - (sysbar->icons_per_row - 1) * (sysbar->icon_size + sysbar->area.paddingx) - sysbar->icon_size; + sysbar->icons_per_column = count / sysbar->icons_per_row + (count % sysbar->icons_per_row != 0); + systray.area.height = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + + (sysbar->icon_size * sysbar->icons_per_column) + + ((sysbar->icons_per_column - 1) * systray.area.paddingx); } if (net_sel_win == None) { @@ -193,8 +212,7 @@ int resize_systray(void *obj) return 1; } - -void on_change_systray (void *obj) +void on_change_systray(void *obj) { if (systray_profile) fprintf(stderr, "[%f] %s:%d\n", profiling_get_time(), __FUNCTION__, __LINE__); @@ -205,7 +223,8 @@ void on_change_systray (void *obj) Panel *panel = sysbar->area.panel; int i, posx, posy; - int start = panel->area.bg->border.width + panel->area.paddingy + systray.area.bg->border.width + systray.area.paddingy + sysbar->marging/2; + int start = panel->area.bg->border.width + panel->area.paddingy + systray.area.bg->border.width + + systray.area.paddingy + sysbar->margin / 2; if (panel_horizontal) { posy = start; posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr; @@ -216,15 +235,23 @@ void on_change_systray (void *obj) TrayWindow *traywin; GSList *l; - for (i = 1, l = systray.list_icons; l ; i++, l = l->next) { - traywin = (TrayWindow*)l->data; + for (i = 1, l = systray.list_icons; l; i++, l = l->next) { + traywin = (TrayWindow *)l->data; if (traywin->hide) continue; traywin->y = posy; traywin->x = posx; if (systray_profile) - fprintf(stderr, "%s:%d win = %lu (%s), parent = %lu, x = %d, y = %d\n", __FUNCTION__, __LINE__, traywin->win, traywin->name, traywin->parent, posx, posy); + fprintf(stderr, + "%s:%d win = %lu (%s), parent = %lu, x = %d, y = %d\n", + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name, + traywin->parent, + posx, + posy); traywin->width = sysbar->icon_size; traywin->height = sysbar->icon_size; if (panel_horizontal) { @@ -253,7 +280,14 @@ void on_change_systray (void *obj) } if (width != traywin->width || height != traywin->height || xpos != traywin->x || ypos != traywin->y) { if (systray_profile) - fprintf(stderr, "XMoveResizeWindow(server.dsp, traywin->parent = %ld, traywin->x = %d, traywin->y = %d, traywin->width = %d, traywin->height = %d)\n", traywin->parent, traywin->x, traywin->y, traywin->width, traywin->height); + fprintf(stderr, + "XMoveResizeWindow(server.dsp, traywin->parent = %ld, traywin->x = %d, traywin->y = %d, " + "traywin->width = %d, traywin->height = %d)\n", + traywin->parent, + traywin->x, + traywin->y, + traywin->width, + traywin->height); XMoveResizeWindow(server.dsp, traywin->parent, traywin->x, traywin->y, traywin->width, traywin->height); } if (!traywin->reparented) @@ -262,7 +296,6 @@ void on_change_systray (void *obj) refresh_systray = 1; } - // *********************************************** // systray protocol @@ -293,7 +326,18 @@ void start_net() int pid; _NET_WM_PID = XInternAtom(server.dsp, "_NET_WM_PID", True); - int ret = XGetWindowProperty(server.dsp, win, _NET_WM_PID, 0, 1024, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, &prop); + int ret = XGetWindowProperty(server.dsp, + win, + _NET_WM_PID, + 0, + 1024, + False, + AnyPropertyType, + &actual_type, + &actual_format, + &nitems, + &bytes_after, + &prop); fprintf(stderr, RED "tint2 : another systray is running" RESET); if (ret == Success && prop) { @@ -312,20 +356,48 @@ void start_net() // v0.3 trayer specification. tint2 always horizontal. // Vertical panel will draw the systray horizontal. long orientation = 0; - XChangeProperty(server.dsp, net_sel_win, server.atom._NET_SYSTEM_TRAY_ORIENTATION, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &orientation, 1); + XChangeProperty(server.dsp, + net_sel_win, + server.atom._NET_SYSTEM_TRAY_ORIENTATION, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char *)&orientation, + 1); if (systray.icon_size > 0) { long icon_size = systray.icon_size; - XChangeProperty(server.dsp, net_sel_win, server.atom._NET_SYSTEM_TRAY_ICON_SIZE, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &icon_size, 1); + XChangeProperty(server.dsp, + net_sel_win, + server.atom._NET_SYSTEM_TRAY_ICON_SIZE, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char *)&icon_size, + 1); } long padding = 0; - XChangeProperty(server.dsp, net_sel_win, server.atom._NET_SYSTEM_TRAY_PADDING, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &padding, 1); + XChangeProperty(server.dsp, + net_sel_win, + server.atom._NET_SYSTEM_TRAY_PADDING, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char *)&padding, + 1); VisualID vid; if (systray_composited) vid = XVisualIDFromVisual(server.visual32); else vid = XVisualIDFromVisual(server.visual); - XChangeProperty(server.dsp, net_sel_win, XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_VISUAL", False), XA_VISUALID, 32, PropModeReplace, (unsigned char*)&vid, 1); + XChangeProperty(server.dsp, + net_sel_win, + XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_VISUAL", False), + XA_VISUALID, + 32, + PropModeReplace, + (unsigned char *)&vid, + 1); XSetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN, net_sel_win, CurrentTime); if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != net_sel_win) { @@ -347,10 +419,9 @@ void start_net() ev.data.l[2] = net_sel_win; ev.data.l[3] = 0; ev.data.l[4] = 0; - XSendEvent(server.dsp, server.root_win, False, StructureNotifyMask, (XEvent*)&ev); + XSendEvent(server.dsp, server.root_win, False, StructureNotifyMask, (XEvent *)&ev); } - void net_message(XClientMessageEvent *e) { if (systray_profile) @@ -380,15 +451,14 @@ void net_message(XClientMessageEvent *e) } } - void stop_net() { if (systray_profile) fprintf(stderr, "[%f] %s:%d\n", profiling_get_time(), __FUNCTION__, __LINE__); if (systray.list_icons) { // remove_icon change systray.list_icons - while(systray.list_icons) - remove_icon((TrayWindow*)systray.list_icons->data); + while (systray.list_icons) + remove_icon((TrayWindow *)systray.list_icons->data); g_slist_free(systray.list_icons); systray.list_icons = NULL; @@ -400,7 +470,6 @@ void stop_net() } } - gboolean error; int window_error_handler(Display *d, XErrorEvent *e) { @@ -413,11 +482,10 @@ int window_error_handler(Display *d, XErrorEvent *e) return 0; } - static gint compare_traywindows(gconstpointer a, gconstpointer b) { - const TrayWindow * traywin_a = (TrayWindow*)a; - const TrayWindow * traywin_b = (TrayWindow*)b; + const TrayWindow *traywin_a = (const TrayWindow *)a; + const TrayWindow *traywin_b = (const TrayWindow *)b; #if 0 // This breaks pygtk2 StatusIcon with blinking activated @@ -427,28 +495,24 @@ static gint compare_traywindows(gconstpointer a, gconstpointer b) return -1 * (systray.sort == SYSTRAY_SORT_RIGHT2LEFT ? -1 : 1); #endif - if (systray.sort == SYSTRAY_SORT_ASCENDING || - systray.sort == SYSTRAY_SORT_DESCENDING) { + if (systray.sort == SYSTRAY_SORT_ASCENDING || systray.sort == SYSTRAY_SORT_DESCENDING) { return g_ascii_strncasecmp(traywin_a->name, traywin_b->name, -1) * - (systray.sort == SYSTRAY_SORT_ASCENDING ? 1 : -1); + (systray.sort == SYSTRAY_SORT_ASCENDING ? 1 : -1); } - if (systray.sort == SYSTRAY_SORT_LEFT2RIGHT || - systray.sort == SYSTRAY_SORT_RIGHT2LEFT) { - return (traywin_a->chrono - traywin_b->chrono) * - (systray.sort == SYSTRAY_SORT_LEFT2RIGHT ? 1 : -1); + if (systray.sort == SYSTRAY_SORT_LEFT2RIGHT || systray.sort == SYSTRAY_SORT_RIGHT2LEFT) { + return (traywin_a->chrono - traywin_b->chrono) * (systray.sort == SYSTRAY_SORT_LEFT2RIGHT ? 1 : -1); } return 0; } - gboolean add_icon(Window win) { XTextProperty xname; char *name; if (XGetWMName(server.dsp, win, &xname)) { - name = strdup((char*)xname.value); + name = strdup((char *)xname.value); XFree(xname.value); } else { name = strdup(""); @@ -467,7 +531,18 @@ gboolean add_icon(Window win) unsigned long nitems; unsigned long bytes_after; unsigned char *prop = 0; - int ret = XGetWindowProperty(server.dsp, win, server.atom._NET_WM_PID, 0, 1024, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, &prop); + int ret = XGetWindowProperty(server.dsp, + win, + server.atom._NET_WM_PID, + 0, + 1024, + False, + AnyPropertyType, + &actual_type, + &actual_format, + &nitems, + &bytes_after, + &prop); if (ret == Success && prop) { pid = prop[1] * 256; pid += prop[0]; @@ -478,7 +553,7 @@ gboolean add_icon(Window win) GSList *l; int num_empty_same_pid = 0; for (l = systray.list_icons; l; l = l->next) { - TrayWindow *other = (TrayWindow*)l->data; + TrayWindow *other = (TrayWindow *)l->data; if (other->win == win) { free(name); return FALSE; @@ -492,12 +567,13 @@ gboolean add_icon(Window win) Imlib_Image image = imlib_create_image_from_drawable(0, 0, 0, other->width, other->height, 1); if (image) { imlib_context_set_drawable(panel->temp_pmap); - Imlib_Image bg = imlib_create_image_from_drawable(0, other->x, other->y, other->width, other->height, 1); + Imlib_Image bg = + imlib_create_image_from_drawable(0, other->x, other->y, other->width, other->height, 1); imlib_context_set_image(bg); - DATA32* data_bg = imlib_image_get_data_for_reading_only(); + DATA32 *data_bg = imlib_image_get_data_for_reading_only(); imlib_context_set_image(image); imlib_image_set_has_alpha(other->depth > 24); - DATA32* data = imlib_image_get_data_for_reading_only(); + DATA32 *data = imlib_image_get_data_for_reading_only(); int x, y; int empty = 1; for (x = 0; x < other->width && empty; x++) { @@ -522,7 +598,14 @@ gboolean add_icon(Window win) imlib_context_set_image(bg); imlib_free_image_and_decache(); if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s) empty = %d\n", profiling_get_time(), __FUNCTION__, __LINE__, other->win, other->name, other->empty); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s) empty = %d\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + other->win, + other->name, + other->empty); } } if (pid && other->pid == pid) { @@ -535,10 +618,15 @@ gboolean add_icon(Window win) const int max_num_empty_same_pid = 0; if (num_empty_same_pid > max_num_empty_same_pid) { for (l = systray.list_icons; l; l = l->next) { - if (pid && ((TrayWindow*)l->data)->pid == pid && ((TrayWindow*)l->data)->empty) { + if (pid && ((TrayWindow *)l->data)->pid == pid && ((TrayWindow *)l->data)->empty) { num_empty_same_pid++; - fprintf(stderr, RED "Removing tray icon %lu (%s) from misbehaving application with pid=%d (too many icons)\n" RESET, ((TrayWindow*)l->data)->win, ((TrayWindow*)l->data)->name, pid); - remove_icon((TrayWindow*)l->data); + fprintf(stderr, + RED + "Removing tray icon %lu (%s) from misbehaving application with pid=%d (too many icons)\n" RESET, + ((TrayWindow *)l->data)->win, + ((TrayWindow *)l->data)->name, + pid); + remove_icon((TrayWindow *)l->data); break; } } @@ -554,9 +642,18 @@ gboolean add_icon(Window win) } unsigned long mask = 0; XSetWindowAttributes set_attr; - Visual* visual = server.visual; - fprintf(stderr, GREEN "add_icon: %lu (%s), pid %d, %d, visual %p, colormap %lu, depth %d, width %d, height %d\n" RESET, - win, name, pid, num_empty_same_pid, attr.visual, attr.colormap, attr.depth, attr.width, attr.height); + Visual *visual = server.visual; + fprintf(stderr, + GREEN "add_icon: %lu (%s), pid %d, %d, visual %p, colormap %lu, depth %d, width %d, height %d\n" RESET, + win, + name, + pid, + num_empty_same_pid, + attr.visual, + attr.colormap, + attr.depth, + attr.width, + attr.height); if (server.disable_transparency) { set_attr.background_pixmap = ParentRelative; mask = CWBackPixmap; @@ -571,7 +668,7 @@ gboolean add_icon(Window win) set_attr.background_pixel = 0; set_attr.border_pixel = 0; set_attr.colormap = attr.colormap; - mask = CWColormap|CWBackPixel|CWBorderPixel; + mask = CWColormap | CWBackPixel | CWBorderPixel; } else { set_attr.background_pixmap = ParentRelative; mask = CWBackPixmap; @@ -579,7 +676,18 @@ gboolean add_icon(Window win) } if (systray_profile) fprintf(stderr, "XCreateWindow(...)\n"); - Window parent = XCreateWindow(server.dsp, panel->main_win, 0, 0, systray.icon_size, systray.icon_size, 0, attr.depth, InputOutput, visual, mask, &set_attr); + Window parent = XCreateWindow(server.dsp, + panel->main_win, + 0, + 0, + systray.icon_size, + systray.icon_size, + 0, + attr.depth, + InputOutput, + visual, + mask, + &set_attr); // Add the icon to the list TrayWindow *traywin = g_new0(TrayWindow, 1); @@ -616,9 +724,9 @@ gboolean add_icon(Window win) if (systray_profile) fprintf(stderr, BLUE "[%f] %s:%d trigger resize & redraw\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__); systray.area.resize_needed = 1; - systray.area.redraw_needed = 1; + systray.area.redraw_needed = TRUE; panel->area.resize_needed = 1; - panel_refresh = 1; + panel_refresh = TRUE; refresh_systray = 1; return TRUE; } @@ -626,7 +734,13 @@ gboolean add_icon(Window win) gboolean reparent_icon(TrayWindow *traywin) { if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); if (traywin->reparented) return TRUE; @@ -641,7 +755,11 @@ gboolean reparent_icon(TrayWindow *traywin) XReparentWindow(server.dsp, traywin->win, traywin->parent, 0, 0); if (systray_profile) - fprintf(stderr, "XMoveResizeWindow(server.dsp, traywin->win = %ld, 0, 0, traywin->width = %d, traywin->height = %d)\n", traywin->win, traywin->width, traywin->height); + fprintf(stderr, + "XMoveResizeWindow(server.dsp, traywin->win = %ld, 0, 0, traywin->width = %d, traywin->height = %d)\n", + traywin->win, + traywin->width, + traywin->height); XMoveResizeWindow(server.dsp, traywin->win, 0, 0, traywin->width, traywin->height); // Embed into parent @@ -666,7 +784,13 @@ gboolean reparent_icon(TrayWindow *traywin) XSync(server.dsp, False); XSetErrorHandler(old); if (error != FALSE) { - fprintf(stderr, RED "systray %d: cannot embed icon for window %lu (%s) parent %lu pid %d\n" RESET, __LINE__, traywin->win, traywin->name, traywin->parent, traywin->pid); + fprintf(stderr, + RED "systray %d: cannot embed icon for window %lu (%s) parent %lu pid %d\n" RESET, + __LINE__, + traywin->win, + traywin->name, + traywin->parent, + traywin->pid); remove_icon(traywin); return FALSE; } @@ -674,7 +798,13 @@ gboolean reparent_icon(TrayWindow *traywin) traywin->reparented = 1; if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); return TRUE; } @@ -682,11 +812,17 @@ gboolean reparent_icon(TrayWindow *traywin) gboolean embed_icon(TrayWindow *traywin) { if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); if (traywin->embedded) return TRUE; - Panel* panel = systray.area.panel; + Panel *panel = systray.area.panel; XSync(server.dsp, False); error = FALSE; @@ -700,23 +836,37 @@ gboolean embed_icon(TrayWindow *traywin) int ret; if (systray_profile) - fprintf(stderr, "XGetWindowProperty(server.dsp, traywin->win, server.atom._XEMBED_INFO, 0, 2, False, server.atom._XEMBED_INFO, &acttype, &actfmt, &nbitem, &bytes, &data)\n"); - ret = XGetWindowProperty(server.dsp, traywin->win, server.atom._XEMBED_INFO, 0, 2, False, server.atom._XEMBED_INFO, &acttype, &actfmt, &nbitem, &bytes, (unsigned char**)&data); + fprintf(stderr, "XGetWindowProperty(server.dsp, traywin->win, server.atom._XEMBED_INFO, 0, 2, False, " + "server.atom._XEMBED_INFO, &acttype, &actfmt, &nbitem, &bytes, &data)\n"); + ret = XGetWindowProperty(server.dsp, + traywin->win, + server.atom._XEMBED_INFO, + 0, + 2, + False, + server.atom._XEMBED_INFO, + &acttype, + &actfmt, + &nbitem, + &bytes, + (unsigned char **)&data); if (ret == Success) { if (data) { if (nbitem >= 2) { int hide = ((data[1] & XEMBED_MAPPED) == 0); if (hide) { // In theory we have to check the embedding with this and remove icons that refuse embedding. - // In practice we have no idea when the other application processes the event and accepts the embed + // In practice we have no idea when the other application processes the event and accepts the + // embed // so we cannot check now without a race. // Race can be triggered with PyGtk(2) apps. - // We could defer this for later (if we set PropertyChangeMask in XSelectInput we get notified) but + // We could defer this for later (if we set PropertyChangeMask in XSelectInput we get notified) + // but // for some reason it breaks transparency for Qt icons. So we don't. - //fprintf(stderr, RED "tint2: window refused embedding\n" RESET); - //remove_icon(traywin); - //XFree(data); - //return FALSE; + // fprintf(stderr, RED "tint2: window refused embedding\n" RESET); + // remove_icon(traywin); + // XFree(data); + // return FALSE; } } XFree(data); @@ -757,7 +907,13 @@ gboolean embed_icon(TrayWindow *traywin) XSync(server.dsp, False); XSetErrorHandler(old); if (error != FALSE) { - fprintf(stderr, RED "systray %d: cannot embed icon for window %lu (%s) parent %lu pid %d\n" RESET, __LINE__, traywin->win, traywin->name, traywin->parent, traywin->pid); + fprintf(stderr, + RED "systray %d: cannot embed icon for window %lu (%s) parent %lu pid %d\n" RESET, + __LINE__, + traywin->win, + traywin->name, + traywin->parent, + traywin->pid); remove_icon(traywin); return FALSE; } @@ -765,7 +921,13 @@ gboolean embed_icon(TrayWindow *traywin) traywin->embedded = 1; if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); return TRUE; } @@ -773,8 +935,14 @@ gboolean embed_icon(TrayWindow *traywin) void remove_icon(TrayWindow *traywin) { if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); - Panel* panel = systray.area.panel; + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); + Panel *panel = systray.area.panel; // remove from our list systray.list_icons = g_slist_remove(systray.list_icons, traywin); @@ -807,7 +975,7 @@ void remove_icon(TrayWindow *traywin) int count = 0; GSList *l; for (l = systray.list_icons; l; l = l->next) { - if (((TrayWindow*)l->data)->hide) + if (((TrayWindow *)l->data)->hide) continue; count++; } @@ -818,17 +986,17 @@ void remove_icon(TrayWindow *traywin) if (systray_profile) fprintf(stderr, BLUE "[%f] %s:%d trigger resize & redraw\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__); systray.area.resize_needed = 1; - systray.area.redraw_needed = 1; + systray.area.redraw_needed = TRUE; panel->area.resize_needed = 1; - panel_refresh = 1; + panel_refresh = TRUE; refresh_systray = 1; } -void systray_resize_icon(void* t) +void systray_resize_icon(void *t) { // we end up in this function only in real transparency mode or if systray_task_asb != 100 0 0 // we made also sure, that we always have a 32 bit visual, i.e. we can safely create 32 bit pixmaps here - TrayWindow* traywin = t; + TrayWindow *traywin = t; unsigned int border_width; int xpos, ypos; @@ -839,7 +1007,12 @@ void systray_resize_icon(void* t) } else { if (1 || xpos != 0 || ypos != 0 || width != traywin->width || height != traywin->height) { if (systray_profile) - fprintf(stderr, "XMoveResizeWindow(server.dsp, traywin->win = %ld, 0, 0, traywin->width = %d, traywin->height = %d)\n", traywin->win, traywin->width, traywin->height); + fprintf(stderr, + "XMoveResizeWindow(server.dsp, traywin->win = %ld, 0, 0, traywin->width = %d, traywin->height " + "= %d)\n", + traywin->win, + traywin->width, + traywin->height); if (0) { XMoveResizeWindow(server.dsp, traywin->win, 0, 0, traywin->width, traywin->height); } @@ -848,7 +1021,7 @@ void systray_resize_icon(void* t) changes.x = changes.y = 0; changes.width = traywin->width; changes.height = traywin->height; - XConfigureWindow(server.dsp, traywin->win, CWX|CWY|CWWidth|CWHeight, &changes); + XConfigureWindow(server.dsp, traywin->win, CWX | CWY | CWWidth | CWHeight, &changes); } if (1) { XConfigureEvent ev; @@ -864,7 +1037,7 @@ void systray_resize_icon(void* t) ev.border_width = 0; ev.above = None; ev.override_redirect = False; - XSendEvent(server.dsp, traywin->win, False, StructureNotifyMask, (XEvent*)&ev); + XSendEvent(server.dsp, traywin->win, False, StructureNotifyMask, (XEvent *)&ev); } XSync(server.dsp, False); } @@ -874,13 +1047,20 @@ void systray_resize_icon(void* t) void systray_reconfigure_event(TrayWindow *traywin, XEvent *e) { if (systray_profile) - fprintf(stderr, "XConfigure event: win = %lu (%s), x = %d, y = %d, w = %d, h = %d\n", - traywin->win, traywin->name, e->xconfigure.x, e->xconfigure.y, e->xconfigure.width, e->xconfigure.height); + fprintf(stderr, + "XConfigure event: win = %lu (%s), x = %d, y = %d, w = %d, h = %d\n", + traywin->win, + traywin->name, + e->xconfigure.x, + e->xconfigure.y, + e->xconfigure.width, + e->xconfigure.height); if (!traywin->reparented) return; - if (e->xconfigure.width != traywin->width || e->xconfigure.height != traywin->height || e->xconfigure.x != 0 || e->xconfigure.y != 0) { + if (e->xconfigure.width != traywin->width || e->xconfigure.height != traywin->height || e->xconfigure.x != 0 || + e->xconfigure.y != 0) { if (traywin->bad_size_counter < max_bad_resize_events) { struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now); @@ -898,18 +1078,24 @@ void systray_reconfigure_event(TrayWindow *traywin, XEvent *e) systray_resize_icon(traywin); } else { if (!traywin->resize_timeout) - traywin->resize_timeout = add_timeout(fast_resize_period, 0, systray_resize_icon, traywin, &traywin->resize_timeout); + traywin->resize_timeout = + add_timeout(fast_resize_period, 0, systray_resize_icon, traywin, &traywin->resize_timeout); } } else { if (traywin->bad_size_counter == max_bad_resize_events) { traywin->bad_size_counter++; - fprintf(stderr, RED "Detected resize loop for tray icon %lu (%s), throttling resize events\n" RESET, traywin->win, traywin->name); + fprintf(stderr, + RED "Detected resize loop for tray icon %lu (%s), throttling resize events\n" RESET, + traywin->win, + traywin->name); } // Delayed resize - // FIXME Normally we should force the icon to resize fill_color to the size we resized it to when we embedded it. + // FIXME Normally we should force the icon to resize fill_color to the size we resized it to when we + // embedded it. // However this triggers a resize loop in new versions of GTK, which we must avoid. if (!traywin->resize_timeout) - traywin->resize_timeout = add_timeout(slow_resize_period, 0, systray_resize_icon, traywin, &traywin->resize_timeout); + traywin->resize_timeout = + add_timeout(slow_resize_period, 0, systray_resize_icon, traywin, &traywin->resize_timeout); return; } } else { @@ -920,15 +1106,19 @@ void systray_reconfigure_event(TrayWindow *traywin, XEvent *e) // Resize and redraw the systray if (systray_profile) fprintf(stderr, BLUE "[%f] %s:%d trigger resize & redraw\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__); - panel_refresh = 1; + panel_refresh = TRUE; refresh_systray = 1; } void systray_resize_request_event(TrayWindow *traywin, XEvent *e) { if (systray_profile) - fprintf(stderr, "XResizeRequest event: win = %lu (%s), w = %d, h = %d\n", - traywin->win, traywin->name, e->xresizerequest.width, e->xresizerequest.height); + fprintf(stderr, + "XResizeRequest event: win = %lu (%s), w = %d, h = %d\n", + traywin->win, + traywin->name, + e->xresizerequest.width, + e->xresizerequest.height); if (!traywin->reparented) return; @@ -951,18 +1141,24 @@ void systray_resize_request_event(TrayWindow *traywin, XEvent *e) systray_resize_icon(traywin); } else { if (!traywin->resize_timeout) - traywin->resize_timeout = add_timeout(fast_resize_period, 0, systray_resize_icon, traywin, &traywin->resize_timeout); + traywin->resize_timeout = + add_timeout(fast_resize_period, 0, systray_resize_icon, traywin, &traywin->resize_timeout); } } else { if (traywin->bad_size_counter == max_bad_resize_events) { traywin->bad_size_counter++; - fprintf(stderr, RED "Detected resize loop for tray icon %lu (%s), throttling resize events\n" RESET, traywin->win, traywin->name); + fprintf(stderr, + RED "Detected resize loop for tray icon %lu (%s), throttling resize events\n" RESET, + traywin->win, + traywin->name); } // Delayed resize - // FIXME Normally we should force the icon to resize fill_color to the size we resized it to when we embedded it. + // FIXME Normally we should force the icon to resize fill_color to the size we resized it to when we + // embedded it. // However this triggers a resize loop in new versions of GTK, which we must avoid. if (!traywin->resize_timeout) - traywin->resize_timeout = add_timeout(slow_resize_period, 0, systray_resize_icon, traywin, &traywin->resize_timeout); + traywin->resize_timeout = + add_timeout(slow_resize_period, 0, systray_resize_icon, traywin, &traywin->resize_timeout); return; } } else { @@ -973,37 +1169,66 @@ void systray_resize_request_event(TrayWindow *traywin, XEvent *e) // Resize and redraw the systray if (systray_profile) fprintf(stderr, BLUE "[%f] %s:%d trigger resize & redraw\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__); - panel_refresh = 1; + panel_refresh = TRUE; refresh_systray = 1; } void systray_destroy_event(TrayWindow *traywin) { if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); remove_icon(traywin); } - -void systray_render_icon_from_image(TrayWindow* traywin) +void systray_render_icon_from_image(TrayWindow *traywin) { - Panel* panel = systray.area.panel; + Panel *panel = systray.area.panel; if (!traywin->image) return; imlib_context_set_image(traywin->image); - XCopyArea(server.dsp, render_background, systray.area.pix, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x-systray.area.posx, traywin->y-systray.area.posy); - render_image(systray.area.pix, traywin->x-systray.area.posx, traywin->y-systray.area.posy); - XCopyArea(server.dsp, systray.area.pix, panel->temp_pmap, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x, traywin->y); + XCopyArea(server.dsp, + render_background, + systray.area.pix, + server.gc, + traywin->x - systray.area.posx, + traywin->y - systray.area.posy, + traywin->width, + traywin->height, + traywin->x - systray.area.posx, + traywin->y - systray.area.posy); + render_image(systray.area.pix, traywin->x - systray.area.posx, traywin->y - systray.area.posy); + XCopyArea(server.dsp, + systray.area.pix, + panel->temp_pmap, + server.gc, + traywin->x - systray.area.posx, + traywin->y - systray.area.posy, + traywin->width, + traywin->height, + traywin->x, + traywin->y); } -void systray_render_icon_composited(void* t) +void systray_render_icon_composited(void *t) { // we end up in this function only in real transparency mode or if systray_task_asb != 100 0 0 // we made also sure, that we always have a 32 bit visual, i.e. we can safely create 32 bit pixmaps here - TrayWindow* traywin = t; + TrayWindow *traywin = t; if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); // wine tray icons update whenever mouse is over them, so we limit the updates to 50 ms struct timespec now; @@ -1012,9 +1237,16 @@ void systray_render_icon_composited(void* t) if (compare_timespecs(&earliest_render, &now) > 0) { traywin->num_fast_renders++; if (traywin->num_fast_renders > max_fast_refreshes) { - traywin->render_timeout = add_timeout(min_refresh_period, 0, systray_render_icon_composited, traywin, &traywin->render_timeout); + traywin->render_timeout = + add_timeout(min_refresh_period, 0, systray_render_icon_composited, traywin, &traywin->render_timeout); if (systray_profile) - fprintf(stderr, YELLOW "[%f] %s:%d win = %lu (%s) delaying rendering\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + YELLOW "[%f] %s:%d win = %lu (%s) delaying rendering\n" RESET, + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); return; } } else { @@ -1025,9 +1257,16 @@ void systray_render_icon_composited(void* t) if (traywin->width == 0 || traywin->height == 0) { // reschedule rendering since the geometry information has not yet been processed (can happen on slow cpu) - traywin->render_timeout = add_timeout(min_refresh_period, 0, systray_render_icon_composited, traywin, &traywin->render_timeout); + traywin->render_timeout = + add_timeout(min_refresh_period, 0, systray_render_icon_composited, traywin, &traywin->render_timeout); if (systray_profile) - fprintf(stderr, YELLOW "[%f] %s:%d win = %lu (%s) delaying rendering\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + YELLOW "[%f] %s:%d win = %lu (%s) delaying rendering\n" RESET, + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); return; } @@ -1039,7 +1278,7 @@ void systray_render_icon_composited(void* t) // good systray icons support 32 bit depth, but some icons are still 24 bit. // We create a heuristic mask for these icons, i.e. we get the rgb value in the top left corner, and // mask out all pixel with the same rgb value - Panel* panel = systray.area.panel; + Panel *panel = systray.area.panel; // Very ugly hack, but somehow imlib2 is not able to get the image from the traywindow itself, // so we first render the tray window onto a pixmap, and then we tell imlib2 to use this pixmap as @@ -1068,8 +1307,8 @@ void systray_render_icon_composited(void* t) error = FALSE; XErrorHandler old = XSetErrorHandler(window_error_handler); - //if (server.real_transparency) - //Picture pict_image = XRenderCreatePicture(server.dsp, traywin->parent, f, 0, 0); + // if (server.real_transparency) + // Picture pict_image = XRenderCreatePicture(server.dsp, traywin->parent, f, 0, 0); // reverted Rev 407 because here it's breaking alls icon with systray + xcompmgr Picture pict_image = XRenderCreatePicture(server.dsp, traywin->win, f, 0, 0); if (!pict_image) { @@ -1077,14 +1316,27 @@ void systray_render_icon_composited(void* t) XSetErrorHandler(old); goto on_error; } - Picture pict_drawable = XRenderCreatePicture(server.dsp, tmp_pmap, XRenderFindVisualFormat(server.dsp, server.visual32), 0, 0); + Picture pict_drawable = + XRenderCreatePicture(server.dsp, tmp_pmap, XRenderFindVisualFormat(server.dsp, server.visual32), 0, 0); if (!pict_drawable) { XRenderFreePicture(server.dsp, pict_image); XFreePixmap(server.dsp, tmp_pmap); XSetErrorHandler(old); goto on_error; } - XRenderComposite(server.dsp, PictOpSrc, pict_image, None, pict_drawable, 0, 0, 0, 0, 0, 0, traywin->width, traywin->height); + XRenderComposite(server.dsp, + PictOpSrc, + pict_image, + None, + pict_drawable, + 0, + 0, + 0, + 0, + 0, + 0, + traywin->width, + traywin->height); XRenderFreePicture(server.dsp, pict_image); XRenderFreePicture(server.dsp, pict_drawable); // end of the ugly hack and we can continue as before @@ -1110,17 +1362,22 @@ void systray_render_icon_composited(void* t) } imlib_context_set_image(traywin->image); - //if (traywin->depth == 24) - //imlib_save_image("/home/thil77/test.jpg"); + // if (traywin->depth == 24) + // imlib_save_image("/home/thil77/test.jpg"); imlib_image_set_has_alpha(1); - DATA32* data = imlib_image_get_data(); + DATA32 *data = imlib_image_get_data(); if (traywin->depth == 24) { - createHeuristicMask(data, traywin->width, traywin->height); + create_heuristic_mask(data, traywin->width, traywin->height); } - int empty = imageEmpty(data, traywin->width, traywin->height); + int empty = image_empty(data, traywin->width, traywin->height); if (systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) - adjust_asb(data, traywin->width, traywin->height, systray.alpha, (float)systray.saturation/100, (float)systray.brightness/100); + adjust_asb(data, + traywin->width, + traywin->height, + systray.alpha, + (float)systray.saturation / 100, + (float)systray.brightness / 100); imlib_image_put_back_data(data); systray_render_icon_from_image(traywin); @@ -1138,44 +1395,76 @@ void systray_render_icon_composited(void* t) systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows); // Resize and redraw the systray if (systray_profile) - fprintf(stderr, BLUE "[%f] %s:%d trigger resize & redraw\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__); + fprintf(stderr, + BLUE "[%f] %s:%d trigger resize & redraw\n" RESET, + profiling_get_time(), + __FUNCTION__, + __LINE__); systray.area.resize_needed = 1; - systray.area.redraw_needed = 1; + systray.area.redraw_needed = TRUE; panel->area.resize_needed = 1; - panel_refresh = 1; + panel_refresh = TRUE; refresh_systray = 1; } - panel_refresh = 1; + panel_refresh = TRUE; if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); return; on_error: - fprintf(stderr, RED "systray %d: rendering error for icon %lu (%s) pid %d\n" RESET, __LINE__, traywin->win, traywin->name, traywin->pid); + fprintf(stderr, + RED "systray %d: rendering error for icon %lu (%s) pid %d\n" RESET, + __LINE__, + traywin->win, + traywin->name, + traywin->pid); return; on_systray_error: - fprintf(stderr, RED "systray %d: rendering error for icon %lu (%s) pid %d. " - "Disabling compositing and restarting systray...\n" RESET, __LINE__, traywin->win, traywin->name, traywin->pid); + fprintf(stderr, + RED "systray %d: rendering error for icon %lu (%s) pid %d. " + "Disabling compositing and restarting systray...\n" RESET, + __LINE__, + traywin->win, + traywin->name, + traywin->pid); systray_composited = 0; stop_net(); start_net(); return; } - -void systray_render_icon(void* t) +void systray_render_icon(void *t) { - TrayWindow* traywin = t; + TrayWindow *traywin = t; if (systray_profile) - fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + "[%f] %s:%d win = %lu (%s)\n", + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); if (!traywin->reparented || !traywin->embedded) { if (systray_profile) - fprintf(stderr, YELLOW "[%f] %s:%d win = %lu (%s) delaying rendering\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + YELLOW "[%f] %s:%d win = %lu (%s) delaying rendering\n" RESET, + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); stop_timeout(traywin->render_timeout); - traywin->render_timeout = add_timeout(min_refresh_period, 0, systray_render_icon, traywin, &traywin->render_timeout); + traywin->render_timeout = + add_timeout(min_refresh_period, 0, systray_render_icon, traywin, &traywin->render_timeout); return; } @@ -1191,7 +1480,8 @@ void systray_render_icon(void* t) if (!XGetGeometry(server.dsp, traywin->win, &root, &xpos, &ypos, &width, &height, &border_width, &depth)) { stop_timeout(traywin->render_timeout); if (!traywin->resize_timeout) - traywin->render_timeout = add_timeout(min_refresh_period, 0, systray_render_icon, traywin, &traywin->render_timeout); + traywin->render_timeout = + add_timeout(min_refresh_period, 0, systray_render_icon, traywin, &traywin->render_timeout); systray_render_icon_from_image(traywin); XSetErrorHandler(old); return; @@ -1199,10 +1489,17 @@ void systray_render_icon(void* t) if (xpos != 0 || ypos != 0 || width != traywin->width || height != traywin->height) { stop_timeout(traywin->render_timeout); if (!traywin->resize_timeout) - traywin->render_timeout = add_timeout(min_refresh_period, 0, systray_render_icon, traywin, &traywin->render_timeout); + traywin->render_timeout = + add_timeout(min_refresh_period, 0, systray_render_icon, traywin, &traywin->render_timeout); systray_render_icon_from_image(traywin); if (systray_profile) - fprintf(stderr, YELLOW "[%f] %s:%d win = %lu (%s) delaying rendering\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__, traywin->win, traywin->name); + fprintf(stderr, + YELLOW "[%f] %s:%d win = %lu (%s) delaying rendering\n" RESET, + profiling_get_time(), + __FUNCTION__, + __LINE__, + traywin->win, + traywin->name); XSetErrorHandler(old); return; } @@ -1218,31 +1515,33 @@ void systray_render_icon(void* t) } else { // Trigger window repaint if (systray_profile) - fprintf(stderr, "XClearArea(server.dsp, traywin->parent = %ld, 0, 0, traywin->width, traywin->height, True)\n", traywin->parent); + fprintf(stderr, + "XClearArea(server.dsp, traywin->parent = %ld, 0, 0, traywin->width, traywin->height, True)\n", + traywin->parent); XClearArea(server.dsp, traywin->parent, 0, 0, 0, 0, True); if (systray_profile) - fprintf(stderr, "XClearArea(server.dsp, traywin->win = %ld, 0, 0, traywin->width, traywin->height, True)\n", traywin->win); + fprintf(stderr, + "XClearArea(server.dsp, traywin->win = %ld, 0, 0, traywin->width, traywin->height, True)\n", + traywin->win); XClearArea(server.dsp, traywin->win, 0, 0, 0, 0, True); } } - void refresh_systray_icons() { if (systray_profile) fprintf(stderr, BLUE "[%f] %s:%d\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__); TrayWindow *traywin; GSList *l; - for (l = systray.list_icons; l ; l = l->next) { - traywin = (TrayWindow*)l->data; + for (l = systray.list_icons; l; l = l->next) { + traywin = (TrayWindow *)l->data; if (traywin->hide) continue; systray_render_icon(traywin); } } -int systray_on_monitor(int i_monitor, int nb_panels) +gboolean systray_on_monitor(int i_monitor, int num_panelss) { - return (i_monitor == systray_monitor) || - (i_monitor == 0 && (systray_monitor >= nb_panels || systray_monitor < 0)); + return (i_monitor == systray_monitor) || (i_monitor == 0 && (systray_monitor >= num_panelss || systray_monitor < 0)); } diff --git a/src/systray/systraybar.h b/src/systray/systraybar.h index 527353d..9e0bfbd 100644 --- a/src/systray/systraybar.h +++ b/src/systray/systraybar.h @@ -16,57 +16,59 @@ #include // XEMBED messages -#define XEMBED_EMBEDDED_NOTIFY 0 +#define XEMBED_EMBEDDED_NOTIFY 0 // Flags for _XEMBED_INFO -#define XEMBED_MAPPED (1 << 0) +#define XEMBED_MAPPED (1 << 0) -enum { SYSTRAY_SORT_ASCENDING, SYSTRAY_SORT_DESCENDING, SYSTRAY_SORT_LEFT2RIGHT, SYSTRAY_SORT_RIGHT2LEFT }; +typedef enum SystraySortMethod { + SYSTRAY_SORT_ASCENDING = 0, + SYSTRAY_SORT_DESCENDING, + SYSTRAY_SORT_LEFT2RIGHT, + SYSTRAY_SORT_RIGHT2LEFT, +} SystraySortMethod; typedef struct { // always start with area Area area; GSList *list_icons; - int sort; + SystraySortMethod sort; int alpha, saturation, brightness; - int icon_size, icons_per_column, icons_per_row, marging; + int icon_size, icons_per_column, icons_per_row, margin; } Systraybar; - -typedef struct -{ +typedef struct { Window parent; Window win; int x, y; int width, height; // TODO: manage icon's show/hide - int hide; + gboolean hide; int depth; Damage damage; - timeout* render_timeout; - int empty; + timeout *render_timeout; + gboolean empty; int pid; int chrono; - struct timespec time_last_render; + struct timespec time_last_render; int num_fast_renders; - int reparented; - int embedded; + gboolean reparented; + gboolean embedded; int bad_size_counter; - timeout* resize_timeout; + timeout *resize_timeout; struct timespec time_last_resize; char *name; Imlib_Image image; } TrayWindow; - // net_sel_win != None when protocol started extern Window net_sel_win; extern Systraybar systray; -extern int refresh_systray; -extern int systray_enabled; +extern gboolean refresh_systray; +extern gboolean systray_enabled; extern int systray_max_icon_size; extern int systray_monitor; -extern int systray_profile; +extern gboolean systray_profile; // default global data void default_systray(); @@ -79,9 +81,9 @@ void init_systray(); void init_systray_panel(void *p); void draw_systray(void *obj, cairo_t *c); -int resize_systray(void *obj); +gboolean resize_systray(void *obj); void on_change_systray(void *obj); -int systray_on_monitor(int i_monitor, int nb_panels); +gboolean systray_on_monitor(int i_monitor, int num_panelss); // systray protocol // many tray icon doesn't manage stop/restart of the systray manager @@ -104,4 +106,3 @@ void systray_destroy_event(TrayWindow *traywin); void kde_update_icons(); #endif - diff --git a/src/taskbar/task.c b/src/taskbar/task.c index 27b29b6..15e5ea8 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -35,180 +35,184 @@ #include "tooltip.h" #include "timer.h" -timeout* urgent_timeout; -GSList* urgent_list; +timeout *urgent_timeout; +GSList *urgent_list; -char* task_get_tooltip(void* obj) +char *task_get_tooltip(void *obj) { - Task* t = obj; + Task *t = (Task *)obj; return strdup(t->title); } - -Task *add_task (Window win) +Task *add_task(Window win) { - if (!win) return 0; - if (window_is_hidden(win)) return 0; + if (!win) + return 0; + if (window_is_hidden(win)) + return 0; - XSelectInput(server.dsp, win, PropertyChangeMask|StructureNotifyMask); + XSelectInput(server.dsp, win, PropertyChangeMask | StructureNotifyMask); XFlush(server.dsp); int monitor; - if (nb_panel > 1) { - monitor = window_get_monitor (win); - if (monitor >= nb_panel) monitor = 0; - } - else monitor = 0; + if (num_panels > 1) { + monitor = get_window_monitor(win); + if (monitor >= num_panels) + monitor = 0; + } else + monitor = 0; - Task new_tsk; - memset(&new_tsk, 0, sizeof(new_tsk)); - new_tsk.area.has_mouse_over_effect = 1; - new_tsk.area.has_mouse_press_effect = 1; - new_tsk.win = win; - new_tsk.desktop = window_get_desktop (win); - new_tsk.area.panel = &panel1[monitor]; - new_tsk.current_state = window_is_iconified(win) ? TASK_ICONIFIED : TASK_NORMAL; - window_get_coordinates(win, &new_tsk.win_x, &new_tsk.win_y, &new_tsk.win_w, &new_tsk.win_h); + Task new_task; + memset(&new_task, 0, sizeof(new_task)); + new_task.area.has_mouse_over_effect = 1; + new_task.area.has_mouse_press_effect = 1; + new_task.win = win; + new_task.desktop = get_window_desktop(win); + new_task.area.panel = &panels[monitor]; + new_task.current_state = window_is_iconified(win) ? TASK_ICONIFIED : TASK_NORMAL; + get_window_coordinates(win, &new_task.win_x, &new_task.win_y, &new_task.win_w, &new_task.win_h); // allocate only one title and one icon // even with task_on_all_desktop and with task_on_all_panel - new_tsk.title = 0; + new_task.title = 0; int k; - for (k=0; karea, &panel1[monitor].g_task.area, sizeof(Area)); - new_tsk2->area.parent = tskbar; - new_tsk2->area.has_mouse_over_effect = 1; - new_tsk2->area.has_mouse_press_effect = 1; - new_tsk2->win = new_tsk.win; - new_tsk2->desktop = new_tsk.desktop; - new_tsk2->win_x = new_tsk.win_x; - new_tsk2->win_y = new_tsk.win_y; - new_tsk2->win_w = new_tsk.win_w; - new_tsk2->win_h = new_tsk.win_h; - new_tsk2->current_state = -1; // to update the current state later in set_task_state... - if (new_tsk2->desktop == ALLDESKTOP && server.desktop != j) { + taskbar = &panels[monitor].taskbar[j]; + new_task2 = calloc(1, sizeof(Task)); + memcpy(&new_task2->area, &panels[monitor].g_task.area, sizeof(Area)); + new_task2->area.parent = taskbar; + new_task2->area.has_mouse_over_effect = 1; + new_task2->area.has_mouse_press_effect = 1; + new_task2->win = new_task.win; + new_task2->desktop = new_task.desktop; + new_task2->win_x = new_task.win_x; + new_task2->win_y = new_task.win_y; + new_task2->win_w = new_task.win_w; + new_task2->win_h = new_task.win_h; + new_task2->current_state = -1; // to update the current state later in set_task_state... + if (new_task2->desktop == ALLDESKTOP && server.desktop != j) { // hide ALLDESKTOP task on non-current desktop - new_tsk2->area.on_screen = 0; + new_task2->area.on_screen = FALSE; } - new_tsk2->title = new_tsk.title; - if (panel1[monitor].g_task.tooltip_enabled) - new_tsk2->area._get_tooltip_text = task_get_tooltip; - for (k=0; kicon[k] = new_tsk.icon[k]; - new_tsk2->icon_hover[k] = new_tsk.icon_hover[k]; - new_tsk2->icon_press[k] = new_tsk.icon_press[k]; - new_tsk2->state_pix[k] = 0; + new_task2->title = new_task.title; + if (panels[monitor].g_task.tooltip_enabled) + new_task2->area._get_tooltip_text = task_get_tooltip; + for (k = 0; k < TASK_STATE_COUNT; ++k) { + new_task2->icon[k] = new_task.icon[k]; + new_task2->icon_hover[k] = new_task.icon_hover[k]; + new_task2->icon_press[k] = new_task.icon_press[k]; + new_task2->state_pix[k] = 0; } - new_tsk2->icon_width = new_tsk.icon_width; - new_tsk2->icon_height = new_tsk.icon_height; - tskbar->area.children = g_list_append(tskbar->area.children, new_tsk2); - tskbar->area.resize_needed = 1; - g_ptr_array_add(task_group, new_tsk2); - //printf("add_task panel %d, desktop %d, task %s\n", i, j, new_tsk2->title); + new_task2->icon_width = new_task.icon_width; + new_task2->icon_height = new_task.icon_height; + taskbar->area.children = g_list_append(taskbar->area.children, new_task2); + taskbar->area.resize_needed = 1; + g_ptr_array_add(task_group, new_task2); + // printf("add_task panel %d, desktop %d, task %s\n", i, j, new_task2->title); } - Window* key = calloc(1, sizeof(Window)); - *key = new_tsk.win; + Window *key = calloc(1, sizeof(Window)); + *key = new_task.win; g_hash_table_insert(win_to_task_table, key, task_group); - set_task_state(new_tsk2, new_tsk.current_state); + set_task_state(new_task2, new_task.current_state); sort_taskbar_for_win(win); - if (panel_mode == MULTI_DESKTOP) { - Panel *panel = new_tsk2->area.panel; + if (taskbar_mode == MULTI_DESKTOP) { + Panel *panel = new_task2->area.panel; panel->area.resize_needed = 1; } if (window_is_urgent(win)) { - add_urgent(new_tsk2); + add_urgent(new_task2); } - return new_tsk2; + return new_task2; } - -void remove_task (Task *tsk) +void remove_task(Task *task) { - if (!tsk) return; + if (!task) + return; - if (panel_mode == MULTI_DESKTOP) { - Panel *panel = tsk->area.panel; + if (taskbar_mode == MULTI_DESKTOP) { + Panel *panel = task->area.panel; panel->area.resize_needed = 1; } - Window win = tsk->win; + Window win = task->win; // free title and icon just for the first task // even with task_on_all_desktop and with task_on_all_panel - //printf("remove_task %s %d\n", tsk->title, tsk->desktop); - if (tsk->title) - free (tsk->title); + // printf("remove_task %s %d\n", task->title, task->desktop); + if (task->title) + free(task->title); int k; - for (k=0; kicon[k]) { - imlib_context_set_image(tsk->icon[k]); + for (k = 0; k < TASK_STATE_COUNT; ++k) { + if (task->icon[k]) { + imlib_context_set_image(task->icon[k]); imlib_free_image(); - tsk->icon[k] = 0; + task->icon[k] = 0; } - if (tsk->icon_hover[k]) { - imlib_context_set_image(tsk->icon_hover[k]); + if (task->icon_hover[k]) { + imlib_context_set_image(task->icon_hover[k]); imlib_free_image(); - tsk->icon_hover[k] = 0; + task->icon_hover[k] = 0; } - if (tsk->icon_press[k]) { - imlib_context_set_image(tsk->icon_press[k]); + if (task->icon_press[k]) { + imlib_context_set_image(task->icon_press[k]); imlib_free_image(); - tsk->icon_press[k] = 0; + task->icon_press[k] = 0; } - if (tsk->state_pix[k]) XFreePixmap(server.dsp, tsk->state_pix[k]); + if (task->state_pix[k]) + XFreePixmap(server.dsp, task->state_pix[k]); } int i; - Task *tsk2; - GPtrArray* task_group = g_hash_table_lookup(win_to_task_table, &win); - for (i=0; ilen; ++i) { - tsk2 = g_ptr_array_index(task_group, i); - if (tsk2 == task_active) task_active = 0; - if (tsk2 == task_drag) task_drag = 0; - if (g_slist_find(urgent_list, tsk2)) del_urgent(tsk2); - remove_area((Area*)tsk2); - free(tsk2); + Task *task2; + GPtrArray *task_group = g_hash_table_lookup(win_to_task_table, &win); + for (i = 0; i < task_group->len; ++i) { + task2 = g_ptr_array_index(task_group, i); + if (task2 == task_active) + task_active = 0; + if (task2 == task_drag) + task_drag = 0; + if (g_slist_find(urgent_list, task2)) + del_urgent(task2); + remove_area((Area *)task2); + free(task2); } g_hash_table_remove(win_to_task_table, &win); } - -int get_title(Task *tsk) +gboolean get_title(Task *task) { - Panel *panel = tsk->area.panel; + Panel *panel = task->area.panel; char *title, *name; - if (!panel->g_task.text && - !panel->g_task.tooltip_enabled && - taskbar_sort_method != TASKBAR_SORT_TITLE) + if (!panel->g_task.text && !panel->g_task.tooltip_enabled && taskbar_sort_method != TASKBAR_SORT_TITLE) return 0; - name = server_get_property (tsk->win, server.atom._NET_WM_VISIBLE_NAME, server.atom.UTF8_STRING, 0); + name = server_get_property(task->win, server.atom._NET_WM_VISIBLE_NAME, server.atom.UTF8_STRING, 0); if (!name || !strlen(name)) { - name = server_get_property (tsk->win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 0); + name = server_get_property(task->win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 0); if (!name || !strlen(name)) { - name = server_get_property (tsk->win, server.atom.WM_NAME, XA_STRING, 0); + name = server_get_property(task->win, server.atom.WM_NAME, XA_STRING, 0); } } @@ -217,70 +221,68 @@ int get_title(Task *tsk) } else { title = strdup("Untitled"); } - if (name) XFree (name); - - if (tsk->title) { + if (name) + XFree(name); + + if (task->title) { // check unecessary title change - if (strcmp(tsk->title, title) == 0) { + if (strcmp(task->title, title) == 0) { free(title); return 0; - } - else - free(tsk->title); - } + } else + free(task->title); + } - tsk->title = title; - GPtrArray* task_group = task_get_tasks(tsk->win); + task->title = title; + GPtrArray *task_group = task_get_tasks(task->win); if (task_group) { int i; - for (i=0; ilen; ++i) { - Task* tsk2 = g_ptr_array_index(task_group, i); - tsk2->title = tsk->title; - set_task_redraw(tsk2); + for (i = 0; i < task_group->len; ++i) { + Task *task2 = g_ptr_array_index(task_group, i); + task2->title = task->title; + set_task_redraw(task2); } } return 1; } - -void get_icon (Task *tsk) +void get_icon(Task *task) { - Panel *panel = tsk->area.panel; - if (!panel->g_task.icon) return; + Panel *panel = task->area.panel; + if (!panel->g_task.icon) + return; int i; Imlib_Image img = NULL; XWMHints *hints = 0; gulong *data = 0; - int k; - for (k=0; kicon[k]) { - imlib_context_set_image(tsk->icon[k]); + for (int k = 0; k < TASK_STATE_COUNT; ++k) { + if (task->icon[k]) { + imlib_context_set_image(task->icon[k]); imlib_free_image(); - tsk->icon[k] = 0; + task->icon[k] = 0; } } - data = server_get_property (tsk->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i); + data = server_get_property(task->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i); if (data) { // get ARGB icon int w, h; gulong *tmp_data; - tmp_data = get_best_icon (data, get_icon_count (data, i), i, &w, &h, panel->g_task.icon_size1); + tmp_data = get_best_icon(data, get_icon_count(data, i), i, &w, &h, panel->g_task.icon_size1); #ifdef __x86_64__ DATA32 icon_data[w * h]; int length = w * h; for (i = 0; i < length; ++i) icon_data[i] = tmp_data[i]; - img = imlib_create_image_using_copied_data (w, h, icon_data); + img = imlib_create_image_using_copied_data(w, h, icon_data); #else - img = imlib_create_image_using_data (w, h, (DATA32*)tmp_data); + img = imlib_create_image_using_data(w, h, (DATA32 *)tmp_data); #endif - } - else { + } else { // get Pixmap icon - hints = XGetWMHints(server.dsp, tsk->win); + hints = XGetWMHints(server.dsp, task->win); if (hints) { if (hints->flags & IconPixmapHint && hints->icon_pixmap != 0) { // get width, height and depth for the pixmap @@ -289,7 +291,7 @@ void get_icon (Task *tsk) uint border_width, bpp; uint w, h; - //printf(" get pixmap\n"); + // printf(" get pixmap\n"); XGetGeometry(server.dsp, hints->icon_pixmap, &root, &icon_x, &icon_y, &w, &h, &border_width, &bpp); imlib_context_set_drawable(hints->icon_pixmap); img = imlib_create_image_from_drawable(hints->icon_mask, 0, 0, w, h, 0); @@ -307,25 +309,37 @@ void get_icon (Task *tsk) int w, h; w = imlib_image_get_width(); h = imlib_image_get_height(); - Imlib_Image orig_image = imlib_create_cropped_scaled_image(0, 0, w, h, panel->g_task.icon_size1, panel->g_task.icon_size1); + Imlib_Image orig_image = + imlib_create_cropped_scaled_image(0, 0, w, h, panel->g_task.icon_size1, panel->g_task.icon_size1); imlib_free_image(); imlib_context_set_image(orig_image); - tsk->icon_width = imlib_image_get_width(); - tsk->icon_height = imlib_image_get_height(); - for (k=0; kicon_width = imlib_image_get_width(); + task->icon_height = imlib_image_get_height(); + for (int k = 0; k < TASK_STATE_COUNT; ++k) { imlib_context_set_image(orig_image); - tsk->icon[k] = imlib_clone_image(); - imlib_context_set_image(tsk->icon[k]); + task->icon[k] = imlib_clone_image(); + imlib_context_set_image(task->icon[k]); DATA32 *data32; if (panel->g_task.alpha[k] != 100 || panel->g_task.saturation[k] != 0 || panel->g_task.brightness[k] != 0) { data32 = imlib_image_get_data(); - adjust_asb(data32, tsk->icon_width, tsk->icon_height, panel->g_task.alpha[k], (float)panel->g_task.saturation[k]/100, (float)panel->g_task.brightness[k]/100); + adjust_asb(data32, + task->icon_width, + task->icon_height, + panel->g_task.alpha[k], + (float)panel->g_task.saturation[k] / 100, + (float)panel->g_task.brightness[k] / 100); imlib_image_put_back_data(data32); } if (panel_config.mouse_effects) { - tsk->icon_hover[k] = adjust_icon(tsk->icon[k], panel_config.mouse_over_alpha, panel_config.mouse_over_saturation, panel_config.mouse_over_brightness); - tsk->icon_press[k] = adjust_icon(tsk->icon[k], panel_config.mouse_pressed_alpha, panel_config.mouse_pressed_saturation, panel_config.mouse_pressed_brightness); + task->icon_hover[k] = adjust_icon(task->icon[k], + panel_config.mouse_over_alpha, + panel_config.mouse_over_saturation, + panel_config.mouse_over_brightness); + task->icon_press[k] = adjust_icon(task->icon[k], + panel_config.mouse_pressed_alpha, + panel_config.mouse_pressed_saturation, + panel_config.mouse_pressed_brightness); } } imlib_context_set_image(orig_image); @@ -334,116 +348,123 @@ void get_icon (Task *tsk) if (hints) XFree(hints); if (data) - XFree (data); + XFree(data); - GPtrArray* task_group = task_get_tasks(tsk->win); + GPtrArray *task_group = task_get_tasks(task->win); if (task_group) { - for (i=0; ilen; ++i) { - Task* tsk2 = g_ptr_array_index(task_group, i); - tsk2->icon_width = tsk->icon_width; - tsk2->icon_height = tsk->icon_height; - int k; - for (k=0; kicon[k] = tsk->icon[k]; - tsk2->icon_hover[k] = tsk->icon_hover[k]; - tsk2->icon_press[k] = tsk->icon_press[k]; + for (i = 0; i < task_group->len; ++i) { + Task *task2 = g_ptr_array_index(task_group, i); + task2->icon_width = task->icon_width; + task2->icon_height = task->icon_height; + for (int k = 0; k < TASK_STATE_COUNT; ++k) { + task2->icon[k] = task->icon[k]; + task2->icon_hover[k] = task->icon_hover[k]; + task2->icon_press[k] = task->icon_press[k]; } - set_task_redraw(tsk2); + set_task_redraw(task2); } } } // TODO icons look too large when the panel is large -void draw_task_icon (Task *tsk, int text_width) +void draw_task_icon(Task *task, int text_width) { - if (tsk->icon[tsk->current_state] == 0) return; + if (!task->icon[task->current_state]) + return; // Find pos int pos_x; - Panel *panel = (Panel*)tsk->area.panel; + Panel *panel = (Panel *)task->area.panel; if (panel->g_task.centered) { if (panel->g_task.text) - pos_x = (tsk->area.width - text_width - panel->g_task.icon_size1) / 2; + pos_x = (task->area.width - text_width - panel->g_task.icon_size1) / 2; else - pos_x = (tsk->area.width - panel->g_task.icon_size1) / 2; - } - else pos_x = panel->g_task.area.paddingxlr + tsk->area.bg->border.width; + pos_x = (task->area.width - panel->g_task.icon_size1) / 2; + } else + pos_x = panel->g_task.area.paddingxlr + task->area.bg->border.width; // Render Imlib_Image image; // Render if (panel_config.mouse_effects) { - if (tsk->area.mouse_state == MOUSE_OVER) - image = tsk->icon_hover[tsk->current_state]; - else if (tsk->area.mouse_state == MOUSE_DOWN) - image = tsk->icon_press[tsk->current_state]; + if (task->area.mouse_state == MOUSE_OVER) + image = task->icon_hover[task->current_state]; + else if (task->area.mouse_state == MOUSE_DOWN) + image = task->icon_press[task->current_state]; else - image = tsk->icon[tsk->current_state]; + image = task->icon[task->current_state]; } else { - image = tsk->icon[tsk->current_state]; + image = task->icon[task->current_state]; } imlib_context_set_image(image); - render_image(tsk->area.pix, pos_x, panel->g_task.icon_posy); + render_image(task->area.pix, pos_x, panel->g_task.icon_posy); } - -void draw_task (void *obj, cairo_t *c) +void draw_task(void *obj, cairo_t *c) { - Task *tsk = obj; + Task *task = obj; if (!panel_config.mouse_effects) - tsk->state_pix[tsk->current_state] = tsk->area.pix; + task->state_pix[task->current_state] = task->area.pix; PangoLayout *layout; Color *config_text; - int width=0, height; - Panel *panel = (Panel*)tsk->area.panel; - //printf("draw_task %d %d\n", tsk->area.posx, tsk->area.posy); + int width = 0, height; + Panel *panel = (Panel *)task->area.panel; + // printf("draw_task %d %d\n", task->area.posx, task->area.posy); if (panel->g_task.text) { /* Layout */ - layout = pango_cairo_create_layout (c); - pango_layout_set_font_description (layout, panel->g_task.font_desc); - pango_layout_set_text(layout, tsk->title, -1); + layout = pango_cairo_create_layout(c); + pango_layout_set_font_description(layout, panel->g_task.font_desc); + pango_layout_set_text(layout, task->title, -1); /* Drawing width and Cut text */ // pango use U+22EF or U+2026 - pango_layout_set_width(layout, ((Taskbar*)tsk->area.parent)->text_width * PANGO_SCALE); + pango_layout_set_width(layout, ((Taskbar *)task->area.parent)->text_width * PANGO_SCALE); pango_layout_set_height(layout, panel->g_task.text_height * PANGO_SCALE); pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR); - pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); + pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); /* Center text */ - if (panel->g_task.centered) pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); - else pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT); + if (panel->g_task.centered) + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); + else + pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT); - pango_layout_get_pixel_size (layout, &width, &height); + pango_layout_get_pixel_size(layout, &width, &height); - config_text = &panel->g_task.font[tsk->current_state]; + config_text = &panel->g_task.font[task->current_state]; double text_posy = (panel->g_task.area.height - height) / 2.0; draw_text(layout, c, panel->g_task.text_posx, text_posy, config_text, panel->font_shadow); - g_object_unref (layout); + g_object_unref(layout); } if (panel->g_task.icon) { - draw_task_icon (tsk, width); + draw_task_icon(task, width); } } - -void on_change_task (void *obj) +void on_change_task(void *obj) { - Task *tsk = obj; - Panel *panel = (Panel*)tsk->area.panel; + Task *task = obj; + Panel *panel = (Panel *)task->area.panel; + + long value[] = {panel->posx + task->area.posx, panel->posy + task->area.posy, task->area.width, task->area.height}; + XChangeProperty(server.dsp, + task->win, + server.atom._NET_WM_ICON_GEOMETRY, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char *)value, + 4); - long value[] = { panel->posx+tsk->area.posx, panel->posy+tsk->area.posy, tsk->area.width, tsk->area.height }; - XChangeProperty (server.dsp, tsk->win, server.atom._NET_WM_ICON_GEOMETRY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)value, 4); - // reset Pixmap when position/size changed - set_task_redraw(tsk); + set_task_redraw(task); } // Given a pointer to the active task (active_task) and a pointer @@ -454,35 +475,35 @@ Task *find_active_task(Task *current_task, Task *active_task) if (active_task == NULL) return current_task; - Taskbar* tskbar = current_task->area.parent; + Taskbar *taskbar = current_task->area.parent; - GList *l0 = tskbar->area.children; + GList *l0 = taskbar->area.children; if (taskbarname_enabled) l0 = l0->next; - for (; l0 ; l0 = l0->next) { - Task *tsk = l0->data; - if (tsk->win == active_task->win) - return tsk; + for (; l0; l0 = l0->next) { + Task *task = l0->data; + if (task->win == active_task->win) + return task; } return current_task; } -Task *next_task(Task *tsk) +Task *next_task(Task *task) { - if (tsk == 0) + if (!task) return 0; - Taskbar* tskbar = tsk->area.parent; + Taskbar *taskbar = task->area.parent; - GList *l0 = tskbar->area.children; - if (taskbarname_enabled) l0 = l0->next; - GList *lfirst_tsk = l0; - for (; l0 ; l0 = l0->next) { - Task *tsk1 = l0->data; - if (tsk1 == tsk) { - if (l0->next == 0) l0 = lfirst_tsk; - else l0 = l0->next; + GList *l0 = taskbar->area.children; + if (taskbarname_enabled) + l0 = l0->next; + GList *lfirst_task = l0; + for (; l0; l0 = l0->next) { + Task *task1 = l0->data; + if (task1 == task) { + l0 = l0->next ? l0->next : lfirst_task; return l0->data; } } @@ -490,34 +511,33 @@ Task *next_task(Task *tsk) return 0; } -Task *prev_task(Task *tsk) +Task *prev_task(Task *task) { - if (tsk == 0) + if (!task) return 0; - Task *tsk1, *tsk2; - Taskbar* tskbar = tsk->area.parent; + Taskbar *taskbar = task->area.parent; - tsk2 = 0; - GList *l0 = tskbar->area.children; - if (taskbarname_enabled) l0 = l0->next; - GList *lfirst_tsk = l0; - for (; l0 ; l0 = l0->next) { - tsk1 = l0->data; - if (tsk1 == tsk) { - if (l0 == lfirst_tsk) { - l0 = g_list_last ( l0 ); - tsk2 = l0->data; + Task *task2 = NULL; + GList *l0 = taskbar->area.children; + if (taskbarname_enabled) + l0 = l0->next; + GList *lfirst_task = l0; + for (; l0; l0 = l0->next) { + Task *task1 = l0->data; + if (task1 == task) { + if (l0 == lfirst_task) { + l0 = g_list_last(l0); + task2 = l0->data; } - return tsk2; + return task2; } - tsk2 = tsk1; + task2 = task1; } return 0; } - void active_task() { if (task_active) { @@ -525,8 +545,8 @@ void active_task() task_active = 0; } - Window w1 = window_get_active(); - //printf("Change active task %ld\n", w1); + Window w1 = get_active_window(); + // printf("Change active task %ld\n", w1); if (w1) { if (!task_get_tasks(w1)) { @@ -538,32 +558,31 @@ void active_task() } } - -void set_task_state(Task *tsk, int state) +void set_task_state(Task *task, TaskState state) { - if (tsk == 0 || state < 0 || state >= TASK_STATE_COUNT) + if (!task || state < 0 || state >= TASK_STATE_COUNT) return; - if (tsk->current_state != state || hide_task_diff_monitor) { - GPtrArray* task_group = task_get_tasks(tsk->win); + if (task->current_state != state || hide_task_diff_monitor) { + GPtrArray *task_group = task_get_tasks(task->win); if (task_group) { int i; - for (i=0; ilen; ++i) { - Task* tsk1 = g_ptr_array_index(task_group, i); - tsk1->current_state = state; - tsk1->area.bg = panel1[0].g_task.background[state]; + for (i = 0; i < task_group->len; ++i) { + Task *task1 = g_ptr_array_index(task_group, i); + task1->current_state = state; + task1->area.bg = panels[0].g_task.background[state]; if (!panel_config.mouse_effects) { - tsk1->area.pix = tsk1->state_pix[state]; - if (!tsk1->area.pix) - tsk1->area.redraw_needed = 1; + task1->area.pix = task1->state_pix[state]; + if (!task1->area.pix) + task1->area.redraw_needed = TRUE; } else { - tsk1->area.redraw_needed = 1; + task1->area.redraw_needed = TRUE; } - if (state == TASK_ACTIVE && g_slist_find(urgent_list, tsk1)) - del_urgent(tsk1); + if (state == TASK_ACTIVE && g_slist_find(urgent_list, task1)) + del_urgent(task1); int hide = 0; - Taskbar *taskbar = (Taskbar *)tsk1->area.parent; - if (tsk->desktop == ALLDESKTOP && server.desktop != taskbar->desktop) { + Taskbar *taskbar = (Taskbar *)task1->area.parent; + if (task->desktop == ALLDESKTOP && server.desktop != taskbar->desktop) { // Hide ALLDESKTOP task on non-current desktop hide = 1; } @@ -573,43 +592,42 @@ void set_task_state(Task *tsk, int state) hide = 1; } } - if (window_get_monitor(tsk->win) != ((Panel*)tsk->area.panel)->monitor && - (hide_task_diff_monitor || nb_panel > 1)) { + if (get_window_monitor(task->win) != ((Panel *)task->area.panel)->monitor && + (hide_task_diff_monitor || num_panels > 1)) { hide = 1; } - if (1 - hide != tsk1->area.on_screen) { - tsk1->area.on_screen = 1 - hide; - set_task_redraw(tsk1); - Panel *p = (Panel*)tsk->area.panel; - tsk->area.resize_needed = 1; + if (1 - hide != task1->area.on_screen) { + task1->area.on_screen = TRUE - hide; + set_task_redraw(task1); + Panel *p = (Panel *)task->area.panel; + task->area.resize_needed = 1; p->taskbar->area.resize_needed = 1; p->area.resize_needed = 1; } } - panel_refresh = 1; + panel_refresh = TRUE; } } } - -void set_task_redraw(Task* tsk) +void set_task_redraw(Task *task) { int k; - for (k=0; kstate_pix[k]) XFreePixmap(server.dsp, tsk->state_pix[k]); - tsk->state_pix[k] = 0; + for (k = 0; k < TASK_STATE_COUNT; ++k) { + if (task->state_pix[k]) + XFreePixmap(server.dsp, task->state_pix[k]); + task->state_pix[k] = 0; } - tsk->area.pix = 0; - tsk->area.redraw_needed = 1; + task->area.pix = 0; + task->area.redraw_needed = TRUE; } - -void blink_urgent(void* arg) +void blink_urgent(void *arg) { - GSList* urgent_task = urgent_list; + GSList *urgent_task = urgent_list; while (urgent_task) { - Task* t = urgent_task->data; - if ( t->urgent_tick < max_tick_urgent) { + Task *t = urgent_task->data; + if (t->urgent_tick < max_tick_urgent) { if (t->urgent_tick++ % 2) set_task_state(t, TASK_URGENT); else @@ -617,39 +635,37 @@ void blink_urgent(void* arg) } urgent_task = urgent_task->next; } - panel_refresh = 1; + panel_refresh = TRUE; } - -void add_urgent(Task *tsk) +void add_urgent(Task *task) { - if (!tsk) + if (!task) return; // some programs set urgency hint although they are active - if ( task_active && task_active->win == tsk->win ) + if (task_active && task_active->win == task->win) return; - tsk = task_get_task(tsk->win); // always add the first tsk for a task group (omnipresent windows) - tsk->urgent_tick = 0; - if (g_slist_find(urgent_list, tsk)) + task = task_get_task(task->win); // always add the first task for a task group (omnipresent windows) + task->urgent_tick = 0; + if (g_slist_find(urgent_list, task)) return; // not yet in the list, so we have to add it - urgent_list = g_slist_prepend(urgent_list, tsk); + urgent_list = g_slist_prepend(urgent_list, task); if (!urgent_timeout) urgent_timeout = add_timeout(10, 1000, blink_urgent, 0, &urgent_timeout); - Panel *panel = tsk->area.panel; + Panel *panel = task->area.panel; if (panel->is_hidden) autohide_show(panel); } - -void del_urgent(Task *tsk) +void del_urgent(Task *task) { - urgent_list = g_slist_remove(urgent_list, tsk); + urgent_list = g_slist_remove(urgent_list, task); if (!urgent_list) { stop_timeout(urgent_timeout); urgent_timeout = NULL; diff --git a/src/taskbar/task.h b/src/taskbar/task.h index ea24842..e8d4cb0 100644 --- a/src/taskbar/task.h +++ b/src/taskbar/task.h @@ -13,19 +13,25 @@ #include "common.h" #include "timer.h" +typedef enum TaskState { + TASK_NORMAL = 0, + TASK_ACTIVE, + TASK_ICONIFIED, + TASK_URGENT, + TASK_STATE_COUNT, +} TaskState; -enum { TASK_NORMAL, TASK_ACTIVE, TASK_ICONIFIED, TASK_URGENT, TASK_STATE_COUNT }; -extern timeout* urgent_timeout; -extern GSList* urgent_list; +extern timeout *urgent_timeout; +extern GSList *urgent_list; // -------------------------------------------------- // global task parameter -typedef struct { +typedef struct GlobalTask { Area area; - int text; - int icon; - int centered; + gboolean text; + gboolean icon; + gboolean centered; int icon_posy; int icon_size1; @@ -35,7 +41,7 @@ typedef struct { int saturation[TASK_STATE_COUNT]; int brightness[TASK_STATE_COUNT]; int config_asb_mask; - Background* background[TASK_STATE_COUNT]; + Background *background[TASK_STATE_COUNT]; int config_background_mask; // starting position for text ~ task_padding + task_border + icon_size double text_posx, text_height; @@ -43,10 +49,8 @@ typedef struct { PangoFontDescription *font_desc; Color font[TASK_STATE_COUNT]; int config_font_mask; - int tooltip_enabled; -} Global_task; - - + gboolean tooltip_enabled; +} GlobalTask; typedef struct { // always start with area @@ -54,8 +58,8 @@ typedef struct { // TODO: group task with list of windows here Window win; - int desktop; - int current_state; + int desktop; + TaskState current_state; Imlib_Image icon[TASK_STATE_COUNT]; Imlib_Image icon_hover[TASK_STATE_COUNT]; Imlib_Image icon_press[TASK_STATE_COUNT]; @@ -71,25 +75,23 @@ typedef struct { int win_h; } Task; +Task *add_task(Window win); +void remove_task(Task *task); -Task *add_task (Window win); -void remove_task (Task *tsk); +void draw_task(void *obj, cairo_t *c); +void on_change_task(void *obj); -void draw_task (void *obj, cairo_t *c); -void on_change_task (void *obj); - -void get_icon (Task *tsk); -int get_title(Task *tsk); +void get_icon(Task *task); +gboolean get_title(Task *task); void active_task(); -void set_task_state(Task* tsk, int state); -void set_task_redraw(Task* tsk); +void set_task_state(Task *task, TaskState state); +void set_task_redraw(Task *task); Task *find_active_task(Task *current_task, Task *active_task); -Task *next_task (Task *tsk); -Task *prev_task (Task *tsk); +Task *next_task(Task *task); +Task *prev_task(Task *task); -void add_urgent(Task *tsk); -void del_urgent(Task *tsk); +void add_urgent(Task *task); +void del_urgent(Task *task); #endif - diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index d084fa4..389d6b3 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -33,26 +33,33 @@ #include "panel.h" #include "strnatcmp.h" - /* win_to_task_table holds for every Window an array of tasks. Usually the array contains only one element. However for omnipresent windows (windows which are visible in every taskbar) the array - contains to every Task* on each panel a pointer (i.e. GPtrArray.len == server.nb_desktop) + contains to every Task* on each panel a pointer (i.e. GPtrArray.len == server.num_desktops) */ -GHashTable* win_to_task_table; +GHashTable *win_to_task_table; Task *task_active; Task *task_drag; -int taskbar_enabled; -int taskbar_distribute_size; -int hide_inactive_tasks; -int hide_task_diff_monitor; -int taskbar_sort_method; -int taskbar_alignment; - -guint win_hash(gconstpointer key) { return (guint)*((Window*)key); } -gboolean win_compare(gconstpointer a, gconstpointer b) { return (*((Window*)a) == *((Window*)b)); } -void free_ptr_array(gpointer data) { g_ptr_array_free(data, 1); } +gboolean taskbar_enabled; +gboolean taskbar_distribute_size; +gboolean hide_inactive_tasks; +gboolean hide_task_diff_monitor; +TaskbarSortMethod taskbar_sort_method; +Alignment taskbar_alignment; +guint win_hash(gconstpointer key) +{ + return (guint) * ((const Window *)key); +} +gboolean win_compare(gconstpointer a, gconstpointer b) +{ + return (*((const Window *)a) == *((const Window *)b)); +} +void free_ptr_array(gpointer data) +{ + g_ptr_array_free(data, 1); +} void default_taskbar() { @@ -71,7 +78,7 @@ void default_taskbar() void cleanup_taskbar() { Panel *panel; - Taskbar *tskbar; + Taskbar *taskbar; int i, j, k; cleanup_taskbarname(); @@ -88,18 +95,18 @@ void cleanup_taskbar() g_hash_table_destroy(win_to_task_table); win_to_task_table = NULL; } - for (i = 0 ; i < nb_panel; i++) { - panel = &panel1[i]; - for (j = 0; j < panel->nb_desktop; j++) { - tskbar = &panel->taskbar[j]; + for (i = 0; i < num_panels; i++) { + panel = &panels[i]; + for (j = 0; j < panel->num_desktops; j++) { + taskbar = &panel->taskbar[j]; for (k = 0; k < TASKBAR_STATE_COUNT; ++k) { - if (tskbar->state_pix[k]) - XFreePixmap(server.dsp, tskbar->state_pix[k]); - tskbar->state_pix[k] = 0; + if (taskbar->state_pix[k]) + XFreePixmap(server.dsp, taskbar->state_pix[k]); + taskbar->state_pix[k] = 0; } - free_area(&tskbar->area); + free_area(&taskbar->area); // remove taskbar from the panel - remove_area((Area*)tskbar); + remove_area((Area *)taskbar); } if (panel->taskbar) { free(panel->taskbar); @@ -113,33 +120,31 @@ void cleanup_taskbar() stop_timeout(urgent_timeout); } - void init_taskbar() { - if (win_to_task_table == 0) + if (!win_to_task_table) win_to_task_table = g_hash_table_new_full(win_hash, win_compare, free, free_ptr_array); task_active = 0; task_drag = 0; } - void init_taskbar_panel(void *p) { - Panel *panel =(Panel*)p; + Panel *panel = (Panel *)p; int j; - if (panel->g_taskbar.background[TASKBAR_NORMAL] == 0) { + if (!panel->g_taskbar.background[TASKBAR_NORMAL]) { panel->g_taskbar.background[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, 0); panel->g_taskbar.background[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, 0); } - if (panel->g_taskbar.background_name[TASKBAR_NORMAL] == 0) { + if (!panel->g_taskbar.background_name[TASKBAR_NORMAL]) { panel->g_taskbar.background_name[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, 0); panel->g_taskbar.background_name[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, 0); } if (!panel->g_task.font_desc) panel->g_task.font_desc = pango_font_description_from_string(DEFAULT_FONT); - if (panel->g_task.area.bg == 0) + if (!panel->g_task.area.bg) panel->g_task.area.bg = &g_array_index(backgrounds, Background, 0); // taskbar name @@ -149,7 +154,7 @@ void init_taskbar_panel(void *p) panel->g_taskbar.area_name._draw_foreground = draw_taskbarname; panel->g_taskbar.area_name._on_change_layout = 0; panel->g_taskbar.area_name.resize_needed = 1; - panel->g_taskbar.area_name.on_screen = 1; + panel->g_taskbar.area_name.on_screen = TRUE; // taskbar panel->g_taskbar.area.parent = panel; @@ -160,14 +165,13 @@ void init_taskbar_panel(void *p) panel->g_taskbar.area._draw_foreground = draw_taskbar; panel->g_taskbar.area._on_change_layout = on_change_taskbar; panel->g_taskbar.area.resize_needed = 1; - panel->g_taskbar.area.on_screen = 1; + panel->g_taskbar.area.on_screen = TRUE; if (panel_horizontal) { panel->g_taskbar.area.posy = panel->area.bg->border.width + panel->area.paddingy; panel->g_taskbar.area.height = panel->area.height - (2 * panel->g_taskbar.area.posy); panel->g_taskbar.area_name.posy = panel->g_taskbar.area.posy; panel->g_taskbar.area_name.height = panel->g_taskbar.area.height; - } - else { + } else { panel->g_taskbar.area.posx = panel->area.bg->border.width + panel->area.paddingy; panel->g_taskbar.area.width = panel->area.width - (2 * panel->g_taskbar.area.posx); panel->g_taskbar.area_name.posx = panel->g_taskbar.area.posx; @@ -180,60 +184,81 @@ void init_taskbar_panel(void *p) panel->g_task.area._draw_foreground = draw_task; panel->g_task.area._on_change_layout = on_change_task; panel->g_task.area.resize_needed = 1; - panel->g_task.area.on_screen = 1; - if ((panel->g_task.config_asb_mask & (1<g_task.area.on_screen = TRUE; + if ((panel->g_task.config_asb_mask & (1 << TASK_NORMAL)) == 0) { panel->g_task.alpha[TASK_NORMAL] = 100; panel->g_task.saturation[TASK_NORMAL] = 0; panel->g_task.brightness[TASK_NORMAL] = 0; } - if ((panel->g_task.config_asb_mask & (1<g_task.config_asb_mask & (1 << TASK_ACTIVE)) == 0) { panel->g_task.alpha[TASK_ACTIVE] = panel->g_task.alpha[TASK_NORMAL]; panel->g_task.saturation[TASK_ACTIVE] = panel->g_task.saturation[TASK_NORMAL]; panel->g_task.brightness[TASK_ACTIVE] = panel->g_task.brightness[TASK_NORMAL]; } - if ((panel->g_task.config_asb_mask & (1<g_task.config_asb_mask & (1 << TASK_ICONIFIED)) == 0) { panel->g_task.alpha[TASK_ICONIFIED] = panel->g_task.alpha[TASK_NORMAL]; panel->g_task.saturation[TASK_ICONIFIED] = panel->g_task.saturation[TASK_NORMAL]; panel->g_task.brightness[TASK_ICONIFIED] = panel->g_task.brightness[TASK_NORMAL]; } - if ((panel->g_task.config_asb_mask & (1<g_task.config_asb_mask & (1 << TASK_URGENT)) == 0) { panel->g_task.alpha[TASK_URGENT] = panel->g_task.alpha[TASK_ACTIVE]; panel->g_task.saturation[TASK_URGENT] = panel->g_task.saturation[TASK_ACTIVE]; panel->g_task.brightness[TASK_URGENT] = panel->g_task.brightness[TASK_ACTIVE]; } - if ((panel->g_task.config_font_mask & (1<g_task.font[TASK_NORMAL] = (Color){{0, 0, 0}, 0}; - if ((panel->g_task.config_font_mask & (1<g_task.font[TASK_ACTIVE] = panel->g_task.font[TASK_NORMAL]; - if ((panel->g_task.config_font_mask & (1<g_task.font[TASK_ICONIFIED] = panel->g_task.font[TASK_NORMAL]; - if ((panel->g_task.config_font_mask & (1<g_task.font[TASK_URGENT] = panel->g_task.font[TASK_ACTIVE]; - if ((panel->g_task.config_background_mask & (1<g_task.background[TASK_NORMAL] = &g_array_index(backgrounds, Background, 0); - if ((panel->g_task.config_background_mask & (1<g_task.background[TASK_ACTIVE] = panel->g_task.background[TASK_NORMAL]; - if ((panel->g_task.config_background_mask & (1<g_task.background[TASK_ICONIFIED] = panel->g_task.background[TASK_NORMAL]; - if ((panel->g_task.config_background_mask & (1<g_task.background[TASK_URGENT] = panel->g_task.background[TASK_ACTIVE]; + if ((panel->g_task.config_font_mask & (1 << TASK_NORMAL)) == 0) + panel->g_task.font[TASK_NORMAL] = (Color){{0, 0, 0}, 0}; + if ((panel->g_task.config_font_mask & (1 << TASK_ACTIVE)) == 0) + panel->g_task.font[TASK_ACTIVE] = panel->g_task.font[TASK_NORMAL]; + if ((panel->g_task.config_font_mask & (1 << TASK_ICONIFIED)) == 0) + panel->g_task.font[TASK_ICONIFIED] = panel->g_task.font[TASK_NORMAL]; + if ((panel->g_task.config_font_mask & (1 << TASK_URGENT)) == 0) + panel->g_task.font[TASK_URGENT] = panel->g_task.font[TASK_ACTIVE]; + if ((panel->g_task.config_background_mask & (1 << TASK_NORMAL)) == 0) + panel->g_task.background[TASK_NORMAL] = &g_array_index(backgrounds, Background, 0); + if ((panel->g_task.config_background_mask & (1 << TASK_ACTIVE)) == 0) + panel->g_task.background[TASK_ACTIVE] = panel->g_task.background[TASK_NORMAL]; + if ((panel->g_task.config_background_mask & (1 << TASK_ICONIFIED)) == 0) + panel->g_task.background[TASK_ICONIFIED] = panel->g_task.background[TASK_NORMAL]; + if ((panel->g_task.config_background_mask & (1 << TASK_URGENT)) == 0) + panel->g_task.background[TASK_URGENT] = panel->g_task.background[TASK_ACTIVE]; if (panel_horizontal) { - panel->g_task.area.posy = panel->g_taskbar.area.posy + panel->g_taskbar.background[TASKBAR_NORMAL]->border.width + panel->g_taskbar.area.paddingy; + panel->g_task.area.posy = panel->g_taskbar.area.posy + + panel->g_taskbar.background[TASKBAR_NORMAL]->border.width + + panel->g_taskbar.area.paddingy; panel->g_task.area.height = panel->area.height - (2 * panel->g_task.area.posy); - } - else { - panel->g_task.area.posx = panel->g_taskbar.area.posx + panel->g_taskbar.background[TASKBAR_NORMAL]->border.width + panel->g_taskbar.area.paddingy; + } else { + panel->g_task.area.posx = panel->g_taskbar.area.posx + + panel->g_taskbar.background[TASKBAR_NORMAL]->border.width + + panel->g_taskbar.area.paddingy; panel->g_task.area.width = panel->area.width - (2 * panel->g_task.area.posx); panel->g_task.area.height = panel->g_task.maximum_height; } - for (j=0; jg_task.background[j] == 0) + for (j = 0; j < TASK_STATE_COUNT; ++j) { + if (!panel->g_task.background[j]) panel->g_task.background[j] = &g_array_index(backgrounds, Background, 0); - if (panel->g_task.background[j]->border.radius > panel->g_task.area.height/2) { - printf("task%sbackground_id has a too large rounded value. Please fix your tint2rc\n", j==0 ? "_" : j==1 ? "_active_" : j==2 ? "_iconified_" : "_urgent_"); + if (panel->g_task.background[j]->border.radius > panel->g_task.area.height / 2) { + printf("task%sbackground_id has a too large rounded value. Please fix your tint2rc\n", + j == 0 ? "_" : j == 1 ? "_active_" : j == 2 ? "_iconified_" : "_urgent_"); g_array_append_val(backgrounds, *panel->g_task.background[j]); - panel->g_task.background[j] = &g_array_index(backgrounds, Background, backgrounds->len-1); - panel->g_task.background[j]->border.radius = panel->g_task.area.height/2; + panel->g_task.background[j] = &g_array_index(backgrounds, Background, backgrounds->len - 1); + panel->g_task.background[j]->border.radius = panel->g_task.area.height / 2; } } // compute vertical position : text and icon int height_ink, height, width; - get_text_size2(panel->g_task.font_desc, &height_ink, &height, &width, panel->area.height, panel->area.width, "TAjpg", 5, PANGO_WRAP_WORD_CHAR, PANGO_ELLIPSIZE_END); + get_text_size2(panel->g_task.font_desc, + &height_ink, + &height, + &width, + panel->area.height, + panel->area.width, + "TAjpg", + 5, + PANGO_WRAP_WORD_CHAR, + PANGO_ELLIPSIZE_END); if (!panel->g_task.maximum_width && panel_horizontal) panel->g_task.maximum_width = server.monitor[panel->monitor].width; @@ -245,41 +270,38 @@ void init_taskbar_panel(void *p) panel->g_task.text_posx += panel->g_task.icon_size1 + panel->g_task.area.paddingx; panel->g_task.icon_posy = (panel->g_task.area.height - panel->g_task.icon_size1) / 2; } - //printf("monitor %d, task_maximum_width %d\n", panel->monitor, panel->g_task.maximum_width); + // printf("monitor %d, task_maximum_width %d\n", panel->monitor, panel->g_task.maximum_width); - Taskbar *tskbar; - panel->nb_desktop = server.nb_desktop; - panel->taskbar = calloc(server.nb_desktop, sizeof(Taskbar)); - for (j=0 ; j < panel->nb_desktop ; j++) { - tskbar = &panel->taskbar[j]; - memcpy(&tskbar->area, &panel->g_taskbar.area, sizeof(Area)); - tskbar->desktop = j; + Taskbar *taskbar; + panel->num_desktops = server.num_desktops; + panel->taskbar = calloc(server.num_desktops, sizeof(Taskbar)); + for (j = 0; j < panel->num_desktops; j++) { + taskbar = &panel->taskbar[j]; + memcpy(&taskbar->area, &panel->g_taskbar.area, sizeof(Area)); + taskbar->desktop = j; if (j == server.desktop) - tskbar->area.bg = panel->g_taskbar.background[TASKBAR_ACTIVE]; + taskbar->area.bg = panel->g_taskbar.background[TASKBAR_ACTIVE]; else - tskbar->area.bg = panel->g_taskbar.background[TASKBAR_NORMAL]; + taskbar->area.bg = panel->g_taskbar.background[TASKBAR_NORMAL]; } init_taskbarname_panel(panel); } - void taskbar_remove_task(gpointer key, gpointer value, gpointer user_data) { - remove_task(task_get_task(*(Window*)key)); + remove_task(task_get_task(*(Window *)key)); } - -Task *task_get_task (Window win) +Task *task_get_task(Window win) { - GPtrArray* task_group = task_get_tasks(win); + GPtrArray *task_group = task_get_tasks(win); if (task_group) return g_ptr_array_index(task_group, 0); else return 0; } - -GPtrArray* task_get_tasks(Window win) +GPtrArray *task_get_tasks(Window win) { if (win_to_task_table && taskbar_enabled) return g_hash_table_lookup(win_to_task_table, &win); @@ -287,21 +309,22 @@ GPtrArray* task_get_tasks(Window win) return 0; } - -void task_refresh_tasklist () +void task_refresh_tasklist() { Window *win; int num_results, i; - if (!taskbar_enabled) return; - win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results); - if (!win) return; + if (!taskbar_enabled) + return; + win = server_get_property(server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results); + if (!win) + return; - GList* win_list = g_hash_table_get_keys(win_to_task_table); - GList* it; - for (it=win_list; it; it=it->next) { + GList *win_list = g_hash_table_get_keys(win_to_task_table); + GList *it; + for (it = win_list; it; it = it->next) { for (i = 0; i < num_results; i++) - if (*((Window*)it->data) == win[i]) + if (*((Window *)it->data) == win[i]) break; if (i == num_results) taskbar_remove_task(it->data, 0, 0); @@ -310,122 +333,121 @@ void task_refresh_tasklist () // Add any new for (i = 0; i < num_results; i++) - if (!task_get_task (win[i])) - add_task (win[i]); + if (!task_get_task(win[i])) + add_task(win[i]); - XFree (win); + XFree(win); } - -void draw_taskbar (void *obj, cairo_t *c) +void draw_taskbar(void *obj, cairo_t *c) { - Taskbar *taskbar = obj; + Taskbar *taskbar = (Taskbar *)obj; int state = (taskbar->desktop == server.desktop) ? TASKBAR_ACTIVE : TASKBAR_NORMAL; - + taskbar->state_pix[state] = taskbar->area.pix; } - -int resize_taskbar(void *obj) +gboolean resize_taskbar(void *obj) { - Taskbar *taskbar = (Taskbar*)obj; - Panel *panel = (Panel*)taskbar->area.panel; + Taskbar *taskbar = (Taskbar *)obj; + Panel *panel = (Panel *)taskbar->area.panel; int text_width; - //printf("resize_taskbar %d %d\n", taskbar->area.posx, taskbar->area.posy); + // printf("resize_taskbar %d %d\n", taskbar->area.posx, taskbar->area.posy); if (panel_horizontal) { relayout_with_constraint(&taskbar->area, panel->g_task.maximum_width); - + text_width = panel->g_task.maximum_width; GList *l = taskbar->area.children; - if (taskbarname_enabled) l = l->next; + if (taskbarname_enabled) + l = l->next; for (; l != NULL; l = l->next) { if (((Task *)l->data)->area.on_screen) { text_width = ((Task *)l->data)->area.width; break; } } - taskbar->text_width = text_width - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingxlr; - } - else { + taskbar->text_width = + text_width - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingxlr; + } else { relayout_with_constraint(&taskbar->area, panel->g_task.maximum_height); - - taskbar->text_width = taskbar->area.width - (2 * panel->g_taskbar.area.paddingy) - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingxlr; + + taskbar->text_width = taskbar->area.width - (2 * panel->g_taskbar.area.paddingy) - panel->g_task.text_posx - + panel->g_task.area.bg->border.width - panel->g_task.area.paddingxlr; } return 0; } - -void on_change_taskbar (void *obj) +void on_change_taskbar(void *obj) { - Taskbar *tskbar = obj; + Taskbar *taskbar = (Taskbar *)obj; int k; // reset Pixmap when position/size changed - for (k=0; kstate_pix[k]) XFreePixmap(server.dsp, tskbar->state_pix[k]); - tskbar->state_pix[k] = 0; + for (k = 0; k < TASKBAR_STATE_COUNT; ++k) { + if (taskbar->state_pix[k]) + XFreePixmap(server.dsp, taskbar->state_pix[k]); + taskbar->state_pix[k] = 0; } - tskbar->area.pix = 0; - tskbar->area.redraw_needed = 1; + taskbar->area.pix = 0; + taskbar->area.redraw_needed = TRUE; } - -void set_taskbar_state(Taskbar *tskbar, int state) +void set_taskbar_state(Taskbar *taskbar, TaskbarState state) { - tskbar->area.bg = panel1[0].g_taskbar.background[state]; - tskbar->area.pix = tskbar->state_pix[state]; + taskbar->area.bg = panels[0].g_taskbar.background[state]; + taskbar->area.pix = taskbar->state_pix[state]; if (taskbarname_enabled) { - tskbar->bar_name.area.bg = panel1[0].g_taskbar.background_name[state]; + taskbar->bar_name.area.bg = panels[0].g_taskbar.background_name[state]; if (!panel_config.mouse_effects) { - tskbar->bar_name.area.pix = tskbar->bar_name.state_pix[state]; + taskbar->bar_name.area.pix = taskbar->bar_name.state_pix[state]; } } - if (panel_mode != MULTI_DESKTOP) { + if (taskbar_mode != MULTI_DESKTOP) { if (state == TASKBAR_NORMAL) - tskbar->area.on_screen = 0; + taskbar->area.on_screen = FALSE; else - tskbar->area.on_screen = 1; + taskbar->area.on_screen = TRUE; } - if (tskbar->area.on_screen == 1) { - if (tskbar->state_pix[state] == 0) - tskbar->area.redraw_needed = 1; + if (taskbar->area.on_screen) { + if (!taskbar->state_pix[state]) + taskbar->area.redraw_needed = TRUE; if (taskbarname_enabled) { if (!panel_config.mouse_effects) { - if (tskbar->bar_name.state_pix[state] == 0) - tskbar->bar_name.area.redraw_needed = 1; + if (!taskbar->bar_name.state_pix[state]) + taskbar->bar_name.area.redraw_needed = TRUE; } else { - tskbar->bar_name.area.redraw_needed = 1; + taskbar->bar_name.area.redraw_needed = TRUE; } } - if (panel_mode == MULTI_DESKTOP && panel1[0].g_taskbar.background[TASKBAR_NORMAL] != panel1[0].g_taskbar.background[TASKBAR_ACTIVE]) { - GList *l = tskbar->area.children; - if (taskbarname_enabled) l = l->next; - for ( ; l ; l = l->next) + if (taskbar_mode == MULTI_DESKTOP && + panels[0].g_taskbar.background[TASKBAR_NORMAL] != panels[0].g_taskbar.background[TASKBAR_ACTIVE]) { + GList *l = taskbar->area.children; + if (taskbarname_enabled) + l = l->next; + for (; l; l = l->next) set_task_redraw(l->data); } } - panel_refresh = 1; + panel_refresh = TRUE; } - void visible_taskbar(void *p) { - Panel *panel =(Panel*)p; + Panel *panel = (Panel *)p; int j; Taskbar *taskbar; - for (j=0 ; j < panel->nb_desktop ; j++) { + for (j = 0; j < panel->num_desktops; j++) { taskbar = &panel->taskbar[j]; - if (panel_mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) { + if (taskbar_mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) { // SINGLE_DESKTOP and not current desktop - taskbar->area.on_screen = 0; - } - else { - taskbar->area.on_screen = 1; + taskbar->area.on_screen = FALSE; + } else { + taskbar->area.on_screen = TRUE; } } - panel_refresh = 1; + panel_refresh = TRUE; } #define NONTRIVIAL 2 @@ -444,9 +466,7 @@ gint compare_tasks_trivial(Task *a, Task *b, Taskbar *taskbar) gint contained_within(Task *a, Task *b) { - if ((a->win_x <= b->win_x) && - (a->win_y <= b->win_y) && - (a->win_x + a->win_w >= b->win_x + b->win_w) && + if ((a->win_x <= b->win_x) && (a->win_y <= b->win_y) && (a->win_x + a->win_w >= b->win_x + b->win_w) && (a->win_y + a->win_h >= b->win_y + b->win_h)) { return 1; } @@ -461,10 +481,7 @@ gint compare_task_centers(Task *a, Task *b, Taskbar *taskbar) // If a window has the same coordinates and size as the other, // they are considered to be equal in the comparison. - if ((a->win_x == b->win_x) && - (a->win_y == b->win_y) && - (a->win_w == b->win_w) && - (a->win_h == b->win_h)) { + if ((a->win_x == b->win_x) && (a->win_y == b->win_y) && (a->win_w == b->win_w) && (a->win_h == b->win_h)) { return 0; } @@ -536,35 +553,34 @@ void sort_tasks(Taskbar *taskbar) { if (!taskbar) return; - if (!taskbar_needs_sort(taskbar)) { + if (!taskbar_needs_sort(taskbar)) return; - } + taskbar->area.children = g_list_sort_with_data(taskbar->area.children, (GCompareDataFunc)compare_tasks, taskbar); taskbar->area.resize_needed = 1; - panel_refresh = 1; - ((Panel*)taskbar->area.panel)->area.resize_needed = 1; + panel_refresh = TRUE; + ((Panel *)taskbar->area.panel)->area.resize_needed = 1; } - void sort_taskbar_for_win(Window win) { if (taskbar_sort_method == TASKBAR_NOSORT) return; - GPtrArray* task_group = task_get_tasks(win); + GPtrArray *task_group = task_get_tasks(win); if (task_group) { int i; - Task* tsk0 = g_ptr_array_index(task_group, 0); - if (tsk0) { - window_get_coordinates(win, &tsk0->win_x, &tsk0->win_y, &tsk0->win_w, &tsk0->win_h); + Task *task0 = g_ptr_array_index(task_group, 0); + if (task0) { + get_window_coordinates(win, &task0->win_x, &task0->win_y, &task0->win_w, &task0->win_h); } for (i = 0; i < task_group->len; ++i) { - Task* tsk = g_ptr_array_index(task_group, i); - tsk->win_x = tsk0->win_x; - tsk->win_y = tsk0->win_y; - tsk->win_w = tsk0->win_w; - tsk->win_h = tsk0->win_h; - sort_tasks(tsk->area.parent); + Task *task = g_ptr_array_index(task_group, i); + task->win_x = task0->win_x; + task->win_y = task0->win_y; + task->win_w = task0->win_w; + task->win_h = task0->win_h; + sort_tasks(task->area.parent); } } } diff --git a/src/taskbar/taskbar.h b/src/taskbar/taskbar.h index ca76314..60c0b26 100644 --- a/src/taskbar/taskbar.h +++ b/src/taskbar/taskbar.h @@ -11,49 +11,51 @@ #include "task.h" #include "taskbarname.h" -enum { TASKBAR_NORMAL, TASKBAR_ACTIVE, TASKBAR_STATE_COUNT }; +typedef enum TaskbarState { + TASKBAR_NORMAL = 0, + TASKBAR_ACTIVE, + TASKBAR_STATE_COUNT, +} TaskbarState; + +typedef enum TaskbarSortMethod { + TASKBAR_NOSORT = 0, + TASKBAR_SORT_CENTER, + TASKBAR_SORT_TITLE, +} TaskbarSortMethod; + extern GHashTable *win_to_task_table; extern Task *task_active; extern Task *task_drag; -extern int taskbar_enabled; -extern int taskbar_distribute_size; -extern int hide_inactive_tasks; -extern int hide_task_diff_monitor; -enum { TASKBAR_NOSORT, TASKBAR_SORT_CENTER, TASKBAR_SORT_TITLE }; -extern int taskbar_sort_method; -extern int taskbar_alignment; +extern gboolean taskbar_enabled; +extern gboolean taskbar_distribute_size; +extern gboolean hide_inactive_tasks; +extern gboolean hide_task_diff_monitor; +extern TaskbarSortMethod taskbar_sort_method; +extern Alignment taskbar_alignment; typedef struct { - // always start with area Area area; Pixmap state_pix[TASKBAR_STATE_COUNT]; gchar *name; - int posy; + int posy; } Taskbarname; -// tint2 use one taskbar per desktop. typedef struct { - // always start with area Area area; - - int desktop; Pixmap state_pix[TASKBAR_STATE_COUNT]; - + int desktop; Taskbarname bar_name; - - // task parameters int text_width; } Taskbar; -typedef struct { - //always start with area +typedef struct GlobalTaskbar { + // always start with area Area area; Area area_name; - Background* background[TASKBAR_STATE_COUNT]; - Background* background_name[TASKBAR_STATE_COUNT]; -} Global_taskbar; - + Background *background[TASKBAR_STATE_COUNT]; + Background *background_name[TASKBAR_STATE_COUNT]; +} GlobalTaskbar; // default global data void default_taskbar(); @@ -64,15 +66,15 @@ void cleanup_taskbar(); void init_taskbar(); void init_taskbar_panel(void *p); -void draw_taskbar (void *obj, cairo_t *c); +void draw_taskbar(void *obj, cairo_t *c); void taskbar_remove_task(gpointer key, gpointer value, gpointer user_data); -Task *task_get_task (Window win); -GPtrArray* task_get_tasks(Window win); -void task_refresh_tasklist (); +Task *task_get_task(Window win); +GPtrArray *task_get_tasks(Window win); +void task_refresh_tasklist(); -int resize_taskbar(void *obj); -void on_change_taskbar (void *obj); -void set_taskbar_state(Taskbar *tskbar, int state); +gboolean resize_taskbar(void *obj); +void on_change_taskbar(void *obj); +void set_taskbar_state(Taskbar *taskbar, TaskbarState state); // show/hide taskbar according to current desktop void visible_taskbar(void *p); @@ -81,4 +83,3 @@ void sort_taskbar_for_win(Window win); void sort_tasks(Taskbar *taskbar); #endif - diff --git a/src/taskbar/taskbarname.c b/src/taskbar/taskbarname.c index 0dfe040..83991b3 100644 --- a/src/taskbar/taskbarname.c +++ b/src/taskbar/taskbarname.c @@ -37,81 +37,76 @@ PangoFontDescription *taskbarname_font_desc; Color taskbarname_font; Color taskbarname_active_font; - void default_taskbarname() { taskbarname_enabled = 0; taskbarname_font_desc = NULL; } - void init_taskbarname_panel(void *p) { - Panel *panel =(Panel*)p; - Taskbar *tskbar; + Panel *panel = (Panel *)p; + Taskbar *taskbar; int j; - + if (!taskbarname_enabled) return; if (!panel_config.taskbarname_font_desc) panel_config.taskbarname_font_desc = pango_font_description_from_string(DEFAULT_FONT); - GSList *l, *list = server_get_name_of_desktop(); - for (j=0, l=list ; j < panel->nb_desktop ; j++) { - tskbar = &panel->taskbar[j]; - memcpy(&tskbar->bar_name.area, &panel->g_taskbar.area_name, sizeof(Area)); - tskbar->bar_name.area.parent = tskbar; - tskbar->bar_name.area.has_mouse_over_effect = 1; - tskbar->bar_name.area.has_mouse_press_effect = 1; + GSList *l, *list = get_desktop_names(); + for (j = 0, l = list; j < panel->num_desktops; j++) { + taskbar = &panel->taskbar[j]; + memcpy(&taskbar->bar_name.area, &panel->g_taskbar.area_name, sizeof(Area)); + taskbar->bar_name.area.parent = taskbar; + taskbar->bar_name.area.has_mouse_over_effect = 1; + taskbar->bar_name.area.has_mouse_press_effect = 1; if (j == server.desktop) - tskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_ACTIVE]; + taskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_ACTIVE]; else - tskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_NORMAL]; + taskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_NORMAL]; // use desktop number if name is missing if (l) { - tskbar->bar_name.name = g_strdup(l->data); + taskbar->bar_name.name = g_strdup(l->data); l = l->next; - } - else - tskbar->bar_name.name = g_strdup_printf("%d", j+1); - + } else + taskbar->bar_name.name = g_strdup_printf("%d", j + 1); + // append the name at the beginning of taskbar - tskbar->area.children = g_list_append(tskbar->area.children, &tskbar->bar_name); + taskbar->area.children = g_list_append(taskbar->area.children, &taskbar->bar_name); } - for (l=list ; l ; l = l->next) + for (l = list; l; l = l->next) g_free(l->data); g_slist_free(list); } - void cleanup_taskbarname() { int i, j, k; Panel *panel; - Taskbar *tskbar; + Taskbar *taskbar; - for (i = 0; i < nb_panel; i++) { - panel = &panel1[i]; - for (j = 0; j < panel->nb_desktop; j++) { - tskbar = &panel->taskbar[j]; - g_free(tskbar->bar_name.name); - tskbar->bar_name.name = NULL; - free_area(&tskbar->bar_name.area); + for (i = 0; i < num_panels; i++) { + panel = &panels[i]; + for (j = 0; j < panel->num_desktops; j++) { + taskbar = &panel->taskbar[j]; + g_free(taskbar->bar_name.name); + taskbar->bar_name.name = NULL; + free_area(&taskbar->bar_name.area); for (k = 0; k < TASKBAR_STATE_COUNT; ++k) { - if (tskbar->bar_name.state_pix[k]) - XFreePixmap(server.dsp, tskbar->bar_name.state_pix[k]); - tskbar->bar_name.state_pix[k] = 0; + if (taskbar->bar_name.state_pix[k]) + XFreePixmap(server.dsp, taskbar->bar_name.state_pix[k]); + taskbar->bar_name.state_pix[k] = 0; } - remove_area((Area*)&tskbar->bar_name); + remove_area((Area *)&taskbar->bar_name); } } } - -void draw_taskbarname (void *obj, cairo_t *c) +void draw_taskbarname(void *obj, cairo_t *c) { Taskbarname *taskbar_name = obj; Taskbar *taskbar = taskbar_name->area.parent; @@ -121,54 +116,58 @@ void draw_taskbarname (void *obj, cairo_t *c) int state = (taskbar->desktop == server.desktop) ? TASKBAR_ACTIVE : TASKBAR_NORMAL; if (!panel_config.mouse_effects) taskbar_name->state_pix[state] = taskbar_name->area.pix; - + // draw content - layout = pango_cairo_create_layout (c); - pango_layout_set_font_description (layout, panel_config.taskbarname_font_desc); - pango_layout_set_width (layout, taskbar_name->area.width * PANGO_SCALE); - pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); + layout = pango_cairo_create_layout(c); + pango_layout_set_font_description(layout, panel_config.taskbarname_font_desc); + pango_layout_set_width(layout, taskbar_name->area.width * PANGO_SCALE); + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR); pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE); - pango_layout_set_text (layout, taskbar_name->name, strlen(taskbar_name->name)); + pango_layout_set_text(layout, taskbar_name->name, strlen(taskbar_name->name)); - cairo_set_source_rgba (c, config_text->rgb[0], config_text->rgb[1], config_text->rgb[2], config_text->alpha); + cairo_set_source_rgba(c, config_text->rgb[0], config_text->rgb[1], config_text->rgb[2], config_text->alpha); - pango_cairo_update_layout (c, layout); - draw_text(layout, c, 0, taskbar_name->posy, config_text, ((Panel*)taskbar_name->area.panel)->font_shadow); + pango_cairo_update_layout(c, layout); + draw_text(layout, c, 0, taskbar_name->posy, config_text, ((Panel *)taskbar_name->area.panel)->font_shadow); - g_object_unref (layout); - //printf("draw_taskbarname %s ******************************\n", taskbar_name->name); + g_object_unref(layout); + // printf("draw_taskbarname %s ******************************\n", taskbar_name->name); } - -int resize_taskbarname(void *obj) +gboolean resize_taskbarname(void *obj) { Taskbarname *taskbar_name = obj; Panel *panel = taskbar_name->area.panel; int name_height, name_width, name_height_ink; int ret = 0; - taskbar_name->area.redraw_needed = 1; - get_text_size2(panel_config.taskbarname_font_desc, &name_height_ink, &name_height, &name_width, panel->area.height, panel->area.width, taskbar_name->name, strlen(taskbar_name->name), + taskbar_name->area.redraw_needed = TRUE; + get_text_size2(panel_config.taskbarname_font_desc, + &name_height_ink, + &name_height, + &name_width, + panel->area.height, + panel->area.width, + taskbar_name->name, + strlen(taskbar_name->name), PANGO_WRAP_WORD_CHAR, PANGO_ELLIPSIZE_NONE); if (panel_horizontal) { - int new_size = name_width + (2* (taskbar_name->area.paddingxlr + taskbar_name->area.bg->border.width)); + int new_size = name_width + (2 * (taskbar_name->area.paddingxlr + taskbar_name->area.bg->border.width)); if (new_size != taskbar_name->area.width) { taskbar_name->area.width = new_size; taskbar_name->posy = (taskbar_name->area.height - name_height) / 2; ret = 1; } - } - else { + } else { int new_size = name_height + (2 * (taskbar_name->area.paddingxlr + taskbar_name->area.bg->border.width)); if (new_size != taskbar_name->area.height) { - taskbar_name->area.height = new_size; + taskbar_name->area.height = new_size; taskbar_name->posy = (taskbar_name->area.height - name_height) / 2; ret = 1; } } return ret; } - diff --git a/src/taskbar/taskbarname.h b/src/taskbar/taskbarname.h index b54d046..371f42d 100644 --- a/src/taskbar/taskbarname.h +++ b/src/taskbar/taskbarname.h @@ -8,7 +8,7 @@ #include "common.h" #include "area.h" -extern int taskbarname_enabled; +extern gboolean taskbarname_enabled; extern Color taskbarname_font; extern Color taskbarname_active_font; @@ -19,8 +19,6 @@ void init_taskbarname_panel(void *p); void draw_taskbarname(void *obj, cairo_t *c); -int resize_taskbarname(void *obj); - +gboolean resize_taskbarname(void *obj); #endif - diff --git a/src/tint.c b/src/tint.c index c9614f7..6e40c0e 100644 --- a/src/tint.c +++ b/src/tint.c @@ -60,7 +60,7 @@ Atom dnd_atom; int dnd_sent_request; char *dnd_launcher_exec; -timeout* detect_compositor_timer = NULL; +timeout *detect_compositor_timer = NULL; int detect_compositor_timer_counter = 0; void detect_compositor(void *arg) @@ -103,10 +103,11 @@ void signal_handler(int sig) signal_pending = sig; } - -void init (int argc, char *argv[]) +void init(int argc, char *argv[]) { - int i; + // Make stdout/stderr flush after a newline (for some reason they don't even if tint2 is started from a terminal) + setlinebuf(stdout); + setlinebuf(stderr); // set global data default_config(); @@ -123,7 +124,7 @@ void init (int argc, char *argv[]) default_panel(); // read options - for (i = 1; i < argc; ++i) { + for (int i = 1; i < argc; ++i) { int error = 0; if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { printf("Usage: tint2 [[-c] ]\n"); @@ -132,20 +133,20 @@ void init (int argc, char *argv[]) printf("tint2 version %s\n", VERSION_STRING); exit(0); } else if (strcmp(argv[i], "-c") == 0) { - if (i+1 < argc) { + if (i + 1 < argc) { i++; config_path = strdup(argv[i]); } else { error = 1; } - } else if (strcmp(argv[i], "-s") == 0) { - if (i+1 < argc) { + } else if (strcmp(argv[i], "-s") == 0) { + if (i + 1 < argc) { i++; snapshot_path = strdup(argv[i]); } else { error = 1; } - } else if (i+1 == argc) { + } else if (i + 1 == argc) { config_path = strdup(argv[i]); } else { error = 1; @@ -157,8 +158,8 @@ void init (int argc, char *argv[]) } // Set signal handler signal_pending = 0; - struct sigaction sa = { .sa_handler = signal_handler }; - struct sigaction sa_chld = { .sa_handler = SIG_DFL, .sa_flags = SA_NOCLDWAIT }; + struct sigaction sa = {.sa_handler = signal_handler}; + struct sigaction sa_chld = {.sa_handler = SIG_DFL, .sa_flags = SA_NOCLDWAIT}; sigaction(SIGUSR1, &sa, 0); sigaction(SIGINT, &sa, 0); sigaction(SIGTERM, &sa, 0); @@ -198,33 +199,36 @@ static void error_trap_pop(SnDisplay *display, Display *xdisplay) --error_trap_depth; } -static void sigchld_handler(int sig) { +static void sigchld_handler(int sig) +{ if (!startup_notifications) return; if (!sn_pipe_valid) return; ssize_t wur = write(sn_pipe[1], "x", 1); - (void) wur; + (void)wur; fsync(sn_pipe[1]); } -static void sigchld_handler_async() { +static void sigchld_handler_async() +{ if (!startup_notifications) return; // Wait for all dead processes pid_t pid; while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) { SnLauncherContext *ctx; - ctx = (SnLauncherContext *) g_tree_lookup (server.pids, GINT_TO_POINTER (pid)); + ctx = (SnLauncherContext *)g_tree_lookup(server.pids, GINT_TO_POINTER(pid)); if (ctx) { - g_tree_remove (server.pids, GINT_TO_POINTER (pid)); - sn_launcher_context_complete (ctx); - sn_launcher_context_unref (ctx); + g_tree_remove(server.pids, GINT_TO_POINTER(pid)); + sn_launcher_context_complete(ctx); + sn_launcher_context_unref(ctx); } } } -static gint cmp_ptr(gconstpointer a, gconstpointer b) { +static gint cmp_ptr(gconstpointer a, gconstpointer b) +{ if (a < b) return -1; else if (a == b) @@ -233,27 +237,29 @@ static gint cmp_ptr(gconstpointer a, gconstpointer b) { return 1; } #else -static void sigchld_handler_async() {} +static void sigchld_handler_async() +{ +} #endif // HAVE_SN void init_X11_pre_config() { - server.dsp = XOpenDisplay (NULL); + server.dsp = XOpenDisplay(NULL); if (!server.dsp) { fprintf(stderr, "tint2 exit : could not open display.\n"); exit(0); } - server_init_atoms (); - server.screen = DefaultScreen (server.dsp); + server_init_atoms(); + server.screen = DefaultScreen(server.dsp); server.root_win = RootWindow(server.dsp, server.screen); - server.desktop = server_get_current_desktop (); + server.desktop = get_current_desktop(); - setlocale (LC_ALL, ""); + setlocale(LC_ALL, ""); // config file use '.' as decimal separator setlocale(LC_NUMERIC, "POSIX"); /* Catch events */ - XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask); + XSelectInput(server.dsp, server.root_win, PropertyChangeMask | StructureNotifyMask); // get monitor and desktop config get_monitors(); @@ -265,13 +271,13 @@ void init_X11_pre_config() void init_X11_post_config() { server_init_visual(); - XSetErrorHandler ((XErrorHandler) server_catch_error); + XSetErrorHandler((XErrorHandler)server_catch_error); #ifdef HAVE_SN // Initialize startup-notification if (startup_notifications) { - server.sn_dsp = sn_display_new (server.dsp, error_trap_push, error_trap_pop); - server.pids = g_tree_new (cmp_ptr); + server.sn_dsp = sn_display_new(server.dsp, error_trap_push, error_trap_pop); + server.pids = g_tree_new(cmp_ptr); // Setup a handler for child termination if (pipe(sn_pipe) != 0) { fprintf(stderr, "Creating pipe failed.\n"); @@ -289,24 +295,23 @@ void init_X11_post_config() } #endif // HAVE_SN - imlib_context_set_display (server.dsp); - imlib_context_set_visual (server.visual); - imlib_context_set_colormap (server.colormap); + imlib_context_set_display(server.dsp); + imlib_context_set_visual(server.visual); + imlib_context_set_colormap(server.colormap); // load default icon gchar *path; - const gchar * const *data_dirs; - data_dirs = g_get_system_data_dirs (); + const gchar *const *data_dirs; + data_dirs = g_get_system_data_dirs(); int i; - for (i = 0; data_dirs[i] != NULL; i++) { + for (i = 0; data_dirs[i] != NULL; i++) { path = g_build_filename(data_dirs[i], "tint2", "default_icon.png", NULL); - if (g_file_test (path, G_FILE_TEST_EXISTS)) + if (g_file_test(path, G_FILE_TEST_EXISTS)) default_icon = imlib_load_image(path); g_free(path); } } - void cleanup() { cleanup_systray(); @@ -345,10 +350,9 @@ void cleanup() uevent_cleanup(); } - void get_snapshot(const char *path) { - Panel *panel = &panel1[0]; + Panel *panel = &panels[0]; if (panel->area.width > server.monitor[0].width) panel->area.width = server.monitor[0].width; @@ -370,83 +374,77 @@ void get_snapshot(const char *path) imlib_free_image(); } - -void window_action (Task *tsk, int action) +void window_action(Task *task, int action) { - if (!tsk) return; + if (!task) + return; int desk; switch (action) { case CLOSE: - set_close (tsk->win); + close_window(task->win); break; case TOGGLE: - set_active(tsk->win); + activate_window(task->win); break; case ICONIFY: - XIconifyWindow (server.dsp, tsk->win, server.screen); + XIconifyWindow(server.dsp, task->win, server.screen); break; case TOGGLE_ICONIFY: - if (task_active && tsk->win == task_active->win) - XIconifyWindow (server.dsp, tsk->win, server.screen); + if (task_active && task->win == task_active->win) + XIconifyWindow(server.dsp, task->win, server.screen); else - set_active (tsk->win); + activate_window(task->win); break; case SHADE: - window_toggle_shade (tsk->win); + toggle_window_shade(task->win); break; case MAXIMIZE_RESTORE: - window_maximize_restore (tsk->win); + toggle_window_maximized(task->win); break; case MAXIMIZE: - window_maximize_restore (tsk->win); + toggle_window_maximized(task->win); break; case RESTORE: - window_maximize_restore (tsk->win); + toggle_window_maximized(task->win); break; case DESKTOP_LEFT: - if ( tsk->desktop == 0 ) break; - desk = tsk->desktop - 1; - windows_set_desktop(tsk->win, desk); + if (task->desktop == 0) + break; + desk = task->desktop - 1; + change_window_desktop(task->win, desk); if (desk == server.desktop) - set_active(tsk->win); + activate_window(task->win); break; case DESKTOP_RIGHT: - if (tsk->desktop == server.nb_desktop ) break; - desk = tsk->desktop + 1; - windows_set_desktop(tsk->win, desk); + if (task->desktop == server.num_desktops) + break; + desk = task->desktop + 1; + change_window_desktop(task->win, desk); if (desk == server.desktop) - set_active(tsk->win); + activate_window(task->win); break; - case NEXT_TASK: - { - Task *tsk1; - tsk1 = next_task(find_active_task(tsk, task_active)); - set_active(tsk1->win); - } - break; - case PREV_TASK: - { - Task *tsk1; - tsk1 = prev_task(find_active_task(tsk, task_active)); - set_active(tsk1->win); + case NEXT_TASK: { + Task *task1; + task1 = next_task(find_active_task(task, task_active)); + activate_window(task1->win); + } break; + case PREV_TASK: { + Task *task1; + task1 = prev_task(find_active_task(task, task_active)); + activate_window(task1->win); } } } - -int tint2_handles_click(Panel* panel, XButtonEvent* e) +int tint2_handles_click(Panel *panel, XButtonEvent *e) { - Task* task = click_task(panel, e->x, e->y); + Task *task = click_task(panel, e->x, e->y); if (task) { - if ( (e->button == 1 && mouse_left != 0) - || (e->button == 2 && mouse_middle != 0) - || (e->button == 3 && mouse_right != 0) - || (e->button == 4 && mouse_scroll_up != 0) - || (e->button == 5 && mouse_scroll_down !=0) ) - { + if ((e->button == 1 && mouse_left != 0) || (e->button == 2 && mouse_middle != 0) || + (e->button == 3 && mouse_right != 0) || (e->button == 4 && mouse_scroll_up != 0) || + (e->button == 5 && mouse_scroll_down != 0)) { return 1; - } - else + } else return 0; } LauncherIcon *icon = click_launcher_icon(panel, e->x, e->y); @@ -458,36 +456,31 @@ int tint2_handles_click(Panel* panel, XButtonEvent* e) } } // no launcher/task clicked --> check if taskbar clicked - Taskbar *tskbar = click_taskbar(panel, e->x, e->y); - if (tskbar && e->button == 1 && panel_mode == MULTI_DESKTOP) + Taskbar *taskbar = click_taskbar(panel, e->x, e->y); + if (taskbar && e->button == 1 && taskbar_mode == MULTI_DESKTOP) return 1; if (click_clock(panel, e->x, e->y)) { - if ( (e->button == 1 && clock_lclick_command) || - (e->button == 2 && clock_mclick_command) || - (e->button == 3 && clock_rclick_command) || - (e->button == 4 && clock_uwheel_command) || - (e->button == 5 && clock_dwheel_command) ) + if ((e->button == 1 && clock_lclick_command) || (e->button == 2 && clock_mclick_command) || + (e->button == 3 && clock_rclick_command) || (e->button == 4 && clock_uwheel_command) || + (e->button == 5 && clock_dwheel_command)) return 1; else return 0; } - #ifdef ENABLE_BATTERY +#ifdef ENABLE_BATTERY if (click_battery(panel, e->x, e->y)) { - if ( (e->button == 1 && battery_lclick_command) || - (e->button == 2 && battery_mclick_command) || - (e->button == 3 && battery_rclick_command) || - (e->button == 4 && battery_uwheel_command) || - (e->button == 5 && battery_dwheel_command) ) + if ((e->button == 1 && battery_lclick_command) || (e->button == 2 && battery_mclick_command) || + (e->button == 3 && battery_rclick_command) || (e->button == 4 && battery_uwheel_command) || + (e->button == 5 && battery_dwheel_command)) return 1; else return 0; } - #endif +#endif return 0; } - -void forward_click(XEvent* e) +void forward_click(XEvent *e) { // forward the click to the desktop window (thanks conky) XUngrabPointer(server.dsp, e->xbutton.time); @@ -496,81 +489,78 @@ void forward_click(XEvent* e) // and xfce doesn't open at all. e->xbutton.x = e->xbutton.x_root; e->xbutton.y = e->xbutton.y_root; - //printf("**** %d, %d\n", e->xbutton.x, e->xbutton.y); - //XSetInputFocus(server.dsp, e->xbutton.window, RevertToParent, e->xbutton.time); + // printf("**** %d, %d\n", e->xbutton.x, e->xbutton.y); + // XSetInputFocus(server.dsp, e->xbutton.window, RevertToParent, e->xbutton.time); XSendEvent(server.dsp, e->xbutton.window, False, ButtonPressMask, e); } - -void event_button_press (XEvent *e) +void event_button_press(XEvent *e) { Panel *panel = get_panel(e->xany.window); - if (!panel) return; + if (!panel) + return; - - if (wm_menu && !tint2_handles_click(panel, &e->xbutton) ) { + if (wm_menu && !tint2_handles_click(panel, &e->xbutton)) { forward_click(e); return; } task_drag = click_task(panel, e->xbutton.x, e->xbutton.y); if (panel_layer == BOTTOM_LAYER) - XLowerWindow (server.dsp, panel->main_win); + XLowerWindow(server.dsp, panel->main_win); } -void event_button_motion_notify (XEvent *e) +void event_button_motion_notify(XEvent *e) { - Panel * panel = get_panel(e->xany.window); + Panel *panel = get_panel(e->xany.window); if (!panel || !task_drag) return; // Find the taskbar on the event's location - Taskbar * event_taskbar = click_taskbar(panel, e->xbutton.x, e->xbutton.y); + Taskbar *event_taskbar = click_taskbar(panel, e->xbutton.x, e->xbutton.y); if (event_taskbar == NULL) return; // Find the task on the event's location - Task * event_task = click_task(panel, e->xbutton.x, e->xbutton.y); + Task *event_task = click_task(panel, e->xbutton.x, e->xbutton.y); // If the event takes place on the same taskbar as the task being dragged - if (event_taskbar == task_drag->area.parent) { + if (&event_taskbar->area == task_drag->area.parent) { if (taskbar_sort_method != TASKBAR_NOSORT) { sort_tasks(event_taskbar); } else { // Swap the task_drag with the task on the event's location (if they differ) if (event_task && event_task != task_drag) { - GList * drag_iter = g_list_find(event_taskbar->area.children, task_drag); - GList * task_iter = g_list_find(event_taskbar->area.children, event_task); + GList *drag_iter = g_list_find(event_taskbar->area.children, task_drag); + GList *task_iter = g_list_find(event_taskbar->area.children, event_task); if (drag_iter && task_iter) { gpointer temp = task_iter->data; task_iter->data = drag_iter->data; drag_iter->data = temp; event_taskbar->area.resize_needed = 1; - panel_refresh = 1; + panel_refresh = TRUE; task_dragged = 1; } } } - } - else { // The event is on another taskbar than the task being dragged - if (task_drag->desktop == ALLDESKTOP || panel_mode != MULTI_DESKTOP) + } else { // The event is on another taskbar than the task being dragged + if (task_drag->desktop == ALLDESKTOP || taskbar_mode != MULTI_DESKTOP) return; - Taskbar * drag_taskbar = (Taskbar*)task_drag->area.parent; - remove_area((Area*)task_drag); + Taskbar *drag_taskbar = (Taskbar *)task_drag->area.parent; + remove_area((Area *)task_drag); if (event_taskbar->area.posx > drag_taskbar->area.posx || event_taskbar->area.posy > drag_taskbar->area.posy) { int i = (taskbarname_enabled) ? 1 : 0; event_taskbar->area.children = g_list_insert(event_taskbar->area.children, task_drag, i); - } - else + } else event_taskbar->area.children = g_list_append(event_taskbar->area.children, task_drag); // Move task to other desktop (but avoid the 'Window desktop changed' code in 'event_property_notify') - task_drag->area.parent = event_taskbar; + task_drag->area.parent = &event_taskbar->area; task_drag->desktop = event_taskbar->desktop; - windows_set_desktop(task_drag->win, event_taskbar->desktop); + change_window_desktop(task_drag->win, event_taskbar->desktop); if (taskbar_sort_method != TASKBAR_NOSORT) { sort_tasks(event_taskbar); @@ -579,20 +569,21 @@ void event_button_motion_notify (XEvent *e) event_taskbar->area.resize_needed = 1; drag_taskbar->area.resize_needed = 1; task_dragged = 1; - panel_refresh = 1; + panel_refresh = TRUE; panel->area.resize_needed = 1; } } -void event_button_release (XEvent *e) +void event_button_release(XEvent *e) { Panel *panel = get_panel(e->xany.window); - if (!panel) return; + if (!panel) + return; if (wm_menu && !tint2_handles_click(panel, &e->xbutton)) { forward_click(e); if (panel_layer == BOTTOM_LAYER) - XLowerWindow (server.dsp, panel->main_win); + XLowerWindow(server.dsp, panel->main_win); task_drag = 0; return; } @@ -622,23 +613,23 @@ void event_button_release (XEvent *e) break; } - if ( click_clock(panel, e->xbutton.x, e->xbutton.y)) { + if (click_clock(panel, e->xbutton.x, e->xbutton.y)) { clock_action(e->xbutton.button); if (panel_layer == BOTTOM_LAYER) - XLowerWindow (server.dsp, panel->main_win); + XLowerWindow(server.dsp, panel->main_win); task_drag = 0; return; } - #ifdef ENABLE_BATTERY +#ifdef ENABLE_BATTERY if (click_battery(panel, e->xbutton.x, e->xbutton.y)) { battery_action(e->xbutton.button); if (panel_layer == BOTTOM_LAYER) - XLowerWindow (server.dsp, panel->main_win); + XLowerWindow(server.dsp, panel->main_win); task_drag = 0; return; } - #endif +#endif if (e->xbutton.button == 1 && click_launcher(panel, e->xbutton.x, e->xbutton.y)) { LauncherIcon *icon = click_launcher_icon(panel, e->xbutton.x, e->xbutton.y); @@ -649,11 +640,11 @@ void event_button_release (XEvent *e) return; } - Taskbar *tskbar; - if ( !(tskbar = click_taskbar(panel, e->xbutton.x, e->xbutton.y)) ) { + Taskbar *taskbar; + if (!(taskbar = click_taskbar(panel, e->xbutton.x, e->xbutton.y))) { // TODO: check better solution to keep window below if (panel_layer == BOTTOM_LAYER) - XLowerWindow (server.dsp, panel->main_win); + XLowerWindow(server.dsp, panel->main_win); task_drag = 0; return; } @@ -666,24 +657,22 @@ void event_button_release (XEvent *e) } // switch desktop - if (panel_mode == MULTI_DESKTOP) { - if (tskbar->desktop != server.desktop && action != CLOSE && action != DESKTOP_LEFT && action != DESKTOP_RIGHT) - set_desktop (tskbar->desktop); + if (taskbar_mode == MULTI_DESKTOP) { + if (taskbar->desktop != server.desktop && action != CLOSE && action != DESKTOP_LEFT && action != DESKTOP_RIGHT) + change_desktop(taskbar->desktop); } // action on task - window_action( click_task(panel, e->xbutton.x, e->xbutton.y), action); + window_action(click_task(panel, e->xbutton.x, e->xbutton.y), action); // to keep window below if (panel_layer == BOTTOM_LAYER) - XLowerWindow (server.dsp, panel->main_win); + XLowerWindow(server.dsp, panel->main_win); } - -void event_property_notify (XEvent *e) +void event_property_notify(XEvent *e) { int i; - Task *tsk; Window win = e->xproperty.window; Atom at = e->xproperty.atom; @@ -691,95 +680,98 @@ void event_property_notify (XEvent *e) xsettings_client_process_event(xsettings_client, e); if (win == server.root_win) { if (!server.got_root_win) { - XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask); + XSelectInput(server.dsp, server.root_win, PropertyChangeMask | StructureNotifyMask); server.got_root_win = 1; } // Change name of desktops else if (at == server.atom._NET_DESKTOP_NAMES) { - if (!taskbarname_enabled) return; - GSList *l, *list = server_get_name_of_desktop(); + if (!taskbarname_enabled) + return; + GSList *l, *list = get_desktop_names(); int j; gchar *name; - Taskbar *tskbar; - for (i=0 ; i < nb_panel ; i++) { - for (j=0, l=list ; j < panel1[i].nb_desktop ; j++) { + Taskbar *taskbar; + for (i = 0; i < num_panels; i++) { + for (j = 0, l = list; j < panels[i].num_desktops; j++) { if (l) { name = g_strdup(l->data); l = l->next; - } - else - name = g_strdup_printf("%d", j+1); - tskbar = &panel1[i].taskbar[j]; - if (strcmp(name, tskbar->bar_name.name) != 0) { - g_free(tskbar->bar_name.name); - tskbar->bar_name.name = name; - tskbar->bar_name.area.resize_needed = 1; - } - else + } else + name = g_strdup_printf("%d", j + 1); + taskbar = &panels[i].taskbar[j]; + if (strcmp(name, taskbar->bar_name.name) != 0) { + g_free(taskbar->bar_name.name); + taskbar->bar_name.name = name; + taskbar->bar_name.area.resize_needed = 1; + } else g_free(name); } } - for (l=list ; l ; l = l->next) + for (l = list; l; l = l->next) g_free(l->data); g_slist_free(list); - panel_refresh = 1; + panel_refresh = TRUE; } // Change number of desktops else if (at == server.atom._NET_NUMBER_OF_DESKTOPS) { - if (!taskbar_enabled) return; - server.nb_desktop = server_get_number_of_desktops(); - if (server.nb_desktop <= server.desktop) { - server.desktop = server.nb_desktop-1; + if (!taskbar_enabled) + return; + server.num_desktops = server_get_number_of_desktops(); + if (server.num_desktops <= server.desktop) { + server.desktop = server.num_desktops - 1; } cleanup_taskbar(); init_taskbar(); - for (i=0 ; i < nb_panel ; i++) { - init_taskbar_panel(&panel1[i]); - set_panel_items_order(&panel1[i]); - visible_taskbar(&panel1[i]); - panel1[i].area.resize_needed = 1; + for (i = 0; i < num_panels; i++) { + init_taskbar_panel(&panels[i]); + set_panel_items_order(&panels[i]); + visible_taskbar(&panels[i]); + panels[i].area.resize_needed = 1; } task_refresh_tasklist(); active_task(); - panel_refresh = 1; + panel_refresh = TRUE; } // Change desktop else if (at == server.atom._NET_CURRENT_DESKTOP) { - if (!taskbar_enabled) return; + if (!taskbar_enabled) + return; int old_desktop = server.desktop; - server.desktop = server_get_current_desktop (); - for (i=0 ; i < nb_panel ; i++) { - Panel *panel = &panel1[i]; + server.desktop = get_current_desktop(); + for (i = 0; i < num_panels; i++) { + Panel *panel = &panels[i]; set_taskbar_state(&panel->taskbar[old_desktop], TASKBAR_NORMAL); set_taskbar_state(&panel->taskbar[server.desktop], TASKBAR_ACTIVE); // check ALLDESKTOP task => resize taskbar - Taskbar *tskbar; - Task *tsk; - if (server.nb_desktop > old_desktop) { - tskbar = &panel->taskbar[old_desktop]; - GList *l = tskbar->area.children; - if (taskbarname_enabled) l = l->next; - for (; l ; l = l->next) { - tsk = l->data; - if (tsk->desktop == ALLDESKTOP) { - tsk->area.on_screen = 0; - tskbar->area.resize_needed = 1; - panel_refresh = 1; - if (panel_mode == MULTI_DESKTOP) + Taskbar *taskbar; + Task *task; + if (server.num_desktops > old_desktop) { + taskbar = &panel->taskbar[old_desktop]; + GList *l = taskbar->area.children; + if (taskbarname_enabled) + l = l->next; + for (; l; l = l->next) { + task = l->data; + if (task->desktop == ALLDESKTOP) { + task->area.on_screen = FALSE; + taskbar->area.resize_needed = 1; + panel_refresh = TRUE; + if (taskbar_mode == MULTI_DESKTOP) panel->area.resize_needed = 1; } } } - tskbar = &panel->taskbar[server.desktop]; - GList *l = tskbar->area.children; - if (taskbarname_enabled) l = l->next; - for (; l ; l = l->next) { - tsk = l->data; - if (tsk->desktop == ALLDESKTOP) { - tsk->area.on_screen = 1; - tskbar->area.resize_needed = 1; - if (panel_mode == MULTI_DESKTOP) + taskbar = &panel->taskbar[server.desktop]; + GList *l = taskbar->area.children; + if (taskbarname_enabled) + l = l->next; + for (; l; l = l->next) { + task = l->data; + if (task->desktop == ALLDESKTOP) { + task->area.on_screen = TRUE; + taskbar->area.resize_needed = 1; + if (taskbar_mode == MULTI_DESKTOP) panel->area.resize_needed = 1; } } @@ -788,25 +780,23 @@ void event_property_notify (XEvent *e) // Window list else if (at == server.atom._NET_CLIENT_LIST) { task_refresh_tasklist(); - panel_refresh = 1; + panel_refresh = TRUE; } // Change active else if (at == server.atom._NET_ACTIVE_WINDOW) { active_task(); - panel_refresh = 1; - } - else if (at == server.atom._XROOTPMAP_ID || at == server.atom._XROOTMAP_ID) { + panel_refresh = TRUE; + } else if (at == server.atom._XROOTPMAP_ID || at == server.atom._XROOTMAP_ID) { // change Wallpaper - for (i=0 ; i < nb_panel ; i++) { - set_panel_background(&panel1[i]); + for (i = 0; i < num_panels; i++) { + set_panel_background(&panels[i]); } - panel_refresh = 1; + panel_refresh = TRUE; } - } - else { - tsk = task_get_task (win); - //printf("change win = %u, task = %p\n", win, tsk); - if (!tsk) { + } else { + Task *task = task_get_task(win); + // printf("change win = %u, task = %p\n", win, task); + if (!task) { if (at != server.atom._NET_WM_STATE) return; else { @@ -815,87 +805,84 @@ void event_property_notify (XEvent *e) XWindowAttributes wa; XGetWindowAttributes(server.dsp, win, &wa); if (wa.map_state == IsViewable && !window_is_skip_taskbar(win)) { - if ( (tsk = add_task(win)) ) - panel_refresh = 1; + if ((task = add_task(win))) + panel_refresh = TRUE; else return; - } - else + } else return; } } - //printf("atom root_win = %s, %s\n", XGetAtomName(server.dsp, at), tsk->title); + // printf("atom root_win = %s, %s\n", XGetAtomName(server.dsp, at), task->title); // Window title changed if (at == server.atom._NET_WM_VISIBLE_NAME || at == server.atom._NET_WM_NAME || at == server.atom.WM_NAME) { - if (get_title(tsk)) { - if (g_tooltip.mapped && (g_tooltip.area == (Area*)tsk)) { - tooltip_copy_text((Area*)tsk); + if (get_title(task)) { + if (g_tooltip.mapped && (g_tooltip.area == (Area *)task)) { + tooltip_copy_text((Area *)task); tooltip_update(); } if (taskbar_sort_method == TASKBAR_SORT_TITLE) sort_taskbar_for_win(win); - panel_refresh = 1; + panel_refresh = TRUE; } } // Demand attention else if (at == server.atom._NET_WM_STATE) { - if (window_is_urgent (win)) { - add_urgent(tsk); + if (window_is_urgent(win)) { + add_urgent(task); } if (window_is_skip_taskbar(win)) { - remove_task( tsk ); - panel_refresh = 1; + remove_task(task); + panel_refresh = TRUE; } - } - else if (at == server.atom.WM_STATE) { + } else if (at == server.atom.WM_STATE) { // Iconic state - int state = (task_active && tsk->win == task_active->win ? TASK_ACTIVE : TASK_NORMAL); + TaskState state = (task_active && task->win == task_active->win ? TASK_ACTIVE : TASK_NORMAL); if (window_is_iconified(win)) state = TASK_ICONIFIED; - set_task_state(tsk, state); - panel_refresh = 1; + set_task_state(task, state); + panel_refresh = TRUE; } // Window icon changed else if (at == server.atom._NET_WM_ICON) { - get_icon(tsk); - panel_refresh = 1; + get_icon(task); + panel_refresh = TRUE; } // Window desktop changed else if (at == server.atom._NET_WM_DESKTOP) { - int desktop = window_get_desktop (win); - //printf(" Window desktop changed %d, %d\n", tsk->desktop, desktop); + int desktop = get_window_desktop(win); + // printf(" Window desktop changed %d, %d\n", task->desktop, desktop); // bug in windowmaker : send unecessary 'desktop changed' when focus changed - if (desktop != tsk->desktop) { - remove_task (tsk); - tsk = add_task (win); + if (desktop != task->desktop) { + remove_task(task); + task = add_task(win); active_task(); - panel_refresh = 1; + panel_refresh = TRUE; } - } - else if (at == server.atom.WM_HINTS) { - XWMHints* wmhints = XGetWMHints(server.dsp, win); + } else if (at == server.atom.WM_HINTS) { + XWMHints *wmhints = XGetWMHints(server.dsp, win); if (wmhints && wmhints->flags & XUrgencyHint) { - add_urgent(tsk); + add_urgent(task); } XFree(wmhints); } - if (!server.got_root_win) server.root_win = RootWindow (server.dsp, server.screen); + if (!server.got_root_win) + server.root_win = RootWindow(server.dsp, server.screen); } } - -void event_expose (XEvent *e) +void event_expose(XEvent *e) { Panel *panel; panel = get_panel(e->xany.window); - if (!panel) return; + if (!panel) + return; // TODO : one panel_refresh per panel ? - panel_refresh = 1; + panel_refresh = TRUE; } - void event_configure_notify(XEvent *e) { Window win = e->xconfigure.window; @@ -909,8 +896,8 @@ void event_configure_notify(XEvent *e) // 'win' is a trayer icon TrayWindow *traywin; GSList *l; - for (l = systray.list_icons; l ; l = l->next) { - traywin = (TrayWindow*)l->data; + for (l = systray.list_icons; l; l = l->next) { + traywin = (TrayWindow *)l->data; if (traywin->win == win) { systray_reconfigure_event(traywin, e); return; @@ -918,21 +905,21 @@ void event_configure_notify(XEvent *e) } // 'win' move in another monitor - if (nb_panel > 1 || hide_task_diff_monitor) { - Task *tsk = task_get_task (win); - if (tsk) { - Panel *p = tsk->area.panel; - int monitor = window_get_monitor(win); - if ((hide_task_diff_monitor && p->monitor != monitor && tsk->area.on_screen) || - (hide_task_diff_monitor && p->monitor == monitor && !tsk->area.on_screen) || - (p->monitor != monitor && nb_panel > 1)) { - remove_task (tsk); - tsk = add_task (win); - if (win == window_get_active ()) { - set_task_state(tsk, TASK_ACTIVE); - task_active = tsk; + if (num_panels > 1 || hide_task_diff_monitor) { + Task *task = task_get_task(win); + if (task) { + Panel *p = task->area.panel; + int monitor = get_window_monitor(win); + if ((hide_task_diff_monitor && p->monitor != monitor && task->area.on_screen) || + (hide_task_diff_monitor && p->monitor == monitor && !task->area.on_screen) || + (p->monitor != monitor && num_panels > 1)) { + remove_task(task); + task = add_task(win); + if (win == get_active_window()) { + set_task_state(task, TASK_ACTIVE); + task_active = task; } - panel_refresh = 1; + panel_refresh = TRUE; } } } @@ -940,7 +927,7 @@ void event_configure_notify(XEvent *e) sort_taskbar_for_win(win); } -char *GetAtomName(Display* disp, Atom a) +const char *GetAtomName(Display *disp, Atom a) { if (a == None) return "None"; @@ -948,31 +935,39 @@ char *GetAtomName(Display* disp, Atom a) return XGetAtomName(disp, a); } -typedef struct Property -{ +typedef struct Property { unsigned char *data; int format, nitems; Atom type; } Property; -//This fetches all the data from a property -struct Property read_property(Display* disp, Window w, Atom property) +// This fetches all the data from a property +struct Property read_property(Display *disp, Window w, Atom property) { Atom actual_type; int actual_format; unsigned long nitems; unsigned long bytes_after; - unsigned char *ret=0; + unsigned char *ret = 0; int read_bytes = 1024; - //Keep trying to read the property until there are no - //bytes unread. + // Keep trying to read the property until there are no + // bytes unread. do { if (ret != 0) XFree(ret); - XGetWindowProperty(disp, w, property, 0, read_bytes, False, AnyPropertyType, - &actual_type, &actual_format, &nitems, &bytes_after, + XGetWindowProperty(disp, + w, + property, + 0, + read_bytes, + False, + AnyPropertyType, + &actual_type, + &actual_format, + &nitems, + &bytes_after, &ret); read_bytes *= 2; } while (bytes_after != 0); @@ -994,16 +989,16 @@ struct Property read_property(Display* disp, Window w, Atom property) // This function takes a list of targets which can be converted to (atom_list, nitems) // and a list of acceptable targets with prioritees (datatypes). It returns the highest // entry in datatypes which is also in atom_list: ie it finds the best match. -Atom pick_target_from_list(Display* disp, Atom* atom_list, int nitems) +Atom pick_target_from_list(Display *disp, Atom *atom_list, int nitems) { Atom to_be_requested = None; int i; for (i = 0; i < nitems; i++) { - char *atom_name = GetAtomName(disp, atom_list[i]); + const char *atom_name = GetAtomName(disp, atom_list[i]); fprintf(stderr, "DnD %s:%d: Type %d = %s\n", __FILE__, __LINE__, i, atom_name); - //See if this data type is allowed and of higher priority (closer to zero) - //than the present one. + // See if this data type is allowed and of higher priority (closer to zero) + // than the present one. if (strcmp(atom_name, "STRING") == 0) { to_be_requested = atom_list[i]; } @@ -1014,7 +1009,7 @@ Atom pick_target_from_list(Display* disp, Atom* atom_list, int nitems) // Finds the best target given up to three atoms provided (any can be None). // Useful for part of the Xdnd protocol. -Atom pick_target_from_atoms(Display* disp, Atom t1, Atom t2, Atom t3) +Atom pick_target_from_atoms(Display *disp, Atom t1, Atom t2, Atom t3) { Atom atoms[3]; int n = 0; @@ -1032,19 +1027,19 @@ Atom pick_target_from_atoms(Display* disp, Atom t1, Atom t2, Atom t3) } // Finds the best target given a local copy of a property. -Atom pick_target_from_targets(Display* disp, Property p) +Atom pick_target_from_targets(Display *disp, Property p) { - //The list of targets is a list of atoms, so it should have type XA_ATOM - //but it may have the type TARGETS instead. + // The list of targets is a list of atoms, so it should have type XA_ATOM + // but it may have the type TARGETS instead. if ((p.type != XA_ATOM && p.type != server.atom.TARGETS) || p.format != 32) { - //This would be really broken. Targets have to be an atom list - //and applications should support this. Nevertheless, some - //seem broken (MATLAB 7, for instance), so ask for STRING - //next instead as the lowest common denominator + // This would be really broken. Targets have to be an atom list + // and applications should support this. Nevertheless, some + // seem broken (MATLAB 7, for instance), so ask for STRING + // next instead as the lowest common denominator return XA_STRING; } else { - Atom *atom_list = (Atom*)p.data; + Atom *atom_list = (Atom *)p.data; return pick_target_from_list(disp, atom_list, p.nitems); } @@ -1064,16 +1059,16 @@ void dnd_enter(XClientMessageEvent *e) fprintf(stderr, "DnD %s:%d: Type 2 = %s\n", __FILE__, __LINE__, GetAtomName(server.dsp, e->data.l[3])); fprintf(stderr, "DnD %s:%d: Type 3 = %s\n", __FILE__, __LINE__, GetAtomName(server.dsp, e->data.l[4])); - //Query which conversions are available and pick the best + // Query which conversions are available and pick the best if (more_than_3) { - //Fetch the list of possible conversions - //Notice the similarity to TARGETS with paste. + // Fetch the list of possible conversions + // Notice the similarity to TARGETS with paste. Property p = read_property(server.dsp, dnd_source_window, server.atom.XdndTypeList); dnd_atom = pick_target_from_targets(server.dsp, p); XFree(p.data); } else { - //Use the available list + // Use the available list dnd_atom = pick_target_from_atoms(server.dsp, e->data.l[2], e->data.l[3], e->data.l[4]); } @@ -1090,10 +1085,10 @@ void dnd_position(XClientMessageEvent *e) x = (e->data.l[2] >> 16) & 0xFFFF; y = e->data.l[2] & 0xFFFF; XTranslateCoordinates(server.dsp, server.root_win, e->window, x, y, &mapX, &mapY, &child); - Task* task = click_task(panel, mapX, mapY); + Task *task = click_task(panel, mapX, mapY); if (task) { - if (task->desktop != server.desktop ) - set_desktop (task->desktop); + if (task->desktop != server.desktop) + change_desktop(task->desktop); window_action(task, TOGGLE); } else { LauncherIcon *icon = click_launcher_icon(panel, mapX, mapY); @@ -1111,30 +1106,40 @@ void dnd_position(XClientMessageEvent *e) se.window = e->data.l[0]; se.message_type = server.atom.XdndStatus; se.format = 32; - se.data.l[0] = e->window; // XID of the target window - se.data.l[1] = accept ? 1 : 0; // bit 0: accept drop bit 1: send XdndPosition events if inside rectangle - se.data.l[2] = 0; // Rectangle x,y for which no more XdndPosition events + se.data.l[0] = e->window; // XID of the target window + se.data.l[1] = accept ? 1 : 0; // bit 0: accept drop bit 1: send XdndPosition events if inside rectangle + se.data.l[2] = 0; // Rectangle x,y for which no more XdndPosition events se.data.l[3] = (1 << 16) | 1; // Rectangle w,h for which no more XdndPosition events if (accept) { se.data.l[4] = dnd_version >= 2 ? e->data.l[4] : server.atom.XdndActionCopy; } else { - se.data.l[4] = None; // None = drop will not be accepted + se.data.l[4] = None; // None = drop will not be accepted } - XSendEvent(server.dsp, e->data.l[0], False, NoEventMask, (XEvent*)&se); + XSendEvent(server.dsp, e->data.l[0], False, NoEventMask, (XEvent *)&se); } void dnd_drop(XClientMessageEvent *e) { if (dnd_target_window && dnd_launcher_exec) { if (dnd_version >= 1) { - XConvertSelection(server.dsp, server.atom.XdndSelection, XA_STRING, dnd_selection, dnd_target_window, e->data.l[2]); + XConvertSelection(server.dsp, + server.atom.XdndSelection, + XA_STRING, + dnd_selection, + dnd_target_window, + e->data.l[2]); } else { - XConvertSelection(server.dsp, server.atom.XdndSelection, XA_STRING, dnd_selection, dnd_target_window, CurrentTime); + XConvertSelection(server.dsp, + server.atom.XdndSelection, + XA_STRING, + dnd_selection, + dnd_target_window, + CurrentTime); } } else { - //The source is sending anyway, despite instructions to the contrary. - //So reply that we're not interested. + // The source is sending anyway, despite instructions to the contrary. + // So reply that we're not interested. XClientMessageEvent m; memset(&m, 0, sizeof(m)); m.type = ClientMessage; @@ -1144,37 +1149,19 @@ void dnd_drop(XClientMessageEvent *e) m.format = 32; m.data.l[0] = dnd_target_window; m.data.l[1] = 0; - m.data.l[2] = None; //Failed. - XSendEvent(server.dsp, e->data.l[0], False, NoEventMask, (XEvent*)&m); + m.data.l[2] = None; // Failed. + XSendEvent(server.dsp, e->data.l[0], False, NoEventMask, (XEvent *)&m); } } -int main (int argc, char *argv[]) +int main(int argc, char *argv[]) { - XEvent e; - XClientMessageEvent *ev; - fd_set fdset; - int x11_fd, i; - Panel *panel; - GSList *it; - struct timeval* select_timeout; - int hidden_dnd = 0; - - // Make stdout/stderr flush after a newline (for some reason they don't even if tint2 is started from a terminal) - setlinebuf(stdout); - setlinebuf(stderr); - start: - init (argc, argv); + init(argc, argv); init_X11_pre_config(); - i = 0; - if (config_path) - i = config_read_file (config_path); - else - i = config_read (); - if (!i) { + if (!config_read()) { fprintf(stderr, "usage: tint2 [-c] \n"); cleanup(); exit(1); @@ -1184,6 +1171,7 @@ start: start_detect_compositor(); init_panel(); + if (snapshot_path) { get_snapshot(snapshot_path); cleanup(); @@ -1192,7 +1180,7 @@ start: int damage_event, damage_error; XDamageQueryExtension(server.dsp, &damage_event, &damage_error); - x11_fd = ConnectionNumber(server.dsp); + int x11_fd = ConnectionNumber(server.dsp); XSync(server.dsp, False); // XDND initialization @@ -1205,61 +1193,75 @@ start: dnd_launcher_exec = 0; int ufd = uevent_init(); - - // sigset_t empty_mask; - // sigemptyset(&empty_mask); + int hidden_dnd = 0; while (1) { if (panel_refresh) { if (systray_profile) fprintf(stderr, BLUE "[%f] %s:%d redrawing panel\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__); - panel_refresh = 0; + panel_refresh = FALSE; - for (i = 0; i < nb_panel ;i++) { - panel = &panel1[i]; + for (int i = 0; i < num_panels; i++) { + Panel *panel = &panels[i]; if (panel->is_hidden) { - XCopyArea(server.dsp, panel->hidden_pixmap, panel->main_win, server.gc, 0, 0, panel->hidden_width, panel->hidden_height, 0, 0); + XCopyArea(server.dsp, + panel->hidden_pixmap, + panel->main_win, + server.gc, + 0, + 0, + panel->hidden_width, + panel->hidden_height, + 0, + 0); XSetWindowBackgroundPixmap(server.dsp, panel->main_win, panel->hidden_pixmap); } else { if (panel->temp_pmap) XFreePixmap(server.dsp, panel->temp_pmap); - panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth); + panel->temp_pmap = + XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth); render_panel(panel); - if (panel == (Panel*)systray.area.panel) { + if (panel == (Panel *)systray.area.panel) { if (refresh_systray && panel && !panel->is_hidden) { - refresh_systray = 0; + refresh_systray = FALSE; XSetWindowBackgroundPixmap(server.dsp, panel->main_win, panel->temp_pmap); refresh_systray_icons(); } } - XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); + XCopyArea(server.dsp, + panel->temp_pmap, + panel->main_win, + server.gc, + 0, + 0, + panel->area.width, + panel->area.height, + 0, + 0); } } XFlush(server.dsp); } - // thanks to AngryLlama for the timer // Create a File Description Set containing x11_fd - FD_ZERO (&fdset); - FD_SET (x11_fd, &fdset); + fd_set fdset; + FD_ZERO(&fdset); + FD_SET(x11_fd, &fdset); int maxfd = x11_fd; if (sn_pipe_valid) { - FD_SET (sn_pipe[0], &fdset); + FD_SET(sn_pipe[0], &fdset); maxfd = maxfd < sn_pipe[0] ? sn_pipe[0] : maxfd; } if (ufd > 0) { - FD_SET (ufd, &fdset); + FD_SET(ufd, &fdset); maxfd = maxfd < ufd ? ufd : maxfd; } update_next_timeout(); - if (next_timeout.tv_sec >= 0 && next_timeout.tv_usec >= 0) - select_timeout = &next_timeout; - else - select_timeout = 0; + struct timeval *select_timeout = (next_timeout.tv_sec >= 0 && next_timeout.tv_usec >= 0) ? &next_timeout : NULL; // Wait for X Event or a Timer - if (XPending(server.dsp) > 0 || select(maxfd+1, &fdset, 0, 0, select_timeout) >= 0) { + if (XPending(server.dsp) > 0 || select(maxfd + 1, &fdset, 0, 0, select_timeout) >= 0) { uevent_handler(); if (sn_pipe_valid) { @@ -1269,13 +1271,14 @@ start: } } if (XPending(server.dsp) > 0) { + XEvent e; XNextEvent(server.dsp, &e); #if HAVE_SN if (startup_notifications) sn_display_process_event(server.sn_dsp, &e); #endif // HAVE_SN - panel = get_panel(e.xany.window); + Panel *panel = get_panel(e.xany.window); if (panel && panel_autohide) { if (e.type == EnterNotify) autohide_trigger_show(panel); @@ -1285,11 +1288,10 @@ start: if (e.type == ClientMessage && e.xclient.message_type == server.atom.XdndPosition) { hidden_dnd = 1; autohide_show(panel); - } - else - continue; // discard further processing of this event because the panel is not visible yet - } - else if (hidden_dnd && e.type == ClientMessage && e.xclient.message_type == server.atom.XdndLeave) { + } else + continue; // discard further processing of this event because the panel is not visible yet + } else if (hidden_dnd && e.type == ClientMessage && + e.xclient.message_type == server.atom.XdndLeave) { hidden_dnd = 0; autohide_hide(panel); } @@ -1298,8 +1300,8 @@ start: switch (e.type) { case ButtonPress: { tooltip_hide(0); - event_button_press (&e); - Area* area = click_area(panel, e.xbutton.x, e.xbutton.y); + event_button_press(&e); + Area *area = click_area(panel, e.xbutton.x, e.xbutton.y); if (panel_config.mouse_effects) mouse_over(area, 1); break; @@ -1307,7 +1309,7 @@ start: case ButtonRelease: { event_button_release(&e); - Area* area = click_area(panel, e.xbutton.x, e.xbutton.y); + Area *area = click_area(panel, e.xbutton.x, e.xbutton.y); if (panel_config.mouse_effects) mouse_over(area, 0); break; @@ -1316,10 +1318,9 @@ start: case MotionNotify: { unsigned int button_mask = Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask; if (e.xmotion.state & button_mask) - event_button_motion_notify (&e); + event_button_motion_notify(&e); - Panel* panel = get_panel(e.xmotion.window); - Area* area = click_area(panel, e.xmotion.x, e.xmotion.y); + Area *area = click_area(panel, e.xmotion.x, e.xmotion.y); if (area->_get_tooltip_text) tooltip_trigger_show(area, panel, &e); else @@ -1349,8 +1350,8 @@ start: case ConfigureRequest: // 'win' is a trayer icon - for (it = systray.list_icons; it ; it = g_slist_next(it)) { - TrayWindow *traywin = (TrayWindow*)it->data; + for (GSList *it = systray.list_icons; it; it = g_slist_next(it)) { + TrayWindow *traywin = (TrayWindow *)it->data; if (traywin->win == e.xany.window) { systray_reconfigure_event(traywin, &e); break; @@ -1360,8 +1361,8 @@ start: case ResizeRequest: // 'win' is a trayer icon - for (it = systray.list_icons; it ; it = g_slist_next(it)) { - TrayWindow *traywin = (TrayWindow*)it->data; + for (GSList *it = systray.list_icons; it; it = g_slist_next(it)) { + TrayWindow *traywin = (TrayWindow *)it->data; if (traywin->win == e.xany.window) { systray_resize_request_event(traywin, &e); break; @@ -1369,14 +1370,14 @@ start: } break; - case ReparentNotify: + case ReparentNotify: { if (!systray_enabled) break; - panel = (Panel*)systray.area.panel; - if (e.xany.window == panel->main_win) // don't care + Panel *systray_panel = (Panel *)systray.area.panel; + if (e.xany.window == systray_panel->main_win) // don't care break; - for (it = systray.list_icons; it; it = g_slist_next(it)) { - TrayWindow *traywin = (TrayWindow*)it->data; + for (GSList *it = systray.list_icons; it; it = g_slist_next(it)) { + TrayWindow *traywin = (TrayWindow *)it->data; if (traywin->win == e.xreparent.window) { if (traywin->parent == e.xreparent.parent) { embed_icon(traywin); @@ -1387,8 +1388,11 @@ start: } } break; + } + case UnmapNotify: break; + case DestroyNotify: if (e.xany.window == server.composite_manager) { // Stop real_transparency @@ -1398,16 +1402,16 @@ start: } if (e.xany.window == g_tooltip.window || !systray_enabled) break; - for (it = systray.list_icons; it; it = g_slist_next(it)) { - if (((TrayWindow*)it->data)->win == e.xany.window) { - systray_destroy_event((TrayWindow*)it->data); + for (GSList *it = systray.list_icons; it; it = g_slist_next(it)) { + if (((TrayWindow *)it->data)->win == e.xany.window) { + systray_destroy_event((TrayWindow *)it->data); break; } } break; - case ClientMessage: - ev = &e.xclient; + case ClientMessage: { + XClientMessageEvent *ev = &e.xclient; if (ev->data.l[1] == server.atom._NET_WM_CM_S0) { if (ev->data.l[2] == None) // Stop real_transparency @@ -1416,34 +1420,44 @@ start: // Start real_transparency signal_pending = SIGUSR1; } - if (systray_enabled && e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && e.xclient.format == 32 && e.xclient.window == net_sel_win) { + if (systray_enabled && e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && + e.xclient.format == 32 && e.xclient.window == net_sel_win) { net_message(&e.xclient); - } - else if (e.xclient.message_type == server.atom.XdndEnter) { + } else if (e.xclient.message_type == server.atom.XdndEnter) { dnd_enter(&e.xclient); - } - else if (e.xclient.message_type == server.atom.XdndPosition) { + } else if (e.xclient.message_type == server.atom.XdndPosition) { dnd_position(&e.xclient); - } - else if (e.xclient.message_type == server.atom.XdndDrop) { + } else if (e.xclient.message_type == server.atom.XdndDrop) { dnd_drop(&e.xclient); } break; + } - case SelectionNotify: - { + case SelectionNotify: { Atom target = e.xselection.target; fprintf(stderr, "DnD %s:%d: A selection notify has arrived!\n", __FILE__, __LINE__); fprintf(stderr, "DnD %s:%d: Requestor = %lu\n", __FILE__, __LINE__, e.xselectionrequest.requestor); - fprintf(stderr, "DnD %s:%d: Selection atom = %s\n", __FILE__, __LINE__, GetAtomName(server.dsp, e.xselection.selection)); - fprintf(stderr, "DnD %s:%d: Target atom = %s\n", __FILE__, __LINE__, GetAtomName(server.dsp, target)); - fprintf(stderr, "DnD %s:%d: Property atom = %s\n", __FILE__, __LINE__, GetAtomName(server.dsp, e.xselection.property)); + fprintf(stderr, + "DnD %s:%d: Selection atom = %s\n", + __FILE__, + __LINE__, + GetAtomName(server.dsp, e.xselection.selection)); + fprintf(stderr, + "DnD %s:%d: Target atom = %s\n", + __FILE__, + __LINE__, + GetAtomName(server.dsp, target)); + fprintf(stderr, + "DnD %s:%d: Property atom = %s\n", + __FILE__, + __LINE__, + GetAtomName(server.dsp, e.xselection.property)); if (e.xselection.property != None && dnd_launcher_exec) { Property prop = read_property(server.dsp, dnd_target_window, dnd_selection); - //If we're being given a list of targets (possible conversions) + // If we're being given a list of targets (possible conversions) if (target == server.atom.TARGETS && !dnd_sent_request) { dnd_sent_request = 1; dnd_atom = pick_target_from_targets(server.dsp, prop); @@ -1451,30 +1465,35 @@ start: if (dnd_atom == None) { fprintf(stderr, "No matching datatypes.\n"); } else { - //Request the data type we are able to select + // Request the data type we are able to select fprintf(stderr, "Now requsting type %s", GetAtomName(server.dsp, dnd_atom)); - XConvertSelection(server.dsp, dnd_selection, dnd_atom, dnd_selection, dnd_target_window, CurrentTime); + XConvertSelection(server.dsp, + dnd_selection, + dnd_atom, + dnd_selection, + dnd_target_window, + CurrentTime); } } else if (target == dnd_atom) { - //Dump the binary data + // Dump the binary data fprintf(stderr, "DnD %s:%d: Data begins:\n", __FILE__, __LINE__); fprintf(stderr, "--------\n"); - int i; - for (i = 0; i < prop.nitems * prop.format/8; i++) - fprintf(stderr, "%c", ((char*)prop.data)[i]); + for (int i = 0; i < prop.nitems * prop.format / 8; i++) + fprintf(stderr, "%c", ((char *)prop.data)[i]); fprintf(stderr, "--------\n"); int cmd_length = 0; - cmd_length += 1; // ( + cmd_length += 1; // ( cmd_length += strlen(dnd_launcher_exec) + 1; // exec + space - cmd_length += 1; // open double quotes - for (i = 0; i < prop.nitems * prop.format/8; i++) { - char c = ((char*)prop.data)[i]; + cmd_length += 1; // open double quotes + for (int i = 0; i < prop.nitems * prop.format / 8; i++) { + char c = ((char *)prop.data)[i]; if (c == '\n') { - if (i < prop.nitems * prop.format/8 - 1) { + if (i < prop.nitems * prop.format / 8 - 1) { cmd_length += 3; // close double quotes, space, open double quotes } } else if (c == '\r') { + // Nothing to do } else { cmd_length += 1; // 1 character if (c == '`' || c == '$' || c == '\\') { @@ -1491,13 +1510,14 @@ start: strcat(cmd, "("); strcat(cmd, dnd_launcher_exec); strcat(cmd, " \""); - for (i = 0; i < prop.nitems * prop.format/8; i++) { - char c = ((char*)prop.data)[i]; + for (int i = 0; i < prop.nitems * prop.format / 8; i++) { + char c = ((char *)prop.data)[i]; if (c == '\n') { - if (i < prop.nitems * prop.format/8 - 1) { + if (i < prop.nitems * prop.format / 8 - 1) { strcat(cmd, "\" \""); } } else if (c == '\r') { + // Nothing to do } else { if (c == '`' || c == '$' || c == '\\') { strcat(cmd, "\\"); @@ -1524,23 +1544,21 @@ start: m.format = 32; m.data.l[0] = dnd_target_window; m.data.l[1] = 1; - m.data.l[2] = server.atom.XdndActionCopy; //We only ever copy. - XSendEvent(server.dsp, dnd_source_window, False, NoEventMask, (XEvent*)&m); + m.data.l[2] = server.atom.XdndActionCopy; // We only ever copy. + XSendEvent(server.dsp, dnd_source_window, False, NoEventMask, (XEvent *)&m); XSync(server.dsp, False); } XFree(prop.data); } - break; } default: - if (e.type == XDamageNotify+damage_event) { - XDamageNotifyEvent *de = (XDamageNotifyEvent*)&e; - GSList *l; - for (l = systray.list_icons; l ; l = l->next) { - TrayWindow *traywin = (TrayWindow*)l->data; + if (e.type == XDamageNotify + damage_event) { + XDamageNotifyEvent *de = (XDamageNotifyEvent *)&e; + for (GSList *l = systray.list_icons; l; l = l->next) { + TrayWindow *traywin = (TrayWindow *)l->data; if (traywin->parent == de->drawable) { systray_render_icon(traywin); break; @@ -1559,13 +1577,10 @@ start: // restart tint2 // SIGUSR1 used when : user's signal, composite manager stop/start or xrandr goto start; - } - else { + } else { // SIGINT, SIGTERM, SIGHUP - return 0; + exit(0); } } } } - - diff --git a/src/tooltip/tooltip.c b/src/tooltip/tooltip.c index 73fa6e1..dbe6c91 100644 --- a/src/tooltip/tooltip.c +++ b/src/tooltip/tooltip.c @@ -37,15 +37,14 @@ void stop_tooltip_timeout(); Tooltip g_tooltip; - void default_tooltip() { // give the tooltip some reasonable default values memset(&g_tooltip, 0, sizeof(Tooltip)); - g_tooltip.font_color.rgb[0] = 1; - g_tooltip.font_color.rgb[1] = 1; - g_tooltip.font_color.rgb[2] = 1; + g_tooltip.font_color.rgb[0] = 1; + g_tooltip.font_color.rgb[1] = 1; + g_tooltip.font_color.rgb[2] = 1; g_tooltip.font_color.alpha = 1; just_shown = 0; } @@ -62,12 +61,11 @@ void cleanup_tooltip() g_tooltip.font_desc = NULL; } - void init_tooltip() { if (!g_tooltip.font_desc) g_tooltip.font_desc = pango_font_description_from_string(DEFAULT_FONT); - if (g_tooltip.bg == 0) + if (!g_tooltip.bg) g_tooltip.bg = &g_array_index(backgrounds, Background, 0); XSetWindowAttributes attr; @@ -76,14 +74,14 @@ void init_tooltip() attr.colormap = server.colormap; attr.background_pixel = 0; attr.border_pixel = 0; - unsigned long mask = CWEventMask|CWColormap|CWBorderPixel|CWBackPixel|CWOverrideRedirect; + unsigned long mask = CWEventMask | CWColormap | CWBorderPixel | CWBackPixel | CWOverrideRedirect; if (g_tooltip.window) XDestroyWindow(server.dsp, g_tooltip.window); - g_tooltip.window = XCreateWindow(server.dsp, server.root_win, 0, 0, 100, 20, 0, server.depth, InputOutput, server.visual, mask, &attr); + g_tooltip.window = + XCreateWindow(server.dsp, server.root_win, 0, 0, 100, 20, 0, server.depth, InputOutput, server.visual, mask, &attr); } - -void tooltip_trigger_show(Area* area, Panel* p, XEvent *e) +void tooltip_trigger_show(Area *area, Panel *p, XEvent *e) { // Position the tooltip in the center of the area x = area->posx + MIN(area->width / 3, 22) + e->xmotion.x_root - e->xmotion.x; @@ -94,19 +92,17 @@ void tooltip_trigger_show(Area* area, Panel* p, XEvent *e) tooltip_copy_text(area); tooltip_update(); stop_tooltip_timeout(); - } - else if (!g_tooltip.mapped) { + } else if (!g_tooltip.mapped) { start_show_timeout(); } } - -void tooltip_show(void* arg) +void tooltip_show(void *arg) { int mx, my; Window w; - XTranslateCoordinates( server.dsp, server.root_win, g_tooltip.panel->main_win, x, y, &mx, &my, &w); - Area* area; + XTranslateCoordinates(server.dsp, server.root_win, g_tooltip.panel->main_win, x, y, &mx, &my, &w); + Area *area; area = click_area(g_tooltip.panel, mx, my); if (!g_tooltip.mapped && area->_get_tooltip_text) { tooltip_copy_text(area); @@ -117,12 +113,11 @@ void tooltip_show(void* arg) } } - void tooltip_update_geometry() { cairo_surface_t *cs; cairo_t *c; - PangoLayout* layout; + PangoLayout *layout; cs = cairo_xlib_surface_create(server.dsp, g_tooltip.window, server.visual, width, height); c = cairo_create(cs); layout = pango_cairo_create_layout(c); @@ -130,12 +125,12 @@ void tooltip_update_geometry() pango_layout_set_text(layout, g_tooltip.tooltip_text, -1); PangoRectangle r1, r2; pango_layout_get_pixel_extents(layout, &r1, &r2); - width = 2*g_tooltip.bg->border.width + 2*g_tooltip.paddingx + r2.width; - height = 2*g_tooltip.bg->border.width + 2*g_tooltip.paddingy + r2.height; + width = 2 * g_tooltip.bg->border.width + 2 * g_tooltip.paddingx + r2.width; + height = 2 * g_tooltip.bg->border.width + 2 * g_tooltip.paddingy + r2.height; - Panel* panel = g_tooltip.panel; + Panel *panel = g_tooltip.panel; if (panel_horizontal && panel_position & BOTTOM) - y = panel->posy-height; + y = panel->posy - height; else if (panel_horizontal && panel_position & TOP) y = panel->posy + panel->area.height; else if (panel_position & LEFT) @@ -148,51 +143,50 @@ void tooltip_update_geometry() cairo_surface_destroy(cs); } - void tooltip_adjust_geometry() { // adjust coordinates and size to not go offscreen // it seems quite impossible that the height needs to be adjusted, but we do it anyway. int min_x, min_y, max_width, max_height; - Panel* panel = g_tooltip.panel; + Panel *panel = g_tooltip.panel; int screen_width = server.monitor[panel->monitor].x + server.monitor[panel->monitor].width; int screen_height = server.monitor[panel->monitor].y + server.monitor[panel->monitor].height; - if ( x+width <= screen_width && y+height <= screen_height && x>=server.monitor[panel->monitor].x && y>=server.monitor[panel->monitor].y ) - return; // no adjustment needed + if (x + width <= screen_width && y + height <= screen_height && x >= server.monitor[panel->monitor].x && + y >= server.monitor[panel->monitor].y) + return; // no adjustment needed if (panel_horizontal) { - min_x=0; - max_width=server.monitor[panel->monitor].width; - max_height=server.monitor[panel->monitor].height-panel->area.height; + min_x = 0; + max_width = server.monitor[panel->monitor].width; + max_height = server.monitor[panel->monitor].height - panel->area.height; if (panel_position & BOTTOM) - min_y=0; + min_y = 0; else - min_y=panel->area.height; - } - else { - max_width=server.monitor[panel->monitor].width-panel->area.width; - min_y=0; - max_height=server.monitor[panel->monitor].height; + min_y = panel->area.height; + } else { + max_width = server.monitor[panel->monitor].width - panel->area.width; + min_y = 0; + max_height = server.monitor[panel->monitor].height; if (panel_position & LEFT) - min_x=panel->area.width; + min_x = panel->area.width; else - min_x=0; + min_x = 0; } - if (x+width > server.monitor[panel->monitor].x + server.monitor[panel->monitor].width) + if (x + width > server.monitor[panel->monitor].x + server.monitor[panel->monitor].width) x = server.monitor[panel->monitor].x + server.monitor[panel->monitor].width - width; - if ( y+height > server.monitor[panel->monitor].y + server.monitor[panel->monitor].height) + if (y + height > server.monitor[panel->monitor].y + server.monitor[panel->monitor].height) y = server.monitor[panel->monitor].y + server.monitor[panel->monitor].height - height; - if (xmax_width) + if (x < min_x) + x = min_x; + if (width > max_width) width = max_width; - if (ymax_height) - height=max_height; + if (y < min_y) + y = min_y; + if (height > max_height) + height = max_height; } void tooltip_update() @@ -205,7 +199,7 @@ void tooltip_update() tooltip_update_geometry(); if (just_shown) { if (!panel_horizontal) - y -= height/2; // center vertically + y -= height / 2; // center vertically just_shown = 0; } tooltip_adjust_geometry(); @@ -214,65 +208,62 @@ void tooltip_update() // Stuff for drawing the tooltip cairo_surface_t *cs; cairo_t *c; - PangoLayout* layout; + PangoLayout *layout; cs = cairo_xlib_surface_create(server.dsp, g_tooltip.window, server.visual, width, height); c = cairo_create(cs); - Color bc = g_tooltip.bg->fill_color; + Color bc = g_tooltip.bg->fill_color; Border b = g_tooltip.bg->border; if (server.real_transparency) { clear_pixmap(g_tooltip.window, 0, 0, width, height); - draw_rect(c, b.width, b.width, width-2*b.width, height-2*b.width, b.radius-b.width/1.571); - cairo_set_source_rgba(c, bc.rgb[0], bc.rgb[1], bc.rgb[2], bc.alpha); - } - else { + draw_rect(c, b.width, b.width, width - 2 * b.width, height - 2 * b.width, b.radius - b.width / 1.571); + cairo_set_source_rgba(c, bc.rgb[0], bc.rgb[1], bc.rgb[2], bc.alpha); + } else { cairo_rectangle(c, 0., 0, width, height); - cairo_set_source_rgb(c, bc.rgb[0], bc.rgb[1], bc.rgb[2]); + cairo_set_source_rgb(c, bc.rgb[0], bc.rgb[1], bc.rgb[2]); } cairo_fill(c); cairo_set_line_width(c, b.width); if (server.real_transparency) - draw_rect(c, b.width/2.0, b.width/2.0, width - b.width, height - b.width, b.radius); + draw_rect(c, b.width / 2.0, b.width / 2.0, width - b.width, height - b.width, b.radius); else - cairo_rectangle(c, b.width/2.0, b.width/2.0, width-b.width, height-b.width); - cairo_set_source_rgba(c, b.color.rgb[0], b.color.rgb[1], b.color.rgb[2], b.color.alpha); + cairo_rectangle(c, b.width / 2.0, b.width / 2.0, width - b.width, height - b.width); + cairo_set_source_rgba(c, b.color.rgb[0], b.color.rgb[1], b.color.rgb[2], b.color.alpha); cairo_stroke(c); Color fc = g_tooltip.font_color; - cairo_set_source_rgba(c, fc.rgb[0], fc.rgb[1], fc.rgb[2], fc.alpha); + cairo_set_source_rgba(c, fc.rgb[0], fc.rgb[1], fc.rgb[2], fc.alpha); layout = pango_cairo_create_layout(c); pango_layout_set_font_description(layout, g_tooltip.font_desc); pango_layout_set_text(layout, g_tooltip.tooltip_text, -1); PangoRectangle r1, r2; pango_layout_get_pixel_extents(layout, &r1, &r2); - pango_layout_set_width(layout, width*PANGO_SCALE); - pango_layout_set_height(layout, height*PANGO_SCALE); + pango_layout_set_width(layout, width * PANGO_SCALE); + pango_layout_set_height(layout, height * PANGO_SCALE); pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); - // I do not know why this is the right way, but with the below cairo_move_to it seems to be centered (horiz. and vert.) + // I do not know why this is the right way, but with the below cairo_move_to it seems to be centered (horiz. and + // vert.) cairo_move_to(c, - -r1.x/2 + g_tooltip.bg->border.width + g_tooltip.paddingx, - -r1.y/2 + 1 + g_tooltip.bg->border.width + g_tooltip.paddingy); - pango_cairo_show_layout (c, layout); + -r1.x / 2 + g_tooltip.bg->border.width + g_tooltip.paddingx, + -r1.y / 2 + 1 + g_tooltip.bg->border.width + g_tooltip.paddingy); + pango_cairo_show_layout(c, layout); - g_object_unref (layout); - cairo_destroy (c); - cairo_surface_destroy (cs); + g_object_unref(layout); + cairo_destroy(c); + cairo_surface_destroy(cs); } - void tooltip_trigger_hide() { if (g_tooltip.mapped) { tooltip_copy_text(0); start_hide_timeout(); - } - else { + } else { // tooltip not visible yet, but maybe a timeout is still pending stop_tooltip_timeout(); } } - -void tooltip_hide(void* arg) +void tooltip_hide(void *arg) { if (g_tooltip.mapped) { g_tooltip.mapped = False; @@ -281,26 +272,22 @@ void tooltip_hide(void* arg) } } - void start_show_timeout() { change_timeout(&g_tooltip.timeout, g_tooltip.show_timeout_msec, 0, tooltip_show, 0); } - void start_hide_timeout() { change_timeout(&g_tooltip.timeout, g_tooltip.hide_timeout_msec, 0, tooltip_hide, 0); } - void stop_tooltip_timeout() { stop_timeout(g_tooltip.timeout); } - -void tooltip_copy_text(Area* area) +void tooltip_copy_text(Area *area) { free(g_tooltip.tooltip_text); if (area && area->_get_tooltip_text) diff --git a/src/tooltip/tooltip.h b/src/tooltip/tooltip.h index c8c5d9b..f02f4b8 100644 --- a/src/tooltip/tooltip.h +++ b/src/tooltip/tooltip.h @@ -22,26 +22,24 @@ #include "panel.h" #include "timer.h" - typedef struct { - Area* area; // never ever use the area attribut if you are not 100% sure that this area was not freed - char* tooltip_text; - Panel* panel; + Area *area; // never ever use the area attribut if you are not 100% sure that this area was not freed + char *tooltip_text; + Panel *panel; Window window; int show_timeout_msec; int hide_timeout_msec; Bool mapped; int paddingx; int paddingy; - PangoFontDescription* font_desc; + PangoFontDescription *font_desc; Color font_color; - Background* bg; - timeout* timeout; + Background *bg; + timeout *timeout; } Tooltip; extern Tooltip g_tooltip; - // default global data void default_tooltip(); @@ -49,11 +47,11 @@ void default_tooltip(); void cleanup_tooltip(); void init_tooltip(); -void tooltip_trigger_show(Area* area, Panel* p, XEvent *e); -void tooltip_show(void* /*arg*/); +void tooltip_trigger_show(Area *area, Panel *p, XEvent *e); +void tooltip_show(void * /*arg*/); void tooltip_update(); void tooltip_trigger_hide(); -void tooltip_hide(void* /*arg*/); -void tooltip_copy_text(Area* area); +void tooltip_hide(void * /*arg*/); +void tooltip_copy_text(Area *area); #endif // TOOLTIP_H diff --git a/src/util/area.c b/src/util/area.c index 3c5cb65..a771d27 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -32,23 +32,24 @@ Area *mouse_over_area = NULL; -void initialize_positions(void *obj, int pos) +void init_background(Background *bg) { - Area *a = (Area*)obj; - - // initialize fixed position/size - GList *l; - for (l = a->children; l ; l = l->next) { - Area *child = ((Area*)l->data); + memset(bg, 0, sizeof(Background)); +} + +void initialize_positions(void *obj, int offset) +{ + Area *a = (Area *)obj; + for (GList *l = a->children; l; l = l->next) { + Area *child = ((Area *)l->data); if (panel_horizontal) { - child->posy = pos + a->bg->border.width + a->paddingy; + child->posy = offset + a->bg->border.width + a->paddingy; child->height = a->height - (2 * (a->bg->border.width + a->paddingy)); if (child->_on_change_layout) child->_on_change_layout(child); initialize_positions(child, child->posy); - } - else { - child->posx = pos + a->bg->border.width + a->paddingy; + } else { + child->posx = offset + a->bg->border.width + a->paddingy; child->width = a->width - (2 * (a->bg->border.width + a->paddingy)); if (child->_on_change_layout) child->_on_change_layout(child); @@ -57,17 +58,16 @@ void initialize_positions(void *obj, int pos) } } - -void _relayout_fixed(Area *a) +void relayout_fixed(Area *a) { if (!a->on_screen) return; // Children are resized before the parent GList *l; - for (l = a->children; l ; l = l->next) - _relayout_fixed(l->data); - + for (l = a->children; l; l = l->next) + relayout_fixed(l->data); + // Recalculate size a->_changed = 0; if (a->resize_needed && a->size_mode == LAYOUT_FIXED) { @@ -77,44 +77,40 @@ void _relayout_fixed(Area *a) if (a->_resize(a)) { // The size hash changed => resize needed for the parent if (a->parent) - ((Area*)a->parent)->resize_needed = 1; + ((Area *)a->parent)->resize_needed = 1; a->_changed = 1; } } } } - -void _relayout_dynamic(Area *a, int level) +void relayout_dynamic(Area *a, int level) { - // don't resize hiden objects if (!a->on_screen) return; - // parent node is resized before its children - // calculate area's size - GList *l; + // Area is resized before its children if (a->resize_needed && a->size_mode == LAYOUT_DYNAMIC) { a->resize_needed = 0; if (a->_resize) { a->_resize(a); // resize children with LAYOUT_DYNAMIC - for (l = a->children; l ; l = l->next) { - Area *child = ((Area*)l->data); + for (GList *l = a->children; l; l = l->next) { + Area *child = ((Area *)l->data); if (child->size_mode == LAYOUT_DYNAMIC && child->children) child->resize_needed = 1; } } } - // update position of children + // Layout children if (a->children) { if (a->alignment == ALIGN_LEFT) { int pos = (panel_horizontal ? a->posx : a->posy) + a->bg->border.width + a->paddingxlr; - for (l = a->children; l ; l = l->next) { - Area *child = ((Area*)l->data); + for (GList *l = a->children; l; l = l->next) { + Area *child = ((Area *)l->data); if (!child->on_screen) continue; @@ -132,15 +128,15 @@ void _relayout_dynamic(Area *a, int level) } } - _relayout_dynamic(child, level+1); + relayout_dynamic(child, level + 1); pos += panel_horizontal ? child->width + a->paddingx : child->height + a->paddingx; } } else if (a->alignment == ALIGN_RIGHT) { int pos = (panel_horizontal ? a->posx + a->width : a->posy + a->height) - a->bg->border.width - a->paddingxlr; - for (l = g_list_last(a->children); l ; l = l->prev) { - Area *child = ((Area*)l->data); + for (GList *l = g_list_last(a->children); l; l = l->prev) { + Area *child = ((Area *)l->data); if (!child->on_screen) continue; @@ -160,7 +156,7 @@ void _relayout_dynamic(Area *a, int level) } } - _relayout_dynamic(child, level+1); + relayout_dynamic(child, level + 1); pos -= a->paddingx; } @@ -168,8 +164,8 @@ void _relayout_dynamic(Area *a, int level) int children_size = 0; - for (l = a->children; l ; l = l->next) { - Area *child = ((Area*)l->data); + for (GList *l = a->children; l; l = l->next) { + Area *child = ((Area *)l->data); if (!child->on_screen) continue; @@ -180,8 +176,8 @@ void _relayout_dynamic(Area *a, int level) int pos = (panel_horizontal ? a->posx : a->posy) + a->bg->border.width + a->paddingxlr; pos += ((panel_horizontal ? a->width : a->height) - children_size) / 2; - for (l = a->children; l ; l = l->next) { - Area *child = ((Area*)l->data); + for (GList *l = a->children; l; l = l->next) { + Area *child = ((Area *)l->data); if (!child->on_screen) continue; @@ -199,7 +195,7 @@ void _relayout_dynamic(Area *a, int level) } } - _relayout_dynamic(child, level+1); + relayout_dynamic(child, level + 1); pos += panel_horizontal ? child->width + a->paddingx : child->height + a->paddingx; } @@ -208,79 +204,71 @@ void _relayout_dynamic(Area *a, int level) if (a->_changed) { // pos/size changed - a->redraw_needed = 1; + a->redraw_needed = TRUE; if (a->_on_change_layout) - a->_on_change_layout (a); + a->_on_change_layout(a); } } +void relayout(Area *a) +{ + relayout_fixed(a); + relayout_dynamic(a, 1); +} -void draw_tree (Area *a) +void draw_tree(Area *a) { if (!a->on_screen) return; - // don't draw transparent objects (without foreground and without background) if (a->redraw_needed) { a->redraw_needed = 0; - // force redraw of child - //GList *l; - //for (l = a->children ; l ; l = l->next) - //((Area*)l->data)->redraw_needed = 1; - - //printf("draw area posx %d, width %d\n", a->posx, a->width); draw(a); } - // draw current Area - if (a->pix == 0) - printf("empty area posx %d, width %d\n", a->posx, a->width); - XCopyArea(server.dsp, a->pix, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy); + if (a->pix) + XCopyArea(server.dsp, a->pix, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy); - // and then draw child objects - GList *l; - for (l = a->children; l ; l = l->next) - draw_tree((Area*)l->data); + for (GList *l = a->children; l; l = l->next) + draw_tree((Area *)l->data); } - int relayout_with_constraint(Area *a, int maximum_size) { - Area *child; - int size, nb_by_content=0, nb_by_layout=0; + int fixed_children_count = 0; + int dynamic_children_count = 0; - if (panel_horizontal) { - // detect free size for LAYOUT_DYNAMIC's Area - size = a->width - (2 * (a->paddingxlr + a->bg->border.width)); - GList *l; - for (l = a->children ; l ; l = l->next) { - child = (Area*)l->data; + if (panel_horizontal) { + // detect free size for LAYOUT_DYNAMIC Areas + int size = a->width - (2 * (a->paddingxlr + a->bg->border.width)); + for (GList *l = a->children; l; l = l->next) { + Area *child = (Area *)l->data; if (child->on_screen && child->size_mode == LAYOUT_FIXED) { size -= child->width; - nb_by_content++; + fixed_children_count++; } if (child->on_screen && child->size_mode == LAYOUT_DYNAMIC) - nb_by_layout++; + dynamic_children_count++; } - //printf(" resize_by_layout Deb %d, %d\n", nb_by_content, nb_by_layout); - if (nb_by_content+nb_by_layout) - size -= ((nb_by_content+nb_by_layout-1) * a->paddingx); + if (fixed_children_count + dynamic_children_count > 0) + size -= (fixed_children_count + dynamic_children_count - 1) * a->paddingx; - int width=0, modulo=0, old_width; - if (nb_by_layout) { - width = size / nb_by_layout; - modulo = size % nb_by_layout; - if (width > maximum_size && maximum_size != 0) { + int width = 0; + int modulo = 0; + if (dynamic_children_count > 0) { + width = size / dynamic_children_count; + modulo = size % dynamic_children_count; + if (width > maximum_size && maximum_size > 0) { width = maximum_size; modulo = 0; } } - // resize LAYOUT_DYNAMIC objects - for (l = a->children ; l ; l = l->next) { - child = (Area*)l->data; + // Resize LAYOUT_DYNAMIC objects + for (GList *l = a->children; l; l = l->next) { + Area *child = (Area *)l->data; if (child->on_screen && child->size_mode == LAYOUT_DYNAMIC) { - old_width = child->width; + int old_width = child->width; child->width = width; if (modulo) { child->width++; @@ -290,36 +278,35 @@ int relayout_with_constraint(Area *a, int maximum_size) child->_changed = 1; } } - } - else { + } else { // detect free size for LAYOUT_DYNAMIC's Area - size = a->height - (2 * (a->paddingxlr + a->bg->border.width)); - GList *l; - for (l = a->children ; l ; l = l->next) { - child = (Area*)l->data; + int size = a->height - (2 * (a->paddingxlr + a->bg->border.width)); + for (GList *l = a->children; l; l = l->next) { + Area *child = (Area *)l->data; if (child->on_screen && child->size_mode == LAYOUT_FIXED) { size -= child->height; - nb_by_content++; + fixed_children_count++; } if (child->on_screen && child->size_mode == LAYOUT_DYNAMIC) - nb_by_layout++; + dynamic_children_count++; } - if (nb_by_content+nb_by_layout) - size -= ((nb_by_content+nb_by_layout-1) * a->paddingx); + if (fixed_children_count + dynamic_children_count > 0) + size -= (fixed_children_count + dynamic_children_count - 1) * a->paddingx; - int height=0, modulo=0; - if (nb_by_layout) { - height = size / nb_by_layout; - modulo = size % nb_by_layout; + int height = 0; + int modulo = 0; + if (dynamic_children_count) { + height = size / dynamic_children_count; + modulo = size % dynamic_children_count; if (height > maximum_size && maximum_size != 0) { height = maximum_size; modulo = 0; } } - // resize LAYOUT_DYNAMIC objects - for (l = a->children ; l ; l = l->next) { - child = (Area*)l->data; + // Resize LAYOUT_DYNAMIC objects + for (GList *l = a->children; l; l = l->next) { + Area *child = (Area *)l->data; if (child->on_screen && child->size_mode == LAYOUT_DYNAMIC) { int old_height = child->height; child->height = height; @@ -335,21 +322,19 @@ int relayout_with_constraint(Area *a, int maximum_size) return 0; } - void schedule_redraw(Area *a) { - a->redraw_needed = 1; + a->redraw_needed = TRUE; - GList *l; - for (l = a->children ; l ; l = l->next) - schedule_redraw((Area*)l->data); + for (GList *l = a->children; l; l = l->next) + schedule_redraw((Area *)l->data); } void hide(Area *a) { - Area *parent = (Area*)a->parent; + Area *parent = (Area *)a->parent; - a->on_screen = 0; + a->on_screen = FALSE; if (parent) parent->resize_needed = 1; if (panel_horizontal) @@ -360,9 +345,9 @@ void hide(Area *a) void show(Area *a) { - Area *parent = (Area*)a->parent; + Area *parent = (Area *)a->parent; - a->on_screen = 1; + a->on_screen = TRUE; if (parent) parent->resize_needed = 1; a->resize_needed = 1; @@ -374,16 +359,13 @@ void draw(Area *a) XFreePixmap(server.dsp, a->pix); a->pix = XCreatePixmap(server.dsp, server.root_win, a->width, a->height, server.depth); - // add layer of root pixmap (or clear pixmap if real_transparency==true) + // Add layer of root pixmap (or clear pixmap if real_transparency==true) if (server.real_transparency) - clear_pixmap(a->pix, 0 ,0, a->width, a->height); + clear_pixmap(a->pix, 0, 0, a->width, a->height); XCopyArea(server.dsp, ((Panel *)a->panel)->temp_pmap, a->pix, server.gc, a->posx, a->posy, a->width, a->height, 0, 0); - cairo_surface_t *cs; - cairo_t *c; - - cs = cairo_xlib_surface_create (server.dsp, a->pix, server.visual, a->width, a->height); - c = cairo_create (cs); + cairo_surface_t *cs = cairo_xlib_surface_create(server.dsp, a->pix, server.visual, a->width, a->height); + cairo_t *c = cairo_create(cs); draw_background(a, c); @@ -394,43 +376,74 @@ void draw(Area *a) cairo_surface_destroy(cs); } - -void draw_background (Area *a, cairo_t *c) +void draw_background(Area *a, cairo_t *c) { if (a->bg->fill_color.alpha > 0.0 || (panel_config.mouse_effects && (a->has_mouse_over_effect || a->has_mouse_press_effect))) { - //printf(" draw_background (%d %d) RGBA (%lf, %lf, %lf, %lf)\n", a->posx, a->posy, pix->fill_color.rgb[0], pix->fill_color.rgb[1], pix->fill_color.rgb[2], pix->fill_color.alpha); if (a->mouse_state == MOUSE_OVER) - cairo_set_source_rgba(c, a->bg->fill_color_hover.rgb[0], a->bg->fill_color_hover.rgb[1], a->bg->fill_color_hover.rgb[2], a->bg->fill_color_hover.alpha); + cairo_set_source_rgba(c, + a->bg->fill_color_hover.rgb[0], + a->bg->fill_color_hover.rgb[1], + a->bg->fill_color_hover.rgb[2], + a->bg->fill_color_hover.alpha); else if (a->mouse_state == MOUSE_DOWN) - cairo_set_source_rgba(c, a->bg->fill_color_pressed.rgb[0], a->bg->fill_color_pressed.rgb[1], a->bg->fill_color_pressed.rgb[2], a->bg->fill_color_pressed.alpha); + cairo_set_source_rgba(c, + a->bg->fill_color_pressed.rgb[0], + a->bg->fill_color_pressed.rgb[1], + a->bg->fill_color_pressed.rgb[2], + a->bg->fill_color_pressed.alpha); else - cairo_set_source_rgba(c, a->bg->fill_color.rgb[0], a->bg->fill_color.rgb[1], a->bg->fill_color.rgb[2], a->bg->fill_color.alpha); - draw_rect(c, a->bg->border.width, a->bg->border.width, a->width-(2.0 * a->bg->border.width), a->height-(2.0*a->bg->border.width), a->bg->border.radius - a->bg->border.width/1.571); + cairo_set_source_rgba(c, + a->bg->fill_color.rgb[0], + a->bg->fill_color.rgb[1], + a->bg->fill_color.rgb[2], + a->bg->fill_color.alpha); + draw_rect(c, + a->bg->border.width, + a->bg->border.width, + a->width - (2.0 * a->bg->border.width), + a->height - (2.0 * a->bg->border.width), + a->bg->border.radius - a->bg->border.width / 1.571); cairo_fill(c); } if (a->bg->border.width > 0) { - cairo_set_line_width (c, a->bg->border.width); + cairo_set_line_width(c, a->bg->border.width); // draw border inside (x, y, width, height) if (a->mouse_state == MOUSE_OVER) - cairo_set_source_rgba(c, a->bg->border_color_hover.rgb[0], a->bg->border_color_hover.rgb[1], a->bg->border_color_hover.rgb[2], a->bg->border_color_hover.alpha); + cairo_set_source_rgba(c, + a->bg->border_color_hover.rgb[0], + a->bg->border_color_hover.rgb[1], + a->bg->border_color_hover.rgb[2], + a->bg->border_color_hover.alpha); else if (a->mouse_state == MOUSE_DOWN) - cairo_set_source_rgba(c, a->bg->border_color_pressed.rgb[0], a->bg->border_color_pressed.rgb[1], a->bg->border_color_pressed.rgb[2], a->bg->border_color_pressed.alpha); + cairo_set_source_rgba(c, + a->bg->border_color_pressed.rgb[0], + a->bg->border_color_pressed.rgb[1], + a->bg->border_color_pressed.rgb[2], + a->bg->border_color_pressed.alpha); else - cairo_set_source_rgba(c, a->bg->border.color.rgb[0], a->bg->border.color.rgb[1], a->bg->border.color.rgb[2], a->bg->border.color.alpha); - draw_rect(c, a->bg->border.width/2.0, a->bg->border.width/2.0, a->width - a->bg->border.width, a->height - a->bg->border.width, a->bg->border.radius); + cairo_set_source_rgba(c, + a->bg->border.color.rgb[0], + a->bg->border.color.rgb[1], + a->bg->border.color.rgb[2], + a->bg->border.color.alpha); + draw_rect(c, + a->bg->border.width / 2.0, + a->bg->border.width / 2.0, + a->width - a->bg->border.width, + a->height - a->bg->border.width, + a->bg->border.radius); cairo_stroke(c); } } - void remove_area(Area *a) { - Area *area = (Area*)a; - Area *parent = (Area*)area->parent; + Area *area = (Area *)a; + Area *parent = (Area *)area->parent; if (parent) { parent->children = g_list_remove(parent->children, area); @@ -443,7 +456,6 @@ void remove_area(Area *a) } } - void add_area(Area *a, Area *parent) { g_assert_null(a->parent); @@ -455,22 +467,20 @@ void add_area(Area *a, Area *parent) } } - -void free_area (Area *a) +void free_area(Area *a) { if (!a) return; - GList *l0; - for (l0 = a->children; l0 ; l0 = l0->next) - free_area (l0->data); + for (GList *l = a->children; l; l = l->next) + free_area(l->data); if (a->children) { g_list_free(a->children); a->children = 0; } if (a->pix) { - XFreePixmap (server.dsp, a->pix); + XFreePixmap(server.dsp, a->pix); a->pix = 0; } if (mouse_over_area == a) { @@ -478,7 +488,6 @@ void free_area (Area *a) } } - void mouse_over(Area *area, int pressed) { if (mouse_over_area == area && !area) @@ -506,7 +515,7 @@ void mouse_over(Area *area, int pressed) mouse_over_area->mouse_state = new_state; schedule_redraw(mouse_over_area); - panel_refresh = 1; + panel_refresh = TRUE; } void mouse_out() @@ -515,17 +524,6 @@ void mouse_out() return; mouse_over_area->mouse_state = MOUSE_NORMAL; schedule_redraw(mouse_over_area); - panel_refresh = 1; + panel_refresh = TRUE; mouse_over_area = NULL; } - -void init_background(Background *bg) -{ - memset(bg, 0, sizeof(Background)); -} - -void relayout(Area *a) -{ - _relayout_fixed(a); - _relayout_dynamic(a, 1); -} diff --git a/src/util/area.h b/src/util/area.h index fcf10f3..6075c5f 100644 --- a/src/util/area.h +++ b/src/util/area.h @@ -147,21 +147,23 @@ typedef struct Background { typedef enum Layout { LAYOUT_DYNAMIC, - LAYOUT_FIXED + LAYOUT_FIXED, } Layout; typedef enum Alignment { ALIGN_LEFT = 0, ALIGN_CENTER = 1, - ALIGN_RIGHT = 2 + ALIGN_RIGHT = 2, } Alignment; typedef enum MouseState { MOUSE_NORMAL = 0, MOUSE_OVER = 1, - MOUSE_DOWN = 2 + MOUSE_DOWN = 2, } MouseState; +struct Panel; + typedef struct Area { // Position relative to the panel window int posx, posy; @@ -202,7 +204,7 @@ typedef struct Area { // Called on resize, obj = pointer to the Area // Returns 1 if the new size is different than the previous size. - int (*_resize)(void *obj); + gboolean (*_resize)(void *obj); // Implemented only to override the default layout algorithm for this widget. // For example, if this widget is a cell in a table, its position and size should be computed here. @@ -210,10 +212,9 @@ typedef struct Area { // Returns a copy of the tooltip to be displayed for this widget. // The caller takes ownership of the pointer. - char* (*_get_tooltip_text)(void *obj); + char *(*_get_tooltip_text)(void *obj); } Area; - // Initializes the Background member to default values. void init_background(Background *bg); @@ -222,10 +223,12 @@ void init_background(Background *bg); // Called on startup to initialize the positions of all Areas in the Area tree. // Parameters: // * obj: pointer to Area -// * pos: offset in pixels from left/top -void initialize_positions(void *obj, int pos); +// * offset: offset in pixels from left/top, relative to the window +void initialize_positions(void *obj, int offset); + // Relayouts the Area and its children. Normally called on the root of the tree (i.e. the Panel). void relayout(Area *a); + // Distributes the Area's size to its children, repositioning them as needed. // If maximum_size > 0, it is an upper limit for the child size. int relayout_with_constraint(Area *a, int maximum_size); @@ -234,15 +237,20 @@ int relayout_with_constraint(Area *a, int maximum_size); // Sets the redraw_needed flag on the area and its descendants void schedule_redraw(Area *a); + // Recreates the Area pixmap and draws the background and the foreground void draw(Area *a); + // Draws the background of the Area void draw_background(Area *a, cairo_t *c); + // Explores the entire Area subtree (only if the on_screen flag set) // and draws the areas with the redraw_needed flag set void draw_tree(Area *a); + // Clears the on_screen flag, sets the size to zero and triggers a parent resize void hide(Area *a); + // Sets the on_screen flag and triggers a parent and area resize void show(Area *a); diff --git a/src/util/common.c b/src/util/common.c index 6208753..7a7bef3 100644 --- a/src/util/common.c +++ b/src/util/common.c @@ -37,67 +37,69 @@ #include #endif - -void copy_file(const char *pathSrc, const char *pathDest) +void copy_file(const char *path_src, const char *path_dest) { - if (g_str_equal(pathSrc, pathDest)) + if (g_str_equal(path_src, path_dest)) return; - FILE *fileSrc, *fileDest; - char buffer[100]; - int nb; + FILE *file_src, *file_dest; + char buffer[4096]; + int nb; - fileSrc = fopen(pathSrc, "rb"); - if (fileSrc == NULL) return; + file_src = fopen(path_src, "rb"); + if (file_src == NULL) + return; - fileDest = fopen(pathDest, "wb"); - if (fileDest == NULL) return; + file_dest = fopen(path_dest, "wb"); + if (file_dest == NULL) { + fclose(file_src); + return; + } - while ((nb = fread(buffer, 1, sizeof(buffer), fileSrc)) > 0) { - if ( nb != fwrite(buffer, 1, nb, fileDest)) { - printf("Error while copying file %s to %s\n", pathSrc, pathDest); + while ((nb = fread(buffer, 1, sizeof(buffer), file_src)) > 0) { + if (nb != fwrite(buffer, 1, nb, file_dest)) { + printf("Error while copying file %s to %s\n", path_src, path_dest); } } - fclose (fileDest); - fclose (fileSrc); + fclose(file_dest); + fclose(file_src); } - -int parse_line (const char *line, char **key, char **value) +int parse_line(const char *line, char **key, char **value) { char *a, *b; /* Skip useless lines */ - if ((line[0] == '#') || (line[0] == '\n')) return 0; - if (!(a = strchr (line, '='))) return 0; + if ((line[0] == '#') || (line[0] == '\n')) + return 0; + if (!(a = strchr(line, '='))) + return 0; /* overwrite '=' with '\0' */ a[0] = '\0'; - *key = strdup (line); + *key = strdup(line); a++; /* overwrite '\n' with '\0' if '\n' present */ - if ((b = strchr (a, '\n'))) b[0] = '\0'; + if ((b = strchr(a, '\n'))) + b[0] = '\0'; - *value = strdup (a); + *value = strdup(a); g_strstrip(*key); g_strstrip(*value); return 1; } - void tint_exec(const char *command) { if (command) { - pid_t pid; - pid = fork(); - if (pid == 0) { + if (fork() == 0) { // change for the fork the signal mask -// sigset_t sigset; -// sigprocmask(SIG_SETMASK, &sigset, 0); -// sigprocmask(SIG_UNBLOCK, &sigset, 0); + // sigset_t sigset; + // sigprocmask(SIG_SETMASK, &sigset, 0); + // sigprocmask(SIG_UNBLOCK, &sigset, 0); execl("/bin/sh", "/bin/sh", "-c", command, NULL); _exit(0); } @@ -107,9 +109,7 @@ void tint_exec(const char *command) char *expand_tilde(char *s) { const gchar *home = g_get_home_dir(); - if (home && - (strcmp(s, "~") == 0 || - strstr(s, "~/") == s)) { + if (home && (strcmp(s, "~") == 0 || strstr(s, "~/") == s)) { char *result = calloc(strlen(home) + strlen(s), 1); strcat(result, home); strcat(result, s + 1); @@ -129,8 +129,7 @@ char *contract_tilde(char *s) strcat(home_slash, home); strcat(home_slash, "/"); - if ((strcmp(s, home) == 0 || - strstr(s, home_slash) == s)) { + if ((strcmp(s, home) == 0 || strstr(s, home_slash) == s)) { char *result = calloc(strlen(s) - strlen(home) + 2, 1); strcat(result, "~"); strcat(result, s + strlen(home)); @@ -142,98 +141,96 @@ char *contract_tilde(char *s) } } -int hex_char_to_int (char c) +int hex_char_to_int(char c) { int r; - if (c >= '0' && c <= '9') r = c - '0'; - else if (c >= 'a' && c <= 'f') r = c - 'a' + 10; - else if (c >= 'A' && c <= 'F') r = c - 'A' + 10; - else r = 0; + if (c >= '0' && c <= '9') + r = c - '0'; + else if (c >= 'a' && c <= 'f') + r = c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + r = c - 'A' + 10; + else + r = 0; return r; } - -int hex_to_rgb (char *hex, int *r, int *g, int *b) +int hex_to_rgb(char *hex, int *r, int *g, int *b) { - int len; + if (hex == NULL || hex[0] != '#') + return (0); - if (hex == NULL || hex[0] != '#') return (0); - - len = strlen (hex); + int len = strlen(hex); if (len == 3 + 1) { - *r = hex_char_to_int (hex[1]); - *g = hex_char_to_int (hex[2]); - *b = hex_char_to_int (hex[3]); - } - else if (len == 6 + 1) { - *r = hex_char_to_int (hex[1]) * 16 + hex_char_to_int (hex[2]); - *g = hex_char_to_int (hex[3]) * 16 + hex_char_to_int (hex[4]); - *b = hex_char_to_int (hex[5]) * 16 + hex_char_to_int (hex[6]); - } - else if (len == 12 + 1) { - *r = hex_char_to_int (hex[1]) * 16 + hex_char_to_int (hex[2]); - *g = hex_char_to_int (hex[5]) * 16 + hex_char_to_int (hex[6]); - *b = hex_char_to_int (hex[9]) * 16 + hex_char_to_int (hex[10]); - } - else return 0; + *r = hex_char_to_int(hex[1]); + *g = hex_char_to_int(hex[2]); + *b = hex_char_to_int(hex[3]); + } else if (len == 6 + 1) { + *r = hex_char_to_int(hex[1]) * 16 + hex_char_to_int(hex[2]); + *g = hex_char_to_int(hex[3]) * 16 + hex_char_to_int(hex[4]); + *b = hex_char_to_int(hex[5]) * 16 + hex_char_to_int(hex[6]); + } else if (len == 12 + 1) { + *r = hex_char_to_int(hex[1]) * 16 + hex_char_to_int(hex[2]); + *g = hex_char_to_int(hex[5]) * 16 + hex_char_to_int(hex[6]); + *b = hex_char_to_int(hex[9]) * 16 + hex_char_to_int(hex[10]); + } else + return 0; return 1; } - -void get_color (char *hex, double *rgb) +void get_color(char *hex, double *rgb) { int r, g, b; r = g = b = 0; - hex_to_rgb (hex, &r, &g, &b); + hex_to_rgb(hex, &r, &g, &b); rgb[0] = (r / 255.0); rgb[1] = (g / 255.0); rgb[2] = (b / 255.0); } - -void extract_values (const char *value, char **value1, char **value2, char **value3) +void extract_values(const char *value, char **value1, char **value2, char **value3) { - char *b=0, *c=0; + char *b = 0, *c = 0; - if (*value1) free (*value1); - if (*value2) free (*value2); - if (*value3) free (*value3); + if (*value1) + free(*value1); + if (*value2) + free(*value2); + if (*value3) + free(*value3); - if ((b = strchr (value, ' '))) { + if ((b = strchr(value, ' '))) { b[0] = '\0'; b++; - } - else { + } else { *value2 = 0; *value3 = 0; } - *value1 = strdup (value); + *value1 = strdup(value); g_strstrip(*value1); if (b) { - if ((c = strchr (b, ' '))) { + if ((c = strchr(b, ' '))) { c[0] = '\0'; c++; - } - else { + } else { c = 0; *value3 = 0; } - *value2 = strdup (b); + *value2 = strdup(b); g_strstrip(*value2); } if (c) { - *value3 = strdup (c); + *value3 = strdup(c); g_strstrip(*value3); } } - void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright) { unsigned int x, y; @@ -244,21 +241,24 @@ void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright float hue, saturation, brightness; float redc, greenc, bluec; - for(y = 0; y < h; y++) { - for(id = y * w, x = 0; x < w; x++, id++) { + for (y = 0; y < h; y++) { + for (id = y * w, x = 0; x < w; x++, id++) { argb = data[id]; a = (argb >> 24) & 0xff; // transparent => nothing to do. - if (a == 0) continue; + if (a == 0) + continue; r = (argb >> 16) & 0xff; g = (argb >> 8) & 0xff; - b = (argb) & 0xff; + b = (argb)&0xff; // convert RGB to HSB cmax = (r > g) ? r : g; - if (b > cmax) cmax = b; + if (b > cmax) + cmax = b; cmin = (r < g) ? r : g; - if (b < cmin) cmin = b; + if (b < cmin) + cmin = b; brightness = ((float)cmax) / 255.0f; if (cmax != 0) saturation = ((float)(cmax - cmin)) / ((float)cmax); @@ -283,13 +283,17 @@ void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright // adjust saturation += satur; - if (saturation < 0.0) saturation = 0.0; - if (saturation > 1.0) saturation = 1.0; + if (saturation < 0.0) + saturation = 0.0; + if (saturation > 1.0) + saturation = 1.0; brightness += bright; - if (brightness < 0.0) brightness = 0.0; - if (brightness > 1.0) brightness = 1.0; + if (brightness < 0.0) + brightness = 0.0; + if (brightness > 1.0) + brightness = 1.0; if (alpha != 100) - a = (a * alpha)/100; + a = (a * alpha) / 100; // convert HSB to RGB if (saturation == 0) { @@ -300,7 +304,7 @@ void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright p = brightness * (1.0f - saturation); q = brightness * (1.0f - saturation * f); t = brightness * (1.0f - (saturation * (1.0f - f))); - switch ((int) h2) { + switch ((int)h2) { case 0: r = (int)(brightness * 255.0f + 0.5f); g = (int)(t * 255.0f + 0.5f); @@ -343,34 +347,33 @@ void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright } } -void createHeuristicMask(DATA32* data, int w, int h) +void create_heuristic_mask(DATA32 *data, int w, int h) { // first we need to find the mask color, therefore we check all 4 edge pixel and take the color which // appears most often (we only need to check three edges, the 4th is implicitly clear) - unsigned int topLeft = data[0], topRight = data[w-1], bottomLeft = data[w*h-w], bottomRight = data[w*h-1]; + unsigned int topLeft = data[0], topRight = data[w - 1], bottomLeft = data[w * h - w], bottomRight = data[w * h - 1]; int max = (topLeft == topRight) + (topLeft == bottomLeft) + (topLeft == bottomRight); int maskPos = 0; - if ( max < (topRight == topLeft) + (topRight == bottomLeft) + (topRight == bottomRight) ) { + if (max < (topRight == topLeft) + (topRight == bottomLeft) + (topRight == bottomRight)) { max = (topRight == topLeft) + (topRight == bottomLeft) + (topRight == bottomRight); - maskPos = w-1; + maskPos = w - 1; } - if ( max < (bottomLeft == topRight) + (bottomLeft == topLeft) + (bottomLeft == bottomRight) ) - maskPos = w*h-w; + if (max < (bottomLeft == topRight) + (bottomLeft == topLeft) + (bottomLeft == bottomRight)) + maskPos = w * h - w; // now mask out every pixel which has the same color as the edge pixels - unsigned char* udata = (unsigned char*)data; - unsigned char b = udata[4*maskPos]; - unsigned char g = udata[4*maskPos+1]; - unsigned char r = udata[4*maskPos+1]; - int i; - for (i=0; i> 24) & 0xff; @@ -381,29 +384,27 @@ int pixelEmpty(DATA32 argb) return rgb == 0; } -int imageEmpty(DATA32* data, int w, int h) +int image_empty(DATA32 *data, int w, int h) { - unsigned int x, y; - if (w > 0 && h > 0) { - x = w / 2; - y = h / 2; - if (!pixelEmpty(data[y * w + x])) { - //fprintf(stderr, "Non-empty pixel: [%u, %u] = %x\n", x, y, data[y * w + x]); + int x = w / 2; + int y = h / 2; + if (!pixel_empty(data[y * w + x])) { + // fprintf(stderr, "Non-empty pixel: [%u, %u] = %x\n", x, y, data[y * w + x]); return 0; } } - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - if (!pixelEmpty(data[y * w + x])) { - //fprintf(stderr, "Non-empty pixel: [%u, %u] = %x\n", x, y, data[y * w + x]); + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + if (!pixel_empty(data[y * w + x])) { + // fprintf(stderr, "Non-empty pixel: [%u, %u] = %x\n", x, y, data[y * w + x]); return 0; } } } - //fprintf(stderr, "All pixels are empty\n"); + // fprintf(stderr, "All pixels are empty\n"); return 1; } @@ -430,7 +431,7 @@ void render_image(Drawable d, int x, int y) Picture pict = XRenderCreatePicture(server.dsp, pixmap, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0); Picture pict_drawable = XRenderCreatePicture(server.dsp, d, XRenderFindVisualFormat(server.dsp, server.visual), 0, 0); - Picture pict_mask = XRenderCreatePicture(server.dsp, mask, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0); + Picture pict_mask = XRenderCreatePicture(server.dsp, mask, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0); XRenderComposite(server.dsp, PictOpOver, pict, pict_mask, pict_drawable, 0, 0, 0, 0, x, y, w, h); XRenderFreePicture(server.dsp, pict_mask); @@ -448,17 +449,23 @@ void draw_text(PangoLayout *layout, cairo_t *c, int posx, int posy, Color *color int i, j; for (i = -shadow_size; i <= shadow_size; i++) { for (j = -shadow_size; j <= shadow_size; j++) { - cairo_set_source_rgba(c, 0.0, 0.0, 0.0, 1.0 - (1.0 - shadow_edge_alpha) * sqrt((i*i + j*j)/(double)(shadow_size*shadow_size))); + cairo_set_source_rgba(c, + 0.0, + 0.0, + 0.0, + 1.0 - + (1.0 - shadow_edge_alpha) * + sqrt((i * i + j * j) / (double)(shadow_size * shadow_size))); pango_cairo_update_layout(c, layout); cairo_move_to(c, posx + i, posy + j); pango_cairo_show_layout(c, layout); } } } - cairo_set_source_rgba (c, color->rgb[0], color->rgb[1], color->rgb[2], color->alpha); - pango_cairo_update_layout (c, layout); - cairo_move_to (c, posx, posy); - pango_cairo_show_layout (c, layout); + cairo_set_source_rgba(c, color->rgb[0], color->rgb[1], color->rgb[2], color->alpha); + pango_cairo_update_layout(c, layout); + cairo_move_to(c, posx, posy); + pango_cairo_show_layout(c, layout); } Imlib_Image load_image(const char *path, int cached) @@ -477,8 +484,8 @@ Imlib_Image load_image(const char *path, int cached) pid_t pid = fork(); if (pid == 0) { // Child - GError* err = NULL; - RsvgHandle* svg = rsvg_handle_new_from_file(path, &err); + GError *err = NULL; + RsvgHandle *svg = rsvg_handle_new_from_file(path, &err); if (err != NULL) { fprintf(stderr, "Could not load svg image!: %s", err->message); @@ -519,8 +526,13 @@ Imlib_Image adjust_icon(Imlib_Image original, int alpha, int saturation, int bri imlib_context_set_image(copy); imlib_image_set_has_alpha(1); - DATA32* data = imlib_image_get_data(); - adjust_asb(data, imlib_image_get_width(), imlib_image_get_height(), alpha, (float)saturation/100, (float)brightness/100); + DATA32 *data = imlib_image_get_data(); + adjust_asb(data, + imlib_image_get_width(), + imlib_image_get_height(), + alpha, + (float)saturation / 100, + (float)brightness / 100); imlib_image_put_back_data(data); return copy; } @@ -530,25 +542,62 @@ void draw_rect(cairo_t *c, double x, double y, double w, double h, double r) if (r > 0.0) { double c1 = 0.55228475 * r; - cairo_move_to(c, x+r, y); - cairo_rel_line_to(c, w-2*r, 0); + cairo_move_to(c, x + r, y); + cairo_rel_line_to(c, w - 2 * r, 0); cairo_rel_curve_to(c, c1, 0.0, r, c1, r, r); - cairo_rel_line_to(c, 0, h-2*r); - cairo_rel_curve_to(c, 0.0, c1, c1-r, r, -r, r); - cairo_rel_line_to (c, -w +2*r, 0); - cairo_rel_curve_to (c, -c1, 0, -r, -c1, -r, -r); - cairo_rel_line_to (c, 0, -h + 2 * r); - cairo_rel_curve_to (c, 0, -c1, r - c1, -r, r, -r); - } - else + cairo_rel_line_to(c, 0, h - 2 * r); + cairo_rel_curve_to(c, 0.0, c1, c1 - r, r, -r, r); + cairo_rel_line_to(c, -w + 2 * r, 0); + cairo_rel_curve_to(c, -c1, 0, -r, -c1, -r, -r); + cairo_rel_line_to(c, 0, -h + 2 * r); + cairo_rel_curve_to(c, 0, -c1, r - c1, -r, r, -r); + } else cairo_rectangle(c, x, y, w, h); } - void clear_pixmap(Pixmap p, int x, int y, int w, int h) { Picture pict = XRenderCreatePicture(server.dsp, p, XRenderFindVisualFormat(server.dsp, server.visual), 0, 0); - XRenderColor col = { .red=0, .green=0, .blue=0, .alpha=0 }; + XRenderColor col; + col.red = col.green = col.blue = col.alpha = 0; XRenderFillRectangle(server.dsp, PictOpSrc, pict, &col, x, y, w, h); XRenderFreePicture(server.dsp, pict); } + +void get_text_size2(PangoFontDescription *font, + int *height_ink, + int *height, + int *width, + int panel_height, + int panel_width, + char *text, + int len, + PangoWrapMode wrap, + PangoEllipsizeMode ellipsis) +{ + PangoRectangle rect_ink, rect; + + Pixmap pmap = XCreatePixmap(server.dsp, server.root_win, panel_height, panel_width, server.depth); + + cairo_surface_t *cs = cairo_xlib_surface_create(server.dsp, pmap, server.visual, panel_height, panel_width); + cairo_t *c = cairo_create(cs); + + PangoLayout *layout = pango_cairo_create_layout(c); + pango_layout_set_width(layout, panel_width * PANGO_SCALE); + pango_layout_set_height(layout, panel_height * PANGO_SCALE); + pango_layout_set_wrap(layout, wrap); + pango_layout_set_ellipsize(layout, ellipsis); + pango_layout_set_font_description(layout, font); + pango_layout_set_text(layout, text, len); + + pango_layout_get_pixel_extents(layout, &rect_ink, &rect); + *height_ink = rect_ink.height; + *height = rect.height; + *width = rect.width; + // printf("dimension : %d - %d\n", rect_ink.height, rect.height); + + g_object_unref(layout); + cairo_destroy(c); + cairo_surface_destroy(cs); + XFreePixmap(server.dsp, pmap); +} diff --git a/src/util/common.h b/src/util/common.h index 955cb0d..ab05815 100644 --- a/src/util/common.h +++ b/src/util/common.h @@ -6,7 +6,7 @@ #ifndef COMMON_H #define COMMON_H -#define WM_CLASS_TINT "panel" +#define WM_CLASS_TINT "panel" #include #include @@ -18,71 +18,83 @@ #define BLUE "\033[1;34m" #define RESET "\033[0m" -/* -void fxfree(void** ptr){ - if (*ptr){ - free(*ptr); - *ptr=NULL; - } - } -FXint fxmalloc(void** ptr,unsigned long size){ - *ptr=NULL; - if (size!=0){ - if ((*ptr=malloc(size))==NULL) return FALSE; - } - return TRUE; - } -*/ - // mouse actions -enum { NONE=0, CLOSE, TOGGLE, ICONIFY, SHADE, TOGGLE_ICONIFY, MAXIMIZE_RESTORE, MAXIMIZE, RESTORE, DESKTOP_LEFT, DESKTOP_RIGHT, NEXT_TASK, PREV_TASK }; +typedef enum MouseAction { + NONE = 0, + CLOSE, + TOGGLE, + ICONIFY, + SHADE, + TOGGLE_ICONIFY, + MAXIMIZE_RESTORE, + MAXIMIZE, + RESTORE, + DESKTOP_LEFT, + DESKTOP_RIGHT, + NEXT_TASK, + PREV_TASK +} MouseAction; #define ALLDESKTOP 0xFFFFFFFF +// Copies a file to another path +void copy_file(const char *path_src, const char *path_dest); -// copy file source to file dest -void copy_file(const char *pathSrc, const char *pathDest); +// Parses lines with the format 'key = value' into key and value. +// Strips key and value. +// Values may contain spaces and the equal sign. +// Returns 1 if both key and value could be read, zero otherwise. +int parse_line(const char *line, char **key, char **value); -// extract key = value -int parse_line (const char *line, char **key, char **value); +void extract_values(const char *value, char **value1, char **value2, char **value3); -// execute a command by calling fork -void tint_exec(const char* command); +// Executes a command in a shell. +void tint_exec(const char *command); // Returns a copy of s in which "~" is expanded to the path to the user's home directory. -// The returned string must be freed by the caller. +// The caller takes ownership of the string. char *expand_tilde(char *s); // The opposite of expand_tilde: replaces the path to the user's home directory with "~". -// The returned string must be freed by the caller. +// The caller takes ownership of the string. char *contract_tilde(char *s); -// conversion -int hex_char_to_int (char c); -int hex_to_rgb (char *hex, int *r, int *g, int *b); -void get_color (char *hex, double *rgb); - -void extract_values (const char *value, char **value1, char **value2, char **value3); - -// adjust Alpha/Saturation/Brightness on an ARGB icon -// alpha from 0 to 100, satur from 0 to 1, bright from 0 to 1. -void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright); -void createHeuristicMask(DATA32* data, int w, int h); -int imageEmpty(DATA32* data, int w, int h); - -void render_image(Drawable d, int x, int y); - -void draw_text(PangoLayout *layout, cairo_t *c, int posx, int posy, Color *color, int font_shadow); +// Color +int hex_char_to_int(char c); +int hex_to_rgb(char *hex, int *r, int *g, int *b); +void get_color(char *hex, double *rgb); Imlib_Image load_image(const char *path, int cached); +// Adjusts the alpha/saturation/brightness on an ARGB image. +// Parameters: alpha from 0 to 100, satur from 0 to 1, bright from 0 to 1. +void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright); Imlib_Image adjust_icon(Imlib_Image original, int alpha, int saturation, int brightness); -// draw rounded rectangle +void create_heuristic_mask(DATA32 *data, int w, int h); + +int image_empty(DATA32 *data, int w, int h); + +// Renders the current Imlib image to a drawable. Wrapper around imlib_render_image_on_drawable. +void render_image(Drawable d, int x, int y); + +void get_text_size2(PangoFontDescription *font, + int *height_ink, + int *height, + int *width, + int panel_height, + int panel_with, + char *text, + int len, + PangoWrapMode wrap, + PangoEllipsizeMode ellipsis); + +void draw_text(PangoLayout *layout, cairo_t *c, int posx, int posy, Color *color, int font_shadow); + +// Draws a rounded rectangle void draw_rect(cairo_t *c, double x, double y, double w, double h, double r); -// clear pixmap with transparent color +// Clears the pixmap (with transparent color) void clear_pixmap(Pixmap p, int x, int y, int w, int h); #endif - diff --git a/src/util/strnatcmp.c b/src/util/strnatcmp.c index 74cbb61..e0a8e7e 100644 --- a/src/util/strnatcmp.c +++ b/src/util/strnatcmp.c @@ -20,7 +20,6 @@ 3. This notice may not be removed or altered from any source distribution. */ - /* partial change history: * * 2004-10-10 mbp: Lift out character type dependencies into macros. @@ -37,142 +36,129 @@ #include "strnatcmp.h" - /* These are defined as macros to make it easier to adapt this code to * different characters types or comparison functions. */ -static inline int -nat_isdigit(nat_char a) +static inline int nat_isdigit(nat_char a) { - return isdigit((unsigned char) a); + return isdigit((unsigned char)a); } - -static inline int -nat_isspace(nat_char a) +static inline int nat_isspace(nat_char a) { - return isspace((unsigned char) a); + return isspace((unsigned char)a); } - -static inline nat_char -nat_toupper(nat_char a) +static inline nat_char nat_toupper(nat_char a) { - return toupper((unsigned char) a); + return toupper((unsigned char)a); } - - -static int -compare_right(nat_char const *a, nat_char const *b) +static int compare_right(nat_char const *a, nat_char const *b) { - int bias = 0; - - /* The longest run of digits wins. That aside, the greatest - value wins, but we can't know that it will until we've scanned - both numbers to know that they have the same magnitude, so we - remember it in BIAS. */ - for (;; a++, b++) { - if (!nat_isdigit(*a) && !nat_isdigit(*b)) - return bias; - else if (!nat_isdigit(*a)) - return -1; - else if (!nat_isdigit(*b)) - return +1; - else if (*a < *b) { - if (!bias) - bias = -1; - } else if (*a > *b) { - if (!bias) - bias = +1; - } else if (!*a && !*b) - return bias; - } + int bias = 0; - return 0; + /* The longest run of digits wins. That aside, the greatest + * value wins, but we can't know that it will until we've scanned + * both numbers to know that they have the same magnitude, so we + * remember it in BIAS. */ + for (;; a++, b++) { + if (!nat_isdigit(*a) && !nat_isdigit(*b)) + return bias; + else if (!nat_isdigit(*a)) + return -1; + else if (!nat_isdigit(*b)) + return +1; + else if (*a < *b) { + if (!bias) + bias = -1; + } else if (*a > *b) { + if (!bias) + bias = +1; + } else if (!*a && !*b) + return bias; + } + + return 0; } - -static int -compare_left(nat_char const *a, nat_char const *b) +static int compare_left(nat_char const *a, nat_char const *b) { - /* Compare two left-aligned numbers: the first to have a - different value wins. */ - for (;; a++, b++) { - if (!nat_isdigit(*a) && !nat_isdigit(*b)) - return 0; - else if (!nat_isdigit(*a)) - return -1; - else if (!nat_isdigit(*b)) - return +1; - else if (*a < *b) - return -1; - else if (*a > *b) - return +1; - } - - return 0; -} + /* Compare two left-aligned numbers: the first to have a different value wins. */ + for (;; a++, b++) { + if (!nat_isdigit(*a) && !nat_isdigit(*b)) + return 0; + else if (!nat_isdigit(*a)) + return -1; + else if (!nat_isdigit(*b)) + return +1; + else if (*a < *b) + return -1; + else if (*a > *b) + return +1; + } + return 0; +} static int strnatcmp0(nat_char const *a, nat_char const *b, int fold_case) { - int ai, bi; - nat_char ca, cb; - int fractional, result; - - assert(a && b); - ai = bi = 0; - while (1) { - ca = a[ai]; cb = b[bi]; + int ai, bi; + nat_char ca, cb; + int fractional, result; - /* skip over leading spaces or zeros */ - while (nat_isspace(ca)) - ca = a[++ai]; + assert(a && b); + ai = bi = 0; + while (1) { + ca = a[ai]; + cb = b[bi]; - while (nat_isspace(cb)) - cb = b[++bi]; + /* skip over leading spaces or zeros */ + while (nat_isspace(ca)) + ca = a[++ai]; - /* process run of digits */ - if (nat_isdigit(ca) && nat_isdigit(cb)) { - fractional = (ca == '0' || cb == '0'); + while (nat_isspace(cb)) + cb = b[++bi]; - if (fractional) { - if ((result = compare_left(a+ai, b+bi)) != 0) - return result; - } else { - if ((result = compare_right(a+ai, b+bi)) != 0) - return result; - } - } + /* process run of digits */ + if (nat_isdigit(ca) && nat_isdigit(cb)) { + fractional = (ca == '0' || cb == '0'); - if (!ca && !cb) { - /* The strings compare the same. Perhaps the caller - will want to call strcmp to break the tie. */ - return 0; - } + if (fractional) { + if ((result = compare_left(a + ai, b + bi)) != 0) + return result; + } else { + if ((result = compare_right(a + ai, b + bi)) != 0) + return result; + } + } - if (fold_case) { - ca = nat_toupper(ca); - cb = nat_toupper(cb); - } - - if (ca < cb) - return -1; - else if (ca > cb) - return +1; + if (!ca && !cb) { + /* The strings compare the same. Perhaps the caller will want to call strcmp to break the tie. */ + return 0; + } - ++ai; ++bi; - } + if (fold_case) { + ca = nat_toupper(ca); + cb = nat_toupper(cb); + } + + if (ca < cb) + return -1; + else if (ca > cb) + return +1; + + ++ai; + ++bi; + } } - - -int strnatcmp(nat_char const *a, nat_char const *b) { - return strnatcmp0(a, b, 0); +int strnatcmp(nat_char const *a, nat_char const *b) +{ + return strnatcmp0(a, b, 0); } - /* Compare, recognizing numeric string and ignoring case. */ -int strnatcasecmp(nat_char const *a, nat_char const *b) { - return strnatcmp0(a, b, 1); +int strnatcasecmp(nat_char const *a, nat_char const *b) +{ + return strnatcmp0(a, b, 1); } diff --git a/src/util/strnatcmp.h b/src/util/strnatcmp.h index 51a3c4e..ab0eb61 100644 --- a/src/util/strnatcmp.h +++ b/src/util/strnatcmp.h @@ -20,7 +20,6 @@ 3. This notice may not be removed or altered from any source distribution. */ - /* CUSTOMIZATION SECTION * * You can change this typedef, but must then also change the inline diff --git a/src/util/timer.c b/src/util/timer.c index 691052e..afe986c 100644 --- a/src/util/timer.c +++ b/src/util/timer.c @@ -22,10 +22,9 @@ #include "timer.h" -GSList* timeout_list; +GSList *timeout_list; struct timeval next_timeout; -GHashTable* multi_timeouts; - +GHashTable *multi_timeouts; // functions and structs for multi timeouts typedef struct { @@ -34,32 +33,31 @@ typedef struct { } multi_timeout; typedef struct { - GSList* timeout_list; - timeout* parent_timeout; + GSList *timeout_list; + timeout *parent_timeout; } multi_timeout_handler; struct _timeout { int interval_msec; struct timespec timeout_expires; - void (*_callback)(void*); - void* arg; - multi_timeout* multi_timeout; + void (*_callback)(void *); + void *arg; + multi_timeout *multi_timeout; timeout **self; }; -void add_timeout_intern(int value_msec, int interval_msec, void(*_callback)(void*), void* arg, timeout* t); +void add_timeout_intern(int value_msec, int interval_msec, void (*_callback)(void *), void *arg, timeout *t); gint compare_timeouts(gconstpointer t1, gconstpointer t2); -int timespec_subtract(struct timespec* result, struct timespec* x, struct timespec* y); +int timespec_subtract(struct timespec *result, struct timespec *x, struct timespec *y); - -int align_with_existing_timeouts(timeout* t); -void create_multi_timeout(timeout* t1, timeout* t2); -void append_multi_timeout(timeout* t1, timeout* t2); -int calc_multi_timeout_interval(multi_timeout_handler* mth); -void update_multi_timeout_values(multi_timeout_handler* mth); -void callback_multi_timeout(void* mth); -void remove_from_multi_timeout(timeout* t); -void stop_multi_timeout(timeout* t); +int align_with_existing_timeouts(timeout *t); +void create_multi_timeout(timeout *t1, timeout *t2); +void append_multi_timeout(timeout *t1, timeout *t2); +int calc_multi_timeout_interval(multi_timeout_handler *mth); +void update_multi_timeout_values(multi_timeout_handler *mth); +void callback_multi_timeout(void *mth); +void remove_from_multi_timeout(timeout *t); +void stop_multi_timeout(timeout *t); void default_timeout() { @@ -70,7 +68,7 @@ void default_timeout() void cleanup_timeout() { while (timeout_list) { - timeout* t = timeout_list->data; + timeout *t = timeout_list->data; if (t->multi_timeout) stop_multi_timeout(t); if (t->self) @@ -84,28 +82,27 @@ void cleanup_timeout() } } -/** Implementation notes for timeouts: The timeouts are kept in a GSList sorted by their - * expiration time. - * That means that update_next_timeout() only have to consider the first timeout in the list, - * and callback_timeout_expired() only have to consider the timeouts as long as the expiration time - * is in the past to the current time. - * As time measurement we use clock_gettime(CLOCK_MONOTONIC) because this refers to a timer, which - * reference point lies somewhere in the past and cannot be changed, but just queried. - * If a single shot timer is installed it will be automatically deleted. I.e. the returned value - * of add_timeout will not be valid anymore. You do not need to call stop_timeout for these timeouts, - * however it's save to call it. -**/ +// Implementation notes for timeouts +// +// The timeouts are kept in a GSList sorted by their expiration time. +// That means that update_next_timeout() only have to consider the first timeout in the list, +// and callback_timeout_expired() only have to consider the timeouts as long as the expiration time +// is in the past to the current time. +// As time measurement we use clock_gettime(CLOCK_MONOTONIC) because this refers to a timer, which +// reference point lies somewhere in the past and cannot be changed, but just queried. +// If a single shot timer is installed it will be automatically deleted. I.e. the returned value +// of add_timeout will not be valid anymore. You do not need to call stop_timeout for these timeouts, +// however it's save to call it. -timeout* add_timeout(int value_msec, int interval_msec, void (*_callback)(void*), void* arg, timeout **self) +timeout *add_timeout(int value_msec, int interval_msec, void (*_callback)(void *), void *arg, timeout **self) { - timeout* t = calloc(1, sizeof(timeout)); + timeout *t = calloc(1, sizeof(timeout)); t->self = self; add_timeout_intern(value_msec, interval_msec, _callback, arg, t); return t; } - -void change_timeout(timeout **t, int value_msec, int interval_msec, void(*_callback)(), void* arg) +void change_timeout(timeout **t, int value_msec, int interval_msec, void (*_callback)(), void *arg) { if (!((timeout_list && g_slist_find(timeout_list, *t)) || (multi_timeouts && g_hash_table_lookup(multi_timeouts, *t)))) @@ -119,32 +116,28 @@ void change_timeout(timeout **t, int value_msec, int interval_msec, void(*_callb } } - void update_next_timeout() { if (timeout_list) { - timeout* t = timeout_list->data; + timeout *t = timeout_list->data; struct timespec cur_time; - struct timespec next_timeout2 = { .tv_sec=next_timeout.tv_sec, .tv_nsec=next_timeout.tv_usec*1000 }; + struct timespec next_timeout2 = {.tv_sec = next_timeout.tv_sec, .tv_nsec = next_timeout.tv_usec * 1000}; clock_gettime(CLOCK_MONOTONIC, &cur_time); if (timespec_subtract(&next_timeout2, &t->timeout_expires, &cur_time)) { next_timeout.tv_sec = 0; next_timeout.tv_usec = 0; - } - else { + } else { next_timeout.tv_sec = next_timeout2.tv_sec; - next_timeout.tv_usec = next_timeout2.tv_nsec/1000; + next_timeout.tv_usec = next_timeout2.tv_nsec / 1000; } - } - else + } else next_timeout.tv_sec = -1; } - void callback_timeout_expired() { struct timespec cur_time; - timeout* t; + timeout *t; while (timeout_list) { clock_gettime(CLOCK_MONOTONIC, &cur_time); t = timeout_list->data; @@ -170,14 +163,12 @@ void callback_timeout_expired() } } - -void stop_timeout(timeout* t) +void stop_timeout(timeout *t) { if (!t) return; // if not in the list, it was deleted in callback_timeout_expired - if ((timeout_list && g_slist_find(timeout_list, t)) || - (multi_timeouts && g_hash_table_lookup(multi_timeouts, t))) { + if ((timeout_list && g_slist_find(timeout_list, t)) || (multi_timeouts && g_hash_table_lookup(multi_timeouts, t))) { if (multi_timeouts && t->multi_timeout) remove_from_multi_timeout(t); if (timeout_list) @@ -188,8 +179,7 @@ void stop_timeout(timeout* t) } } - -void add_timeout_intern(int value_msec, int interval_msec, void(*_callback)(), void* arg, timeout *t) +void add_timeout_intern(int value_msec, int interval_msec, void (*_callback)(), void *arg, timeout *t) { t->interval_msec = interval_msec; t->_callback = _callback; @@ -205,15 +195,12 @@ void add_timeout_intern(int value_msec, int interval_msec, void(*_callback)(), v timeout_list = g_slist_insert_sorted(timeout_list, t, compare_timeouts); } - gint compare_timeouts(gconstpointer t1, gconstpointer t2) { - return compare_timespecs(&((timeout*)t1)->timeout_expires, - &((timeout*)t2)->timeout_expires); + return compare_timespecs(&((const timeout *)t1)->timeout_expires, &((const timeout *)t2)->timeout_expires); } - -gint compare_timespecs(const struct timespec* t1, const struct timespec* t2) +gint compare_timespecs(const struct timespec *t1, const struct timespec *t2) { if (t1->tv_sec < t2->tv_sec) return -1; @@ -224,12 +211,11 @@ gint compare_timespecs(const struct timespec* t1, const struct timespec* t2) return 0; else return 1; - } - else + } else return 1; } -int timespec_subtract(struct timespec* result, struct timespec* x, struct timespec* y) +int timespec_subtract(struct timespec *result, struct timespec *x, struct timespec *y) { /* Perform the carry for the later subtraction by updating y. */ if (x->tv_nsec < y->tv_nsec) { @@ -251,27 +237,25 @@ int timespec_subtract(struct timespec* result, struct timespec* x, struct timesp return x->tv_sec < y->tv_sec; } - struct timespec add_msec_to_timespec(struct timespec ts, int msec) { ts.tv_sec += msec / 1000; - ts.tv_nsec += (msec % 1000)*1000000; - if (ts.tv_nsec >= 1000000000) { // 10^9 + ts.tv_nsec += (msec % 1000) * 1000000; + if (ts.tv_nsec >= 1000000000) { // 10^9 ts.tv_sec++; ts.tv_nsec -= 1000000000; } return ts; } - int align_with_existing_timeouts(timeout *t) { - GSList* it = timeout_list; + GSList *it = timeout_list; while (it) { - timeout* t2 = it->data; + timeout *t2 = it->data; if (t2->interval_msec > 0) { if (t->interval_msec % t2->interval_msec == 0 || t2->interval_msec % t->interval_msec == 0) { - if (multi_timeouts == 0) + if (!multi_timeouts) multi_timeouts = g_hash_table_new(0, 0); if (!t->multi_timeout && !t2->multi_timeout) { // both timeouts can be aligned, but there is no multi timeout for them @@ -288,11 +272,10 @@ int align_with_existing_timeouts(timeout *t) return 0; } - -int calc_multi_timeout_interval(multi_timeout_handler* mth) +int calc_multi_timeout_interval(multi_timeout_handler *mth) { - GSList* it = mth->timeout_list; - timeout* t = it->data; + GSList *it = mth->timeout_list; + timeout *t = it->data; int min_interval = t->interval_msec; it = it->next; while (it) { @@ -304,13 +287,12 @@ int calc_multi_timeout_interval(multi_timeout_handler* mth) return min_interval; } - -void create_multi_timeout(timeout* t1, timeout* t2) +void create_multi_timeout(timeout *t1, timeout *t2) { - multi_timeout* mt1 = calloc(1, sizeof(multi_timeout)); - multi_timeout* mt2 = calloc(1, sizeof(multi_timeout)); - multi_timeout_handler* mth = calloc(1, sizeof(multi_timeout_handler)); - timeout* real_timeout = calloc(1, sizeof(timeout)); + multi_timeout *mt1 = calloc(1, sizeof(multi_timeout)); + multi_timeout *mt2 = calloc(1, sizeof(multi_timeout)); + multi_timeout_handler *mth = calloc(1, sizeof(multi_timeout_handler)); + timeout *real_timeout = calloc(1, sizeof(timeout)); mth->timeout_list = 0; mth->timeout_list = g_slist_prepend(mth->timeout_list, t1); @@ -325,7 +307,7 @@ void create_multi_timeout(timeout* t1, timeout* t2) t2->multi_timeout = mt2; // set real_timeout->multi_timeout to something, such that we see in add_timeout_intern that // it is already a multi_timeout (we never use it, except of checking for 0 ptr) - real_timeout->multi_timeout = (void*)real_timeout; + real_timeout->multi_timeout = (void *)real_timeout; timeout_list = g_slist_remove(timeout_list, t1); timeout_list = g_slist_remove(timeout_list, t2); @@ -333,18 +315,17 @@ void create_multi_timeout(timeout* t1, timeout* t2) update_multi_timeout_values(mth); } - -void append_multi_timeout(timeout* t1, timeout* t2) +void append_multi_timeout(timeout *t1, timeout *t2) { if (t2->multi_timeout) { // swap t1 and t2 such that t1 is the multi timeout - timeout* tmp = t2; + timeout *tmp = t2; t2 = t1; t1 = tmp; } - multi_timeout* mt = calloc(1, sizeof(multi_timeout)); - multi_timeout_handler* mth = g_hash_table_lookup(multi_timeouts, t1); + multi_timeout *mt = calloc(1, sizeof(multi_timeout)); + multi_timeout_handler *mth = g_hash_table_lookup(multi_timeouts, t1); mth->timeout_list = g_slist_prepend(mth->timeout_list, t2); g_hash_table_insert(multi_timeouts, t2, mth); @@ -354,8 +335,7 @@ void append_multi_timeout(timeout* t1, timeout* t2) update_multi_timeout_values(mth); } - -void update_multi_timeout_values(multi_timeout_handler* mth) +void update_multi_timeout_values(multi_timeout_handler *mth) { int interval = calc_multi_timeout_interval(mth); int next_timeout_msec = interval; @@ -363,14 +343,14 @@ void update_multi_timeout_values(multi_timeout_handler* mth) struct timespec cur_time; clock_gettime(CLOCK_MONOTONIC, &cur_time); - GSList* it = mth->timeout_list; + GSList *it = mth->timeout_list; struct timespec diff_time; while (it) { - timeout* t = it->data; + timeout *t = it->data; t->multi_timeout->count_to_expiration = t->interval_msec / interval; timespec_subtract(&diff_time, &t->timeout_expires, &cur_time); - int msec_to_expiration = diff_time.tv_sec*1000 + diff_time.tv_nsec/1000000; - int count_left = msec_to_expiration / interval + (msec_to_expiration%interval != 0); + int msec_to_expiration = diff_time.tv_sec * 1000 + diff_time.tv_nsec / 1000000; + int count_left = msec_to_expiration / interval + (msec_to_expiration % interval != 0); t->multi_timeout->current_count = t->multi_timeout->count_to_expiration - count_left; if (msec_to_expiration < next_timeout_msec) next_timeout_msec = msec_to_expiration; @@ -382,15 +362,14 @@ void update_multi_timeout_values(multi_timeout_handler* mth) add_timeout_intern(next_timeout_msec, interval, callback_multi_timeout, mth, mth->parent_timeout); } - -void callback_multi_timeout(void* arg) +void callback_multi_timeout(void *arg) { - multi_timeout_handler* mth = arg; + multi_timeout_handler *mth = arg; struct timespec cur_time; clock_gettime(CLOCK_MONOTONIC, &cur_time); - GSList* it = mth->timeout_list; + GSList *it = mth->timeout_list; while (it) { - timeout* t = it->data; + timeout *t = it->data; if (++t->multi_timeout->current_count >= t->multi_timeout->count_to_expiration) { t->_callback(t->arg); if (multi_timeouts && g_hash_table_lookup(multi_timeouts, t)) { @@ -405,10 +384,9 @@ void callback_multi_timeout(void* arg) } } - -void remove_from_multi_timeout(timeout* t) +void remove_from_multi_timeout(timeout *t) { - multi_timeout_handler* mth = g_hash_table_lookup(multi_timeouts, t); + multi_timeout_handler *mth = g_hash_table_lookup(multi_timeouts, t); g_hash_table_remove(multi_timeouts, t); mth->timeout_list = g_slist_remove(mth->timeout_list, t); @@ -416,7 +394,7 @@ void remove_from_multi_timeout(timeout* t) t->multi_timeout = 0; if (g_slist_length(mth->timeout_list) == 1) { - timeout* last_timeout = mth->timeout_list->data; + timeout *last_timeout = mth->timeout_list->data; mth->timeout_list = g_slist_remove(mth->timeout_list, last_timeout); free(last_timeout->multi_timeout); last_timeout->multi_timeout = 0; @@ -429,20 +407,22 @@ void remove_from_multi_timeout(timeout* t) struct timespec cur_time, diff_time; clock_gettime(CLOCK_MONOTONIC, &cur_time); timespec_subtract(&diff_time, &t->timeout_expires, &cur_time); - int msec_to_expiration = diff_time.tv_sec*1000 + diff_time.tv_nsec/1000000; - add_timeout_intern(msec_to_expiration, last_timeout->interval_msec, last_timeout->_callback, last_timeout->arg, last_timeout); - } - else + int msec_to_expiration = diff_time.tv_sec * 1000 + diff_time.tv_nsec / 1000000; + add_timeout_intern(msec_to_expiration, + last_timeout->interval_msec, + last_timeout->_callback, + last_timeout->arg, + last_timeout); + } else update_multi_timeout_values(mth); } - -void stop_multi_timeout(timeout* t) +void stop_multi_timeout(timeout *t) { - multi_timeout_handler* mth = g_hash_table_lookup(multi_timeouts, t); + multi_timeout_handler *mth = g_hash_table_lookup(multi_timeouts, t); g_hash_table_remove(multi_timeouts, mth->parent_timeout); while (mth->timeout_list) { - timeout* t1 = mth->timeout_list->data; + timeout *t1 = mth->timeout_list->data; mth->timeout_list = g_slist_remove(mth->timeout_list, t1); g_hash_table_remove(multi_timeouts, t1); free(t1->multi_timeout); @@ -452,6 +432,7 @@ void stop_multi_timeout(timeout* t) } double profiling_get_time_old_time = 0; + double profiling_get_time() { struct timespec cur_time; diff --git a/src/util/timer.h b/src/util/timer.h index 0172fe1..c347ed8 100644 --- a/src/util/timer.h +++ b/src/util/timer.h @@ -1,4 +1,4 @@ -/************************************************************************** +/************************************************************************* * * Copyright (C) 2009 Andreas.Fink (Andreas.Fink85@gmail.com) * @@ -15,7 +15,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **************************************************************************/ - #ifndef TIMER_H #define TIMER_H @@ -23,59 +22,51 @@ #include #include +// Single shot timers (i.e. timers with interval_msec == 0) are deleted automatically as soon as they expire, +// i.e. you do not need to stop them, however it is safe to call stop_timeout for these timers. +// You can pass the address of the variable storing the pointer to the timer as 'self' in add_timeout, in which +// case it is used to clear the pointer if the timer is destroyed automatically. This enforces the timeout pointers +// to be either valid or NULL. +// Periodic timeouts are aligned to each other whenever possible, i.e. one interval_msec is an +// integral multiple of the other. + extern struct timeval next_timeout; - - typedef struct _timeout timeout; - -// timer functions -/** - * Single shot timers (i.e. timers with interval_msec == 0) are deleted automatically as soon as they expire, - * i.e. you do not need to stop them, however it is safe to call stop_timeout for these timers. - * You can pass the address of the variable storing the pointer to the timer as 'self' in add_timeout, in which - * case it is used to clear the pointer if the timer is destroyed automatically. This enforces the timeout pointers - * to be either valid or NULL. - * Periodic timeouts are aligned to each other whenever possible, i.e. one interval_msec is an - * integral multiple of the other. -**/ - -/** Initializes default global data. **/ +// Initializes default global data. void default_timeout(); -/** Cleans up: stops all timers and frees memory. **/ +// Cleans up: stops all timers and frees memory. void cleanup_timeout(); -/** Installs a timer with the first timeout after 'value_msec' and then an optional periodic timeout every - * 'interval_msec' (set it to 0 to prevent periodic timeouts). - * '_callback' is the function called when the timer reaches the timeout. - * 'arg' is the argument passed to the callback function. - * 'self' is an optional pointer to a timeout* variable. If non-NULL, the variable is set to NULL when the timer - * is destroyed (with stop_timeout, cleanup_timeout or when the timer expires and it is single-shot). - * Returns a pointer to the timer, which is needed for stopping/changing it. -**/ -timeout* add_timeout(int value_msec, int interval_msec, void (*_callback)(void*), void* arg, timeout **self); +// Installs a timer with the first timeout after 'value_msec' and then an optional periodic timeout every +// 'interval_msec' (set it to 0 to prevent periodic timeouts). +// '_callback' is the function called when the timer reaches the timeout. +// 'arg' is the argument passed to the callback function. +// 'self' is an optional pointer to a timeout* variable. If non-NULL, the variable is set to NULL when the timer +// is destroyed (with stop_timeout, cleanup_timeout or when the timer expires and it is single-shot). +// Returns a pointer to the timer, which is needed for stopping/changing it. +timeout *add_timeout(int value_msec, int interval_msec, void (*_callback)(void *), void *arg, timeout **self); -/** Changes timer 't'. If it does not exist, a new timer is created, with self set to 't'. **/ -void change_timeout(timeout** t, int value_msec, int interval_msec, void (*_callback)(void*), void* arg); +// Changes timer 't'. If it does not exist, a new timer is created, with self set to 't'. +void change_timeout(timeout **t, int value_msec, int interval_msec, void (*_callback)(void *), void *arg); -/** stops the timeout 't' **/ -void stop_timeout(timeout* t); +// Stops the timer 't' +void stop_timeout(timeout *t); -/** update_next_timeout updates next_timeout to the value, when the next installed timeout will expire **/ +// Updates next_timeout to the value, when the next installed timeout will expire void update_next_timeout(); -/** Callback of all expired timeouts **/ +// Callback of all expired timeouts void callback_timeout_expired(); -/** Returns -1 if t1 < t2, 0 if t1 == t2, 1 if t1 > t2 **/ -gint compare_timespecs(const struct timespec* t1, const struct timespec* t2); +// Returns -1 if t1 < t2, 0 if t1 == t2, 1 if t1 > t2 +gint compare_timespecs(const struct timespec *t1, const struct timespec *t2); struct timespec add_msec_to_timespec(struct timespec ts, int msec); -/** Returns the time difference in seconds between the current time and the last time this function was called. - * At the first call returns zero. -**/ +// Returns the time difference in seconds between the current time and the last time this function was called. +// At the first call returns zero. double profiling_get_time(); #endif // TIMER_H diff --git a/src/util/uevent.c b/src/util/uevent.c index 47d0f09..d76c9fa 100644 --- a/src/util/uevent.c +++ b/src/util/uevent.c @@ -36,8 +36,9 @@ static int ueventfd = -1; static struct sockaddr_nl nls; static GList *notifiers = NULL; -static const char* has_prefix(const char *str, const char *end, const char *prefix, size_t prefixlen) { - if ((end-str) < prefixlen) +static const char *has_prefix(const char *str, const char *end, const char *prefix, size_t prefixlen) +{ + if ((end - str) < prefixlen) return NULL; if (!memcmp(str, prefix, prefixlen)) @@ -46,38 +47,40 @@ static const char* has_prefix(const char *str, const char *end, const char *pref return NULL; } -#define HAS_CONST_PREFIX(str,end,prefix) has_prefix((str),end,prefix,sizeof(prefix)-1) +#define HAS_CONST_PREFIX(str, end, prefix) has_prefix((str), end, prefix, sizeof(prefix) - 1) -static void uevent_param_free(gpointer data) { +static void uevent_param_free(gpointer data) +{ struct uevent_parameter *param = data; free(param->key); free(param->val); free(param); } -static void uevent_free(struct uevent *ev) { +static void uevent_free(struct uevent *ev) +{ free(ev->path); free(ev->subsystem); g_list_free_full(ev->params, uevent_param_free); free(ev); } -static struct uevent *uevent_new(char *buffer, int size) { - struct uevent *ev; - const char* s = buffer; - const char* end = s + size; +static struct uevent *uevent_new(char *buffer, int size) +{ gboolean first = TRUE; if (size == 0) return NULL; - ev = calloc(1, sizeof(*ev)); + struct uevent *ev = calloc(1, sizeof(*ev)); if (!ev) return NULL; /* ensure nul termination required by strlen() */ - buffer[size-1] = '\0'; + buffer[size - 1] = '\0'; + const char *s = buffer; + const char *end = s + size; for (; s < end; s += strlen(s) + 1) { if (first) { const char *p = strchr(s, '@'); @@ -87,10 +90,10 @@ static struct uevent *uevent_new(char *buffer, int size) { free(ev); return NULL; } - ev->path = strdup(p+1); + ev->path = strdup(p + 1); first = FALSE; } else { - const char* val; + const char *val; if ((val = HAS_CONST_PREFIX(s, end, "ACTION=")) != NULL) { if (!strcmp(val, "add")) ev->action = UEVENT_ADD; @@ -109,8 +112,8 @@ static struct uevent *uevent_new(char *buffer, int size) { if (val) { struct uevent_parameter *param = malloc(sizeof(*param)); if (param) { - param->key = strndup(s, val-s); - param->val = strdup(val+1); + param->key = strndup(s, val - s); + param->val = strdup(val + 1); ev->params = g_list_append(ev->params, param); } } @@ -121,11 +124,13 @@ static struct uevent *uevent_new(char *buffer, int size) { return ev; } -void uevent_register_notifier(struct uevent_notify *nb) { +void uevent_register_notifier(struct uevent_notify *nb) +{ notifiers = g_list_append(notifiers, nb); } -void uevent_unregister_notifier(struct uevent_notify *nb) { +void uevent_unregister_notifier(struct uevent_notify *nb) +{ GList *l = notifiers; while (l != NULL) { @@ -139,21 +144,19 @@ void uevent_unregister_notifier(struct uevent_notify *nb) { } } -void uevent_handler() { - struct uevent *ev; - char buf[512]; - GList *l; - +void uevent_handler() +{ if (ueventfd < 0) return; + char buf[512]; int len = recv(ueventfd, buf, sizeof(buf), MSG_DONTWAIT); if (len < 0) return; - ev = uevent_new(buf, len); + struct uevent *ev = uevent_new(buf, len); if (ev) { - for (l = notifiers; l != NULL; l = l->next) { + for (GList *l = notifiers; l; l = l->next) { struct uevent_notify *nb = l->data; if (!(ev->action & nb->action)) @@ -169,9 +172,10 @@ void uevent_handler() { } } -int uevent_init() { +int uevent_init() +{ /* Open hotplug event netlink socket */ - memset(&nls,0,sizeof(struct sockaddr_nl)); + memset(&nls, 0, sizeof(struct sockaddr_nl)); nls.nl_family = AF_NETLINK; nls.nl_pid = getpid(); nls.nl_groups = -1; @@ -194,7 +198,8 @@ int uevent_init() { return ueventfd; } -void uevent_cleanup() { +void uevent_cleanup() +{ if (ueventfd >= 0) close(ueventfd); } diff --git a/src/util/window.c b/src/util/window.c index ec61b6b..b415eb2 100644 --- a/src/util/window.c +++ b/src/util/window.c @@ -35,97 +35,88 @@ #include "panel.h" #include "taskbar.h" - - -void set_active (Window win) +void activate_window(Window win) { - send_event32 (win, server.atom._NET_ACTIVE_WINDOW, 2, CurrentTime, 0); + send_event32(win, server.atom._NET_ACTIVE_WINDOW, 2, CurrentTime, 0); } - -void set_desktop (int desktop) +void change_desktop(int desktop) { - send_event32 (server.root_win, server.atom._NET_CURRENT_DESKTOP, desktop, 0, 0); + send_event32(server.root_win, server.atom._NET_CURRENT_DESKTOP, desktop, 0, 0); } - -void windows_set_desktop (Window win, int desktop) +void change_window_desktop(Window win, int desktop) { - send_event32 (win, server.atom._NET_WM_DESKTOP, desktop, 2, 0); + send_event32(win, server.atom._NET_WM_DESKTOP, desktop, 2, 0); } - -void set_close (Window win) +void close_window(Window win) { - send_event32 (win, server.atom._NET_CLOSE_WINDOW, 0, 2, 0); + send_event32(win, server.atom._NET_CLOSE_WINDOW, 0, 2, 0); } - -void window_toggle_shade (Window win) +void toggle_window_shade(Window win) { - send_event32 (win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_SHADED, 0); + send_event32(win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_SHADED, 0); } - -void window_maximize_restore (Window win) +void toggle_window_maximized(Window win) { - send_event32 (win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_MAXIMIZED_VERT, 0); - send_event32 (win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_MAXIMIZED_HORZ, 0); + send_event32(win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_MAXIMIZED_VERT, 0); + send_event32(win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_MAXIMIZED_HORZ, 0); } - -int window_is_hidden (Window win) +gboolean window_is_hidden(Window win) { Window window; - Atom *at; - int count, i; + int count; - at = server_get_property (win, server.atom._NET_WM_STATE, XA_ATOM, &count); - for (i = 0; i < count; i++) { + Atom *at = server_get_property(win, server.atom._NET_WM_STATE, XA_ATOM, &count); + for (int i = 0; i < count; i++) { if (at[i] == server.atom._NET_WM_STATE_SKIP_TASKBAR) { XFree(at); - return 1; + return TRUE; } // do not add transient_for windows if the transient window is already in the taskbar - window=win; - while ( XGetTransientForHint(server.dsp, window, &window) ) { - if ( task_get_tasks(window) ) { + window = win; + while (XGetTransientForHint(server.dsp, window, &window)) { + if (task_get_tasks(window)) { XFree(at); - return 1; + return TRUE; } } } XFree(at); - at = server_get_property (win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, &count); - for (i = 0; i < count; i++) { - if (at[i] == server.atom._NET_WM_WINDOW_TYPE_DOCK || at[i] == server.atom._NET_WM_WINDOW_TYPE_DESKTOP || at[i] == server.atom._NET_WM_WINDOW_TYPE_TOOLBAR || at[i] == server.atom._NET_WM_WINDOW_TYPE_MENU || at[i] == server.atom._NET_WM_WINDOW_TYPE_SPLASH) { + at = server_get_property(win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, &count); + for (int i = 0; i < count; i++) { + if (at[i] == server.atom._NET_WM_WINDOW_TYPE_DOCK || at[i] == server.atom._NET_WM_WINDOW_TYPE_DESKTOP || + at[i] == server.atom._NET_WM_WINDOW_TYPE_TOOLBAR || at[i] == server.atom._NET_WM_WINDOW_TYPE_MENU || + at[i] == server.atom._NET_WM_WINDOW_TYPE_SPLASH) { XFree(at); - return 1; + return TRUE; } } XFree(at); - for (i=0 ; i < nb_panel ; i++) { - if (panel1[i].main_win == win) { - return 1; + for (int i = 0; i < num_panels; i++) { + if (panels[i].main_win == win) { + return TRUE; } } // specification // Windows with neither _NET_WM_WINDOW_TYPE nor WM_TRANSIENT_FOR set // MUST be taken as top-level window. - return 0; + return FALSE; } - -int window_get_desktop (Window win) +int get_window_desktop(Window win) { return get_property32(win, server.atom._NET_WM_DESKTOP, XA_CARDINAL); } - -int window_get_monitor (Window win) +int get_window_monitor(Window win) { int i, x, y; Window src; @@ -136,14 +127,12 @@ int window_get_monitor (Window win) int match_bottom = 0; // There is an ambiguity when a window is right on the edge between screens. // In that case, prefer the monitor which is on the right and bottom of the window's top-left corner. - for (i = 0; i < server.nb_monitor; i++) { + for (i = 0; i < server.num_monitors; i++) { if (x >= server.monitor[i].x && x <= (server.monitor[i].x + server.monitor[i].width)) if (y >= server.monitor[i].y && y <= (server.monitor[i].y + server.monitor[i].height)) { int current_right = x < (server.monitor[i].x + server.monitor[i].width); int current_bottom = y < (server.monitor[i].y + server.monitor[i].height); - if (best_match < 0 || - (!match_right && current_right) || - (!match_bottom && current_bottom)) { + if (best_match < 0 || (!match_right && current_right) || (!match_bottom && current_bottom)) { best_match = i; } } @@ -155,81 +144,73 @@ int window_get_monitor (Window win) return best_match; } -void window_get_coordinates (Window win, int *x, int *y, int *w, int *h) +void get_window_coordinates(Window win, int *x, int *y, int *w, int *h) { int dummy_int; unsigned ww, wh, bw, bh; - Window src; - XTranslateCoordinates(server.dsp, win, server.root_win, 0, 0, x, y, &src); + Window src; + XTranslateCoordinates(server.dsp, win, server.root_win, 0, 0, x, y, &src); XGetGeometry(server.dsp, win, &src, &dummy_int, &dummy_int, &ww, &wh, &bw, &bh); *w = ww + bw; *h = wh + bh; } -int window_is_iconified (Window win) +gboolean window_is_iconified(Window win) { // EWMH specification : minimization of windows use _NET_WM_STATE_HIDDEN. // WM_STATE is not accurate for shaded window and in multi_desktop mode. - Atom *at; - int count, i; - at = server_get_property (win, server.atom._NET_WM_STATE, XA_ATOM, &count); - for (i = 0; i < count; i++) { + int count; + Atom *at = server_get_property(win, server.atom._NET_WM_STATE, XA_ATOM, &count); + for (int i = 0; i < count; i++) { if (at[i] == server.atom._NET_WM_STATE_HIDDEN) { XFree(at); - return 1; + return TRUE; } } XFree(at); - return 0; + return FALSE; } - -int window_is_urgent (Window win) +gboolean window_is_urgent(Window win) { - Atom *at; - int count, i; + int count; - at = server_get_property (win, server.atom._NET_WM_STATE, XA_ATOM, &count); - for (i = 0; i < count; i++) { + Atom *at = server_get_property(win, server.atom._NET_WM_STATE, XA_ATOM, &count); + for (int i = 0; i < count; i++) { if (at[i] == server.atom._NET_WM_STATE_DEMANDS_ATTENTION) { XFree(at); - return 1; + return TRUE; } } XFree(at); - return 0; + return FALSE; } - -int window_is_skip_taskbar (Window win) +gboolean window_is_skip_taskbar(Window win) { - Atom *at; - int count, i; + int count; - at = server_get_property(win, server.atom._NET_WM_STATE, XA_ATOM, &count); - for (i=0; i num || w <= 0 || h <= 0) break; + if (pos > num || w <= 0 || h <= 0) + break; count++; } return count; } - -gulong *get_best_icon (gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size) +gulong *get_best_icon(gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size) { int width[icon_count], height[icon_count], pos, i, w, h; gulong *icon_data[icon_count]; @@ -286,7 +263,8 @@ gulong *get_best_icon (gulong *data, int icon_count, int num, int *iw, int *ih, while (i--) { w = data[pos++]; h = data[pos++]; - if (pos + w * h > num) break; + if (pos + w * h > num) + break; width[i] = w; height[i] = h; @@ -309,8 +287,8 @@ gulong *get_best_icon (gulong *data, int icon_count, int num, int *iw, int *ih, int highest = 0; for (i = 0; i < icon_count; i++) { if (width[i] > highest) { - icon_num = i; - highest = width[i]; + icon_num = i; + highest = width[i]; } } } @@ -319,44 +297,3 @@ gulong *get_best_icon (gulong *data, int icon_count, int num, int *iw, int *ih, *ih = height[icon_num]; return icon_data[icon_num]; } - - -void get_text_size2(PangoFontDescription *font, - int *height_ink, - int *height, - int *width, - int panel_height, - int panel_width, - char *text, - int len, - PangoWrapMode wrap, - PangoEllipsizeMode ellipsis) -{ - PangoRectangle rect_ink, rect; - - Pixmap pmap = XCreatePixmap (server.dsp, server.root_win, panel_height, panel_width, server.depth); - - cairo_surface_t *cs = cairo_xlib_surface_create (server.dsp, pmap, server.visual, panel_height, panel_width); - cairo_t *c = cairo_create (cs); - - PangoLayout *layout = pango_cairo_create_layout (c); - pango_layout_set_width(layout, panel_width * PANGO_SCALE); - pango_layout_set_height(layout, panel_height * PANGO_SCALE); - pango_layout_set_wrap(layout, wrap); - pango_layout_set_ellipsize(layout, ellipsis); - pango_layout_set_font_description (layout, font); - pango_layout_set_text (layout, text, len); - - pango_layout_get_pixel_extents(layout, &rect_ink, &rect); - *height_ink = rect_ink.height; - *height = rect.height; - *width = rect.width; - //printf("dimension : %d - %d\n", rect_ink.height, rect.height); - - g_object_unref (layout); - cairo_destroy (c); - cairo_surface_destroy (cs); - XFreePixmap (server.dsp, pmap); -} - - diff --git a/src/util/window.h b/src/util/window.h index 3e3c1d5..4841864 100644 --- a/src/util/window.h +++ b/src/util/window.h @@ -11,38 +11,30 @@ #include #include +#include +GSList *get_desktop_names(); +int get_current_desktop(); +void change_desktop(int desktop); -void set_active (Window win); -void set_desktop (int desktop); -void set_close (Window win); -int server_get_current_desktop (); -GSList *server_get_name_of_desktop (); -void window_get_coordinates (Window win, int *x, int *y, int *w, int *h); -int window_is_iconified (Window win); -int window_is_urgent (Window win); -int window_is_hidden (Window win); -int window_is_active (Window win); -int window_is_skip_taskbar (Window win); -int get_icon_count (gulong *data, int num); -gulong *get_best_icon (gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size); -void window_maximize_restore (Window win); -void window_toggle_shade (Window win); -int window_get_desktop (Window win); -void windows_set_desktop (Window win, int desktop); -int window_get_monitor (Window win); -Window window_get_active (); +Window get_active_window(); -void get_text_size2(PangoFontDescription *font, - int *height_ink, - int *height, - int *width, - int panel_height, - int panel_with, - char *text, - int len, - PangoWrapMode wrap, - PangoEllipsizeMode ellipsis); +gboolean window_is_iconified(Window win); +gboolean window_is_urgent(Window win); +gboolean window_is_hidden(Window win); +gboolean window_is_active(Window win); +gboolean window_is_skip_taskbar(Window win); +int get_window_desktop(Window win); +int get_window_monitor(Window win); +void activate_window(Window win); +void close_window(Window win); +void get_window_coordinates(Window win, int *x, int *y, int *w, int *h); +void toggle_window_maximized(Window win); +void toggle_window_shade(Window win); +void change_window_desktop(Window win, int desktop); + +int get_icon_count(gulong *data, int num); +gulong *get_best_icon(gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size); #endif diff --git a/tint2.files b/tint2.files index dd24d39..a2edc16 100644 --- a/tint2.files +++ b/tint2.files @@ -160,3 +160,4 @@ src/battery/linux.c src/battery/openbsd.c src/util/uevent.c src/util/uevent.h +.clang-format