diff --git a/ChangeLog b/ChangeLog index a35b1d441..1280e4f71 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Tue Sep 21 18:05:34 2004 Jonathan Blandford + + * configure.in: Add graphics + + * panel-applet/Makefile.am: Add graphics + + * panel-applet/icons/*: Add graphics + + * panel-applet/NMWirelessApplet.c: Use new menu times to display + the icons fully lined up. + + * panel-applet/menu-info.c: + * panel-applet/menu-info.h: Add another menu type. + Fri Sep 17 14:04:34 2004 Jonathan Blandford * panel-applet/NMWirelessApplet.c: Redo the menu item code. diff --git a/configure.in b/configure.in index c4df2964c..27a784f46 100644 --- a/configure.in +++ b/configure.in @@ -141,6 +141,7 @@ src/Makefile dispatcher-daemon/Makefile info-daemon/Makefile panel-applet/Makefile +panel-applet/icons/Makefile test/Makefile initscript/Makefile initscript/RedHat/Makefile diff --git a/panel-applet/Makefile.am b/panel-applet/Makefile.am index 17928ade9..a0b20e11c 100644 --- a/panel-applet/Makefile.am +++ b/panel-applet/Makefile.am @@ -1,3 +1,5 @@ +SUBDIRS=icons + NULL= INCLUDES = \ diff --git a/panel-applet/NMWirelessApplet.c b/panel-applet/NMWirelessApplet.c index 86181b846..f44cc351d 100644 --- a/panel-applet/NMWirelessApplet.c +++ b/panel-applet/NMWirelessApplet.c @@ -566,48 +566,46 @@ static void nmwa_menu_add_text_item (GtkWidget *menu, char *text) * Add a network device to the menu * */ -static void nmwa_menu_add_device_item (GtkWidget *menu, GdkPixbuf *icon, char *name, char *nm_device, gboolean current, NMWirelessApplet *applet) +static void nmwa_menu_add_device_item (GtkWidget *menu, NetworkDevice *device, gboolean current, gboolean multiple_devices, NMWirelessApplet *applet) { GtkWidget *menu_item; - GtkWidget *label; - GtkWidget *hbox; - GtkWidget *image; g_return_if_fail (menu != NULL); - g_return_if_fail (icon != NULL); - g_return_if_fail (name != NULL); - g_return_if_fail (nm_device != NULL); - menu_item = gtk_check_menu_item_new (); - hbox = gtk_hbox_new (FALSE, 2); - gtk_container_add (GTK_CONTAINER (menu_item), hbox); - gtk_widget_show (hbox); + menu_item = nm_menu_network_new (applet->image_size_group); + nm_menu_network_update (NM_MENU_NETWORK (menu_item), device, multiple_devices); - if ((image = gtk_image_new_from_pixbuf (icon))) - { - gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0); - gtk_widget_show (image); - gtk_size_group_add_widget (applet->image_size_group, image); - } - - label = gtk_label_new (name); - if (current) - { - char *markup = g_markup_printf_escaped ("%s", name); - gtk_label_set_markup (GTK_LABEL (label), markup); - g_free (markup); - } - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0); - gtk_widget_show (label); - - g_object_set_data (G_OBJECT (menu_item), "device", g_strdup (nm_device)); + 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); } +static void nmwa_menu_add_custom_essid_item (GtkWidget *menu, NetworkDevice *device, NMWirelessApplet *applet) +{ + GtkWidget *menu_item; + GtkWidget *spacer; + GtkWidget *hbox; + GtkWidget *label; + + menu_item = gtk_menu_item_new (); + hbox = gtk_hbox_new (FALSE, 2); + spacer = gtk_frame_new (NULL); + gtk_size_group_add_widget (applet->image_size_group, spacer); + gtk_frame_set_shadow_type (GTK_FRAME (spacer), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (hbox), spacer, FALSE, FALSE, 0); + label = gtk_label_new (_("Other Wireless Network...")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (menu_item), hbox); + g_object_set_data (G_OBJECT (menu_item), "device", g_strdup (device->nm_device)); + gtk_widget_set_sensitive (menu_item, FALSE); // FIXME: make this work. + gtk_widget_show_all (menu_item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); +} + /* * nmwa_menu_device_add_networks @@ -625,23 +623,11 @@ static void nmwa_menu_device_add_networks (GtkWidget *menu, NetworkDevice *dev, if (dev->type != DEVICE_TYPE_WIRELESS_ETHERNET) return; - if (dev->networks == NULL) - { - nmwa_menu_add_text_item (menu, _("There are no wireless networks...")); - return; - } - /* Check for any security */ for (list = dev->networks; list; list = list->next) { WirelessNetwork *network = list->data; - if (FALSE && !has_encrypted)//BADHACKTOTEST - { // REMOVE! - network->encrypted = TRUE; // REMOVE! - network->active = TRUE; // REMOVE! - } // REMOVE! - if (network->encrypted) has_encrypted = TRUE; } @@ -665,6 +651,9 @@ static void nmwa_menu_device_add_networks (GtkWidget *menu, NetworkDevice *dev, gtk_widget_show (menu_item); } + + /* Add the 'Select a custom esssid entry */ + nmwa_menu_add_custom_essid_item (menu, dev, applet); } @@ -675,37 +664,59 @@ static void nmwa_menu_device_add_networks (GtkWidget *menu, NetworkDevice *dev, static void nmwa_menu_add_devices (GtkWidget *menu, NMWirelessApplet *applet) { GSList *element; + gint n_wireless_interfaces = 0; + gint n_wired_interfaces = 0; g_return_if_fail (menu != NULL); g_return_if_fail (applet != NULL); g_mutex_lock (applet->data_mutex); - element = applet->devices; - if (!element) - nmwa_menu_add_text_item (menu, _("There are no network devices...")); - else + + if (! applet->devices) { - /* Add all devices in our device list to the menu */ - while (element) + nmwa_menu_add_text_item (menu, _("No network devices have been found")); + return; + } + + for (element = applet->devices; element; element = element->next) + { + NetworkDevice *dev = (NetworkDevice *)(element->data); + + g_assert (dev); + + switch (dev->type) { - NetworkDevice *dev = (NetworkDevice *)(element->data); - - if (dev && ((dev->type == DEVICE_TYPE_WIRED_ETHERNET) || (dev->type == DEVICE_TYPE_WIRELESS_ETHERNET))) - { - GdkPixbuf *icon = (dev->type == DEVICE_TYPE_WIRED_ETHERNET) ? applet->wired_icon : applet->wireless_icon; - char *name_string; - gboolean current = (dev == applet->active_device); - - name_string = g_strdup_printf ("%s (%s)", (dev->hal_name ? dev->hal_name : dev->nm_name), - (dev->type == DEVICE_TYPE_WIRED_ETHERNET) ? "wired" : "wireless"); - nmwa_menu_add_device_item (menu, icon, name_string, dev->nm_device, current, applet); - g_free (name_string); - nmwa_menu_device_add_networks (menu, dev, applet); - nmwa_menu_add_separator_item (menu); - } - element = g_slist_next (element); + case DEVICE_TYPE_WIRELESS_ETHERNET: + n_wireless_interfaces++; + break; + case DEVICE_TYPE_WIRED_ETHERNET: + n_wired_interfaces++; + break; + default: + break; } } + + /* Add all devices in our device list to the menu */ + for (element = applet->devices; element; element = element->next) + { + NetworkDevice *dev = (NetworkDevice *)(element->data); + + if (dev && ((dev->type == DEVICE_TYPE_WIRED_ETHERNET) || (dev->type == DEVICE_TYPE_WIRELESS_ETHERNET))) + { + gboolean current = (dev == applet->active_device); + gboolean multiple_devices; + + if (dev->type == DEVICE_TYPE_WIRED_ETHERNET) + multiple_devices = (n_wired_interfaces > 1); + else if (dev->type == DEVICE_TYPE_WIRELESS_ETHERNET) + multiple_devices = (n_wireless_interfaces > 1); + + nmwa_menu_add_device_item (menu, dev, current, multiple_devices, applet); + nmwa_menu_device_add_networks (menu, dev, applet); + } + } + g_mutex_unlock (applet->data_mutex); } @@ -774,9 +785,7 @@ static GtkWidget * nmwa_populate_menu (NMWirelessApplet *applet) return NULL; } - nmwa_menu_add_text_item (menu, _("Network Connections")); nmwa_menu_add_devices (menu, applet); - nmwa_menu_add_text_item (menu, _("Other Wireless Network...")); return (menu); } @@ -992,6 +1001,14 @@ setup_stock (void) ifactory = gtk_icon_factory_new (); iset = gtk_icon_set_new (); isource = gtk_icon_source_new (); + + /* Set up custom stock images. We a bunch of icons. */ + /* All but gnome-lockscreen are icons we install. */ + gtk_icon_source_set_icon_name (isource, "nm-"); + gtk_icon_set_add_source (iset, isource); + gtk_icon_factory_add (ifactory, "gnome-lockscreen", iset); + gtk_icon_factory_add_default (ifactory); + gtk_icon_source_set_icon_name (isource, "gnome-lockscreen"); gtk_icon_set_add_source (iset, isource); gtk_icon_factory_add (ifactory, "gnome-lockscreen", iset); diff --git a/panel-applet/icons/.cvsignore b/panel-applet/icons/.cvsignore new file mode 100644 index 000000000..3dda72986 --- /dev/null +++ b/panel-applet/icons/.cvsignore @@ -0,0 +1,2 @@ +Makefile.in +Makefile diff --git a/panel-applet/icons/Makefile.am b/panel-applet/icons/Makefile.am new file mode 100644 index 000000000..3c1d9a091 --- /dev/null +++ b/panel-applet/icons/Makefile.am @@ -0,0 +1,10 @@ +NULL = + +largeicondir=${datadir}/icons/hicolor/48x48/apps +largeicon_DATA=\ + nm-device-wired.png \ + nm-device-wireless.png \ + $(NULL) + +EXTRA_DIST=\ + $(largeicon_DATA) diff --git a/panel-applet/icons/nm-device-wired.png b/panel-applet/icons/nm-device-wired.png new file mode 100644 index 000000000..1bf6d7d34 Binary files /dev/null and b/panel-applet/icons/nm-device-wired.png differ diff --git a/panel-applet/icons/nm-device-wireless.png b/panel-applet/icons/nm-device-wireless.png new file mode 100644 index 000000000..a3e9e26f6 Binary files /dev/null and b/panel-applet/icons/nm-device-wireless.png differ diff --git a/panel-applet/menu-info.c b/panel-applet/menu-info.c index 7b9527eaa..777d520ca 100644 --- a/panel-applet/menu-info.c +++ b/panel-applet/menu-info.c @@ -28,7 +28,151 @@ #include "menu-info.h" #include "gtkcellview.h" #include "gtkcellrendererprogress.h" +#include "NMWirelessAppletDbus.h" +#include +G_DEFINE_TYPE (NMMenuNetwork, nm_menu_network, GTK_TYPE_CHECK_MENU_ITEM); + +static void nm_menu_network_update_image (NMMenuNetwork *menu_network); + +static void +nm_menu_network_init (NMMenuNetwork *menu_network) +{ + GtkWidget *hbox; + + gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM (menu_network), TRUE); + hbox = gtk_hbox_new (FALSE, 2); + menu_network->image = gtk_image_new (); + gtk_box_pack_start (GTK_BOX (hbox), menu_network->image, FALSE, FALSE, 0); + menu_network->label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (menu_network->label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), menu_network->label, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (menu_network), hbox); + gtk_widget_show_all (hbox); +} + + +static void +nm_menu_network_style_set (GtkWidget *widget, + GtkStyle *previous_style) +{ + GTK_WIDGET_CLASS (nm_menu_network_parent_class)->style_set (widget, previous_style); + + nm_menu_network_update_image (NM_MENU_NETWORK (widget)); +} + +static void +nm_menu_network_draw_indicator (GtkCheckMenuItem *check_menu_item, + GdkRectangle *area) +{ + /* Only draw the indicator if we're an ethernet device */ + if (NM_MENU_NETWORK (check_menu_item)->type == DEVICE_TYPE_WIRELESS_ETHERNET) + GTK_CHECK_MENU_ITEM_CLASS (nm_menu_network_parent_class)->draw_indicator (check_menu_item, area); +} + +static void +nm_menu_network_class_init (NMMenuNetworkClass *menu_network) +{ + GtkWidgetClass *widget_class; + GtkCheckMenuItemClass *check_menu_item_class; + + widget_class = GTK_WIDGET_CLASS (menu_network); + check_menu_item_class = GTK_CHECK_MENU_ITEM_CLASS (menu_network); + + widget_class->style_set = nm_menu_network_style_set; + check_menu_item_class->draw_indicator = nm_menu_network_draw_indicator; +} + +GtkWidget * +nm_menu_network_new (GtkSizeGroup *image_size_group) +{ + GtkWidget *retval = g_object_new (nm_menu_network_get_type (), NULL); + + gtk_size_group_add_widget (image_size_group, + NM_MENU_NETWORK (retval)->image); + + return retval; +} + +/* updates the image based on the icon type. It is called when themes + * change too as the icon size is theme dependent */ +static void +nm_menu_network_update_image (NMMenuNetwork *menu_network) +{ + GtkIconTheme *icon_theme; + GdkPixbuf *icon; + const gchar *icon_name = NULL; + gint size; + + if (menu_network->type == DEVICE_TYPE_WIRED_ETHERNET) + { + icon_name = "nm-device-wired"; + } + else if (menu_network->type == DEVICE_TYPE_WIRELESS_ETHERNET) + { + icon_name = "nm-device-wireless"; + } + else + { + gtk_image_set_from_pixbuf (GTK_IMAGE (menu_network->image), NULL); + return; + } + + gtk_icon_size_lookup_for_settings (gtk_settings_get_default (), + GTK_ICON_SIZE_MENU, + &size, NULL); + + icon_theme = gtk_icon_theme_get_default (); + icon = gtk_icon_theme_load_icon (icon_theme, + icon_name, + size, 0, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE (menu_network->image), icon); + if (icon) + g_object_unref (icon); +} + +void +nm_menu_network_update (NMMenuNetwork *menu_network, + NetworkDevice *network, + gint n_devices) +{ + char *text; + const char *network_name; + gint n_essids; + + menu_network->type = network->type; + n_essids = g_slist_length (network->networks); + network_name = network->hal_name ? network->hal_name : network->nm_name; + + switch (menu_network->type) + { + case DEVICE_TYPE_WIRED_ETHERNET: + if (n_devices > 1) + text = g_strdup_printf (_("Wired Network (%s)"), network_name); + else + text = g_strdup (_("Wired Network")); + break; + case 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)); + break; + default: + g_assert_not_reached (); + break; + } + gtk_label_set_text (GTK_LABEL (menu_network->label), text); + g_free (text); + nm_menu_network_update_image (menu_network); + + if (menu_network->type == DEVICE_TYPE_WIRELESS_ETHERNET) + gtk_widget_set_sensitive (GTK_WIDGET (menu_network), FALSE); + else + gtk_widget_set_sensitive (GTK_WIDGET (menu_network), TRUE); +} + +/* NMMenuWireless items*/ G_DEFINE_TYPE (NMMenuWireless, nm_menu_wireless, GTK_TYPE_CHECK_MENU_ITEM); static void @@ -94,19 +238,9 @@ nm_menu_wireless_update (NMMenuWireless *menu_info, char *display_essid; display_essid = nm_menu_wireless_escape_essid_for_display (network->essid); - if (network->active) - { - char *markup_essid; - markup_essid = g_markup_printf_escaped ("%s", display_essid); - gtk_label_set_markup (GTK_LABEL (menu_info->label), markup_essid); - g_free (markup_essid); - } - else - { - gtk_label_set_text (GTK_LABEL (menu_info->label), display_essid); - } - + gtk_label_set_text (GTK_LABEL (menu_info->label), display_essid); g_free (display_essid); + g_object_set (G_OBJECT (menu_info->progress_bar), "value", CLAMP ((int) network->strength, 0, 100), NULL); diff --git a/panel-applet/menu-info.h b/panel-applet/menu-info.h index d2a24a124..828f51333 100644 --- a/panel-applet/menu-info.h +++ b/panel-applet/menu-info.h @@ -1,4 +1,4 @@ -/* menu-info.h: Simple menu item for the Applet to use +/* menu-info.h: Simple menu items for the Applet to use * * Jonathan Blandford * @@ -23,11 +23,30 @@ #define MENU_INFO_H +/* We have two widgets that we use here. + */ #include #include "NMWirelessApplet.h" -#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)) +#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 +{ + GtkCheckMenuItemClass parent_class; +} NMMenuNetworkClass; + +typedef struct +{ + GtkCheckMenuItem parent; + GtkWidget *image; + GtkWidget *label; + int type; +} NMMenuNetwork; + typedef struct { @@ -45,6 +64,14 @@ typedef struct } NMMenuWireless; + + +GType nm_menu_network_get_type (void); +GtkWidget *nm_menu_network_new (GtkSizeGroup *image_size_group); +void nm_menu_network_update (NMMenuNetwork *menu_network, + NetworkDevice *network, + gboolean multiple_devices); + GType nm_menu_wireless_get_type (void); GtkWidget *nm_menu_wireless_new (GtkSizeGroup *image_size_group, GtkSizeGroup *encryption_size_group);