X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftaskbar%2Ftaskbar.c;h=a1be3ec78236220ec049ec53f0ad2a4dd12df247;hb=9cb781048d0a1cf55f0044e2f9f65ac9a5a241e9;hp=fe2383c19086bfeeb7579758073296524113e0e5;hpb=280d1d6e2e2cf7eed76e1def50a4b9547094d185;p=chaz%2Ftint2 diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index fe2383c..a1be3ec 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -26,6 +26,7 @@ #include #include +#include "task.h" #include "taskbar.h" #include "server.h" #include "window.h" @@ -33,152 +34,283 @@ -Task *task_get_task (Window win) +void init_taskbar() { - Task *tsk; - GSList *l0; - int i, nb; - - nb = panel.nb_desktop * panel.nb_monitor; - for (i=0 ; i < nb ; i++) { - for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { - tsk = l0->data; - if (win == tsk->win) - return tsk; - } - } - return 0; + Panel *panel; + int i, j; + + for (i=0 ; i < nb_panel ; i++) { + panel = &panel1[i]; + + if (panel->taskbar) { + free(panel->taskbar); + panel->taskbar = 0; + } + + // taskbar + panel->g_taskbar._resize = resize_taskbar; + panel->g_taskbar.redraw = 1; + panel->g_taskbar.on_screen = 1; + if (panel_horizontal) { + panel->g_taskbar.posy = panel->area.pix.border.width + panel->area.paddingy; + panel->g_taskbar.height = panel->area.height - (2 * panel->g_taskbar.posy); + } + else { + panel->g_taskbar.posx = panel->area.pix.border.width + panel->area.paddingy; + panel->g_taskbar.width = panel->area.width - (2 * panel->g_taskbar.posx); + } + + // task + panel->g_task.area._draw_foreground = draw_task; + panel->g_task.area.use_active = 1; + panel->g_task.area.redraw = 1; + panel->g_task.area.on_screen = 1; + if (panel_horizontal) { + panel->g_task.area.posy = panel->g_taskbar.posy + panel->g_taskbar.pix.border.width + panel->g_taskbar.paddingy; + panel->g_task.area.height = panel->area.height - (2 * panel->g_task.area.posy); + } + else { + panel->g_task.area.posx = panel->g_taskbar.posx + panel->g_taskbar.pix.border.width + panel->g_taskbar.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; + } + + if (panel->g_task.area.pix.border.rounded > panel->g_task.area.height/2) { + panel->g_task.area.pix.border.rounded = panel->g_task.area.height/2; + panel->g_task.area.pix_active.border.rounded = panel->g_task.area.pix.border.rounded; + } + + // compute vertical position : text and icon + int height_ink, height; + get_text_size(panel->g_task.font_desc, &height_ink, &height, panel->area.height, "TAjpg", 5); + + if (!panel->g_task.maximum_width && panel_horizontal) + panel->g_task.maximum_width = server.monitor[panel->monitor].width; + + panel->g_task.text_posx = panel->g_task.area.pix.border.width + panel->g_task.area.paddingxlr; + panel->g_task.text_posy = (panel->g_task.area.height - height) / 2.0; + if (panel->g_task.icon) { + panel->g_task.icon_size1 = panel->g_task.area.height - (2 * panel->g_task.area.paddingy); + panel->g_task.text_posx += panel->g_task.icon_size1; + 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); + + Taskbar *tskbar; + panel->nb_desktop = server.nb_desktop; + panel->taskbar = calloc(panel->nb_desktop, sizeof(Taskbar)); + for (j=0 ; j < panel->nb_desktop ; j++) { + tskbar = &panel->taskbar[j]; + memcpy(&tskbar->area, &panel->g_taskbar, sizeof(Area)); + tskbar->desktop = j; + if (j == server.desktop && tskbar->area.use_active) + tskbar->area.is_active = 1; + + // add taskbar to the panel + panel->area.list = g_slist_append(panel->area.list, tskbar); + } + } } -void task_refresh_tasklist () +void cleanup_taskbar() { - Window *win, active_win; - int num_results, i, j, nb; - GSList *l0; - Task *tsk; - - win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results); + Panel *panel; + Taskbar *tskbar; + int i, j; + GSList *l0; + Task *tsk; + + for (i=0 ; i < nb_panel ; i++) { + panel = &panel1[i]; + + for (j=0 ; j < panel->nb_desktop ; j++) { + tskbar = &panel->taskbar[j]; + l0 = tskbar->area.list; + while (l0) { + tsk = l0->data; + l0 = l0->next; + // careful : remove_task change l0->next + remove_task (tsk); + } + free_area (&tskbar->area); - if (!win) return; + // remove taskbar from the panel + panel->area.list = g_slist_remove(panel->area.list, tskbar); + } + } - // Remove any old and set active win - active_win = window_get_active (); - if (panel.task_active) { - panel.task_active->area.is_active = 0; - panel.task_active = 0; + for (i=0 ; i < nb_panel ; i++) { + panel = &panel1[i]; + if (panel->taskbar) { + free(panel->taskbar); + panel->taskbar = 0; + } } +} - nb = panel.nb_desktop * panel.nb_monitor; - for (i=0 ; i < nb ; i++) { - l0 = panel.taskbar[i].area.list; - while (l0) { - tsk = l0->data; - l0 = l0->next; - if (tsk->win == active_win) { - tsk->area.is_active = 1; - panel.task_active = tsk; +Task *task_get_task (Window win) +{ + Task *tsk; + GSList *l0; + int i, j; + + for (i=0 ; i < nb_panel ; i++) { + for (j=0 ; j < panel1[i].nb_desktop ; j++) { + for (l0 = panel1[i].taskbar[j].area.list; l0 ; l0 = l0->next) { + tsk = l0->data; + if (win == tsk->win) + return tsk; } + } + } + return 0; +} - for (j = 0; j < num_results; j++) { - if (tsk->win == win[j]) break; - } - // careful : remove_task change l0->next - if (tsk->win != win[j]) remove_task (tsk); - } - } - // Add any new - for (i = 0; i < num_results; i++) - if (!task_get_task (win[i])) - add_task (win[i]); +void task_refresh_tasklist () +{ + Window *win, active_win; + int num_results, i, j, k; + GSList *l0; + Task *tsk; + + win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results); + if (!win) return; + + // Remove any old and set active win + active_win = window_get_active (); + if (task_active) { + task_active->area.is_active = 0; + task_active = 0; + } - XFree (win); -} + for (i=0 ; i < nb_panel ; i++) { + for (j=0 ; j < panel1[i].nb_desktop ; j++) { + l0 = panel1[i].taskbar[j].area.list; + while (l0) { + tsk = l0->data; + l0 = l0->next; + + if (tsk->win == active_win) { + tsk->area.is_active = 1; + task_active = tsk; + } + + for (k = 0; k < num_results; k++) { + if (tsk->win == win[k]) break; + } + // careful : remove_task change l0->next + if (k == num_results) remove_task (tsk); + } + } + } + // Add any new + for (i = 0; i < num_results; i++) + if (!task_get_task (win[i])) + add_task (win[i]); -int resize_tasks (Taskbar *taskbar) -{ - int ret, task_count, pixel_width, modulo_width=0; - int x, taskbar_width; - Task *tsk; - GSList *l; - - // new task width for 'desktop' - task_count = g_slist_length(taskbar->area.list); - if (!task_count) pixel_width = g_task.maximum_width; - else { - taskbar_width = taskbar->area.width - (2 * g_taskbar.pix.border.width) - ((task_count+1) * g_taskbar.paddingx); - - pixel_width = taskbar_width / task_count; - if (pixel_width > g_task.maximum_width) pixel_width = g_task.maximum_width; - else modulo_width = taskbar_width % task_count; - } - - if ((taskbar->task_width == pixel_width) && (taskbar->task_modulo == modulo_width)) { - ret = 0; - } - else { - ret = 1; - taskbar->task_width = pixel_width; - taskbar->task_modulo = modulo_width; - taskbar->text_width = pixel_width - g_task.text_posx - g_task.area.pix.border.width - g_task.area.paddingx; - } - - // change pos_x and width for all tasks - x = taskbar->area.posx + taskbar->area.pix.border.width + taskbar->area.paddingx; - for (l = taskbar->area.list; l ; l = l->next) { - tsk = l->data; - tsk->area.posx = x; - tsk->area.width = pixel_width; - if (modulo_width) { - tsk->area.width++; - modulo_width--; - } - - x += tsk->area.width + g_taskbar.paddingx; - } - return ret; + XFree (win); } -// initialise taskbar posx and width -void resize_taskbar() +void resize_taskbar(void *obj) { - int taskbar_width, modulo_width, taskbar_on_screen; - - if (panel.mode == MULTI_DESKTOP) taskbar_on_screen = panel.nb_desktop; - else taskbar_on_screen = panel.nb_monitor; - - taskbar_width = panel.area.width - (2 * panel.area.paddingx) - (2 * panel.area.pix.border.width); - if (panel.clock.time1_format) - taskbar_width -= (panel.clock.area.width + panel.area.paddingx); - taskbar_width = (taskbar_width - ((taskbar_on_screen-1) * panel.area.paddingx)) / taskbar_on_screen; - - if (taskbar_on_screen > 1) - modulo_width = (taskbar_width - ((taskbar_on_screen-1) * panel.area.paddingx)) % taskbar_on_screen; - else - modulo_width = 0; - - int i, nb, modulo=0, posx=0; - nb = panel.nb_desktop * panel.nb_monitor; - for (i=0 ; i < nb ; i++) { - if ((i % taskbar_on_screen) == 0) { - posx = panel.area.pix.border.width + panel.area.paddingx; - modulo = modulo_width; - } - else posx += taskbar_width + panel.area.paddingx; - - panel.taskbar[i].area.posx = posx; - panel.taskbar[i].area.width = taskbar_width; - if (modulo) { - panel.taskbar[i].area.width++; - modulo--; - } - - resize_tasks(&panel.taskbar[i]); - } + Taskbar *taskbar = (Taskbar*)obj; + Panel *panel = (Panel*)taskbar->area.panel; + Task *tsk; + GSList *l; + int task_count; + + //printf("resize_taskbar : posx et width des taches\n"); + + taskbar->area.redraw = 1; + + if (panel_horizontal) { + int pixel_width, modulo_width=0; + int x, taskbar_width; + + // new task width for 'desktop' + task_count = g_slist_length(taskbar->area.list); + if (!task_count) pixel_width = panel->g_task.maximum_width; + else { + taskbar_width = taskbar->area.width - (2 * panel->g_taskbar.pix.border.width) - (2 * panel->g_taskbar.paddingxlr); + if (task_count>1) taskbar_width -= ((task_count-1) * panel->g_taskbar.paddingx); + + pixel_width = taskbar_width / task_count; + if (pixel_width > panel->g_task.maximum_width) + pixel_width = panel->g_task.maximum_width; + else + modulo_width = taskbar_width % task_count; + } + + if ((taskbar->task_width == pixel_width) && (taskbar->task_modulo == modulo_width)) { + } + else { + taskbar->task_width = pixel_width; + taskbar->task_modulo = modulo_width; + taskbar->text_width = pixel_width - panel->g_task.text_posx - panel->g_task.area.pix.border.width - panel->g_task.area.paddingx; + } + + // change pos_x and width for all tasks + x = taskbar->area.posx + taskbar->area.pix.border.width + taskbar->area.paddingxlr; + for (l = taskbar->area.list; l ; l = l->next) { + tsk = l->data; + tsk->area.posx = x; + tsk->area.width = pixel_width; + tsk->area.redraw = 1; + if (modulo_width) { + tsk->area.width++; + modulo_width--; + } + + x += tsk->area.width + panel->g_taskbar.paddingx; + } + } + else { + int pixel_height, modulo_height=0; + int y, taskbar_height; + + // new task width for 'desktop' + task_count = g_slist_length(taskbar->area.list); + if (!task_count) pixel_height = panel->g_task.maximum_height; + else { + taskbar_height = taskbar->area.height - (2 * panel->g_taskbar.pix.border.width) - (2 * panel->g_taskbar.paddingxlr); + if (task_count>1) taskbar_height -= ((task_count-1) * panel->g_taskbar.paddingx); + + pixel_height = taskbar_height / task_count; + if (pixel_height > panel->g_task.maximum_height) + pixel_height = panel->g_task.maximum_height; + else + modulo_height = taskbar_height % task_count; + } + + if ((taskbar->task_width == pixel_height) && (taskbar->task_modulo == modulo_height)) { + } + else { + taskbar->task_width = pixel_height; + taskbar->task_modulo = modulo_height; + taskbar->text_width = taskbar->area.width - (2 * panel->g_taskbar.paddingy) - panel->g_task.text_posx - panel->g_task.area.pix.border.width - panel->g_task.area.paddingx; + } + + // change pos_y and height for all tasks + y = taskbar->area.posy + taskbar->area.pix.border.width + taskbar->area.paddingxlr; + for (l = taskbar->area.list; l ; l = l->next) { + tsk = l->data; + tsk->area.posy = y; + tsk->area.height = pixel_height; + tsk->area.redraw = 1; + if (modulo_height) { + tsk->area.height++; + modulo_height--; + } + + y += tsk->area.height + panel->g_taskbar.paddingx; + } + } } +