From 027cb6a6905cc19e0a01badd6d7abc08a25b7c2f Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 7 Nov 2017 02:04:42 +0100 Subject: [PATCH] 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. --- src/applets/pager.c | 75 +++++++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/src/applets/pager.c b/src/applets/pager.c index 2715899..c2b5f26 100644 --- a/src/applets/pager.c +++ b/src/applets/pager.c @@ -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[