]> Dogcows Code - chaz/tint2/commitdiff
cleanup : Area posx/posy managed by layering engine (area.c)
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Tue, 21 Sep 2010 09:54:19 +0000 (09:54 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Tue, 21 Sep 2010 09:54:19 +0000 (09:54 +0000)
src/battery/battery.c
src/clock/clock.c
src/launcher/launcher.c
src/panel.c
src/systray/systraybar.c
src/util/area.c
src/util/area.h
src/util/window.c
src/util/window.h

index 086b6d0dd7180910f6780857026d87137e35438d..0514a51f27ff46b77e0d79a73664a74e090a109b 100644 (file)
@@ -80,7 +80,6 @@ void update_batterys(void* arg)
                else {
                        if (panel1[i].battery.area.on_screen == 0) {
                                panel1[i].battery.area.on_screen = 1;
-                               panel1[i].area.resize = 1;
                        }
                }
                if (panel1[i].battery.area.on_screen == 1) {
@@ -238,15 +237,14 @@ void init_battery_panel(void *p)
 
        get_text_size(bat1_font_desc, &bat_percentage_height_ink, &bat_percentage_height, panel->area.height, buf_bat_percentage, strlen(buf_bat_percentage));
        get_text_size(bat2_font_desc, &bat_time_height_ink, &bat_time_height, panel->area.height, buf_bat_time, strlen(buf_bat_time));
+       
 
        if (panel_horizontal) {
-               // panel horizonal => fixed height and posy
-               battery->area.posy = panel->area.bg->border.width + panel->area.paddingy;
+               // panel horizonal => fixed height
                battery->area.height = panel->area.height - (2 * battery->area.posy);
        }
        else {
-               // panel vertical => fixed width, height, posy and posx
-               battery->area.posx = panel->area.bg->border.width + panel->area.paddingy;
+               // panel vertical => fixed width, height
                battery->area.width = panel->area.width - (2 * panel->area.bg->border.width) - (2 * panel->area.paddingy);
        }
 
index cfd9aed5d22ad90ed63ff4b1a0bf20e621a55b84..55e5e456285b59b019dc8f9d4460a22c3e2c05e5 100644 (file)
@@ -142,7 +142,6 @@ void init_clock_panel(void *p)
 {
        Panel *panel =(Panel*)p;
        Clock *clock = &panel->clock;
-       int time_height, time_height_ink, date_height, date_height_ink;
 
        clock->area.parent = p;
        clock->area.panel = p;
@@ -156,33 +155,6 @@ void init_clock_panel(void *p)
                return;
 
        clock->area.on_screen = 1;
-       strftime(buf_time, sizeof(buf_time), time1_format, clock_gettime_for_tz(time1_timezone));
-       get_text_size(time1_font_desc, &time_height_ink, &time_height, panel->area.height, buf_time, strlen(buf_time));
-       if (time2_format) {
-               strftime(buf_date, sizeof(buf_date), time2_format, clock_gettime_for_tz(time2_timezone));
-               get_text_size(time2_font_desc, &date_height_ink, &date_height, panel->area.height, buf_date, strlen(buf_date));
-       }
-
-       if (panel_horizontal) {
-               // panel horizonal => fixed height and posy
-               clock->area.posy = panel->area.bg->border.width + panel->area.paddingy;
-               clock->area.height = panel->area.height - (2 * clock->area.posy);
-       }
-       else {
-               // panel vertical => fixed width, posx, height
-               clock->area.posx = panel->area.bg->border.width + panel->area.paddingy;
-               clock->area.width = panel->area.width - (2 * panel->area.bg->border.width) - (2 * panel->area.paddingy);
-               clock->area.height = time_height + date_height + (2 * clock->area.paddingxlr) + (2*clock->area.bg->border.width);
-       }
-
-       clock->time1_posy = (clock->area.height - time_height) / 2;
-       if (time2_format) {
-               strftime(buf_date, sizeof(buf_date), time2_format, clock_gettime_for_tz(time2_timezone));
-               get_text_size(time2_font_desc, &date_height_ink, &date_height, panel->area.height, buf_date, strlen(buf_date));
-
-               clock->time1_posy -= ((date_height_ink + 2) / 2);
-               clock->time2_posy = clock->time1_posy + time_height + 2 - (time_height - time_height_ink)/2 - (date_height - date_height_ink)/2;
-       }
 
        if (time_tooltip_format) {
                clock->area._get_tooltip_text = clock_get_tooltip;
@@ -228,53 +200,46 @@ void draw_clock (void *obj, cairo_t *c)
 int resize_clock (void *obj)
 {
        Clock *clock = obj;
-       PangoLayout *layout;
-       int time_width, date_width, ret = 0;
+       Panel *panel = clock->area.panel;
+       int time_height_ink, time_height, time_width, date_height_ink, date_height, date_width, ret = 0;
 
        clock->area.redraw = 1;
-       time_width = date_width = 0;
+       
        strftime(buf_time, sizeof(buf_time), time1_format, clock_gettime_for_tz(time1_timezone));
-       if (time2_format)
+       get_text_size2(time1_font_desc, &time_height_ink, &time_height, &time_width, panel->area.height, panel->area.width, buf_time, strlen(buf_time));
+       if (time2_format) {
                strftime(buf_date, sizeof(buf_date), time2_format, clock_gettime_for_tz(time2_timezone));
-
-       // vertical panel doen't adjust width
-       if (!panel_horizontal) return ret;
+               get_text_size2(time2_font_desc, &date_height_ink, &date_height, &date_width, panel->area.height, panel->area.width, buf_date, strlen(buf_date));
+       }
        
-       //printf("  resize_clock\n");
-       cairo_surface_t *cs;
-       cairo_t *c;
-       Pixmap pmap;
-       pmap = XCreatePixmap (server.dsp, server.root_win, clock->area.width, clock->area.height, server.depth);
-
-       cs = cairo_xlib_surface_create (server.dsp, pmap, server.visual, clock->area.width, clock->area.height);
-       c = cairo_create (cs);
-       layout = pango_cairo_create_layout (c);
-
-       // check width/height
-       pango_layout_set_font_description (layout, time1_font_desc);
-       pango_layout_set_indent(layout, 0);
-       pango_layout_set_text (layout, buf_time, strlen(buf_time));
-       pango_layout_get_pixel_size (layout, &time_width, NULL);
-       if (time2_format) {
-               pango_layout_set_font_description (layout, time2_font_desc);
-               pango_layout_set_indent(layout, 0);
-               pango_layout_set_text (layout, buf_date, strlen(buf_date));
-               pango_layout_get_pixel_size (layout, &date_width, NULL);
+       if (panel_horizontal) {
+               int new_size = (time_width > date_width) ? time_width : date_width;
+               new_size += (2*clock->area.paddingxlr) + (2*clock->area.bg->border.width);
+               if (new_size > clock->area.width || new_size < (clock->area.width-6)) {
+                       // we try to limit the number of resize
+                       clock->area.width = new_size + 1;
+                       clock->time1_posy = (clock->area.height - time_height) / 2;
+                       if (time2_format) {
+                               clock->time1_posy -= ((date_height_ink + 2) / 2);
+                               clock->time2_posy = clock->time1_posy + time_height + 2 - (time_height - time_height_ink)/2 - (date_height - date_height_ink)/2;
+                       }
+                       ret = 1;
+               }
        }
-
-       int new_width = (time_width > date_width) ? time_width : date_width;
-       new_width += (2*clock->area.paddingxlr) + (2*clock->area.bg->border.width);
-       if (new_width > clock->area.width || new_width < (clock->area.width-6)) {
-               // we try to limit the number of resize
-               clock->area.width = new_width + 1;
-               ret = 1;
-               panel_refresh = 1;
+       else {
+               int new_size = time_height + date_height + (2 * (clock->area.paddingxlr + clock->area.bg->border.width));
+               if (new_size != clock->area.height) {
+                       // we try to limit the number of resize
+                       clock->area.height =  new_size;
+                       clock->time1_posy = (clock->area.height - time_height) / 2;
+                       if (time2_format) {
+                               clock->time1_posy -= ((date_height_ink + 2) / 2);
+                               clock->time2_posy = clock->time1_posy + time_height + 2 - (time_height - time_height_ink)/2 - (date_height - date_height_ink)/2;
+                       }
+                       ret = 1;
+               }
        }
 
-       g_object_unref (layout);
-       cairo_destroy (c);
-       cairo_surface_destroy (cs);
-       XFreePixmap (server.dsp, pmap);
        return ret;
 }
 
index ea456546318be4fd5414353e4388fcae089fc6fa..630a74ecf0402136136ee977763f94086aadf37d 100644 (file)
@@ -76,16 +76,7 @@ void init_launcher_panel(void *p)
                return;
 
        launcher->area.on_screen = 1;
-       if (panel_horizontal) {
-               // panel horizonal => fixed height and posy
-               launcher->area.posy = panel->area.bg->border.width + panel->area.paddingy;
-               launcher->area.height = panel->area.height - (2 * launcher->area.posy);
-       }
-       else {
-               // panel vertical => fixed width, height, posy and posx
-               launcher->area.posx = panel->area.bg->border.width + panel->area.paddingxlr;
-               launcher->area.width = panel->area.width - (2 * panel->area.bg->border.width) - (2 * panel->area.paddingy);
-       }
+       panel_refresh = 1;
 
        fprintf(stderr, "Loading themes...\n");
        launcher_load_themes(launcher);
index 2d34c573dc5a2558995d9c83d9e81ba018839358..b618bf10a791c3eb3f2a063d304ced5986c59300 100644 (file)
@@ -221,7 +221,6 @@ void init_panel()
                        add_timeout(panel_autohide_hide_timeout, 0, autohide_hide, p);
        }
 
-       panel_refresh = 1;
        visible_object();
        task_refresh_tasklist();
        active_task();
@@ -497,6 +496,7 @@ void set_panel_items_order(Panel *p)
                if (panel_items_order[k] == 'C')
                        p->area.list = g_slist_append(p->area.list, &p->clock);
        }
+       init_rendering(&p->area, 0);
 }
 
 
index 0b92bb002d42896aca56a7fad8958eb4b6c26cef..2d13af46b457eb0c908cb7b01f8464530f1e1079 100644 (file)
@@ -97,14 +97,6 @@ void init_systray_panel(void *p)
 {
        Panel *panel =(Panel*)p;
 
-       if (panel_horizontal) {
-               systray.area.posy = panel->area.bg->border.width + panel->area.paddingy;
-               systray.area.height = panel->area.height - (2 * systray.area.posy);
-       }
-       else {
-               systray.area.posx = panel->area.bg->border.width + panel->area.paddingy;
-               systray.area.width = panel->area.width - (2 * panel->area.bg->border.width) - (2 * panel->area.paddingy);
-       }
        systray.area.parent = p;
        systray.area.panel = p;
        
@@ -442,7 +434,6 @@ gboolean add_icon(Window id)
                systray.list_icons = g_slist_append(systray.list_icons, traywin);
        else
                systray.list_icons = g_slist_insert_sorted(systray.list_icons, traywin, compare_traywindows);
-       systray.area.resize = 1;
        //printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons));
 
        // watch for the icon trying to resize itself!
@@ -458,8 +449,8 @@ gboolean add_icon(Window id)
        if (!traywin->hide && !panel->is_hidden)
                XMapRaised(server.dsp, traywin->id);
 
-       // changed in systray force resize on panel
-       panel->area.resize = 1;
+       // changed in systray
+       systray.area.resize = 1;
        panel_refresh = 1;
        return TRUE;
 }
@@ -471,7 +462,6 @@ void remove_icon(TrayWindow *traywin)
 
        // remove from our list
        systray.list_icons = g_slist_remove(systray.list_icons, traywin);
-       systray.area.resize = 1;
        //printf("remove_icon id %lx, %d\n", traywin->id);
 
        XSelectInput(server.dsp, traywin->tray_id, NoEventMask);
@@ -502,9 +492,8 @@ void remove_icon(TrayWindow *traywin)
                systray.area.on_screen = 0;
                systray.area.width = 0;
        }
-       // changed in systray force resize on panel
-       Panel *panel = systray.area.panel;
-       panel->area.resize = 1;
+       // changed in systray
+       systray.area.resize = 1;
        panel_refresh = 1;
 }
 
index 62417fe30242f7b3fd278b32f472e19136b450e9..0320bbb549a32e3bd0206be094f12c8d3ecd153c 100644 (file)
@@ -51,7 +51,9 @@
  * DRAWING AND LAYERING ENGINE :
  * Redrawing an object (like the clock) could come from an 'external event' (date change) 
  * or from a 'layering event' (position change).
- * The following 'drawing engine' take care of all 'layering event'.
+ * The following 'drawing engine' take care of :
+ * - posx/posy of all Area
+ * - 'layering event' propagation between object
  * 1) browse tree SIZE_BY_CONTENT
  *  - resize SIZE_BY_CONTENT node : children are resized before parent
  *     - if 'size' changed then 'resize = 1' on the parent
  *
  ************************************************************/
 
+void init_rendering(void *obj, int pos)
+{
+       Area *a = (Area*)obj;
+       
+       // initialize fixed position/size
+       GSList *l;
+       for (l = a->list; l ; l = l->next) {
+               Area *child = ((Area*)l->data);
+               if (panel_horizontal) {
+                       child->posy = pos + a->bg->border.width + a->paddingy;
+                       child->height = a->height - (2 * (a->bg->border.width + a->paddingy));
+                       init_rendering(child, child->posy);
+               }
+               else {
+                       child->posx = pos + a->bg->border.width + a->paddingy;
+                       child->width = a->width - (2 * (a->bg->border.width + a->paddingy));
+                       init_rendering(child, child->posx);
+               }
+       }
+}
+
+
 void rendering(void *obj)
 {
        Panel *panel = (Panel*)obj;
@@ -191,6 +215,99 @@ void refresh (Area *a)
 }
 
 
+int resize_by_layout(void *obj)
+{
+       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;
+
+       border_width = taskbar->area.bg->border.width;
+
+       if (panel_horizontal) {
+               int  pixel_width, modulo_width=0;
+               int  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.area.paddingxlr);
+                       if (task_count>1) taskbar_width -= ((task_count-1) * panel->g_taskbar.area.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.bg->border.width - panel->g_task.area.paddingx;
+
+               // change pos_x and width for all tasks
+               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;
+// TODO : move later (when posx is known)
+//                     long value[] = { panel->posx+x, panel->posy, pixel_width, panel->area.height };
+//                     XChangeProperty (server.dsp, tsk->win, server.atom._NET_WM_ICON_GEOMETRY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)value, 4);
+
+                       if (modulo_width) {
+                               tsk->area.width++;
+                               modulo_width--;
+                       }
+               }
+       }
+       else {
+               int  pixel_height, modulo_height=0;
+               int  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.area.paddingxlr);
+                       if (task_count>1) taskbar_height -= ((task_count-1) * panel->g_taskbar.area.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.area.paddingy) - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingx;
+
+               // change pos_y and height for all tasks
+               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;
+// TODO : move later (when posy is known)
+//                     long value[] = { panel->posx, panel->posy+y, panel->area.width, pixel_height };
+//                     XChangeProperty (server.dsp, tsk->win, server.atom._NET_WM_ICON_GEOMETRY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)value, 4);
+
+                       if (modulo_height) {
+                               tsk->area.height++;
+                               modulo_height--;
+                       }
+               }
+       }
+       return 0;
+}
+
+
 void set_redraw (Area *a)
 {
        a->redraw = 1;
index 16465b29daeb1d7d5e0f79051842e82b4cac39b8..a5d1434e856e818f14aa81aa1fea20216a810074 100644 (file)
@@ -89,13 +89,18 @@ typedef struct {
        const char* (*_get_tooltip_text)(void *obj);
 } Area;
 
+// on startup, initialize fixed pos/size
+void init_rendering(void *obj, int pos);
 
-void rendering(void *panel);
+void rendering(void *obj);
 void size_by_content (Area *a);
 void size_by_layout (Area *a, int pos, int level);
 // draw background and foreground
 void refresh (Area *a);
  
+// generic resize for SIZE_BY_LAYOUT objects
+int resize_by_layout(void *obj);
+
 // set 'redraw' on an area and childs
 void set_redraw (Area *a);
 
index 98e3075978f65ad2e322f3a1add96807e06f27f6..046623652a27ec402c407a3c393593f00dccbc39 100644 (file)
@@ -310,3 +310,29 @@ void get_text_size(PangoFontDescription *font, int *height_ink, int *height, int
 }
 
 
+void get_text_size2(PangoFontDescription *font, int *height_ink, int *height, int *width, int panel_height, int panel_with, char *text, int len)
+{
+       PangoRectangle rect_ink, rect;
+
+       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_with);
+       cairo_t *c = cairo_create (cs);
+
+       PangoLayout *layout = pango_cairo_create_layout (c);
+       pango_layout_set_font_description (layout, font);
+       pango_layout_set_text (layout, text, len);
+
+       pango_layout_get_pixel_extents(layout, &rect_ink, &rect);
+       *height_ink = rect_ink.height;
+       *height = rect.height;
+       *width = rect.width;
+       //printf("dimension : %d - %d\n", rect_ink.height, rect.height);
+
+       g_object_unref (layout);
+       cairo_destroy (c);
+       cairo_surface_destroy (cs);
+       XFreePixmap (server.dsp, pmap);
+}
+
+
index 074079eed9db6b3f301f7801e476301b67c92171..db6d3a99a7ab281f85e827c22195e3d730f07e15 100644 (file)
@@ -32,6 +32,7 @@ int window_get_monitor (Window win);
 Window window_get_active ();
 
 void get_text_size(PangoFontDescription *font, int *height_ink, int *height, int panel_height, char *text, int len);
+void get_text_size2(PangoFontDescription *font, int *height_ink, int *height, int *width, int panel_height, int panel_with, char *text, int len);
 
 
 #endif
This page took 0.032257 seconds and 4 git commands to generate.