X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftaskbar%2Ftaskbar.c;h=6ea6b4d18ef260220dcb1005b37cd04b016b55d0;hb=21dcd195642692401f855ef07b239364b5ef0c1b;hp=b2c7f952e0cf5d2e2ed6cde31cf53480e4d663c2;hpb=0357305cec0f78ba4d4717467025ead6be25ce0c;p=chaz%2Ftint2 diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index b2c7f95..6ea6b4d 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -36,23 +36,44 @@ void init_taskbar() { - Panel *panel; - int i, j; + 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.posy = panel->area.pix.border.width + panel->area.paddingy; - panel->g_taskbar.height = panel->area.height - (2 * panel->g_taskbar.posy); + 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_foreground_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._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; @@ -63,11 +84,10 @@ void init_taskbar() 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) + if (!panel->g_task.maximum_width && panel_horizontal) 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_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); @@ -83,50 +103,60 @@ void init_taskbar() 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; - resize_taskbar(panel); + // add taskbar to the panel + panel->area.list = g_slist_append(panel->area.list, tskbar); + } } - } void cleanup_taskbar() { - Panel *panel; - int i, j; + Panel *panel; + Taskbar *tskbar; + int i, j; GSList *l0; Task *tsk; for (i=0 ; i < nb_panel ; i++) { panel = &panel1[i]; - if (!panel->taskbar) continue; for (j=0 ; j < panel->nb_desktop ; j++) { - l0 = panel->taskbar[j].area.list; + 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); - free_area (&panel->taskbar[j].area); + // remove taskbar from the panel + panel->area.list = g_slist_remove(panel->area.list, tskbar); } + } - free(panel->taskbar); - panel->taskbar = 0; + 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, j; + Task *tsk; + GSList *l0; + int i, j; - for (i=0 ; i < nb_panel ; i++) { + 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; @@ -134,28 +164,42 @@ Task *task_get_task (Window win) return tsk; } } - } - return 0; + } + return 0; } -void task_refresh_tasklist () +GSList* task_get_tasks(Window win) { - Window *win, active_win; - int num_results, i, j, k; - GSList *l0; - Task *tsk; + GSList* l = 0; + GSList* it; + Task* tsk; + int i, j; + for (i=0; inext) { + tsk = it->data; + if (win == tsk->win) + l = g_slist_prepend(l, tsk); + } + } + } + return l; +} - win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results); - if (!win) return; +void task_refresh_tasklist () +{ + Window *win; + int num_results, i, j, k; + GSList *l0; + Task *tsk; - // Remove any old and set active win - active_win = window_get_active (); - if (task_active) { - task_active->area.is_active = 0; - task_active = 0; - } + 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_task(); for (i=0 ; i < nb_panel ; i++) { for (j=0 ; j < panel1[i].nb_desktop ; j++) { @@ -164,115 +208,115 @@ void task_refresh_tasklist () 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 (tsk->win != win[k]) remove_task (tsk); + 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]); + // Add any new + for (i = 0; i < num_results; i++) + if (!task_get_task (win[i])) + add_task (win[i]); - XFree (win); + XFree (win); } -int resize_tasks (Taskbar *taskbar) +void resize_taskbar(void *obj) { - int ret, task_count, pixel_width, modulo_width=0; - int x, taskbar_width; - Task *tsk; - Panel *panel = (Panel*)taskbar->area.panel; - GSList *l; - - // 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; - } - //printf("monitor %d, resize_tasks %d %d\n", panel->monitor, task_count, pixel_width); - - 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 - 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; - if (modulo_width) { - tsk->area.width++; - modulo_width--; - } - - x += tsk->area.width + panel->g_taskbar.paddingx; - } - return ret; -} + Taskbar *taskbar = (Taskbar*)obj; + Panel *panel = (Panel*)taskbar->area.panel; + Task *tsk; + GSList *l; + int task_count, border_width; + + //printf("resize_taskbar : posx et width des taches\n"); + taskbar->area.redraw = 1; + + if (taskbar->area.is_active && taskbar->area.use_active) + border_width = taskbar->area.pix_active.border.width; + else + border_width = taskbar->area.pix.border.width; + + 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 * 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; + } + 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 + border_width + taskbar->area.paddingxlr; + for (l = taskbar->area.list; l ; l = l->next) { + tsk = l->data; + if (!tsk->area.on_screen) continue; + tsk->area.posx = x; + tsk->area.width = pixel_width; + if (modulo_width) { + tsk->area.width++; + modulo_width--; + } -// initialise taskbar posx and width -void resize_taskbar(void *p) -{ - Panel *panel = p; - int taskbar_width, modulo_width, taskbar_on_screen; - - if (panel_mode == MULTI_DESKTOP) taskbar_on_screen = panel->nb_desktop; - else taskbar_on_screen = 1; - - taskbar_width = panel->area.width - (2 * panel->area.paddingxlr) - (2 * panel->area.pix.border.width); - if (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, modulo=0, posx=0; - for (i=0 ; i < panel->nb_desktop ; 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]); - } + 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 * 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; + } + + 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 + border_width + taskbar->area.paddingxlr; + for (l = taskbar->area.list; l ; l = l->next) { + tsk = l->data; + if (!tsk->area.on_screen) continue; + tsk->area.posy = y; + tsk->area.height = pixel_height; + if (modulo_height) { + tsk->area.height++; + modulo_height--; + } + + y += tsk->area.height + panel->g_taskbar.paddingx; + } + } } +