From cb9288bcb990b5ff5b550285f6d3ef752bd44d68 Mon Sep 17 00:00:00 2001 From: Thierry Lorthiois Date: Tue, 3 Feb 2009 20:40:46 +0000 Subject: [PATCH] fixed issue 13, removed Window magager s menu for stability reason --- ChangeLog | 8 ++- doc/tint2-0.7.odt | Bin 121399 -> 121429 bytes src/clock/clock.c | 34 +++++++----- src/clock/clock.h | 16 +++--- src/config.c | 22 ++++---- src/panel.c | 123 ++++++++++++++++++++++++------------------ src/panel.h | 5 ++ src/server.c | 35 ++++++++---- src/server.h | 115 ++++++++++++++++++++------------------- src/taskbar/taskbar.c | 2 +- src/tint.c | 24 ++++----- src/tint2 | Bin 55856 -> 55872 bytes tintrc01 | 2 +- tintrc02 | 12 ++--- 14 files changed, 227 insertions(+), 171 deletions(-) diff --git a/ChangeLog b/ChangeLog index ba42e14..cdbfc22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ -2009-01-30 -- fixed issue 13 (not sure but it look right) +2009-02-05 +- better fixed for Robert Escriva problem : set_panel_properties -> Reserved space +- fixed issue 13 with background detection +- fixed bug with disconnected monitor (in multi monitor mode) +- removed capability to show Window magager's menu + it's a feature I would like, but implementation was buggy 2009-01-29 - use panel_margin parameter even with full_width diff --git a/doc/tint2-0.7.odt b/doc/tint2-0.7.odt index 37a72fe818411e929892ce323a1fed000e29fe81..52535d0c7c5a3d770854f66cac5d37a9c98fbf65 100644 GIT binary patch delta 9739 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 Ra8pHpfzV+&Wtime1_format) return; + if (!time1_format) return; - if (strchr(clock->time1_format, 'S') == NULL) clock->time_precision = 60; - else clock->time_precision = 1; + if (strchr(time1_format, 'S') == NULL) time_precision = 60; + else time_precision = 1; clock->area.posy = panel.area.pix.border.width + panel.area.paddingy; clock->area.height = panel.area.height - (2 * clock->area.posy); clock->area.width = 0; // force posx and width detection clock->area.redraw = 1; - gettimeofday(&clock->clock, 0); - clock->clock.tv_sec -= clock->clock.tv_sec % clock->time_precision; + gettimeofday(&time_clock, 0); + time_clock.tv_sec -= time_clock.tv_sec % time_precision; - strftime(buf_time, sizeof(buf_time), clock->time1_format, localtime(&clock->clock.tv_sec)); - if (clock->time2_format) - strftime(buf_date, sizeof(buf_date), clock->time2_format, localtime(&clock->clock.tv_sec)); + strftime(buf_time, sizeof(buf_time), time1_format, localtime(&time_clock.tv_sec)); + if (time2_format) + strftime(buf_date, sizeof(buf_date), time2_format, localtime(&time_clock.tv_sec)); get_text_size(clock->time1_font_desc, &time_height_ink, &time_height, panel_height, buf_time, strlen(buf_time)); clock->time1_posy = (clock->area.height - time_height) / 2; - if (clock->time2_format) { + if (time2_format) { get_text_size(clock->time2_font_desc, &date_height_ink, &date_height, panel_height, buf_date, strlen(buf_date)); clock->time1_posy -= ((date_height_ink + 2) / 2); @@ -74,9 +80,9 @@ void draw_foreground_clock (void *obj, cairo_t *c, int active) int time_width, date_width, new_width; time_width = date_width = 0; - strftime(buf_time, sizeof(buf_time), clock->time1_format, localtime(&clock->clock.tv_sec)); - if (clock->time2_format) - strftime(buf_date, sizeof(buf_date), clock->time2_format, localtime(&clock->clock.tv_sec)); + strftime(buf_time, sizeof(buf_time), time1_format, localtime(&time_clock.tv_sec)); + if (time2_format) + strftime(buf_date, sizeof(buf_date), time2_format, localtime(&time_clock.tv_sec)); //printf(" draw_foreground_clock : %s\n", buf_time); redraw: @@ -87,7 +93,7 @@ redraw: 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 (clock->time2_format) { + if (time2_format) { pango_layout_set_font_description (layout, clock->time2_font_desc); pango_layout_set_indent(layout, 0); pango_layout_set_text (layout, buf_date, strlen(buf_date)); @@ -120,7 +126,7 @@ redraw: cairo_move_to (c, 0, clock->time1_posy); pango_cairo_show_layout (c, layout); - if (clock->time2_format) { + if (time2_format) { pango_layout_set_font_description (layout, clock->time2_font_desc); pango_layout_set_indent(layout, 0); pango_layout_set_text (layout, buf_date, strlen(buf_date)); diff --git a/src/clock/clock.h b/src/clock/clock.h index 246bb2e..4eea837 100644 --- a/src/clock/clock.h +++ b/src/clock/clock.h @@ -1,9 +1,9 @@ /************************************************************************** * Copyright (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) * -* clock : -* - draw clock, adjust width -* +* Clock with fonctionnal data (timeval, precision) and drawing data (area, font, ...). +* Each panel use his own drawing data. +* **************************************************************************/ #ifndef CLOCK_H @@ -23,13 +23,13 @@ typedef struct Clock { PangoFontDescription *time2_font_desc; int time1_posy; int time2_posy; - char *time1_format; - char *time2_format; - - struct timeval clock; - int time_precision; } Clock; +extern char *time1_format; +extern char *time2_format; +extern struct timeval time_clock; +extern int time_precision; + // initialize clock : y position, precision, ... void init_clock(Clock *clock, int panel_height); diff --git a/src/config.c b/src/config.c index fd1cfcc..e292375 100644 --- a/src/config.c +++ b/src/config.c @@ -77,9 +77,10 @@ void cleanup () if (panel.clock.time1_font_desc) pango_font_description_free(panel.clock.time1_font_desc); if (panel.clock.time2_font_desc) pango_font_description_free(panel.clock.time2_font_desc); if (panel.taskbar) cleanup_taskbar(); - if (panel.clock.time1_format) g_free(panel.clock.time1_format); - if (panel.clock.time2_format) g_free(panel.clock.time2_format); + if (time1_format) g_free(time1_format); + if (time2_format) g_free(time2_format); if (server.monitor) free(server.monitor); + XFreeGC(server.dsp, server.gc); XCloseDisplay(server.dsp); } @@ -288,14 +289,14 @@ void add_entry (char *key, char *value) /* Clock */ else if (strcmp (key, "time1_format") == 0) { - if (panel.clock.time1_format) g_free(panel.clock.time1_format); - if (strlen(value) > 0) panel.clock.time1_format = strdup (value); - else panel.clock.time1_format = 0; + if (time1_format) g_free(time1_format); + if (strlen(value) > 0) time1_format = strdup (value); + else time1_format = 0; } else if (strcmp (key, "time2_format") == 0) { - if (panel.clock.time2_format) g_free(panel.clock.time2_format); - if (strlen(value) > 0) panel.clock.time2_format = strdup (value); - else panel.clock.time2_format = 0; + if (time2_format) g_free(time2_format); + if (strlen(value) > 0) time2_format = strdup (value); + else time2_format = 0; } else if (strcmp (key, "time1_font") == 0) { if (panel.clock.time1_font_desc) pango_font_description_free(panel.clock.time1_font_desc); @@ -522,7 +523,7 @@ void config_taskbar() panel.area.list = g_slist_append(panel.area.list, tskbar); } } - if (panel.clock.time1_format) + if (time1_format) panel.area.list = g_slist_append(panel.area.list, &panel.clock); //printf("taskbar (desktop x monitor) : (%d x %d)\n", panel.nb_desktop, panel.nb_monitor); @@ -552,7 +553,8 @@ void config_finish () fprintf(stderr, "tint2 error : invalid monitor size.\n"); } - if (!panel.area.width) panel.area.width = server.monitor[panel.monitor].width - 1 - panel.marginleft - panel.marginright; + // use panel.marginleft and panel.marginright even in full width mode + if (!panel.area.width) panel.area.width = server.monitor[panel.monitor].width - panel.marginleft - panel.marginright; // taskbar g_taskbar.posy = panel.area.pix.border.width + panel.area.paddingy; diff --git a/src/panel.c b/src/panel.c index f2e9746..cbe765b 100644 --- a/src/panel.c +++ b/src/panel.c @@ -32,9 +32,6 @@ void visual_refresh () { - if (!panel.area.pix.pmap) - set_panel_background(); - if (server.pmap) XFreePixmap (server.dsp, server.pmap); server.pmap = XCreatePixmap (server.dsp, server.root_win, panel.area.width, panel.area.height, server.depth); @@ -46,7 +43,10 @@ void visual_refresh () refresh (l->data); // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right. - XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0); + // this feature is disabled ! + //XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0); + + XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0); XFlush (server.dsp); panel.refresh = 0; } @@ -73,12 +73,14 @@ void set_panel_properties (Window win) if (panel.position & TOP) { struts[2] = panel.area.height + panel.marginy; struts[8] = server.posx; - struts[9] = server.posx + panel.area.width; + // panel.area.width - 1 allowed full screen on monitor 2 + struts[9] = server.posx + panel.area.width - 1; } else { struts[3] = panel.area.height + panel.marginy; struts[10] = server.posx; - struts[11] = server.posx + panel.area.width; + // panel.area.width - 1 allowed full screen on monitor 2 + struts[11] = server.posx + panel.area.width - 1; } // Old specification : fluxbox need _NET_WM_STRUT. XChangeProperty (server.dsp, win, server.atom._NET_WM_STRUT, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 4); @@ -113,34 +115,40 @@ void set_panel_properties (Window win) void window_draw_panel () { - Window win; - /* panel position determined here */ - if (panel.position & LEFT) server.posx = server.monitor[panel.monitor].x + panel.marginleft; + if (panel.position & LEFT) { + server.posx = server.monitor[panel.monitor].x + panel.marginleft; + } else { - if (panel.position & RIGHT) server.posx = server.monitor[panel.monitor].x + server.monitor[panel.monitor].width - panel.area.width - panel.marginright; - else server.posx = server.monitor[panel.monitor].x + ((server.monitor[panel.monitor].width - panel.area.width) / 2); + if (panel.position & RIGHT) { + //server.posx = server.monitor[panel.monitor].x + server.monitor[panel.monitor].width - panel.area.width - panel.marginright; + server.posx = server.monitor[panel.monitor].x + server.monitor[panel.monitor].width - panel.area.width; + } + else { + server.posx = server.monitor[panel.monitor].x + ((server.monitor[panel.monitor].width - panel.area.width) / 2); + } } - if (panel.position & TOP) server.posy = server.monitor[panel.monitor].y + panel.marginy; - else server.posy = server.monitor[panel.monitor].y + server.monitor[panel.monitor].height - panel.area.height - panel.marginy; + if (panel.position & TOP) { + server.posy = server.monitor[panel.monitor].y + panel.marginy; + } + else { + server.posy = server.monitor[panel.monitor].y + server.monitor[panel.monitor].height - panel.area.height - panel.marginy; + } - /* Catch some events */ + // Catch some events XSetWindowAttributes att = { ParentRelative, 0L, 0, 0L, 0, 0, Always, 0L, 0L, False, ExposureMask|ButtonPressMask|ButtonReleaseMask, NoEventMask, False, 0, 0 }; // XCreateWindow(display, parent, x, y, w, h, border, depth, class, visual, mask, attrib) // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right. + Window win; if (window.main_win) XDestroyWindow(server.dsp, window.main_win); - win = XCreateWindow (server.dsp, server.root_win, server.posx+panel.area.paddingxlr, server.posy, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, server.depth, InputOutput, CopyFromParent, CWEventMask, &att); + //win = XCreateWindow (server.dsp, server.root_win, server.posx+panel.area.paddingxlr, server.posy, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, server.depth, InputOutput, CopyFromParent, CWEventMask, &att); + win = XCreateWindow (server.dsp, server.root_win, server.posx, server.posy, panel.area.width, panel.area.height, 0, server.depth, InputOutput, CopyFromParent, CWEventMask, &att); set_panel_properties (win); window.main_win = win; - // replaced : server.gc = DefaultGC (server.dsp, 0); - if (server.gc) XFree(server.gc); - XGCValues gcValues; - server.gc = XCreateGC(server.dsp, win, (unsigned long) 0, &gcValues); - if (server.gc_root) XFree(server.gc_root); - server.gc_root = XCreateGC(server.dsp, server.root_win, (unsigned long) 0, &gcValues); + set_panel_background(); XMapWindow (server.dsp, win); XFlush (server.dsp); @@ -156,7 +164,7 @@ void visible_object() // list of visible objects // start with clock because draw(clock) can resize others object - if (panel.clock.time1_format) + if (time1_format) panel.area.list = g_slist_append(panel.area.list, &panel.clock); int i, j; @@ -174,44 +182,52 @@ void visible_object() } -Pixmap get_root_pixmap () +void get_root_pixmap() { - Pixmap ret; - Window root = RootWindow(server.dsp, server.screen); - - ret = None; - int act_format, c = 2 ; - u_long nitems ; - u_long bytes_after ; - u_char *prop ; - Atom dummy_id; - - do { - if (XGetWindowProperty(server.dsp, root, server.atom._XROOTPMAP_ID, 0, 1, - False, XA_PIXMAP, &dummy_id, &act_format, - &nitems, &bytes_after, &prop) == Success) { - if (prop) { - ret = *((Pixmap *)prop); - XFree(prop); - break; - } - } - } while (--c > 0); - - if (ret == None) fprintf(stderr, "unknown background\n"); - return ret; + Pixmap ret = None; + + unsigned long *res; + int c = 2; + + do { + res = server_get_property (server.root_win, server.atom._XROOTPMAP_ID, XA_PIXMAP, 0); + if (res) { + ret = *((Pixmap*)res); + XFree(res); + break; + } + } while (--c > 0); + server.root_pmap = ret; + + if (server.root_pmap != None) { + XGCValues gcv; + gcv.ts_x_origin = 0; + gcv.ts_y_origin = 0; + gcv.fill_style = FillTiled; + uint mask = GCTileStipXOrigin | GCTileStipYOrigin | GCFillStyle | GCTile; + + gcv.tile = server.root_pmap; + XChangeGC(server.dsp, server.gc, mask, &gcv); + //fprintf(stderr, "pixmap background detected\n"); + } + else + fprintf(stderr, "pixmap background detection failed\n"); } void set_panel_background() { - Pixmap wall = get_root_pixmap(); + get_root_pixmap(); 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); + // copy background (server.root_pmap) in panel + Window dummy; + int x, y ; + XTranslateCoordinates(server.dsp, window.main_win, server.root_win, 0, 0, &x, &y, &dummy); + XSetTSOrigin(server.dsp, server.gc, -x, -y) ; + XFillRectangle(server.dsp, panel.area.pix.pmap, server.gc, 0, 0, panel.area.width, panel.area.height); // draw background panel cairo_surface_t *cs; @@ -224,10 +240,11 @@ void set_panel_background() cairo_destroy (c); cairo_surface_destroy (cs); - // copy background panel on desktop window - XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); - + // redraw panel set_redraw (&panel.area); + + // copy background panel on desktop window + //XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); } diff --git a/src/panel.h b/src/panel.h index 0ab2293..105cd8e 100644 --- a/src/panel.h +++ b/src/panel.h @@ -82,6 +82,11 @@ void visual_refresh (); void set_panel_properties (Window win); void window_draw_panel (); void visible_object(); + +// draw background panel void set_panel_background(); +// detect server.root_pmap +void get_root_pixmap(); + #endif diff --git a/src/server.c b/src/server.c index 4b5726d..8e90d24 100644 --- a/src/server.c +++ b/src/server.c @@ -172,19 +172,36 @@ void get_monitors() XineramaScreenInfo *info = XineramaQueryScreens(server.dsp, &nb_monitor); if (info) { - int i; + int i = 0, nb=0, j; - //printf("nb_monitors %d\n", nb_monitor); - server.nb_monitor = nb_monitor; server.monitor = calloc(nb_monitor, sizeof(Monitor)); - for (i = 0; i < server.nb_monitor; i++) { - server.monitor[i].x = info[i].x_org; - server.monitor[i].y = info[i].y_org; - server.monitor[i].width = info[i].width; - server.monitor[i].height = info[i].height; + while (i < nb_monitor) { + for (j = 0; j < i; j++) { + if (info[i].x_org >= info[j].x_org && info[i].y_org >= info[j].y_org && (info[i].x_org+info[i].width) <= (info[j].x_org+info[j].width) && (info[i].y_org+info[i].height) <= (info[j].y_org+info[j].height)) { + if (info[i].x_org == info[j].x_org && info[i].y_org == info[j].y_org && info[i].width == info[j].width && info[i].height == info[j].height && nb == 0) { + // add the first monitor + break; + } + else { + // doesn't count monitor 'i' because it's included into another one + //fprintf(stderr, "monitor %d included into another one\n", i); + goto next; + } + } + } + + //fprintf(stderr, "monitor %d added\n", i); + server.monitor[nb].x = info[i].x_org; + server.monitor[nb].y = info[i].y_org; + server.monitor[nb].width = info[i].width; + server.monitor[nb].height = info[i].height; + nb++; +next: + i++; } XFree(info); - + server.nb_monitor = nb; + // ordered monitor according to coordinate qsort(server.monitor, server.nb_monitor, sizeof(Monitor), compareMonitor); } diff --git a/src/server.h b/src/server.h index 369014a..2f8a701 100644 --- a/src/server.h +++ b/src/server.h @@ -17,72 +17,74 @@ typedef struct Global_atom { - Atom _XROOTPMAP_ID; - Atom _NET_CURRENT_DESKTOP; - Atom _NET_NUMBER_OF_DESKTOPS; - Atom _NET_DESKTOP_GEOMETRY; - Atom _NET_DESKTOP_VIEWPORT; - Atom _NET_ACTIVE_WINDOW; - Atom _NET_WM_WINDOW_TYPE; - Atom _NET_WM_STATE_SKIP_PAGER; - Atom _NET_WM_STATE_SKIP_TASKBAR; - Atom _NET_WM_STATE_STICKY; - Atom _NET_WM_WINDOW_TYPE_DOCK; - Atom _NET_WM_WINDOW_TYPE_DESKTOP; - Atom _NET_WM_WINDOW_TYPE_TOOLBAR; - Atom _NET_WM_WINDOW_TYPE_MENU; - Atom _NET_WM_WINDOW_TYPE_SPLASH; - Atom _NET_WM_WINDOW_TYPE_DIALOG; - Atom _NET_WM_WINDOW_TYPE_NORMAL; - Atom _NET_WM_DESKTOP; - Atom WM_STATE; - Atom _NET_WM_STATE; - Atom _NET_WM_STATE_SHADED; - Atom _NET_WM_STATE_BELOW; - Atom _NET_WM_STATE_MODAL; - Atom _NET_CLIENT_LIST; - Atom _NET_WM_NAME; - Atom _NET_WM_VISIBLE_NAME; - Atom _NET_WM_STRUT; - Atom _NET_WM_ICON; - Atom _NET_CLOSE_WINDOW; - Atom UTF8_STRING; - Atom _NET_SUPPORTING_WM_CHECK; - Atom _WIN_LAYER; - Atom _NET_WM_STRUT_PARTIAL; - Atom WM_NAME; - Atom __SWM_VROOT; - Atom _MOTIF_WM_HINTS; + Atom _XROOTPMAP_ID; + Atom _NET_CURRENT_DESKTOP; + Atom _NET_NUMBER_OF_DESKTOPS; + Atom _NET_DESKTOP_GEOMETRY; + Atom _NET_DESKTOP_VIEWPORT; + Atom _NET_ACTIVE_WINDOW; + Atom _NET_WM_WINDOW_TYPE; + Atom _NET_WM_STATE_SKIP_PAGER; + Atom _NET_WM_STATE_SKIP_TASKBAR; + Atom _NET_WM_STATE_STICKY; + Atom _NET_WM_WINDOW_TYPE_DOCK; + Atom _NET_WM_WINDOW_TYPE_DESKTOP; + Atom _NET_WM_WINDOW_TYPE_TOOLBAR; + Atom _NET_WM_WINDOW_TYPE_MENU; + Atom _NET_WM_WINDOW_TYPE_SPLASH; + Atom _NET_WM_WINDOW_TYPE_DIALOG; + Atom _NET_WM_WINDOW_TYPE_NORMAL; + Atom _NET_WM_DESKTOP; + Atom WM_STATE; + Atom _NET_WM_STATE; + Atom _NET_WM_STATE_SHADED; + Atom _NET_WM_STATE_BELOW; + Atom _NET_WM_STATE_MODAL; + Atom _NET_CLIENT_LIST; + Atom _NET_WM_NAME; + Atom _NET_WM_VISIBLE_NAME; + Atom _NET_WM_STRUT; + Atom _NET_WM_ICON; + Atom _NET_CLOSE_WINDOW; + Atom UTF8_STRING; + Atom _NET_SUPPORTING_WM_CHECK; + Atom _WIN_LAYER; + Atom _NET_WM_STRUT_PARTIAL; + Atom WM_NAME; + Atom __SWM_VROOT; + Atom _MOTIF_WM_HINTS; } Global_atom; typedef struct Monitor { - int x; - int y; - int width; - int height; + int x; + int y; + int width; + int height; } Monitor; typedef struct { - Display *dsp; - Window root_win; - int desktop; - int screen; - int depth; - int nb_desktop; - Monitor *monitor; - int nb_monitor; - int got_root_win; - Visual *visual; - int posx, posy; - Pixmap pmap; - GC gc; - GC gc_root; - Global_atom atom; + Display *dsp; + Window root_win; + int desktop; + int screen; + int depth; + int nb_desktop; + // number of monitor (without monitor included into another one) + int nb_monitor; + Monitor *monitor; + int got_root_win; + Visual *visual; + int posx, posy; + Pixmap pmap; + // root background + Pixmap root_pmap; + GC gc; + Global_atom atom; } Server_global; @@ -97,6 +99,9 @@ void server_refresh_root_pixmap (); void server_refresh_main_pixmap (); void server_catch_error (Display *d, XErrorEvent *ev); void server_init_atoms (); + +// detect monitors +// doesn't count monitor included into another one void get_monitors(); diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 7a2bb3f..a2aa99c 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -153,7 +153,7 @@ void resize_taskbar() else taskbar_on_screen = panel.nb_monitor; taskbar_width = panel.area.width - (2 * panel.area.paddingxlr) - (2 * panel.area.pix.border.width); - if (panel.clock.time1_format) + if (time1_format) taskbar_width -= (panel.clock.area.width + panel.area.paddingx); taskbar_width = (taskbar_width - ((taskbar_on_screen-1) * panel.area.paddingx)) / taskbar_on_screen; diff --git a/src/tint.c b/src/tint.c index 9ff04fc..e228aae 100644 --- a/src/tint.c +++ b/src/tint.c @@ -75,12 +75,14 @@ void init () server.depth = DefaultDepth (server.dsp, server.screen); server.visual = DefaultVisual (server.dsp, server.screen); server.desktop = server_get_current_desktop (); + XGCValues gcv; + server.gc = XCreateGC (server.dsp, server.root_win, (unsigned long)0, &gcv) ; XSetErrorHandler ((XErrorHandler) server_catch_error); // init systray - display = server.dsp; - root = RootWindow(display, DefaultScreen(display)); + //display = server.dsp; + //root = RootWindow(display, DefaultScreen(display)); //create_main_window(); //kde_init(); //net_init(); @@ -296,8 +298,7 @@ void event_property_notify (Window win, Atom at) } /* Wallpaper changed */ else if (at == server.atom._XROOTPMAP_ID) { - XFreePixmap (server.dsp, panel.area.pix.pmap); - panel.area.pix.pmap = 0; + set_panel_background(); panel.refresh = 1; } } @@ -395,15 +396,15 @@ void event_timer() { struct timeval stv; - if (!panel.clock.time1_format) return; + if (!time1_format) return; if (gettimeofday(&stv, 0)) return; - if (abs(stv.tv_sec - panel.clock.clock.tv_sec) < panel.clock.time_precision) return; + if (abs(stv.tv_sec - time_clock.tv_sec) < time_precision) return; // update clock - panel.clock.clock.tv_sec = stv.tv_sec; - panel.clock.clock.tv_sec -= panel.clock.clock.tv_sec % panel.clock.time_precision; + time_clock.tv_sec = stv.tv_sec; + time_clock.tv_sec -= time_clock.tv_sec % time_precision; panel.clock.area.redraw = 1; panel.refresh = 1; } @@ -420,8 +421,6 @@ int main (int argc, char *argv[]) init (); load_config: - if (panel.area.pix.pmap) XFreePixmap (server.dsp, panel.area.pix.pmap); - panel.area.pix.pmap = 0; // append full transparency background list_back = g_slist_append(0, calloc(1, sizeof(Area))); @@ -470,8 +469,9 @@ load_config: break; case Expose: - XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); - XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0); + //XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); + //XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0); + XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0); break; case PropertyNotify: diff --git a/src/tint2 b/src/tint2 index 71ec37c4d245bef8ac2395997fecc33c428f624f..effbfca8156847c40ff4e80724b2687d5eeb6f07 100755 GIT binary patch delta 24892 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 OF#L