systray: Delay icon rendering only when throttling is necessary
This commit is contained in:
parent
7ea0dc241c
commit
1b4b0a8d8d
4 changed files with 22 additions and 6 deletions
|
@ -603,7 +603,18 @@ void systray_render_icon_now(void* t)
|
||||||
// we made also sure, that we always have a 32 bit visual, i.e. we can safely create 32 bit pixmaps here
|
// 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;
|
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 ) {
|
if ( traywin->width == 0 || traywin->height == 0 ) {
|
||||||
// reschedule rendering since the geometry information has not yet been processed (can happen on slow cpu)
|
// reschedule rendering since the geometry information has not yet been processed (can happen on slow cpu)
|
||||||
systray_render_icon(traywin);
|
systray_render_icon(traywin);
|
||||||
|
@ -698,9 +709,8 @@ void systray_render_icon_now(void* t)
|
||||||
void systray_render_icon(TrayWindow* traywin)
|
void systray_render_icon(TrayWindow* traywin)
|
||||||
{
|
{
|
||||||
if (FORCE_COMPOSITED_RENDERING || server.real_transparency || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) {
|
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)
|
||||||
if (!traywin->render_timeout)
|
systray_render_icon_now(traywin);
|
||||||
traywin->render_timeout = add_timeout(50, 0, systray_render_icon_now, traywin, &traywin->render_timeout);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Pixmap pix = XCreatePixmap(server.dsp, server.root_win, traywin->width, traywin->height, server.depth);
|
// Pixmap pix = XCreatePixmap(server.dsp, server.root_win, traywin->width, traywin->height, server.depth);
|
||||||
|
|
|
@ -47,6 +47,7 @@ typedef struct
|
||||||
int empty;
|
int empty;
|
||||||
int pid;
|
int pid;
|
||||||
int chrono;
|
int chrono;
|
||||||
|
struct timespec time_last_render;
|
||||||
} TrayWindow;
|
} TrayWindow;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -49,9 +49,7 @@ struct _timeout {
|
||||||
|
|
||||||
void add_timeout_intern(int value_msec, int interval_msec, void(*_callback)(void*), void* arg, timeout* t);
|
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_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);
|
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);
|
int align_with_existing_timeouts(timeout* t);
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#define TIMER_H
|
#define TIMER_H
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
extern struct timeval next_timeout;
|
extern struct timeval next_timeout;
|
||||||
|
|
||||||
|
@ -66,4 +68,9 @@ void update_next_timeout();
|
||||||
/** Callback of all expired timeouts **/
|
/** Callback of all expired timeouts **/
|
||||||
void callback_timeout_expired();
|
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
|
#endif // TIMER_H
|
||||||
|
|
Loading…
Reference in a new issue