Optimize widget management

The buttons are no longer destroyed and created again from scratch when
the amount of desktops changes. They are now only created when adding
desktops, and simply updated otherwise.
This commit is contained in:
Pierre Pronchery 2017-11-07 02:04:42 +01:00
parent 8676662be0
commit 027cb6a690

View File

@ -84,6 +84,7 @@ static int _pager_get_window_property(Pager * pager, Window window,
/* useful */ /* useful */
static void _pager_do(Pager * pager); static void _pager_do(Pager * pager);
static void _pager_refresh(Pager * pager);
/* callbacks */ /* callbacks */
static void _pager_on_clicked(GtkWidget * widget, gpointer data); static void _pager_on_clicked(GtkWidget * widget, gpointer data);
@ -251,7 +252,6 @@ static void _pager_do(Pager * pager)
unsigned long * p; unsigned long * p;
unsigned long i; unsigned long i;
GtkWidget ** q; GtkWidget ** q;
int cur;
char ** names; char ** names;
char buf[64]; char buf[64];
@ -264,18 +264,13 @@ static void _pager_do(Pager * pager)
fprintf(stderr, "DEBUG: %s() l=%ld\n", __func__, l); fprintf(stderr, "DEBUG: %s() l=%ld\n", __func__, l);
#endif #endif
XFree(p); XFree(p);
for(i = 0; i < pager->widgets_cnt; i++) for(i = l; i < pager->widgets_cnt; i++)
if(pager->widgets[i] != NULL) if(pager->widgets[i] != NULL)
{
gtk_widget_destroy(pager->widgets[i]); gtk_widget_destroy(pager->widgets[i]);
pager->widgets[i] = NULL;
}
if((q = realloc(pager->widgets, l * sizeof(*q))) == NULL if((q = realloc(pager->widgets, l * sizeof(*q))) == NULL
&& l != 0) && l != 0)
return; return;
pager->widgets = q; pager->widgets = q;
pager->widgets_cnt = l;
cur = _pager_get_current_desktop(pager);
names = _pager_get_desktop_names(pager); names = _pager_get_desktop_names(pager);
for(i = 0; i < l; i++) for(i = 0; i < l; i++)
{ {
@ -286,21 +281,21 @@ static void _pager_do(Pager * pager)
} }
else else
snprintf(buf, sizeof(buf), _("Desk %lu"), i + 1); snprintf(buf, sizeof(buf), _("Desk %lu"), i + 1);
pager->widgets[i] = gtk_button_new_with_label(buf); if(i < pager->widgets_cnt)
if(cur >= 0 && i == (unsigned int)cur) gtk_button_set_label(GTK_BUTTON(pager->widgets[i]),
gtk_widget_set_sensitive(pager->widgets[i], FALSE); buf);
#if GTK_CHECK_VERSION(2, 12, 0) else
snprintf(buf, sizeof(buf), _("Switch to %s"), {
gtk_button_get_label( pager->widgets[i] = gtk_button_new_with_label(buf);
GTK_BUTTON(pager->widgets[i]))); g_signal_connect(pager->widgets[i], "clicked",
gtk_widget_set_tooltip_text(pager->widgets[i], buf); G_CALLBACK( _pager_on_clicked), pager);
#endif gtk_box_pack_start(GTK_BOX(pager->box),
g_signal_connect(pager->widgets[i], "clicked", G_CALLBACK( pager->widgets[i], FALSE, TRUE, 0);
_pager_on_clicked), pager); }
gtk_box_pack_start(GTK_BOX(pager->box), pager->widgets[i],
FALSE, TRUE, 0);
} }
free(names); free(names);
pager->widgets_cnt = l;
_pager_refresh(pager);
if(pager->widgets_cnt <= 1) if(pager->widgets_cnt <= 1)
gtk_widget_hide(pager->box); gtk_widget_hide(pager->box);
else else
@ -308,6 +303,38 @@ static void _pager_do(Pager * pager)
} }
/* pager_refresh */
static void _pager_refresh(Pager * pager)
{
size_t i;
int cur;
char buf[64];
cur = _pager_get_current_desktop(pager);
for(i = 0; i < pager->widgets_cnt; i++)
if(cur < 0 || i != (unsigned int)cur)
{
gtk_widget_set_sensitive(pager->widgets[i], TRUE);
#if GTK_CHECK_VERSION(2, 12, 0)
snprintf(buf, sizeof(buf), _("Switch to %s"),
gtk_button_get_label(
GTK_BUTTON(pager->widgets[i])));
gtk_widget_set_tooltip_text(pager->widgets[i], buf);
#endif
}
else
{
gtk_widget_set_sensitive(pager->widgets[i], FALSE);
#if GTK_CHECK_VERSION(2, 12, 0)
snprintf(buf, sizeof(buf), _("On %s"),
gtk_button_get_label(
GTK_BUTTON(pager->widgets[i])));
gtk_widget_set_tooltip_text(pager->widgets[i], buf);
#endif
}
}
/* callbacks */ /* callbacks */
/* pager_on_clicked */ /* pager_on_clicked */
static void _pager_on_clicked(GtkWidget * widget, gpointer data) static void _pager_on_clicked(GtkWidget * widget, gpointer data)
@ -351,17 +378,13 @@ static GdkFilterReturn _pager_on_filter(GdkXEvent * xevent, GdkEvent * event,
Pager * pager = data; Pager * pager = data;
XEvent * xev = xevent; XEvent * xev = xevent;
int cur; int cur;
size_t i;
if(xev->type != PropertyNotify) if(xev->type != PropertyNotify)
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
if(xev->xproperty.atom == pager->atoms[PAGER_ATOM_NET_CURRENT_DESKTOP]) if(xev->xproperty.atom == pager->atoms[PAGER_ATOM_NET_CURRENT_DESKTOP])
{ {
if((cur = _pager_get_current_desktop(pager)) < 0) if((cur = _pager_get_current_desktop(pager)) >= 0)
return GDK_FILTER_CONTINUE; _pager_refresh(pager);
for(i = 0; i < pager->widgets_cnt; i++)
gtk_widget_set_sensitive(pager->widgets[i],
(i == (size_t)cur) ? FALSE : TRUE);
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
} }
if(xev->xproperty.atom == pager->atoms[ if(xev->xproperty.atom == pager->atoms[