all repos — tint2 @ 1b4b0a8d8dc99b93d942b2f2bc3391c5827bd495

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

systray: Delay icon rendering only when throttling is necessary
o9000 o9000
commit

1b4b0a8d8dc99b93d942b2f2bc3391c5827bd495

parent

7ea0dc241c7cd86ef28c2ea7edbb8eb81c162e5a

4 files changed, 22 insertions(+), 6 deletions(-)

jump to
M src/systray/systraybar.csrc/systray/systraybar.c

@@ -603,7 +603,18 @@ // we end up in this function only in real transparency mode or if systray_task_asb != 100 0 0

// we made also sure, that we always have a 32 bit visual, i.e. we can safely create 32 bit pixmaps here TrayWindow* traywin = t; - traywin->render_timeout = 0; + // wine tray icons update whenever mouse is over them, so we limit the updates to 50 ms + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + struct timespec earliest_render = add_msec_to_timespec(traywin->time_last_render, 50); + if (compare_timespecs(&earliest_render, &now) > 0) { + traywin->render_timeout = add_timeout(50, 0, systray_render_icon_now, traywin, &traywin->render_timeout); + return; + } + traywin->time_last_render.tv_sec = now.tv_sec; + traywin->time_last_render.tv_nsec = now.tv_nsec; + traywin->render_timeout = NULL; + if ( traywin->width == 0 || traywin->height == 0 ) { // reschedule rendering since the geometry information has not yet been processed (can happen on slow cpu) systray_render_icon(traywin);

@@ -698,9 +709,8 @@

void systray_render_icon(TrayWindow* traywin) { if (FORCE_COMPOSITED_RENDERING || server.real_transparency || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) { - // wine tray icons update whenever mouse is over them, so we limit the updates to 50 ms - if (!traywin->render_timeout) - traywin->render_timeout = add_timeout(50, 0, systray_render_icon_now, traywin, &traywin->render_timeout); + if (!traywin->render_timeout) + systray_render_icon_now(traywin); } else { // Pixmap pix = XCreatePixmap(server.dsp, server.root_win, traywin->width, traywin->height, server.depth);
M src/systray/systraybar.hsrc/systray/systraybar.h

@@ -47,6 +47,7 @@ timeout* render_timeout;

int empty; int pid; int chrono; + struct timespec time_last_render; } TrayWindow;
M src/util/timer.csrc/util/timer.c

@@ -49,9 +49,7 @@ };

void add_timeout_intern(int value_msec, int interval_msec, void(*_callback)(void*), void* arg, timeout* t); gint compare_timeouts(gconstpointer t1, gconstpointer t2); -gint compare_timespecs(const struct timespec* t1, const struct timespec* t2); int timespec_subtract(struct timespec* result, struct timespec* x, struct timespec* y); -struct timespec add_msec_to_timespec(struct timespec ts, int msec); int align_with_existing_timeouts(timeout* t);
M src/util/timer.hsrc/util/timer.h

@@ -20,6 +20,8 @@ #ifndef TIMER_H

#define TIMER_H #include <glib.h> +#include <time.h> +#include <sys/time.h> extern struct timeval next_timeout;

@@ -65,5 +67,10 @@ void update_next_timeout();

/** Callback of all expired timeouts **/ void callback_timeout_expired(); + +/** Returns -1 if t1 < t2, 0 if t1 == t2, 1 if t1 > t2 **/ +gint compare_timespecs(const struct timespec* t1, const struct timespec* t2); + +struct timespec add_msec_to_timespec(struct timespec ts, int msec); #endif // TIMER_H