]> Dogcows Code - chaz/tint2/commitdiff
rendering engine : _on_change_layout() called when pos/size changed
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Sat, 25 Sep 2010 21:18:47 +0000 (21:18 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Sat, 25 Sep 2010 21:18:47 +0000 (21:18 +0000)
src/systray/systraybar.c
src/systray/systraybar.h
src/taskbar/task.c
src/taskbar/task.h
src/taskbar/taskbar.c
src/util/area.c
src/util/area.h

index 22fc50ba978a126ee7d328b001f7019d25cfeb72..23d2ab3821d1b58883ed1a0a380dd36a1bea2626 100644 (file)
@@ -61,6 +61,7 @@ void default_systray()
        systray.alpha = 100;
        systray.sort = 3;
        systray.area._draw_foreground = draw_systray;
+       systray.area._on_change_layout = on_change_systray;
        systray.area.size_mode = SIZE_BY_CONTENT;
        systray.area._resize = resize_systray;
 }
@@ -114,52 +115,6 @@ void init_systray_panel(void *p)
 
 void draw_systray(void *obj, cairo_t *c)
 {
-       // here, sysbar's position is defined. so we can calculate position of tray icon.
-       Systraybar *sysbar = obj;
-       Panel *panel = sysbar->area.panel;
-       int i, posx, posy;
-       int start = panel->area.bg->border.width + panel->area.paddingy + systray.area.bg->border.width + systray.area.paddingy +sysbar->marging/2;
-       if (panel_horizontal) {
-               posy = start;
-               posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr;
-       }
-       else {
-               posx = start;
-               posy = systray.area.posy + systray.area.bg->border.width + systray.area.paddingxlr;
-       }
-
-       TrayWindow *traywin;
-       GSList *l;
-       for (i=1, l = systray.list_icons; l ; i++, l = l->next) {
-               traywin = (TrayWindow*)l->data;
-               if (traywin->hide) continue;
-
-               traywin->y = posy;
-               traywin->x = posx;
-               traywin->width = sysbar->icon_size;
-               traywin->height = sysbar->icon_size;
-               if (panel_horizontal) {
-                       if (i % sysbar->icons_per_column)
-                               posy += sysbar->icon_size + sysbar->area.paddingx;
-                       else {
-                               posy = start;
-                               posx += (sysbar->icon_size + systray.area.paddingx);
-                       }
-               }
-               else {
-                       if (i % sysbar->icons_per_row)
-                               posx += sysbar->icon_size + systray.area.paddingx;
-                       else {
-                               posx = start;
-                               posy += (sysbar->icon_size + systray.area.paddingx);
-                       }
-               }
-
-               // position and size the icon window
-               XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, sysbar->icon_size, sysbar->icon_size);
-               XResizeWindow(server.dsp, traywin->tray_id, sysbar->icon_size, sysbar->icon_size);
-       }
-
        if (server.real_transparency || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) {
                if (render_background) XFreePixmap(server.dsp, render_background);
                render_background = XCreatePixmap(server.dsp, server.root_win, systray.area.width, systray.area.height, server.depth);
@@ -210,6 +165,56 @@ int resize_systray(void *obj)
 }
 
 
+void on_change_systray (void *obj)
+{
+       // here, sysbar's position is defined. so we can calculate position of tray icon.
+       Systraybar *sysbar = obj;
+       Panel *panel = sysbar->area.panel;
+       int i, posx, posy;
+       int start = panel->area.bg->border.width + panel->area.paddingy + systray.area.bg->border.width + systray.area.paddingy +sysbar->marging/2;
+       if (panel_horizontal) {
+               posy = start;
+               posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr;
+       }
+       else {
+               posx = start;
+               posy = systray.area.posy + systray.area.bg->border.width + systray.area.paddingxlr;
+       }
+
+       TrayWindow *traywin;
+       GSList *l;
+       for (i=1, l = systray.list_icons; l ; i++, l = l->next) {
+               traywin = (TrayWindow*)l->data;
+               if (traywin->hide) continue;
+
+               traywin->y = posy;
+               traywin->x = posx;
+               traywin->width = sysbar->icon_size;
+               traywin->height = sysbar->icon_size;
+               if (panel_horizontal) {
+                       if (i % sysbar->icons_per_column)
+                               posy += sysbar->icon_size + sysbar->area.paddingx;
+                       else {
+                               posy = start;
+                               posx += (sysbar->icon_size + systray.area.paddingx);
+                       }
+               }
+               else {
+                       if (i % sysbar->icons_per_row)
+                               posx += sysbar->icon_size + systray.area.paddingx;
+                       else {
+                               posx = start;
+                               posy += (sysbar->icon_size + systray.area.paddingx);
+                       }
+               }
+
+               // position and size the icon window
+               XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, sysbar->icon_size, sysbar->icon_size);
+               XResizeWindow(server.dsp, traywin->tray_id, sysbar->icon_size, sysbar->icon_size);
+       }
+}
+
+
 // ***********************************************
 // systray protocol
 
index dd5e08dd8c9b9c5793590c153fde86d47346a8ee..d3f5a7213ee1edb5a95c153cacc58b03f345833a 100644 (file)
@@ -65,6 +65,7 @@ void init_systray_panel(void *p);
 
 void draw_systray(void *obj, cairo_t *c);
 int  resize_systray(void *obj);
+void on_change_systray(void *obj);
 
 
 // systray protocol
index b132ae68e69e0a36666e59c0eb230c858af8af9f..7a5212e794fe9191e8b240c93a11d80f07f2bf99 100644 (file)
@@ -344,9 +344,6 @@ void draw_task (void *obj, cairo_t *c)
        Panel *panel = (Panel*)tsk->area.panel;
        //printf("draw_task %d %d\n", tsk->area.posx, tsk->area.posy);
 
-       long value[] = { panel->posx+tsk->area.posx, panel->posy+tsk->area.posy, tsk->area.width, tsk->area.height };
-       XChangeProperty (server.dsp, tsk->win, server.atom._NET_WM_ICON_GEOMETRY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)value, 4);
-
        if (panel->g_task.text) {
                /* Layout */
                layout = pango_cairo_create_layout (c);
@@ -389,6 +386,19 @@ void draw_task (void *obj, cairo_t *c)
 }
 
 
+void on_change_task (void *obj)
+{
+       Task *tsk = obj;
+       Panel *panel = (Panel*)tsk->area.panel;
+
+       long value[] = { panel->posx+tsk->area.posx, panel->posy+tsk->area.posy, tsk->area.width, tsk->area.height };
+       XChangeProperty (server.dsp, tsk->win, server.atom._NET_WM_ICON_GEOMETRY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)value, 4);
+       
+       // reset Pixmap when position/size changed
+       set_task_redraw(tsk);
+}
+
+
 Task *next_task(Task *tsk)
 {
        if (tsk == 0)
index 54695abe1096996d71daeaf638b74948b63de14b..3de591b62ca5858286c0e7bf6ea8dac80199b850 100644 (file)
@@ -69,6 +69,7 @@ Task *add_task (Window win);
 void remove_task (Task *tsk);
 
 void draw_task (void *obj, cairo_t *c);
+void on_change_task (void *obj);
 
 void get_icon (Task *tsk);
 void get_title(Task *tsk);
index 45388921c2b96392a951d5221e315171aa723528..75cbd4c646ba9a477edc27fd4e8f87428cfcd483 100644 (file)
@@ -125,6 +125,7 @@ void init_taskbar_panel(void *p)
        // task
        panel->g_task.area.size_mode = SIZE_BY_LAYOUT;
        panel->g_task.area._draw_foreground = draw_task;
+       panel->g_task.area._on_change_layout = on_change_task;
        panel->g_task.area.redraw = 1;
        panel->g_task.area.on_screen = 1;
        if ((panel->g_task.config_asb_mask & (1<<TASK_NORMAL)) == 0) {
@@ -296,7 +297,6 @@ int resize_taskbar(void *obj)
                for (l = taskbar->area.list; l ; l = l->next) {
                        tsk = l->data;
                        if (!tsk->area.on_screen) continue;
-                       //set_task_redraw(tsk);  // always redraw task, because the background could have changed (taskbar_active_id)
                        tsk->area.width = pixel_width;
 
                        if (modulo_width) {
@@ -331,7 +331,6 @@ int resize_taskbar(void *obj)
                for (l = taskbar->area.list; l ; l = l->next) {
                        tsk = l->data;
                        if (!tsk->area.on_screen) continue;
-                       //set_task_redraw(tsk);  // always redraw task, because the background could have changed (taskbar_active_id)
                        tsk->area.height = pixel_height;
 
                        if (modulo_height) {
index adec3c9ae55da5720aa28179e0be3f132788f9d8..dafd947773144ca34fb8846a385457a454159711 100644 (file)
@@ -116,6 +116,7 @@ void size_by_content (Area *a)
                size_by_content(l->data);
        
        // calculate area's size
+       a->on_changed = 0;
        if (a->resize && a->size_mode == SIZE_BY_CONTENT) {
                a->resize = 0;
 
@@ -123,8 +124,9 @@ void size_by_content (Area *a)
                        if (a->_resize(a)) {
                                // 'size' changed => 'resize = 1' on the parent and redraw object
                                ((Area*)a->parent)->resize = 1;
+                               a->on_changed = 1;
+                               a->redraw = 1;
                        }
-                       a->redraw = 1;
                }
        }
 }
@@ -144,6 +146,7 @@ void size_by_layout (Area *a, int pos, int level)
                if (a->_resize) {
                        if (a->_resize(a)) {
                                // if 'size' changed then 'resize = 1' on childs with SIZE_BY_LAYOUT
+                               a->on_changed = 1;
                                for (l = a->list; l ; l = l->next) {
                                        if (((Area*)l->data)->size_mode == SIZE_BY_LAYOUT)
                                                ((Area*)l->data)->resize = 1;
@@ -164,6 +167,7 @@ void size_by_layout (Area *a, int pos, int level)
                        if (pos != child->posx) {
                                // pos changed => redraw
                                child->posx = pos;
+                               child->on_changed = 1;
                                child->redraw = 1;
                        }
                }
@@ -171,6 +175,7 @@ void size_by_layout (Area *a, int pos, int level)
                        if (pos != child->posy) {
                                // pos changed => redraw
                                child->posy = pos;
+                               child->on_changed = 1;
                                child->redraw = 1;
                        }
                }
@@ -183,6 +188,9 @@ void size_by_layout (Area *a, int pos, int level)
                else
                        pos += child->height + a->paddingx;
        }
+       
+       if (a->on_changed && a->_on_change_layout)
+               a->_on_change_layout (a);
 }
 
 
index 7270419d9ee6b20bb63c6a3d2ab3d0351f4c221a..37e1dc42132f00db8df59e97f54f5d79ae4003df 100644 (file)
@@ -85,8 +85,9 @@ typedef struct {
        // update area's content and update size (width/heith). 
        // return '1' if size changed, '0' otherwise.
        int (*_resize)(void *obj);
-       void (*_add_child)(void *obj);
-       int (*_remove_child)(void *obj);
+       // after pos/size changed, the rendering engine will call _on_change_layout(Area*)
+       int on_changed;
+       void (*_on_change_layout)(void *obj);
        const char* (*_get_tooltip_text)(void *obj);
 } Area;
 
This page took 0.037829 seconds and 4 git commands to generate.