From 346e19cf9cc32f56221ae0e9dc25070cefedb5be Mon Sep 17 00:00:00 2001 From: Thierry Lorthiois Date: Fri, 27 Feb 2009 22:18:30 +0000 Subject: [PATCH] fixed issue 49 and some systray code (not yet) --- ChangeLog | 11 +++ src/Makefile | 15 ++++- src/config.c | 23 +++---- src/panel.c | 14 ++-- src/panel.h | 6 -- src/systray/systraybar.c | 140 +++++++++++++++++++++++++-------------- src/systray/systraybar.h | 6 +- src/tint.c | 14 ++-- src/tint2 | Bin 55664 -> 55652 bytes src/util/area.c | 38 +++++++---- src/util/area.h | 3 + 11 files changed, 169 insertions(+), 101 deletions(-) diff --git a/ChangeLog b/ChangeLog index 55a5ac9..54ddae1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-02-27 +- fixed issue 49 : better Makefile +- some systray code (doesn't work) +- cleanup code + +2009-02-25 +- fixed issue 48 : tint2 does't create config file on first start + +2009-02-14 +- fxed issue 45 : segfault without clock + 2009-02-13 - improved object oriented layout - tint2 looks good for me. if you see bugs, report it. diff --git a/src/Makefile b/src/Makefile index 73695a9..a08c75a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -23,9 +23,20 @@ endif $(PROGNAME): $(FILES) $(SYSTRAYOBJ) $(CC) $(CFLAGS) -I. -Iutil -Iclock -Itaskbar -Isystray -o $(PROGNAME) $(FILES) $(FLAGS) + +install: install-strip + +install-strip: + mkdir -p $(BINDIR) + mkdir -p $(XDG_CONFIG_DIR)/tint2 + mkdir -p $(MANDIR) + mkdir -p $(MANDIR)/man1 strip $(PROGNAME) + install $(PROGNAME) $(BINDIR) + cp -f ../tintrc01 $(XDG_CONFIG_DIR)/tint2/tint2rc + cp -f ../doc/man/tint2.1 $(MANDIR)/man1 -install: +install-nostrip: mkdir -p $(BINDIR) mkdir -p $(XDG_CONFIG_DIR)/tint2 mkdir -p $(MANDIR) @@ -41,4 +52,4 @@ uninstall: clean: rm -f $(PROGNAME) -.PHONY: clean uninstall install +.PHONY: clean uninstall install install-strip install-nostrip diff --git a/src/config.c b/src/config.c index 98938e4..8f88fdf 100644 --- a/src/config.c +++ b/src/config.c @@ -414,16 +414,16 @@ void add_entry (char *key, char *value) /* Systray */ else if (strcmp (key, "systray_padding") == 0) { extract_values(value, &value1, &value2, &value3); - panel_config->systray.area.paddingxlr = panel_config->systray.area.paddingx = atoi (value1); - if (value2) panel_config->systray.area.paddingy = atoi (value2); - if (value3) panel_config->systray.area.paddingx = atoi (value3); - panel_config->systray.area.visible = 1; + systray.area.paddingxlr = systray.area.paddingx = atoi (value1); + if (value2) systray.area.paddingy = atoi (value2); + if (value3) systray.area.paddingx = atoi (value3); + systray.area.visible = 1; } else if (strcmp (key, "systray_background_id") == 0) { int id = atoi (value); Area *a = g_slist_nth_data(list_back, id); - memcpy(&panel_config->systray.area.pix.back, &a->pix.back, sizeof(Color)); - memcpy(&panel_config->systray.area.pix.border, &a->pix.border, sizeof(Border)); + memcpy(&systray.area.pix.back, &a->pix.back, sizeof(Color)); + memcpy(&systray.area.pix.border, &a->pix.border, sizeof(Border)); } /* Mouse actions */ @@ -560,7 +560,7 @@ void config_finish () // alloc panels int i; if (panel_config->monitor >= 0) { - // just one monitor + // one monitor nb_panel = 1; panel1 = calloc(nb_panel, sizeof(Panel)); memcpy(panel1, panel_config, sizeof(Panel)); @@ -578,16 +578,9 @@ void config_finish () } // TODO: user can configure layout => ordered objects in panel.area.list - // clock and systray before taskbar because resize(clock) can resize others object + // clock and systray before taskbar because resize(clock) can resize others object ?? init_panel(); init_clock(); - // force the resize - for (i=0 ; i < nb_panel ; i++) { - panel1[i].area.resize = 1; - if (panel1[i].clock.area.visible) - resize_clock(&panel1[i].clock); - } - init_systray(); init_taskbar(); visible_object(); diff --git a/src/panel.c b/src/panel.c index d257cf9..c3c5803 100644 --- a/src/panel.c +++ b/src/panel.c @@ -55,12 +55,14 @@ void init_panel() { int i; Panel *p; + for (i=0 ; i < nb_panel ; i++) { p = &panel1[i]; p->area.parent = p; p->area.panel = p; p->area.visible = 1; + p->area.resize = 1; p->area._resize = resize_panel; p->g_taskbar.parent = p; p->g_taskbar.panel = p; @@ -69,8 +71,10 @@ void init_panel() // add childs if (p->clock.area.visible) p->area.list = g_slist_append(p->area.list, &p->clock); - if (p->systray.area.visible) - p->area.list = g_slist_append(p->area.list, &p->systray); + if (systray.area.visible && i == 0) { + // systray only on first panel + p->area.list = g_slist_append(p->area.list, &systray); + } // detect panel size if (p->pourcentx) @@ -173,10 +177,10 @@ void resize_panel(void *obj) else taskbar_on_screen = 1; taskbar_width = panel->area.width - (2 * panel->area.paddingxlr) - (2 * panel->area.pix.border.width); - if (panel->clock.area.visible) + if (panel->clock.area.visible && panel->clock.area.width) taskbar_width -= (panel->clock.area.width + panel->area.paddingx); - if (panel->systray.area.visible) - taskbar_width -= (panel->systray.area.width + panel->area.paddingx); + if (systray.area.visible && systray.area.width) + taskbar_width -= (systray.area.width + panel->area.paddingx); taskbar_width = (taskbar_width - ((taskbar_on_screen-1) * panel->area.paddingx)) / taskbar_on_screen; diff --git a/src/panel.h b/src/panel.h index c76d98a..67c995c 100644 --- a/src/panel.h +++ b/src/panel.h @@ -77,12 +77,6 @@ typedef struct { // clock Clock clock; - // -------------------------------------------------- - // systray - Systraybar systray; - - // global taskbar parameter - //Area g_systraybar; } Panel; diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 0fa8dae..6d72240 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -39,76 +39,58 @@ GSList *icons; // selection window Window net_sel_win = None; +// freedesktop specification doesn't allow multi systray +Systraybar systray; + void init_systray() { - Panel *panel; - Systraybar *sysbar; - int i, run_systray; - cleanup_systray(); - run_systray = 0; - for (i=0 ; i < nb_panel ; i++) { - if (panel1[i].systray.area.visible) { - run_systray = 1; - break; - } - } - if (run_systray) { + Panel *panel = &panel1[0]; + systray.area.parent = panel; + systray.area.panel = panel; + systray.area._resize = resize_systray; + + if (systray.area.visible) { if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != None) { fprintf(stderr, "tint2 : another systray is running\n"); - run_systray = 0; + systray.area.visible = 0; } } - if (run_systray) - run_systray = net_init(); - - // configure sysbar on all panels - for (i=0 ; i < nb_panel ; i++) { - panel = &panel1[i]; - sysbar = &panel->systray; - - if (!run_systray) { - sysbar->area.visible = 0; - continue; - } - if (!sysbar->area.visible) - continue; + if (systray.area.visible) + systray.area.visible = net_init(); - sysbar->area.parent = panel; - sysbar->area.panel = panel; + if (!systray.area.visible) + return; - sysbar->area.posy = panel->area.pix.border.width + panel->area.paddingy; - sysbar->area.height = panel->area.height - (2 * sysbar->area.posy); - sysbar->area.width = 100; + // configure systray + // draw only one systray (even with multi panel) + systray.area.posy = panel->area.pix.border.width + panel->area.paddingy; + systray.area.height = panel->area.height - (2 * systray.area.posy); + systray.area.width = 0; - sysbar->area.posx = panel->area.width - panel->area.paddingxlr - panel->area.pix.border.width - sysbar->area.width; - if (panel->clock.area.visible) - sysbar->area.posx -= (panel->clock.area.width + panel->area.paddingx); + systray.area.posx = panel->area.width - panel->area.paddingxlr - panel->area.pix.border.width - systray.area.width; + if (panel->clock.area.visible) + systray.area.posx -= (panel->clock.area.width + panel->area.paddingx); - sysbar->area.redraw = 1; - } + systray.area.redraw = 1; } void cleanup_systray() { - Panel *panel; - int i; - - for (i=0 ; i < nb_panel ; i++) { - panel = &panel1[i]; - if (!panel->systray.area.visible) continue; - - free_area(&panel->systray.area); - } + free_area(&systray.area); if (net_sel_win != None) { XDestroyWindow(server.dsp, net_sel_win); net_sel_win = None; } + if (systray.list_icons) { + g_slist_free(systray.list_icons); + systray.list_icons = 0; + } } @@ -137,15 +119,29 @@ int net_init() ev.data.l[2] = net_sel_win; ev.data.l[3] = 0; ev.data.l[4] = 0; - XSendEvent(server.dsp, server.root_win, False, StructureNotifyMask, &ev); + XSendEvent(server.dsp, server.root_win, False, StructureNotifyMask, (XEvent*)&ev); return 1; } -int resize_systray (Systraybar *sysbar) +void resize_systray (void *obj) { - return 0; + Systraybar *sysbar = obj; + Panel *panel = sysbar->area.panel; + int count = g_slist_length(systray.list_icons); + + if (!count) systray.area.width = 0; + else systray.area.width = 30 * count; + + systray.area.posx = panel->area.width - panel->area.paddingxlr - panel->area.pix.border.width - systray.area.width; + if (panel->clock.area.visible) + systray.area.posx -= (panel->clock.area.width + panel->area.paddingx); + + systray.area.redraw = 1; + + // resize other objects on panel + printf("resize_systray %d %d\n", systray.area.posx, systray.area.width); } @@ -207,6 +203,16 @@ gboolean icon_add(Window id) traywin = g_new0(TrayWindow, 1); traywin->id = id; + systray.list_icons = g_slist_append(systray.list_icons, traywin); + printf("ajout d'un icone %d (%lx)\n", g_slist_length(systray.list_icons), id); + systray.area.resize = 1; + + // changed in systray force resize on panel + Panel *panel = systray.area.panel; + panel->area.resize = 1; + panel_refresh = 1; + return TRUE; + if (!icon_swallow(traywin)) { printf("not icon_swallow\n"); g_free(traywin); @@ -224,7 +230,7 @@ gboolean icon_add(Window id) icons = g_slist_append(icons, traywin); // watch for the icon trying to resize itself! - XSelectInput(server.dsp, traywin->id, StructureNotifyMask); + //XSelectInput(server.dsp, traywin->id, StructureNotifyMask); // position and size the icon window XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, icon_size, icon_size); @@ -245,6 +251,39 @@ gboolean icon_add(Window id) } +void icon_remove(TrayWindow *traywin) +{ + XErrorHandler old; + Window win_id = traywin->id; + + XSelectInput(server.dsp, traywin->id, NoEventMask); + + // remove it from our list + systray.list_icons = g_slist_remove(systray.list_icons, traywin); + g_free(traywin); + printf("suppression d'un icone %d\n", g_slist_length(systray.list_icons)); + systray.area.resize = 1; + + // changed in systray force resize on panel + Panel *panel = systray.area.panel; + panel->area.resize = 1; + panel_refresh = 1; + return; + +/* + // reparent it to root + error = FALSE; + old = XSetErrorHandler(window_error_handler); + XReparentWindow(server.dsp, win_id, root, 0, 0); + XSync(server.dsp, False); + XSetErrorHandler(old); + + reposition_icons(); + fix_geometry(); + */ +} + + void net_message(XClientMessageEvent *e) { unsigned long opcode; @@ -256,7 +295,6 @@ void net_message(XClientMessageEvent *e) case SYSTEM_TRAY_REQUEST_DOCK: panel_refresh = 1; id = e->data.l[2]; - printf("add dockapp\n"); if (id && icon_add(id)) { XSelectInput(server.dsp, id, StructureNotifyMask); } diff --git a/src/systray/systraybar.h b/src/systray/systraybar.h index 5222dd6..fab1891 100644 --- a/src/systray/systraybar.h +++ b/src/systray/systraybar.h @@ -34,16 +34,16 @@ typedef struct extern Window net_sel_win; +extern Systraybar systray; void init_systray(); void cleanup_systray(); int net_init(); void net_message(XClientMessageEvent *e); +void icon_remove(TrayWindow *traywin); -// return 1 if task_width changed -int resize_systray (Systraybar *sysbar); - +void resize_systray (void *obj); #endif diff --git a/src/tint.c b/src/tint.c index 13e380f..9d830bf 100644 --- a/src/tint.c +++ b/src/tint.c @@ -55,6 +55,7 @@ void init () // set global data memset(&server, 0, sizeof(Server_global)); + memset(&systray, 0, sizeof(Systraybar)); server.dsp = XOpenDisplay (NULL); if (!server.dsp) { @@ -86,6 +87,7 @@ void init () void cleanup() { cleanup_panel(); + cleanup_systray(); if (time1_font_desc) pango_font_description_free(time1_font_desc); if (time2_font_desc) pango_font_description_free(time2_font_desc); @@ -453,6 +455,7 @@ int main (int argc, char *argv[]) int x11_fd, i, c; struct timeval tv; Panel *panel; + GSList *it; c = getopt (argc, argv, "c:"); init (); @@ -517,15 +520,12 @@ load_config: case UnmapNotify: case DestroyNotify: -// printf("destroy client\n"); - /* - GSList *it; - for (it = icons; it; it = g_slist_next(it)) { + for (it = systray.list_icons; it; it = g_slist_next(it)) { if (((TrayWindow*)it->data)->id == e.xany.window) { - icon_remove(it); + icon_remove((TrayWindow*)it->data); break; } - }*/ + } break; case ClientMessage: @@ -557,7 +557,7 @@ load_config: if (panel->temp_pmap) XFreePixmap(server.dsp, panel->temp_pmap); panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth); - refresh(panel); + refresh(&panel->area); XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); } XFlush (server.dsp); diff --git a/src/tint2 b/src/tint2 index 7a98f5f57a118cf794e527ce0cdd523aa357a0cc..786d990d3c350a2be45d1ffc1edd404ed03f950d 100755 GIT binary patch delta 17220 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 Ph> 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 delta 16948 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 I244^SfB5ND_5c6? diff --git a/src/util/area.c b/src/util/area.c index 4cb3b41..4b45fbd 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -29,25 +29,22 @@ #include "server.h" #include "panel.h" - +// 1) resize child +// 2) resize parent +// 3) redraw parent +// 4) redraw child void refresh (Area *a) { if (!a->visible) return; - if (a->resize) { - // resize can generate a redraw - if (a->_resize) { - //printf("resize area posx %d, width %d\n", a->posx, a->width); - a->_resize(a); - } - a->resize = 0; - } + + size(a); if (a->redraw) { + a->redraw = 0; //printf("draw area posx %d, width %d\n", a->posx, a->width); draw(a, 0); if (a->use_active) draw(a, 1); - a->redraw = 0; } // draw current Area @@ -55,12 +52,29 @@ void refresh (Area *a) XCopyArea (server.dsp, *pmap, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy); // and then refresh child object - GSList *l = a->list; - for (; l ; l = l->next) + GSList *l; + for (l = a->list; l ; l = l->next) refresh(l->data); } +void size (Area *a) +{ + GSList *l; + + if (a->resize) { + a->resize = 0; + for (l = a->list; l ; l = l->next) + size(l->data); + + // resize can generate a redraw + if (a->_resize) { + a->_resize(a); + } + } +} + + void set_redraw (Area *a) { a->redraw = 1; diff --git a/src/util/area.h b/src/util/area.h index da32592..cbcf58f 100644 --- a/src/util/area.h +++ b/src/util/area.h @@ -52,6 +52,7 @@ typedef struct typedef struct { // absolute coordinate in panel int posx, posy; + // width and height including border int width, height; Pmap pix; Pmap pix_active; @@ -85,6 +86,8 @@ typedef struct { // draw background and foreground void refresh (Area *a); +void size (Area *a); + // set 'redraw' on an area and childs void set_redraw (Area *a); -- 2.44.0