all repos — tint2 @ 8280d4dc87becdce3eead326ce0f9a8f9dce9503

fork of the tint2 desktop panel for my custom setup - only minimized windows across all desktops for the taskbar

*fix* only redraw task on state change, if not already drawn


git-svn-id: http://tint2.googlecode.com/svn/trunk@329 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
Andreas.Fink85 Andreas.Fink85@121b4492-b84c-0410-8b4c-0d4edfb3f3cc
commit

8280d4dc87becdce3eead326ce0f9a8f9dce9503

parent

739af137140ecccfa51f76aef036e7fe0204c713

3 files changed, 32 insertions(+), 10 deletions(-)

jump to
M src/taskbar/task.csrc/taskbar/task.c

@@ -90,17 +90,19 @@ memcpy(&new_tsk2->area, &panel1[i].g_task.area, sizeof(Area));

new_tsk2->area.parent = tskbar; new_tsk2->win = new_tsk.win; new_tsk2->desktop = new_tsk.desktop; - set_task_state(new_tsk2, new_tsk.current_state); if (new_tsk2->desktop == ALLDESKTOP && server.desktop != j) { // hide ALLDESKTOP task on non-current desktop new_tsk2->area.on_screen = 0; } new_tsk2->title = new_tsk.title; new_tsk2->area._get_tooltip_text = task_get_tooltip; - for (k=0; k<TASK_STATE_COUNT; ++k) + for (k=0; k<TASK_STATE_COUNT; ++k) { new_tsk2->icon[k] = new_tsk.icon[k]; + new_tsk2->state_pix[k] = 0; + } new_tsk2->icon_width = new_tsk.icon_width; new_tsk2->icon_height = new_tsk.icon_height; + set_task_state(new_tsk2, new_tsk.current_state); tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk2); tskbar->area.resize = 1; //printf("add_task panel %d, desktop %d, task %s\n", i, j, new_tsk2->title);

@@ -130,6 +132,7 @@ if (tsk->icon[k]) {

imlib_context_set_image(tsk->icon[k]); imlib_free_image(); tsk->icon[k] = 0; + if (tsk->state_pix[k]) XFreePixmap(server.dsp, tsk->state_pix[k]); } }

@@ -191,7 +194,7 @@ else title[0] = 0;

strcat(title, name); if (name) XFree (name); - tsk->area.redraw = 1; + set_task_redraw(tsk); if (tsk->title) free(tsk->title); tsk->title = title;

@@ -215,7 +218,7 @@ imlib_free_image();

tsk->icon[k] = 0; } } - tsk->area.redraw = 1; + set_task_redraw(tsk); data = server_get_property (tsk->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i); if (data) {

@@ -321,6 +324,7 @@

void draw_task (void *obj, cairo_t *c) { Task *tsk = obj; + tsk->state_pix[tsk->current_state] = tsk->area.pix; PangoLayout *layout; Color *config_text; int width=0, height;

@@ -466,8 +470,24 @@

void set_task_state(Task *tsk, int state) { - tsk->current_state = state; - tsk->area.bg = panel1[0].g_task.background[state]; + if (tsk->current_state != state) { + tsk->current_state = state; + tsk->area.bg = panel1[0].g_task.background[state]; + tsk->area.pix = tsk->state_pix[state]; + if (tsk->state_pix[state] == 0) + tsk->area.redraw = 1; + panel_refresh = 1; + } +} + + +void set_task_redraw(Task* tsk) { + int k; + for (k=0; k<TASK_STATE_COUNT; ++k) { + if (tsk->state_pix[k]) XFreePixmap(server.dsp, tsk->state_pix[k]); + tsk->state_pix[k] = 0; + } + tsk->area.pix = 0; tsk->area.redraw = 1; }
M src/taskbar/task.hsrc/taskbar/task.h

@@ -54,6 +54,7 @@ Window win;

int desktop; int current_state; Imlib_Image icon[TASK_STATE_COUNT]; + Pixmap state_pix[TASK_STATE_COUNT]; unsigned int icon_width; unsigned int icon_height; char *title;

@@ -70,6 +71,7 @@ void get_icon (Task *tsk);

void get_title(Task *tsk); void active_task(); void set_task_state(Task* tsk, int state); +void set_task_redraw(Task* tsk); Task *next_task (Task *tsk); Task *prev_task (Task *tsk);
M src/tint.csrc/tint.c

@@ -502,7 +502,7 @@ for (l0 = panel1[i].taskbar[j].area.list; l0 ; l0 = l0->next) {

tsk2 = l0->data; if (tsk->win == tsk2->win && tsk != tsk2) { tsk2->title = tsk->title; - tsk2->area.redraw = 1; + set_task_redraw(tsk2); } } }

@@ -521,7 +521,7 @@ }

} else if (at == server.atom.WM_STATE) { // Iconic state - int state = task_active == tsk ? TASK_ACTIVE : TASK_NORMAL; + int state = tsk->current_state; if (window_is_iconified(win)) state = TASK_ICONIFIED; GSList* task_list = task_get_tasks(win);

@@ -548,7 +548,7 @@ tsk2->icon_height = tsk->icon_height;

int k=0; for ( ; k<TASK_STATE_COUNT; ++k) tsk2->icon[k] = tsk->icon[k]; - tsk2->area.redraw = 1; + set_task_redraw(tsk2); } l0 = l0->next; }

@@ -630,7 +630,7 @@ GSList* task_list = task_get_tasks(win);

GSList* it = task_list; while (it) { Task *tsk = it->data; - tsk->current_state = TASK_ACTIVE; + set_task_state(tsk, TASK_ACTIVE); task_active = tsk; it = task_list->next; }