X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftaskbar%2Ftaskbar.c;h=ce1338a341c2170493fca669a2a7fd7ad6361468;hb=bd3c2db488b1662fffd7cb5e6226613df2f7dec7;hp=7a2bb3f6c6d0a2d1e9b959709913818317eb8afc;hpb=ad0010a813450116f875d943f36cd6c93d84cb04;p=chaz%2Ftint2 diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 7a2bb3f..ce1338a 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,19 +34,122 @@ +void init_taskbar() +{ + 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.posy = panel->area.pix.border.width + panel->area.paddingy; + panel->g_taskbar.height = panel->area.height - (2 * panel->g_taskbar.posy); + panel->g_taskbar.redraw = 1; + panel->g_taskbar.on_screen = 1; + + // task + panel->g_task.area._draw_foreground = draw_task; + 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); + panel->g_task.area.use_active = 1; + panel->g_task.area.redraw = 1; + panel->g_task.area.on_screen = 1; + + 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->g_task.maximum_width = server.monitor[panel->monitor].width; + + // add task_icon_size + panel->g_task.text_posx = panel->g_task.area.paddingxlr + panel->g_task.area.pix.border.width; + 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; + + // add taskbar to the panel + panel->area.list = g_slist_append(panel->area.list, tskbar); + } + } +} + + +void cleanup_taskbar() +{ + 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); + + // remove taskbar from the panel + panel->area.list = g_slist_remove(panel->area.list, tskbar); + } + } + + for (i=0 ; i < nb_panel ; i++) { + panel = &panel1[i]; + if (panel->taskbar) { + free(panel->taskbar); + panel->taskbar = 0; + } + } +} + + Task *task_get_task (Window win) { 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; - } + 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; } @@ -54,7 +158,7 @@ Task *task_get_task (Window win) void task_refresh_tasklist () { Window *win, active_win; - int num_results, i, j, nb; + int num_results, i, j, k; GSList *l0; Task *tsk; @@ -64,29 +168,30 @@ void task_refresh_tasklist () // 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; + if (task_active) { + task_active->area.is_active = 0; + task_active = 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; + 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); } - - 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 @@ -98,33 +203,39 @@ void task_refresh_tasklist () } -int resize_tasks (Taskbar *taskbar) +void resize_taskbar(void *obj) { - int ret, task_count, pixel_width, modulo_width=0; - int x, taskbar_width; + Taskbar *taskbar = (Taskbar*)obj; + Panel *panel = (Panel*)taskbar->area.panel; + int task_count, pixel_width, modulo_width=0; + int x, taskbar_width; Task *tsk; GSList *l; +//printf("resize_taskbar : posx et width des taches\n"); + + taskbar->area.redraw = 1; + // new task width for 'desktop' task_count = g_slist_length(taskbar->area.list); - if (!task_count) pixel_width = g_task.maximum_width; + if (!task_count) pixel_width = panel->g_task.maximum_width; else { - taskbar_width = taskbar->area.width - (2 * g_taskbar.pix.border.width) - (2 * g_taskbar.paddingxlr); - if (task_count>1) taskbar_width -= ((task_count-1) * g_taskbar.paddingx); + 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 > g_task.maximum_width) pixel_width = g_task.maximum_width; - else modulo_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)) { - 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; + 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 @@ -133,53 +244,15 @@ int resize_tasks (Taskbar *taskbar) 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 + g_taskbar.paddingx; + x += tsk->area.width + panel->g_taskbar.paddingx; } - return ret; } -// initialise taskbar posx and width -void resize_taskbar() -{ - 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.paddingxlr) - (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.paddingxlr; - 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]); - } -} -