From 280d1d6e2e2cf7eed76e1def50a4b9547094d185 Mon Sep 17 00:00:00 2001 From: Thierry Lorthiois Date: Sun, 18 Jan 2009 22:12:41 +0000 Subject: [PATCH] fixed bug with "task on all desktop" (issue 39), fixed memory corruption --- ChangeLog | 5 ++ src/clock/clock.c | 2 +- src/clock/clock.h | 2 +- src/panel.c | 6 ++- src/server.c | 6 --- src/server.h | 1 - src/taskbar/task.c | 52 +++++++++++++++------ src/taskbar/task.h | 1 + src/taskbar/taskbar.c | 3 +- src/tint.c | 105 ++++++++++++++++++++++++++++++++++++------ src/tint2 | Bin 47528 -> 47528 bytes src/util/area.c | 28 +++++++++-- src/util/area.h | 9 ++-- src/util/window.c | 26 ++--------- src/util/window.h | 5 -- 15 files changed, 177 insertions(+), 74 deletions(-) diff --git a/ChangeLog b/ChangeLog index c60fa67..e48dba3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +2009-01-18 +- update documentation for new config format +- fixed memory corruption +- fixed bug with "task on all desktop" (issue 39) + 2009-01-17 - fixed drawing of active task (with new layout) diff --git a/src/clock/clock.c b/src/clock/clock.c index 2ec86a4..5fb6cb1 100644 --- a/src/clock/clock.c +++ b/src/clock/clock.c @@ -64,7 +64,7 @@ void init_clock(Clock *clock, int panel_height) } -void draw_foreground_clock (void *obj, cairo_t *c) +void draw_foreground_clock (void *obj, cairo_t *c, int active) { Clock *clock = obj; PangoLayout *layout; diff --git a/src/clock/clock.h b/src/clock/clock.h index 742a224..b886d4a 100644 --- a/src/clock/clock.h +++ b/src/clock/clock.h @@ -32,7 +32,7 @@ typedef struct Clock { // initialize clock : y position, precision, ... void init_clock(Clock *clock, int panel_height); -void draw_foreground_clock (void *obj, cairo_t *c); +void draw_foreground_clock (void *obj, cairo_t *c, int active); #endif diff --git a/src/panel.c b/src/panel.c index 6e0b45c..71802e6 100644 --- a/src/panel.c +++ b/src/panel.c @@ -35,7 +35,8 @@ void visual_refresh () set_panel_background(); if (server.pmap) XFreePixmap (server.dsp, server.pmap); - server.pmap = server_create_pixmap (panel.area.width, panel.area.height); + server.pmap = XCreatePixmap (server.dsp, server.root_win, panel.area.width, panel.area.height, server.depth); + XCopyArea (server.dsp, panel.area.pix.pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0); // draw child object @@ -176,7 +177,8 @@ void set_panel_background() { Pixmap wall = get_root_pixmap(); - panel.area.pix.pmap = server_create_pixmap (panel.area.width, panel.area.height); + if (panel.area.pix.pmap) XFreePixmap (server.dsp, panel.area.pix.pmap); + panel.area.pix.pmap = XCreatePixmap (server.dsp, server.root_win, panel.area.width, panel.area.height, server.depth); // add layer of root pixmap XCopyArea (server.dsp, wall, panel.area.pix.pmap, server.gc, server.posx, server.posy, panel.area.width, panel.area.height, 0, 0); diff --git a/src/server.c b/src/server.c index aaa1863..6767f9d 100644 --- a/src/server.c +++ b/src/server.c @@ -135,12 +135,6 @@ void *server_get_property (Window win, Atom at, Atom type, int *num_results) } -Pixmap server_create_pixmap (int width, int height) -{ - return XCreatePixmap (server.dsp, server.root_win, width, height, server.depth); -} - - Pixmap get_root_pixmap () { Pixmap ret; diff --git a/src/server.h b/src/server.h index 435aefd..d042f70 100644 --- a/src/server.h +++ b/src/server.h @@ -97,7 +97,6 @@ void server_refresh_root_pixmap (); void server_refresh_main_pixmap (); void server_catch_error (Display *d, XErrorEvent *ev); void server_init_atoms (); -Pixmap server_create_pixmap (int width, int height); void get_monitors(); Pixmap get_root_pixmap(); diff --git a/src/taskbar/task.c b/src/taskbar/task.c index 2a7119a..9bfc703 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -39,7 +39,8 @@ void add_task (Window win) Task *new_tsk; int desktop, monitor; - if (!win || window_is_hidden (win) || win == window.main_win) return; + if (!win) return; + if (window_is_hidden (win) || win == window.main_win) return; new_tsk = malloc(sizeof(Task)); new_tsk->win = win; @@ -55,31 +56,46 @@ void add_task (Window win) //if (panel.mode == MULTI_MONITOR) monitor = window_get_monitor (new_tsk->win); //else monitor = 0; //printf("task %s : desktop %d, monitor %d\n", new_tsk->title, desktop, monitor); - XSelectInput (server.dsp, new_tsk->win, PropertyChangeMask|StructureNotifyMask); + Taskbar *tskbar; if (desktop == 0xFFFFFFFF) { - if (new_tsk->title) { - free (new_tsk->title); - new_tsk->title = 0; - } - if (new_tsk->icon_data) { - free (new_tsk->icon_data); - new_tsk->icon_data = 0; - } - free(new_tsk); - fprintf(stderr, "task on all desktop : ignored\n"); - return; + tskbar = &panel.taskbar[index(0, monitor)]; + new_tsk->all_desktop = 1; + } + else { + tskbar = &panel.taskbar[index(desktop, monitor)]; + new_tsk->all_desktop = 0; } //printf("add_task %d %s\n", index(desktop, monitor), new_tsk->title); - Taskbar *tskbar; - tskbar = &panel.taskbar[index(desktop, monitor)]; new_tsk->area.parent = tskbar; tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk); if (resize_tasks (tskbar)) set_redraw (&tskbar->area); + + if (desktop == 0xFFFFFFFF) { + // task on all desktop + int i; + Task *new_tsk2; + for (i = 1 ; i < server.nb_desktop ; i++) { + new_tsk2 = malloc(sizeof(Task)); + memcpy(new_tsk2, new_tsk, sizeof(Task)); + + new_tsk2->title = 0; + new_tsk2->icon_data = 0; + get_icon(new_tsk2); + get_title(new_tsk2); + + tskbar = &panel.taskbar[index(i, monitor)]; + new_tsk2->area.parent = tskbar; + tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk2); + + if (resize_tasks (tskbar)) + set_redraw (&tskbar->area); + } + } } @@ -94,6 +110,11 @@ void remove_task (Task *tsk) set_redraw (&tskbar->area); //printf("remove_task %d %s\n", index(tskbar->desktop, tskbar->monitor), tsk->title); + if (tsk == panel.task_active) + panel.task_active = 0; + if (tsk == panel.task_drag) + panel.task_drag = 0; + if (tsk->title) { free (tsk->title); tsk->title = 0; @@ -102,6 +123,7 @@ void remove_task (Task *tsk) free (tsk->icon_data); tsk->icon_data = 0; } + XFreePixmap (server.dsp, tsk->area.pix.pmap); XFreePixmap (server.dsp, tsk->area.pix_active.pmap); free(tsk); diff --git a/src/taskbar/task.h b/src/taskbar/task.h index ec1544d..2948906 100644 --- a/src/taskbar/task.h +++ b/src/taskbar/task.h @@ -46,6 +46,7 @@ typedef struct { int icon_width; int icon_height; char *title; + int all_desktop; } Task; diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 7118182..fe2383c 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -43,7 +43,8 @@ Task *task_get_task (Window win) 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; + if (win == tsk->win) + return tsk; } } return 0; diff --git a/src/tint.c b/src/tint.c index badfa7f..a85771d 100644 --- a/src/tint.c +++ b/src/tint.c @@ -190,10 +190,12 @@ suite: // drag and drop task if (panel.task_drag) { if (tskbar != panel.task_drag->area.parent && action == TOGGLE_ICONIFY) { - windows_set_desktop(panel.task_drag->win, tskbar->desktop); - if (tskbar->desktop == server.desktop) - set_active(panel.task_drag->win); - panel.task_drag = 0; + if (!panel.task_drag->all_desktop && panel.mode == MULTI_DESKTOP) { + windows_set_desktop(panel.task_drag->win, tskbar->desktop); + if (tskbar->desktop == server.desktop) + set_active(panel.task_drag->win); + panel.task_drag = 0; + } return; } else panel.task_drag = 0; @@ -249,7 +251,20 @@ void event_property_notify (Window win, Atom at) /* Change active */ else if (at == server.atom._NET_ACTIVE_WINDOW) { if (panel.task_active) { - panel.task_active->area.is_active = 0; + if (panel.task_active->all_desktop) { + Task *tsk; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { + tsk = l0->data; + tsk->area.is_active = 0; + } + } + } + else + panel.task_active->area.is_active = 0; panel.task_active = 0; } Window w1 = window_get_active (); @@ -260,7 +275,21 @@ void event_property_notify (Window win, Atom at) if (w2) t = task_get_task(w2); } if (t) { - t->area.is_active = 1; + if (t->all_desktop) { + Task *tsk; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { + tsk = l0->data; + if (tsk->win == t->win) + tsk->area.is_active = 1; + } + } + } + else + t->area.is_active = 1; panel.task_active = t; } panel.refresh = 1; @@ -280,17 +309,49 @@ void event_property_notify (Window win, Atom at) /* Window title changed */ if (at == server.atom._NET_WM_VISIBLE_NAME || at == server.atom._NET_WM_NAME || at == server.atom.WM_NAME) { - get_title(tsk); - tsk->area.redraw = 1; + if (tsk->all_desktop) { + Task *tsk2; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { + tsk2 = l0->data; + if (tsk->win == tsk2->win) { + get_title(tsk2); + tsk2->area.redraw = 1; + } + } + } + } + else { + get_title(tsk); + tsk->area.redraw = 1; + } panel.refresh = 1; } /* Iconic state */ else if (at == server.atom.WM_STATE) { if (window_is_iconified (win)) - if (panel.task_active == tsk) { - tsk->area.is_active = 0; - panel.task_active = 0; - } + if (panel.task_active) { + if (panel.task_active->win == tsk->win) { + if (tsk->all_desktop) { + Task *tsk2; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { + tsk2 = l0->data; + tsk2->area.is_active = 0; + } + } + } + else + panel.task_active->area.is_active = 0; + panel.task_active = 0; + } + } } /* Window icon changed */ else if (at == server.atom._NET_WM_ICON) { @@ -303,8 +364,24 @@ void event_property_notify (Window win, Atom at) } /* Window desktop changed */ else if (at == server.atom._NET_WM_DESKTOP) { - add_task (tsk->win); - remove_task (tsk); + Window win2 = tsk->win; + if (tsk->all_desktop) { + Task *tsk2; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; ) { + tsk2 = l0->data; + l0 = l0->next; + if (win2 == tsk2->win) + remove_task (tsk2); + } + } + } + else + remove_task (tsk); + add_task (win); panel.refresh = 1; } diff --git a/src/tint2 b/src/tint2 index 6bdf2d3e1c6d292f836a86f1c9969cd12e0e6b91..771467014466afe70644b38ad8686bcf2e9f92a6 100755 GIT binary patch delta 14241 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 svQ-BA;e*m&2adwy6&A)>>-uC)s4F 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 #include #include -#include +#include -#include "window.h" -#include "server.h" #include "area.h" +#include "server.h" void refresh (Area *a) @@ -69,7 +68,7 @@ void draw (Area *a, int active) //printf("begin draw area\n"); if (*pmap) XFreePixmap (server.dsp, *pmap); - *pmap = server_create_pixmap (a->width, a->height); + *pmap = XCreatePixmap (server.dsp, server.root_win, a->width, a->height, server.depth); // add layer of root pixmap XCopyArea (server.dsp, server.pmap, *pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0); @@ -186,3 +185,24 @@ void free_area (Area *a) } } + +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_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_rectangle(c, x, y, w, h); +} + + diff --git a/src/util/area.h b/src/util/area.h index 9a29ebd..0294353 100644 --- a/src/util/area.h +++ b/src/util/area.h @@ -30,10 +30,10 @@ #ifndef AREA_H #define AREA_H +#include #include -#include - -#include "common.h" +#include +#include typedef struct @@ -101,5 +101,8 @@ void remove_area (Area *a); void add_area (Area *a); void free_area (Area *a); +// draw rounded rectangle +void draw_rect(cairo_t *c, double x, double y, double w, double h, double r); + #endif diff --git a/src/util/window.c b/src/util/window.c index b265d6f..e60dc2c 100644 --- a/src/util/window.c +++ b/src/util/window.c @@ -24,7 +24,10 @@ #include #include #include + #include +#include +#include #include "common.h" #include "window.h" @@ -217,31 +220,12 @@ long *get_best_icon (long *data, int icon_count, int num, int *iw, int *ih, int } -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_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_rectangle(c, x, y, w, h); -} - - void get_text_size(PangoFontDescription *font, int *height_ink, int *height, int panel_height, char *text, int len) { PangoRectangle rect_ink, rect; - Pixmap pmap = server_create_pixmap (panel_height, panel_height); + Pixmap pmap = XCreatePixmap (server.dsp, server.root_win, panel_height, panel_height, server.depth); + cairo_surface_t *cs = cairo_xlib_surface_create (server.dsp, pmap, server.visual, panel_height, panel_height); cairo_t *c = cairo_create (cs); diff --git a/src/util/window.h b/src/util/window.h index fd596c0..8f3bba3 100644 --- a/src/util/window.h +++ b/src/util/window.h @@ -9,8 +9,6 @@ #ifndef WINDOW_H #define WINDOW_H -#include -#include #include @@ -37,9 +35,6 @@ void windows_set_desktop (Window win, int desktop); int window_get_monitor (Window win); Window window_get_active (); -// draw rounded rectangle -void draw_rect(cairo_t *c, double x, double y, double w, double h, double r); - void get_text_size(PangoFontDescription *font, int *height_ink, int *height, int panel_height, char *text, int len); -- 2.44.0