From 8976f35c5fba405658118c4b2470450b1a51ec28 Mon Sep 17 00:00:00 2001 From: Benoit Averty Date: Wed, 31 Aug 2016 16:55:33 +0200 Subject: [PATCH 1/3] Add behavior to hide an empty taskbar in multi_desktop mode --- src/panel.c | 3 +-- src/taskbar/taskbar.c | 56 ++++++++++++++++++++++++++----------------- src/taskbar/taskbar.h | 5 ++-- src/tint.c | 5 ++-- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/panel.c b/src/panel.c index 954f98a..3a72531 100644 --- a/src/panel.c +++ b/src/panel.c @@ -269,12 +269,11 @@ void init_panel() if (panel_autohide) autohide_trigger_hide(p); - - update_taskbar_visibility(p); } taskbar_refresh_tasklist(); reset_active_task(); + update_all_taskbars_visibility(); } void init_panel_size_and_position(Panel *panel) diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 6eddc01..678db23 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -430,18 +430,46 @@ gboolean resize_taskbar(void *obj) return FALSE; } +void update_one_taskbar_visibility(Taskbar *taskbar) +{ + //TODO handle hidden name + gboolean taskbar_non_empty = g_list_length(taskbar->area.children) > 1; + + if (taskbar->desktop == server.desktop) { + // Taskbar for current desktop is always shown + taskbar->area.on_screen = TRUE; + } + else if (taskbar_mode == MULTI_DESKTOP && taskbar_non_empty) { + // MULTI_DESKTOP : show non-empty taskbars + taskbar->area.on_screen = TRUE; + } + else { + taskbar->area.on_screen = FALSE; + } + + panel_refresh = TRUE; +} + +void update_all_taskbars_visibility() +{ + for (int i = 0; i < num_panels; i++) { + Panel *panel = &panels[i]; + for (int j = 0; j < panel->num_desktops; j++) { + update_one_taskbar_visibility(&panel->taskbar[j]); + } + } + panel_refresh = TRUE; +} + void set_taskbar_state(Taskbar *taskbar, TaskbarState state) { taskbar->area.bg = panels[0].g_taskbar.background[state]; if (taskbarname_enabled) { taskbar->bar_name.area.bg = panels[0].g_taskbar.background_name[state]; } - if (taskbar_mode != MULTI_DESKTOP) { - if (state == TASKBAR_NORMAL) - taskbar->area.on_screen = FALSE; - else - taskbar->area.on_screen = TRUE; - } + + update_one_taskbar_visibility(taskbar); + if (taskbar->area.on_screen) { schedule_redraw(&taskbar->area); if (taskbarname_enabled) { @@ -459,22 +487,6 @@ void set_taskbar_state(Taskbar *taskbar, TaskbarState state) panel_refresh = TRUE; } -void update_taskbar_visibility(void *p) -{ - Panel *panel = (Panel *)p; - - for (int j = 0; j < panel->num_desktops; j++) { - Taskbar *taskbar = &panel->taskbar[j]; - if (taskbar_mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) { - // SINGLE_DESKTOP and not current desktop - taskbar->area.on_screen = FALSE; - } else { - taskbar->area.on_screen = TRUE; - } - } - panel_refresh = TRUE; -} - #define NONTRIVIAL 2 gint compare_tasks_trivial(Task *a, Task *b, Taskbar *taskbar) { diff --git a/src/taskbar/taskbar.h b/src/taskbar/taskbar.h index 22e1bf9..92f71cb 100644 --- a/src/taskbar/taskbar.h +++ b/src/taskbar/taskbar.h @@ -79,10 +79,11 @@ Task *get_task(Window win); // However for windows shown on all desktops, there are multiple buttons, one for each taskbar. GPtrArray *get_task_buttons(Window win); +// Change state of a taskbar (ACTIVE or NORMAL) void set_taskbar_state(Taskbar *taskbar, TaskbarState state); -// Updates the visibility of each taskbar when the current desktop changes. -void update_taskbar_visibility(void *p); +// Updates the visibility of all taskbars +void update_all_taskbars_visibility(); // Sorts the taskbar(s) on which the window is present. void sort_taskbar_for_win(Window win); diff --git a/src/tint.c b/src/tint.c index bb79007..45c3ebd 100644 --- a/src/tint.c +++ b/src/tint.c @@ -1010,7 +1010,7 @@ void event_property_notify(XEvent *e) int old_desktop = server.desktop; server_get_number_of_desktops(); server.desktop = get_current_desktop(); - if (old_num_desktops != server.num_desktops) { + if (old_num_desktops != server.num_desktops) { // If number of desktop changed if (server.num_desktops <= server.desktop) { server.desktop = server.num_desktops - 1; } @@ -1019,11 +1019,11 @@ void event_property_notify(XEvent *e) for (int i = 0; i < num_panels; i++) { init_taskbar_panel(&panels[i]); set_panel_items_order(&panels[i]); - update_taskbar_visibility(&panels[i]); panels[i].area.resize_needed = 1; } taskbar_refresh_tasklist(); reset_active_task(); + update_all_taskbars_visibility(); panel_refresh = TRUE; } else if (old_desktop != server.desktop) { for (int i = 0; i < num_panels; i++) { @@ -1092,6 +1092,7 @@ void event_property_notify(XEvent *e) if (debug) fprintf(stderr, "%s %d: win = root, atom = _NET_CLIENT_LIST\n", __FUNCTION__, __LINE__); taskbar_refresh_tasklist(); + update_all_taskbars_visibility(); panel_refresh = TRUE; } // Change active From d765190e3d3bd6b13b313c4a2425bd8d4241e8aa Mon Sep 17 00:00:00 2001 From: Benoit Averty Date: Sun, 4 Sep 2016 15:33:33 +0200 Subject: [PATCH 2/3] Add behavior to hide an empty taskbar in multi_desktop mode: fix TODO and fix panel resize --- src/panel.c | 10 ++++++++-- src/taskbar/taskbar.c | 33 +++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/panel.c b/src/panel.c index 3a72531..7be38df 100644 --- a/src/panel.c +++ b/src/panel.c @@ -394,7 +394,11 @@ gboolean resize_panel(void *obj) int total_size = 0; int total_name_size = 0; int total_items = 0; + int visible_taskbars = 0; for (int i = 0; i < panel->num_desktops; i++) { + if (!panel->taskbar[i].area.on_screen) + continue; + visible_taskbars++; if (panel_horizontal) { total_size += panel->taskbar[i].area.width; } else { @@ -426,14 +430,16 @@ gboolean resize_panel(void *obj) if (total_items) { int actual_name_size; if (total_name_size <= total_size) { - actual_name_size = total_name_size / panel->num_desktops; + actual_name_size = total_name_size / visible_taskbars; } else { - actual_name_size = total_size / panel->num_desktops; + actual_name_size = total_size / visible_taskbars; } total_size -= total_name_size; for (int i = 0; i < panel->num_desktops; i++) { Taskbar *taskbar = &panel->taskbar[i]; + if (!taskbar->area.on_screen) + continue; int requested_size = (panel_horizontal ? left_right_border_width(&taskbar->area) : top_bottom_border_width(&taskbar->area)) + diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 678db23..5578a77 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -169,7 +169,7 @@ void init_taskbar_panel(void *p) if (panel_horizontal) { panel->g_taskbar.area.posy = top_border_width(&panel->area) + panel->area.paddingy; panel->g_taskbar.area.height = - panel->area.height - top_bottom_border_width(&panel->area) - 2 * panel->area.paddingy; + panel->area.height - top_bottom_border_width(&panel->area) - 2 * panel->area.paddingy; panel->g_taskbar.area_name.posy = panel->g_taskbar.area.posy; panel->g_taskbar.area_name.height = panel->g_taskbar.area.height; } else { @@ -430,24 +430,30 @@ gboolean resize_taskbar(void *obj) return FALSE; } +gboolean taskbar_is_empty(Taskbar *taskbar) +{ + GList *l = taskbar->area.children; + if (taskbarname_enabled) + l = l->next; + for (; l != NULL; l = l->next) { + if (((Task *)l->data)->area.on_screen) { + return TRUE; + } + } + return FALSE; +} + void update_one_taskbar_visibility(Taskbar *taskbar) { - //TODO handle hidden name - gboolean taskbar_non_empty = g_list_length(taskbar->area.children) > 1; - if (taskbar->desktop == server.desktop) { // Taskbar for current desktop is always shown - taskbar->area.on_screen = TRUE; - } - else if (taskbar_mode == MULTI_DESKTOP && taskbar_non_empty) { + show(&taskbar->area); + } else if (taskbar_mode == MULTI_DESKTOP && taskbar_is_empty(taskbar)) { // MULTI_DESKTOP : show non-empty taskbars - taskbar->area.on_screen = TRUE; + show(&taskbar->area); + } else { + hide(&taskbar->area); } - else { - taskbar->area.on_screen = FALSE; - } - - panel_refresh = TRUE; } void update_all_taskbars_visibility() @@ -458,7 +464,6 @@ void update_all_taskbars_visibility() update_one_taskbar_visibility(&panel->taskbar[j]); } } - panel_refresh = TRUE; } void set_taskbar_state(Taskbar *taskbar, TaskbarState state) From 863ef0259c44a51b13edefe2c15989eb93a355f9 Mon Sep 17 00:00:00 2001 From: Benoit Averty Date: Sun, 4 Sep 2016 15:55:51 +0200 Subject: [PATCH 3/3] Add config option for the hide_if_empty behaviour --- src/config.c | 2 ++ src/taskbar/taskbar.c | 7 +++++-- src/taskbar/taskbar.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 27ccb8c..a831ece 100644 --- a/src/config.c +++ b/src/config.c @@ -771,6 +771,8 @@ void add_entry(char *key, char *value) 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_hide_if_empty") == 0) { + hide_taskbar_if_empty = atoi(value); } else if (strcmp(key, "taskbar_always_show_all_desktop_tasks") == 0) { always_show_all_desktop_tasks = atoi(value); } else if (strcmp(key, "taskbar_sort_order") == 0) { diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 5578a77..ea3e996 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -41,6 +41,7 @@ gboolean taskbar_enabled; gboolean taskbar_distribute_size; gboolean hide_inactive_tasks; gboolean hide_task_diff_monitor; +gboolean hide_taskbar_if_empty; gboolean always_show_all_desktop_tasks; TaskbarSortMethod taskbar_sort_method; Alignment taskbar_alignment; @@ -74,6 +75,7 @@ void default_taskbar() taskbar_distribute_size = FALSE; hide_inactive_tasks = FALSE; hide_task_diff_monitor = FALSE; + hide_taskbar_if_empty = FALSE; always_show_all_desktop_tasks = FALSE; taskbar_sort_method = TASKBAR_NOSORT; taskbar_alignment = ALIGN_LEFT; @@ -430,7 +432,7 @@ gboolean resize_taskbar(void *obj) return FALSE; } -gboolean taskbar_is_empty(Taskbar *taskbar) +gboolean taskbar_is_not_empty(Taskbar *taskbar) { GList *l = taskbar->area.children; if (taskbarname_enabled) @@ -448,7 +450,8 @@ void update_one_taskbar_visibility(Taskbar *taskbar) if (taskbar->desktop == server.desktop) { // Taskbar for current desktop is always shown show(&taskbar->area); - } else if (taskbar_mode == MULTI_DESKTOP && taskbar_is_empty(taskbar)) { + } + else if (taskbar_mode == MULTI_DESKTOP && (taskbar_is_not_empty(taskbar) || hide_taskbar_if_empty == FALSE)) { // MULTI_DESKTOP : show non-empty taskbars show(&taskbar->area); } else { diff --git a/src/taskbar/taskbar.h b/src/taskbar/taskbar.h index 92f71cb..7138916 100644 --- a/src/taskbar/taskbar.h +++ b/src/taskbar/taskbar.h @@ -49,6 +49,7 @@ extern gboolean taskbar_enabled; extern gboolean taskbar_distribute_size; extern gboolean hide_inactive_tasks; extern gboolean hide_task_diff_monitor; +extern gboolean hide_taskbar_if_empty; extern gboolean always_show_all_desktop_tasks; extern TaskbarSortMethod taskbar_sort_method; extern Alignment taskbar_alignment;