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:
parent
8676662be0
commit
027cb6a690
|
@ -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[
|
||||||
|
|
Loading…
Reference in New Issue
Block a user