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