Tracking the number of active sockets

This commit is contained in:
Pierre Pronchery 2012-10-06 00:37:47 +00:00
parent 89611a2f50
commit 58d450c5db

View File

@ -12,6 +12,8 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. */ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* TODO:
* - let automatic show/hide be in preferences */
@ -31,6 +33,7 @@ typedef struct _PanelApplet
PanelAppletHelper * helper; PanelAppletHelper * helper;
guint source; guint source;
guint count;
/* widgets */ /* widgets */
GtkWidget * button; GtkWidget * button;
@ -45,10 +48,12 @@ static Embed * _embed_init(PanelAppletHelper * helper,
static void _embed_destroy(Embed * embed); static void _embed_destroy(Embed * embed);
/* callbacks */ /* callbacks */
static void _embed_on_added(gpointer data);
static int _embed_on_desktop_message(void * data, uint32_t value1, static int _embed_on_desktop_message(void * data, uint32_t value1,
uint32_t value2, uint32_t value3); uint32_t value2, uint32_t value3);
static int _embed_on_idle(gpointer data); static int _embed_on_idle(gpointer data);
static void _embed_on_toggled(GtkWidget * widget, gpointer data); static void _embed_on_removed(gpointer data);
static void _embed_on_toggled(gpointer data);
/* public */ /* public */
@ -82,6 +87,7 @@ static Embed * _embed_init(PanelAppletHelper * helper,
} }
embed->helper = helper; embed->helper = helper;
embed->source = 0; embed->source = 0;
embed->count = 0;
embed->window = NULL; embed->window = NULL;
embed->vbox = NULL; embed->vbox = NULL;
embed->button = gtk_toggle_button_new(); embed->button = gtk_toggle_button_new();
@ -89,7 +95,7 @@ static Embed * _embed_init(PanelAppletHelper * helper,
gtk_widget_set_tooltip_text(embed->button, "Show embedded widgets"); gtk_widget_set_tooltip_text(embed->button, "Show embedded widgets");
#endif #endif
gtk_button_set_relief(GTK_BUTTON(embed->button), GTK_RELIEF_NONE); gtk_button_set_relief(GTK_BUTTON(embed->button), GTK_RELIEF_NONE);
g_signal_connect(G_OBJECT(embed->button), "toggled", G_CALLBACK( g_signal_connect_swapped(G_OBJECT(embed->button), "toggled", G_CALLBACK(
_embed_on_toggled), embed); _embed_on_toggled), embed);
image = gtk_image_new_from_icon_name(applet.icon, helper->icon_size); image = gtk_image_new_from_icon_name(applet.icon, helper->icon_size);
gtk_container_add(GTK_CONTAINER(embed->button), image); gtk_container_add(GTK_CONTAINER(embed->button), image);
@ -110,6 +116,20 @@ static void _embed_destroy(Embed * embed)
/* callbacks */ /* callbacks */
/* embed_on_added */
static void _embed_on_added(gpointer data)
{
Embed * embed = data;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(embed->button), TRUE);
gtk_widget_set_sensitive(embed->button, TRUE);
embed->count++;
}
/* embed_on_desktop_message */ /* embed_on_desktop_message */
static int _embed_on_desktop_message(void * data, uint32_t value1, static int _embed_on_desktop_message(void * data, uint32_t value1,
uint32_t value2, uint32_t value3) uint32_t value2, uint32_t value3)
@ -124,8 +144,12 @@ static int _embed_on_desktop_message(void * data, uint32_t value1,
if(value1 != PANEL_MESSAGE_EMBED) if(value1 != PANEL_MESSAGE_EMBED)
return 0; return 0;
socket = gtk_socket_new(); socket = gtk_socket_new();
gtk_box_pack_start(GTK_BOX(embed->vbox), socket, FALSE, TRUE, 0); g_signal_connect_swapped(socket, "plug-added",
G_CALLBACK(_embed_on_added), embed);
g_signal_connect_swapped(socket, "plug-removed",
G_CALLBACK(_embed_on_removed), embed);
gtk_widget_show(socket); gtk_widget_show(socket);
gtk_box_pack_start(GTK_BOX(embed->vbox), socket, FALSE, TRUE, 0);
gtk_socket_add_id(GTK_SOCKET(socket), value2); gtk_socket_add_id(GTK_SOCKET(socket), value2);
return 0; return 0;
} }
@ -136,6 +160,9 @@ static int _embed_on_idle(gpointer data)
{ {
Embed * embed = data; Embed * embed = data;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
embed->source = 0; embed->source = 0;
embed->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); embed->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_accept_focus(GTK_WINDOW(embed->window), FALSE); gtk_window_set_accept_focus(GTK_WINDOW(embed->window), FALSE);
@ -154,8 +181,25 @@ static int _embed_on_idle(gpointer data)
} }
/* embed_on_removed */
static void _embed_on_removed(gpointer data)
{
Embed * embed = data;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
if(embed->count > 0 && --embed->count == 0)
{
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(embed->button),
FALSE);
gtk_widget_set_sensitive(embed->button, TRUE);
}
}
/* embed_on_toggled */ /* embed_on_toggled */
static void _embed_on_toggled(GtkWidget * widget, gpointer data) static void _embed_on_toggled(gpointer data)
{ {
Embed * embed = data; Embed * embed = data;
PanelAppletHelper * helper = embed->helper; PanelAppletHelper * helper = embed->helper;
@ -170,7 +214,7 @@ static void _embed_on_toggled(GtkWidget * widget, gpointer data)
helper->position_menu(helper->panel, (GtkMenu *)embed->window, &x, &y, helper->position_menu(helper->panel, (GtkMenu *)embed->window, &x, &y,
&push_in); &push_in);
gtk_window_move(GTK_WINDOW(embed->window), x, y); gtk_window_move(GTK_WINDOW(embed->window), x, y);
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(embed->button)))
gtk_widget_show(embed->window); gtk_widget_show(embed->window);
else else
gtk_widget_hide(embed->window); gtk_widget_hide(embed->window);