all repos — tint2 @ d818e66097984cc6da29fc901fa96fd54bf5cbac

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

fixed bug with "task on all desktop" (issue 39), fixed memory corruption

git-svn-id: http://tint2.googlecode.com/svn/trunk@26 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
lorthiois@bbsoft.fr lorthiois@bbsoft.fr@121b4492-b84c-0410-8b4c-0d4edfb3f3cc
commit

d818e66097984cc6da29fc901fa96fd54bf5cbac

parent

067f07625e62a33932cd8e8480a1508043f71622

M ChangeLogChangeLog

@@ -1,3 +1,8 @@

+ +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)
M src/clock/clock.csrc/clock/clock.c

@@ -64,7 +64,7 @@ }

} -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;
M src/clock/clock.hsrc/clock/clock.h

@@ -32,7 +32,7 @@

// 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
M src/panel.csrc/panel.c

@@ -35,7 +35,8 @@ if (!panel.area.pix.pmap)

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);
M src/server.csrc/server.c

@@ -135,12 +135,6 @@ else return 0;

} -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;
M src/server.hsrc/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();
M src/taskbar/task.csrc/taskbar/task.c

@@ -39,7 +39,8 @@ {

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 @@

//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 @@ resize_tasks (tskbar);

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 @@ if (tsk->icon_data) {

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);
M src/taskbar/task.hsrc/taskbar/task.h

@@ -46,6 +46,7 @@ long *icon_data;

int icon_width; int icon_height; char *title; + int all_desktop; } Task;
M src/taskbar/taskbar.csrc/taskbar/taskbar.c

@@ -43,7 +43,8 @@ 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; + if (win == tsk->win) + return tsk; } } return 0;
M src/tint.csrc/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 @@ }

/* 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 @@ if (XGetTransientForHint(server.dsp, w1, &w2) != 0)

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 @@ //printf("atom root_win = %s, %s\n", XGetAtomName(server.dsp, at), tsk->title);

/* 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 @@ panel.refresh = 1;

} /* 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; }
M src/util/area.csrc/util/area.c

@@ -23,11 +23,10 @@ #include <X11/Xatom.h>

#include <stdio.h> #include <stdlib.h> #include <string.h> -#include <glib.h> +#include <pango/pangocairo.h> -#include "window.h" +#include "area.h" #include "server.h" -#include "area.h" void refresh (Area *a)

@@ -69,7 +68,7 @@ Pixmap *pmap = (active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap);

//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 @@ a->list = 0;

} } + +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); +} + +
M src/util/area.hsrc/util/area.h

@@ -30,10 +30,10 @@

#ifndef AREA_H #define AREA_H +#include <glib.h> #include <X11/Xlib.h> -#include <pango/pangocairo.h> - -#include "common.h" +#include <cairo.h> +#include <cairo-xlib.h> typedef struct

@@ -100,6 +100,9 @@

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
M src/util/window.csrc/util/window.c

@@ -24,7 +24,10 @@ #include <X11/Xatom.h>

#include <stdio.h> #include <stdlib.h> #include <string.h> + #include <Imlib2.h> +#include <cairo.h> +#include <cairo-xlib.h> #include "common.h" #include "window.h"

@@ -217,31 +220,12 @@ return icon_data[icon_num];

} -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);
M src/util/window.hsrc/util/window.h

@@ -9,8 +9,6 @@

#ifndef WINDOW_H #define WINDOW_H -#include <cairo.h> -#include <cairo-xlib.h> #include <pango/pangocairo.h>

@@ -36,9 +34,6 @@ int window_get_desktop (Window win);

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);