diff --git a/ChangeLog b/ChangeLog index 8c72eb2fe6..31d90325af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2005-02-21 Dan Williams + + * panel-applet/NMWirelessApplet.[ch] + panel-applet/menu-info.[ch] + - Give the panel applet some major love: menu items are no longer + subclasses of GtkCheckMenuItem, they are actual GtkCheckMenuItems. + This allows the applet to actually reflect theme changes correctly, + since themeing of subclassed items in GTK _sucks_. + 2005-02-18 Dan Williams * libnm_glib/libnm_glib.[ch] diff --git a/panel-applet/NMWirelessApplet.c b/panel-applet/NMWirelessApplet.c index 9dd5a9b737..2287ce5490 100644 --- a/panel-applet/NMWirelessApplet.c +++ b/panel-applet/NMWirelessApplet.c @@ -66,10 +66,6 @@ #define GTK_STOCK_ABOUT GTK_STOCK_DIALOG_INFO #endif - -static GtkWidget * nmwa_populate_menu (NMWirelessApplet *applet); -static void nmwa_dispose_menu_items (NMWirelessApplet *applet); -static gboolean nmwa_toplevel_menu_button_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data); static GObject * nmwa_constructor (GType type, guint n_props, GObjectConstructParam *construct_props); static void setup_stock (void); static void nmwa_icons_init (NMWirelessApplet *applet); @@ -504,28 +500,6 @@ void show_warning_dialog (gboolean error, gchar *mesg, ...) } -/* - * nmwa_destroy - * - * Destroy the applet and clean up its data - * - */ -static void nmwa_destroy (NMWirelessApplet *applet, gpointer user_data) -{ - if (applet->menu) - nmwa_dispose_menu_items (applet); - - if (applet->redraw_timeout_id > 0) - { - gtk_timeout_remove (applet->redraw_timeout_id); - applet->redraw_timeout_id = 0; - } - - if (applet->gconf_client) - g_object_unref (G_OBJECT (applet->gconf_client)); -} - - /* * nmwa_update_network_timestamp * @@ -659,24 +633,6 @@ static void nmwa_menu_item_activate (GtkMenuItem *item, gpointer user_data) } -/* - * nmwa_menu_show_cb - * - * Pop up the wireless networks menu in response to a click on the applet - * - */ -static void nmwa_menu_show_cb (GtkWidget *menu, NMWirelessApplet *applet) -{ - if (!applet->tooltips) - applet->tooltips = gtk_tooltips_new (); - gtk_tooltips_set_tip (applet->tooltips, applet->event_box, NULL, NULL); - - nmwa_dispose_menu_items (applet); - nmwa_populate_menu (applet); - gtk_widget_show (applet->menu); -} - - /* * nmwa_menu_add_separator_item * @@ -725,22 +681,36 @@ static void nmwa_menu_add_device_item (GtkWidget *menu, NetworkDevice *device, g if (device->type == DEVICE_TYPE_WIRED_ETHERNET) { - menu_item = nm_menu_wired_new (); - nm_menu_wired_update (NM_MENU_WIRED (menu_item), device, n_devices); + NMWiredMenuItem *item = wired_menu_item_new (); + GtkCheckMenuItem *gtk_item; + + gtk_item = wired_menu_item_get_check_item (item); + wired_menu_item_update (item, device, n_devices); if (applet->active_device == device) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE); + gtk_check_menu_item_set_active (gtk_item, TRUE); + + g_object_set_data (G_OBJECT (gtk_item), "device", g_strdup (device->nm_device)); + g_object_set_data (G_OBJECT (gtk_item), "nm-item-data", item); + g_signal_connect(G_OBJECT (gtk_item), "activate", G_CALLBACK (nmwa_menu_item_activate), applet); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), GTK_WIDGET (gtk_item)); + gtk_widget_show (GTK_WIDGET (gtk_item)); } else { - menu_item = nm_menu_network_new (); - nm_menu_network_update (NM_MENU_NETWORK (menu_item), device, n_devices); + NMWirelessMenuItem *item = wireless_menu_item_new (); + GtkMenuItem *gtk_item; + + gtk_item = wireless_menu_item_get_item (item); + wireless_menu_item_update (item, device, n_devices); + + g_object_set_data (G_OBJECT (gtk_item), "device", g_strdup (device->nm_device)); + g_object_set_data (G_OBJECT (gtk_item), "nm-item-data", item); + g_signal_connect(G_OBJECT (gtk_item), "activate", G_CALLBACK (nmwa_menu_item_activate), applet); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), GTK_WIDGET (gtk_item)); + gtk_widget_show (GTK_WIDGET (gtk_item)); } - - g_object_set_data (G_OBJECT (menu_item), "device", g_strdup (device->nm_device)); - g_signal_connect(G_OBJECT (menu_item), "activate", G_CALLBACK(nmwa_menu_item_activate), applet); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - gtk_widget_show (menu_item); } @@ -813,22 +783,26 @@ static void nmwa_menu_device_add_networks (GtkWidget *menu, NetworkDevice *dev, /* Add all networks in our network list to the menu */ for (list = dev->networks; list; list = list->next) { - GtkWidget *menu_item; - WirelessNetwork *net; + NMNetworkMenuItem *item; + GtkCheckMenuItem *gtk_item; + WirelessNetwork *net; net = (WirelessNetwork *) list->data; - menu_item = nm_menu_wireless_new (applet->encryption_size_group); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + item = network_menu_item_new (applet->encryption_size_group); + gtk_item = network_menu_item_get_check_item (item); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), GTK_WIDGET (gtk_item)); if (applet->active_device == dev && net->active) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE); - nm_menu_wireless_update (NM_MENU_WIRELESS (menu_item), net, has_encrypted); + gtk_check_menu_item_set_active (gtk_item, TRUE); + network_menu_item_update (item, net, has_encrypted); - g_object_set_data (G_OBJECT (menu_item), "network", g_strdup (net->essid)); - g_object_set_data (G_OBJECT (menu_item), "nm_device", g_strdup (dev->nm_device)); - g_signal_connect(G_OBJECT (menu_item), "activate", G_CALLBACK (nmwa_menu_item_activate), applet); + g_object_set_data (G_OBJECT (gtk_item), "network", g_strdup (net->essid)); + g_object_set_data (G_OBJECT (gtk_item), "nm_device", g_strdup (dev->nm_device)); + g_object_set_data (G_OBJECT (gtk_item), "nm-item-data", item); + g_signal_connect(G_OBJECT (gtk_item), "activate", G_CALLBACK (nmwa_menu_item_activate), applet); - gtk_widget_show (menu_item); + gtk_widget_show (GTK_WIDGET (gtk_item)); } } @@ -945,6 +919,21 @@ static void nmwa_menu_add_devices (GtkWidget *menu, NMWirelessApplet *applet) } +static void nmwa_set_scanning_enabled_cb (GtkWidget *widget, NMWirelessApplet *applet) +{ + g_return_if_fail (applet != NULL); + + nmwa_dbus_enable_scanning (applet, !applet->scanning_enabled); +} + +static void nmwa_set_wireless_enabled_cb (GtkWidget *widget, NMWirelessApplet *applet) +{ + g_return_if_fail (applet != NULL); + + nmwa_dbus_enable_scanning (applet, !applet->wireless_enabled); +} + + /* * nmwa_menu_item_data_free * @@ -957,6 +946,7 @@ static void nmwa_menu_item_data_free (GtkWidget *menu_item, gpointer data) GtkWidget *menu; g_return_if_fail (menu_item != NULL); + g_return_if_fail (data != NULL); menu = GTK_WIDGET(data); @@ -972,7 +962,13 @@ static void nmwa_menu_item_data_free (GtkWidget *menu_item, gpointer data) g_free (tag); } - gtk_container_remove(GTK_CONTAINER(menu), menu_item); + if ((tag = g_object_get_data (G_OBJECT (menu_item), "nm-item-data"))) + { + g_object_set_data (G_OBJECT (menu_item), "nm-item-data", NULL); + g_free (tag); + } + + gtk_widget_destroy (menu_item); } @@ -982,51 +978,75 @@ static void nmwa_menu_item_data_free (GtkWidget *menu_item, gpointer data) * Destroy the menu and each of its items data tags * */ -static void nmwa_dispose_menu_items (NMWirelessApplet *applet) +static void nmwa_dropdown_menu_clear (GtkWidget *menu) { - g_return_if_fail (applet != NULL); + g_return_if_fail (menu != NULL); - /* Free the "network" data on each menu item */ - gtk_container_foreach (GTK_CONTAINER (applet->menu), nmwa_menu_item_data_free, applet->menu); + /* Free the "network" data on each menu item, and destroy the item */ + gtk_container_foreach (GTK_CONTAINER (menu), nmwa_menu_item_data_free, menu); } /* - * nmwa_populate_menu + * nmwa_dropdown_menu_populate * * Set up our networks menu from scratch * */ -static GtkWidget * nmwa_populate_menu (NMWirelessApplet *applet) +static void nmwa_dropdown_menu_populate (GtkWidget *menu, NMWirelessApplet *applet) { - GtkWidget *menu = applet->menu; - - g_return_val_if_fail (applet != NULL, NULL); + g_return_if_fail (menu != NULL); + g_return_if_fail (applet != NULL); if (applet->applet_state == APPLET_STATE_NO_NM) - { nmwa_menu_add_text_item (menu, _("NetworkManager is not running...")); - return NULL; + else + nmwa_menu_add_devices (menu, applet); +} + + +/* + * nmwa_dropdown_menu_show_cb + * + * Pop up the wireless networks menu + * + */ +static void nmwa_dropdown_menu_show_cb (GtkWidget *menu, NMWirelessApplet *applet) +{ + g_return_if_fail (menu != NULL); + g_return_if_fail (applet != NULL); + + if (!applet->tooltips) + applet->tooltips = gtk_tooltips_new (); + gtk_tooltips_set_tip (applet->tooltips, applet->event_box, NULL, NULL); + + if (applet->dropdown_menu && (menu == applet->dropdown_menu)) + { + nmwa_dropdown_menu_clear (applet->dropdown_menu); + nmwa_dropdown_menu_populate (applet->dropdown_menu, applet); + gtk_widget_show_all (applet->dropdown_menu); } - - nmwa_menu_add_devices (menu, applet); - - return (menu); } - -static void nmwa_set_scanning_enabled_cb (GtkWidget *widget, NMWirelessApplet *applet) +/* + * nmwa_dropdown_menu_create + * + * Create the applet's dropdown menu + * + */ +static GtkWidget *nmwa_dropdown_menu_create (GtkMenuItem *parent, NMWirelessApplet *applet) { - g_return_if_fail (applet != NULL); + GtkWidget *menu; - nmwa_dbus_enable_scanning (applet, !applet->scanning_enabled); -} + g_return_val_if_fail (parent != NULL, NULL); + g_return_val_if_fail (applet != NULL, NULL); -static void nmwa_set_wireless_enabled_cb (GtkWidget *widget, NMWirelessApplet *applet) -{ - g_return_if_fail (applet != NULL); + menu = gtk_menu_new (); + gtk_container_set_border_width (GTK_CONTAINER (menu), 0); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), menu); + g_signal_connect (menu, "show", G_CALLBACK (nmwa_dropdown_menu_show_cb), applet); - nmwa_dbus_enable_scanning (applet, !applet->wireless_enabled); + return menu; } @@ -1134,53 +1154,32 @@ static GtkWidget *nmwa_context_menu_create (NMWirelessApplet *applet) /* - * nmwa_setup_widgets + * nmwa_theme_change_cb * - * Intialize the applet's widgets and packing, create the initial - * menu of networks. + * Destroy the popdown menu when the theme changes * */ -static void nmwa_setup_widgets (NMWirelessApplet *applet) +static void nmwa_theme_change_cb (NMWirelessApplet *applet) { - GtkWidget *menu_bar; - GtkWidget *event_box; + g_return_if_fail (applet != NULL); - /* construct pixmap widget */ - applet->pixmap = gtk_image_new (); - applet->event_box = gtk_event_box_new (); - gtk_container_set_border_width (GTK_CONTAINER (applet->event_box), 0); + if (applet->dropdown_menu) + nmwa_dropdown_menu_clear (applet->dropdown_menu); - menu_bar = gtk_menu_bar_new (); - gtk_container_add (GTK_CONTAINER(applet->event_box), menu_bar); - - applet->toplevel_menu = gtk_menu_item_new(); - gtk_widget_set_name (applet->toplevel_menu, "ToplevelMenu"); - gtk_container_set_border_width (GTK_CONTAINER (applet->toplevel_menu), 0); - gtk_container_add (GTK_CONTAINER(applet->toplevel_menu), applet->pixmap); - gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), applet->toplevel_menu); - - applet->context_menu = nmwa_context_menu_create (applet); - g_signal_connect (applet->toplevel_menu, "button_press_event", G_CALLBACK (nmwa_toplevel_menu_button_press), applet); - - applet->menu = gtk_menu_new (); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (applet->toplevel_menu), applet->menu); - g_signal_connect (applet->menu, "show", G_CALLBACK (nmwa_menu_show_cb), applet); - - applet->encryption_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - - gtk_container_add (GTK_CONTAINER (applet), applet->event_box); - - gtk_widget_show_all (GTK_WIDGET (applet)); + if (applet->top_menu_item) + { + gtk_menu_item_remove_submenu (GTK_MENU_ITEM (applet->top_menu_item)); + applet->dropdown_menu = nmwa_dropdown_menu_create (GTK_MENU_ITEM (applet->top_menu_item), applet); + } } - /* - * nmwa_toplevel_menu_button_press + * nmwa_toplevel_menu_button_press_cb * * Handle right-clicks for the context popup menu * */ -static gboolean nmwa_toplevel_menu_button_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +static gboolean nmwa_toplevel_menu_button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { NMWirelessApplet *applet = (NMWirelessApplet *)user_data; @@ -1199,6 +1198,70 @@ static gboolean nmwa_toplevel_menu_button_press (GtkWidget *widget, GdkEventButt return (FALSE); } + +/* + * nmwa_setup_widgets + * + * Intialize the applet's widgets and packing, create the initial + * menu of networks. + * + */ +static void nmwa_setup_widgets (NMWirelessApplet *applet) +{ + GtkWidget *menu_bar; + GtkWidget *event_box; + + /* Event box for tooltips */ + applet->event_box = gtk_event_box_new (); + gtk_container_set_border_width (GTK_CONTAINER (applet->event_box), 0); + + menu_bar = gtk_menu_bar_new (); + + applet->top_menu_item = gtk_menu_item_new(); + gtk_widget_set_name (applet->top_menu_item, "ToplevelMenu"); + gtk_container_set_border_width (GTK_CONTAINER (applet->top_menu_item), 0); + g_signal_connect (applet->top_menu_item, "button_press_event", G_CALLBACK (nmwa_toplevel_menu_button_press_cb), applet); + + applet->dropdown_menu = nmwa_dropdown_menu_create (GTK_MENU_ITEM (applet->top_menu_item), applet); + + applet->pixmap = gtk_image_new (); + + /* Set up the widget structure and show the applet */ + gtk_container_add (GTK_CONTAINER(applet->top_menu_item), applet->pixmap); + gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), applet->top_menu_item); + gtk_container_add (GTK_CONTAINER(applet->event_box), menu_bar); + gtk_container_add (GTK_CONTAINER (applet), applet->event_box); + gtk_widget_show_all (GTK_WIDGET (applet)); + + applet->context_menu = nmwa_context_menu_create (applet); + applet->encryption_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); +} + + +/* + * nmwa_destroy + * + * Destroy the applet and clean up its data + * + */ +static void nmwa_destroy (NMWirelessApplet *applet, gpointer user_data) +{ + if (applet->dropdown_menu) + nmwa_dropdown_menu_clear (applet->dropdown_menu); + if (applet->top_menu_item) + gtk_menu_item_remove_submenu (GTK_MENU_ITEM (applet->top_menu_item)); + + if (applet->redraw_timeout_id > 0) + { + gtk_timeout_remove (applet->redraw_timeout_id); + applet->redraw_timeout_id = 0; + } + + if (applet->gconf_client) + g_object_unref (G_OBJECT (applet->gconf_client)); +} + + /* * nmwa_get_instance * @@ -1237,7 +1300,8 @@ static GtkWidget * nmwa_get_instance (NMWirelessApplet *applet) /* Load pixmaps and create applet widgets */ nmwa_setup_widgets (applet); - g_signal_connect (applet,"destroy", G_CALLBACK (nmwa_destroy), NULL); + g_signal_connect (applet, "destroy", G_CALLBACK (nmwa_destroy), NULL); + g_signal_connect (applet, "style-set", G_CALLBACK (nmwa_theme_change_cb), NULL); /* Start redraw timeout */ nmwa_start_redraw_timeout (applet); @@ -1283,16 +1347,16 @@ nmwa_icons_free (NMWirelessApplet *applet) { gint i; - g_object_unref (applet->no_nm_icon); - g_object_unref (applet->wired_icon); - g_object_unref (applet->adhoc_icon); + g_object_unref (applet->no_nm_icon); + g_object_unref (applet->wired_icon); + g_object_unref (applet->adhoc_icon); for (i = 0; i < NUM_WIRED_CONNECTING_FRAMES; i++) g_object_unref (applet->wired_connecting_icons[i]); - g_object_unref (applet->wireless_00_icon); - g_object_unref (applet->wireless_25_icon); - g_object_unref (applet->wireless_50_icon); - g_object_unref (applet->wireless_75_icon); - g_object_unref (applet->wireless_100_icon); + g_object_unref (applet->wireless_00_icon); + g_object_unref (applet->wireless_25_icon); + g_object_unref (applet->wireless_50_icon); + g_object_unref (applet->wireless_75_icon); + g_object_unref (applet->wireless_100_icon); for (i = 0; i < NUM_WIRELESS_CONNECTING_FRAMES; i++) g_object_unref (applet->wireless_connecting_icons[i]); for (i = 0; i < NUM_WIRELESS_SCANNING_FRAMES; i++) diff --git a/panel-applet/NMWirelessApplet.h b/panel-applet/NMWirelessApplet.h index 13a27c6488..23d904ef94 100644 --- a/panel-applet/NMWirelessApplet.h +++ b/panel-applet/NMWirelessApplet.h @@ -144,8 +144,8 @@ typedef struct /* Direct UI elements */ GtkWidget *pixmap; - GtkWidget *menu; - GtkWidget *toplevel_menu; + GtkWidget *top_menu_item; + GtkWidget *dropdown_menu; GtkWidget *event_box; GtkSizeGroup *encryption_size_group; GtkTooltips *tooltips; diff --git a/panel-applet/menu-info.c b/panel-applet/menu-info.c index cc9e9fb24c..81229b1768 100644 --- a/panel-applet/menu-info.c +++ b/panel-applet/menu-info.c @@ -30,6 +30,7 @@ #include #endif +#include #include #include #include "menu-info.h" @@ -41,253 +42,225 @@ #include "NMWirelessAppletDbus.h" -static gboolean nm_menu_wired_expose_event (GtkWidget *widget, GdkEventExpose *event); -static gboolean nm_menu_wireless_expose_event (GtkWidget *widget, GdkEventExpose *event); +/**************************************************************** + * Wired menu item + ****************************************************************/ - -G_DEFINE_TYPE (NMMenuWired, nm_menu_wired, GTK_TYPE_CHECK_MENU_ITEM); - - -static void -nm_menu_wired_init (NMMenuWired *menu_wired) +struct NMWiredMenuItem { - menu_wired->label = gtk_label_new (NULL); - gtk_misc_set_alignment (GTK_MISC (menu_wired->label), 0.0, 0.5); - gtk_container_add (GTK_CONTAINER (menu_wired), menu_wired->label); - gtk_widget_show (menu_wired->label); + GtkCheckMenuItem *check_item; + GtkLabel *label; +}; + + +NMWiredMenuItem *wired_menu_item_new (void) +{ + NMWiredMenuItem *item = g_malloc0 (sizeof (NMWiredMenuItem)); + + g_return_val_if_fail (item != NULL, NULL); + + item->check_item = GTK_CHECK_MENU_ITEM (gtk_check_menu_item_new ()); + item->label = GTK_LABEL (gtk_label_new (NULL)); + gtk_misc_set_alignment (GTK_MISC (item->label), 0.0, 0.5); + gtk_container_add (GTK_CONTAINER (item->check_item), GTK_WIDGET (item->label)); + gtk_widget_show (GTK_WIDGET (item->label)); + + return item; +} + +GtkCheckMenuItem *wired_menu_item_get_check_item (NMWiredMenuItem *item) +{ + g_return_val_if_fail (item != NULL, NULL); + + return item->check_item; +} + +void wired_menu_item_update (NMWiredMenuItem *item, NetworkDevice *dev, const gint n_devices) +{ + gchar *text; + gchar *dev_name; + + g_return_if_fail (dev != NULL); + g_return_if_fail (item != NULL); + g_assert (dev->type == DEVICE_TYPE_WIRED_ETHERNET); + + dev_name = dev->hal_name ? dev->hal_name : dev->nm_name; + + if (n_devices > 1) + text = g_strdup_printf (_("Wired Network (%s)"), dev_name); + else + text = g_strdup (_("Wired Network")); + + gtk_label_set_text (GTK_LABEL (item->label), text); + + /* Only dim the item if the device supports carrier detection AND + * we know it doesn't have a link. + */ + if (dev->supports_carrier_detect == TRUE) + gtk_widget_set_sensitive (GTK_WIDGET (item->check_item), dev->link); } -static void -nm_menu_wired_class_init (NMMenuWiredClass *klass) +/**************************************************************** + * Wireless menu item + ****************************************************************/ + +struct NMWirelessMenuItem { - GTK_WIDGET_CLASS (klass)->expose_event = nm_menu_wired_expose_event; -} + GtkMenuItem *menu_item; + GtkLabel *label; +}; -/* Bad hack */ -static gboolean -nm_menu_wired_expose_event (GtkWidget *widget, GdkEventExpose *event) + +static gboolean label_expose (GtkWidget *widget) { - gboolean retval; - GtkStyle *old_style; - - old_style = NM_MENU_WIRED (widget)->label->style; - NM_MENU_WIRED (widget)->label->style = - gtk_rc_get_style_by_paths (gtk_settings_get_default (), - "GtkWindow.GtkMenu.GtkMenuItem.GtkLabel", - "GtkWindow.GtkMenu.GtkMenuItem.GtkLabel", - GTK_TYPE_LABEL); - retval = GTK_WIDGET_CLASS (nm_menu_wired_parent_class)->expose_event (widget, event); - NM_MENU_WIRED (widget)->label->style = old_style; - - return retval; -} - -GtkWidget * -nm_menu_wired_new (void) -{ - GtkWidget *retval = g_object_new (nm_menu_wired_get_type (), NULL); - - return retval; -} - - -void -nm_menu_wired_update (NMMenuWired *menu_wired, - NetworkDevice *dev, - gint n_devices) -{ - gchar *text; - gchar *dev_name; - - g_assert (dev->type == DEVICE_TYPE_WIRED_ETHERNET); - - dev_name = dev->hal_name ? dev->hal_name : dev->nm_name; - - if (n_devices > 1) - text = g_strdup_printf (_("Wired Network (%s)"), dev_name); - else - text = g_strdup (_("Wired Network")); - - gtk_label_set_text (GTK_LABEL (menu_wired->label), text); - /* Only dim the item if the device supports carrier detection AND - * we know it doesn't have a link. - */ - if (dev->supports_carrier_detect == TRUE) - gtk_widget_set_sensitive (GTK_WIDGET (menu_wired), dev->link); -} - - -/* NMMenuNetwork */ -G_DEFINE_TYPE (NMMenuNetwork, nm_menu_network, GTK_TYPE_MENU_ITEM); - - -static gboolean -label_expose (GtkWidget *widget) -{ - /* Bad hack to make the label draw normally, instead of insensitive. */ - widget->state = GTK_STATE_NORMAL; + /* Bad hack to make the label draw normally, instead of insensitive. */ + widget->state = GTK_STATE_NORMAL; - return FALSE; + return FALSE; } -static void -nm_menu_network_init (NMMenuNetwork *menu_network) +NMWirelessMenuItem *wireless_menu_item_new (void) { - menu_network->label = gtk_label_new (NULL); + NMWirelessMenuItem *item = g_malloc0 (sizeof (NMWirelessMenuItem)); - /* Make sure it looks slightly different if the label determines the width of the widget */ - gtk_misc_set_padding (GTK_MISC (menu_network->label), 6, 0); - g_signal_connect (menu_network->label, "expose-event", G_CALLBACK (label_expose), NULL); + g_return_val_if_fail (item != NULL, NULL); - gtk_container_add (GTK_CONTAINER (menu_network), menu_network->label); - gtk_widget_show (menu_network->label); + item->menu_item = GTK_MENU_ITEM (gtk_menu_item_new ()); - gtk_widget_set_sensitive (GTK_WIDGET (menu_network), FALSE); + /* Make sure it looks slightly different if the label determines the width of the widget */ + item->label = GTK_LABEL (gtk_label_new (NULL)); + gtk_misc_set_padding (GTK_MISC (item->label), 6, 0); + g_signal_connect (G_OBJECT (item->label), "expose-event", G_CALLBACK (label_expose), NULL); + + gtk_container_add (GTK_CONTAINER (item->menu_item), GTK_WIDGET (item->label)); + gtk_widget_show (GTK_WIDGET (item->label)); + + gtk_widget_set_sensitive (GTK_WIDGET (item->menu_item), FALSE); + + return item; +} + +GtkMenuItem *wireless_menu_item_get_item (NMWirelessMenuItem *item) +{ + g_return_val_if_fail (item != NULL, NULL); + + return item->menu_item; +} + +void wireless_menu_item_update (NMWirelessMenuItem *item, NetworkDevice *dev, const gint n_devices) +{ + char *text; + const char *dev_name; + gint n_essids; + + n_essids = g_slist_length (dev->networks); + dev_name = dev->hal_name ? dev->hal_name : dev->nm_name; + + g_return_if_fail (dev != NULL); + g_return_if_fail (item != NULL); + g_assert (dev->type == DEVICE_TYPE_WIRELESS_ETHERNET); + + if (n_devices > 1) + text = g_strdup_printf (ngettext ("Wireless Network (%s)", "Wireless Networks (%s)", n_essids), dev_name); + else + text = g_strdup (ngettext ("Wireless Network", "Wireless Networks", n_essids)); + + gtk_label_set_markup (GTK_LABEL (item->label), text); + g_free (text); } -static void -nm_menu_network_class_init (NMMenuNetworkClass *menu_network) +/**************************************************************** + * Wireless Network menu item + ****************************************************************/ + +struct NMNetworkMenuItem { - + GtkCheckMenuItem *check_item; + GtkLabel *label; + GtkWidget *cell_view; + GtkWidget *security_image; + GObject *progress_bar; +}; + + +NMNetworkMenuItem *network_menu_item_new (GtkSizeGroup *encryption_size_group) +{ + GtkWidget *hbox; + NMNetworkMenuItem *item = g_malloc0 (sizeof (NMNetworkMenuItem)); + + g_return_val_if_fail (item != NULL, NULL); + + item->check_item = GTK_CHECK_MENU_ITEM (gtk_check_menu_item_new ()); + gtk_check_menu_item_set_draw_as_radio (item->check_item, TRUE); + + hbox = gtk_hbox_new (FALSE, 6); + item->label = GTK_LABEL (gtk_label_new (NULL)); + gtk_misc_set_alignment (GTK_MISC (item->label), 0.0, 0.5); + + item->security_image = gtk_image_new (); + gtk_size_group_add_widget (encryption_size_group, item->security_image); + + gtk_container_add (GTK_CONTAINER (item->check_item), hbox); + gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (item->label), TRUE, TRUE, 0); + item->cell_view = gtk_cell_view_new (); + item->progress_bar = g_object_new (GTK_TYPE_CELL_RENDERER_PROGRESS, "text", "", NULL); + gtk_cell_renderer_set_fixed_size (GTK_CELL_RENDERER (item->progress_bar), 150, -1); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (item->cell_view), GTK_CELL_RENDERER (item->progress_bar), TRUE); + gtk_box_pack_start (GTK_BOX (hbox), item->cell_view, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), item->security_image, FALSE, FALSE, 0); + + gtk_widget_show (GTK_WIDGET (item->label)); + gtk_widget_show (item->cell_view); + gtk_widget_show (hbox); + + return item; } -GtkWidget * -nm_menu_network_new (void) +GtkCheckMenuItem *network_menu_item_get_check_item (NMNetworkMenuItem *item) { - GtkWidget *retval = g_object_new (nm_menu_network_get_type (), NULL); + g_return_val_if_fail (item != NULL, NULL); - return retval; -} - - -void -nm_menu_network_update (NMMenuNetwork *menu_network, - NetworkDevice *network, - gint n_devices) -{ - char *text, *markup; - const char *network_name; - gint n_essids; - - n_essids = g_slist_length (network->networks); - network_name = network->hal_name ? network->hal_name : network->nm_name; - - g_assert (network->type == DEVICE_TYPE_WIRELESS_ETHERNET); - - if (n_devices > 1) - text = g_strdup_printf (ngettext ("Wireless Network (%s)", "Wireless Networks (%s)", n_essids), network_name); - else - text = g_strdup (ngettext ("Wireless Network", "Wireless Networks", n_essids)); - - markup = g_markup_printf_escaped ("%s", text); - gtk_label_set_markup (GTK_LABEL (menu_network->label), markup); - g_free (markup); - g_free (text); -} - -/* NMMenuWireless items*/ -G_DEFINE_TYPE (NMMenuWireless, nm_menu_wireless, GTK_TYPE_CHECK_MENU_ITEM); - -static void -nm_menu_wireless_init (NMMenuWireless *menu_info) -{ - GtkWidget *hbox; - - gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM (menu_info), TRUE); - hbox = gtk_hbox_new (FALSE, 6); - menu_info->label = gtk_label_new (NULL); - gtk_misc_set_alignment (GTK_MISC (menu_info->label), 0.0, 0.5); - menu_info->security_image = gtk_image_new (); - - gtk_container_add (GTK_CONTAINER (menu_info), hbox); - gtk_box_pack_start (GTK_BOX (hbox), menu_info->label, TRUE, TRUE, 0); - menu_info->cell_view = gtk_cell_view_new (); - menu_info->progress_bar = g_object_new (GTK_TYPE_CELL_RENDERER_PROGRESS, - "text", "", - NULL); - gtk_cell_renderer_set_fixed_size (GTK_CELL_RENDERER (menu_info->progress_bar), 150, -1); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (menu_info->cell_view), - GTK_CELL_RENDERER (menu_info->progress_bar), - TRUE); - gtk_box_pack_start (GTK_BOX (hbox), menu_info->cell_view, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (hbox), menu_info->security_image, FALSE, FALSE, 0); - - gtk_widget_show (menu_info->label); - gtk_widget_show (menu_info->cell_view); - gtk_widget_show (hbox); -} - -static void -nm_menu_wireless_class_init (NMMenuWirelessClass *menu_info_class) -{ - GTK_WIDGET_CLASS (menu_info_class)->expose_event = nm_menu_wireless_expose_event; -} - -GtkWidget * -nm_menu_wireless_new (GtkSizeGroup *encryption_size_group) -{ - GtkWidget *retval = g_object_new (nm_menu_wireless_get_type (), NULL); - - gtk_size_group_add_widget (encryption_size_group, - NM_MENU_WIRELESS (retval)->security_image); - - return retval; -} - -/* Bad hack */ -static gboolean -nm_menu_wireless_expose_event (GtkWidget *widget, GdkEventExpose *event) -{ - gboolean retval; - GtkStyle *old_style; - - old_style = NM_MENU_WIRELESS (widget)->label->style; - NM_MENU_WIRELESS (widget)->label->style = - gtk_rc_get_style_by_paths (gtk_settings_get_default (), - "GtkWindow.GtkMenu.GtkMenuItem.GtkLabel", - "GtkWindow.GtkMenu.GtkMenuItem.GtkLabel", - GTK_TYPE_LABEL); - retval = GTK_WIDGET_CLASS (nm_menu_wireless_parent_class)->expose_event (widget, event); - NM_MENU_WIRELESS (widget)->label->style = old_style; - - return retval; + return item->check_item; } /* has_encrypted means that the wireless network has an encrypted * area, and thus we need to allow for spacing. */ -void -nm_menu_wireless_update (NMMenuWireless *menu_info, - WirelessNetwork *network, - gboolean has_encrypted) +void network_menu_item_update (NMNetworkMenuItem *item, WirelessNetwork *network, const gboolean is_encrypted) { - char *display_essid; + char *display_essid; - display_essid = nm_menu_wireless_escape_essid_for_display (network->essid); - gtk_label_set_text (GTK_LABEL (menu_info->label), display_essid); - g_free (display_essid); + g_return_if_fail (item != NULL); + g_return_if_fail (network != NULL); - g_object_set (G_OBJECT (menu_info->progress_bar), - "value", CLAMP ((int) network->strength, 0, 100), - NULL); + display_essid = nm_menu_network_escape_essid_for_display (network->essid); + gtk_label_set_text (GTK_LABEL (item->label), display_essid); + g_free (display_essid); - /* Deal with the encrypted icon */ - g_object_set (menu_info->security_image, "visible", has_encrypted, NULL); + g_object_set (G_OBJECT (item->progress_bar), "value", CLAMP ((int) network->strength, 0, 100), NULL); - if (network->encrypted) - gtk_image_set_from_stock (GTK_IMAGE (menu_info->security_image), "gnome-lockscreen", GTK_ICON_SIZE_MENU); - else - gtk_image_set_from_stock (GTK_IMAGE (menu_info->security_image), NULL, GTK_ICON_SIZE_MENU); + /* Deal with the encrypted icon */ + g_object_set (item->security_image, "visible", is_encrypted, NULL); + + if (network->encrypted) + gtk_image_set_from_stock (GTK_IMAGE (item->security_image), "gnome-lockscreen", GTK_ICON_SIZE_MENU); + else + gtk_image_set_from_stock (GTK_IMAGE (item->security_image), NULL, GTK_ICON_SIZE_MENU); } + + +/**************************************************************** + * Utility stuff + ****************************************************************/ + /* This is copied from eel. */ -static char * -eel_make_valid_utf8 (const char *name) +static char *eel_make_valid_utf8 (const char *name) { GString *string; const char *remainder, *invalid; @@ -324,11 +297,10 @@ eel_make_valid_utf8 (const char *name) return g_string_free (string, FALSE); } -char * -nm_menu_wireless_escape_essid_for_display (const char *essid) +char *nm_menu_network_escape_essid_for_display (const char *essid) { - if (g_utf8_validate (essid, -1, NULL)) - return g_strdup (essid); - else - return eel_make_valid_utf8 (essid); + if (g_utf8_validate (essid, -1, NULL)) + return g_strdup (essid); + else + return eel_make_valid_utf8 (essid); } diff --git a/panel-applet/menu-info.h b/panel-applet/menu-info.h index 1e855e38d2..9141e86930 100644 --- a/panel-applet/menu-info.h +++ b/panel-applet/menu-info.h @@ -22,83 +22,29 @@ #ifndef MENU_INFO_H #define MENU_INFO_H - -/* We have two widgets that we use here. - */ #include #include "NMWirelessApplet.h" -#define NM_TYPE_MENU_WIRED (nm_menu_wired_get_type ()) -#define NM_MENU_WIRED(widget) (G_TYPE_CHECK_INSTANCE_CAST ((widget), NM_TYPE_MENU_WIRED, NMMenuWired)) -#define NM_TYPE_MENU_NETWORK (nm_menu_network_get_type ()) -#define NM_MENU_NETWORK(widget) (G_TYPE_CHECK_INSTANCE_CAST ((widget), NM_TYPE_MENU_NETWORK, NMMenuNetwork)) - -#define NM_TYPE_MENU_WIRELESS (nm_menu_wireless_get_type ()) -#define NM_MENU_WIRELESS(widget) (G_TYPE_CHECK_INSTANCE_CAST ((widget), NM_TYPE_MENU_WIRELESS, NMMenuWireless)) +typedef struct NMWiredMenuItem NMWiredMenuItem; +typedef struct NMWirelessMenuItem NMWirelessMenuItem; +typedef struct NMNetworkMenuItem NMNetworkMenuItem; -typedef struct -{ - GtkCheckMenuItemClass parent_class; -} NMMenuWiredClass; +NMWiredMenuItem *wired_menu_item_new (void); +GtkCheckMenuItem *wired_menu_item_get_check_item (NMWiredMenuItem *item); +void wired_menu_item_update (NMWiredMenuItem *item, NetworkDevice *dev, const gint n_devices); -typedef struct -{ - GtkCheckMenuItem parent; - GtkWidget *label; -} NMMenuWired; +NMWirelessMenuItem *wireless_menu_item_new (void); +GtkMenuItem *wireless_menu_item_get_item (NMWirelessMenuItem *item); +void wireless_menu_item_update (NMWirelessMenuItem *item, NetworkDevice *dev, const gint n_devices); - -typedef struct -{ - GtkMenuItemClass parent_class; -} NMMenuNetworkClass; - -typedef struct -{ - GtkMenuItem parent; - GtkWidget *event_box; - GtkWidget *label; -} NMMenuNetwork; - - -typedef struct -{ - GtkCheckMenuItemClass parent_class; -} NMMenuWirelessClass; - -typedef struct -{ - GtkCheckMenuItem parent; - GtkWidget *label; - GtkWidget *cell_view; - GtkWidget *security_image; - GObject *progress_bar; -} NMMenuWireless; - - - -GType nm_menu_wired_get_type (void); -GtkWidget *nm_menu_wired_new (void); -void nm_menu_wired_update (NMMenuWired *menu_wired, - NetworkDevice *network, - gint n_devices); - -GType nm_menu_network_get_type (void); -GtkWidget *nm_menu_network_new (void); -void nm_menu_network_update (NMMenuNetwork *menu_network, - NetworkDevice *network, - gint n_devices); - -GType nm_menu_wireless_get_type (void); -GtkWidget *nm_menu_wireless_new (GtkSizeGroup *encryption_size_group); -void nm_menu_wireless_update (NMMenuWireless *menu_info, - WirelessNetwork *network, - gboolean has_encrypted); +NMNetworkMenuItem *network_menu_item_new (GtkSizeGroup *encryption_size_group); +GtkCheckMenuItem *network_menu_item_get_check_item (NMNetworkMenuItem *item); +void network_menu_item_update (NMNetworkMenuItem *item, WirelessNetwork *network, const gboolean is_encrypted); /* Helper function; escapes an essid for human readable display. */ -char *nm_menu_wireless_escape_essid_for_display (const char *essid); +char *nm_menu_network_escape_essid_for_display (const char *essid); #endif /* MENU_INFO_H */