diff --git a/ChangeLog b/ChangeLog index 89760a3b53..61526dd6a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +Wed Sep 29 18:18:24 2004 Jonathan Blandford + + * configure.in: Add a temporary --enable-notification-icon. This + will prolly go away. + + * info-daemon/Makefile.am: + * info-daemon/NetworkManagerInfo.c: + * info-daemon/NetworkManagerInfo.h: Use a notification icon. + + * panel-applet/Makefile.am: + * panel-applet/NMWirelessApplet.c: Turn into a notification icon + * panel-applet/NMWirelessApplet.h: + Tue Sep 28 16:35:20 2004 Jonathan Blandford * panel-applet/NMWirelessApplet.c: Fix deadlock. Add a separator diff --git a/Makefile.am b/Makefile.am index b8877fb813..cbb50ccc79 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src dispatcher-daemon info-daemon panel-applet initscript test po +SUBDIRS = src dispatcher-daemon $(notification_icon_dir) info-daemon initscript test po EXTRA_DIST = CONTRIBUTING NetworkManager.pc.in diff --git a/configure.in b/configure.in index 27a784f462..6da2c2c999 100644 --- a/configure.in +++ b/configure.in @@ -8,6 +8,8 @@ AM_CONFIG_HEADER(config.h) AC_PROG_CC AM_PROG_CC_C_O +AC_PROG_LIBTOOL + GETTEXT_PACKAGE=NetworkManager AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package]) @@ -135,6 +137,46 @@ fi AC_SUBST(DBUS_SYS_DIR) AC_DEFINE_UNQUOTED(DBUS_SYSTEMD_DIR, "$DBUS_SYS_DIR", [Where system.d dir for DBUS is]) +AC_ARG_ENABLE(notification-icon, [ --enable-notification-icon builds the wireless applet as a notification icon], enable_notification_icon=$enableval, enable_notification_icon=yes) + +AM_CONDITIONAL(BUILD_NOTIFICATION_ICON, test x$enable_notification_icon = xyes) +if test x$enable_notification_icon == xyes ; then + AC_DEFINE_UNQUOTED(BUILD_NOTIFICATION_ICON, "$BUILD_NOTIFICATION_ICON", [Should we build the notification icon instead of the applet]) + notification_icon_dir="panel-applet" + AC_SUBST(notification_icon_dir) +fi + +#### find the actual value for $prefix that we'll end up with +## (I know this is broken and should be done in the Makefile, but +## that's a major pain and almost nobody actually seems to care) +REAL_PREFIX= +if test "x$prefix" = "xNONE"; then + REAL_PREFIX=$ac_default_prefix +else + REAL_PREFIX=$prefix +fi + +## temporarily change prefix and exec_prefix +old_prefix=$prefix +prefix=$REAL_PREFIX + +if test "x$exec_prefix" = xNONE ; then + REAL_EXEC_PREFIX=$REAL_PREFIX +else + REAL_EXEC_PREFIX=$exec_prefix +fi +old_exec_prefix=$exec_prefix +exec_prefix=$REAL_EXEC_PREFIX + +BINDIR_TMP="$bindir" +EXPANDED_BINDIR=`eval echo $BINDIR_TMP` +AC_SUBST(EXPANDED_BINDIR) +AC_DEFINE_UNQUOTED(EXPANDED_BINDIR, "$EXPANDED_BINDIR", [Where the executables are installed]) + +## put prefix and exec_prefix back +prefix=$old_prefix +exec_prefix=$old_exec_prefix + AC_OUTPUT([ Makefile src/Makefile diff --git a/info-daemon/Makefile.am b/info-daemon/Makefile.am index 5584484003..3cd232740e 100644 --- a/info-daemon/Makefile.am +++ b/info-daemon/Makefile.am @@ -2,20 +2,21 @@ INCLUDES = \ $(NM_CFLAGS) \ $(GTK_CFLAGS) \ - $(GDK_PIXBUF_CFLAGS) \ - $(GLADE_CFLAGS) \ - $(GCONF_CFLAGS) \ - $(LIBGNOMEUI_CFLAGS) \ + $(GDK_PIXBUF_CFLAGS) \ + $(GLADE_CFLAGS) \ + $(GCONF_CFLAGS) \ + $(LIBGNOMEUI_CFLAGS) \ -Wall \ - -DDBUS_API_SUBJECT_TO_CHANGE \ - -DG_DISABLE_DEPRECATED \ + -DDBUS_API_SUBJECT_TO_CHANGE \ + -DG_DISABLE_DEPRECATED \ -DGTK_DISABLE_DEPRECATED \ - -DGLADEDIR=\""$(datadir)/NetworkManagerInfo/glade"\" \ - -DBINDIR=\"$(bindir)\" \ + -DGLADEDIR=\""$(datadir)/NetworkManagerInfo/glade"\" \ + -DBINDIR=\"$(bindir)\" \ -DPREFIX=\""$(prefix)"\" \ - -DSYSCONFDIR=\""$(sysconfdir)"\" \ - -DVERSION="\"$(VERSION)\"" \ + -DSYSCONFDIR=\""$(sysconfdir)"\" \ + -DVERSION="\"$(VERSION)\"" \ -DLIBDIR=\""$(libdir)"\" \ + -DLIBEXECDIR=\""$(libexecdir)"\" \ -DDATADIR=\"$(datadir)\" bin_PROGRAMS = NetworkManagerInfo @@ -29,7 +30,12 @@ NetworkManagerInfo_SOURCES = NetworkManagerInfo.h \ NetworkManagerInfoNetworksDialog.c \ NetworkManagerInfoNetworksDialog.h -NetworkManagerInfo_LDADD = $(NM_LIBS) $(GLADE_LIBS) $(GCONF_LIBS) $(GTK_LIBS) $(GDK_PIXBUF_LIBS) $(LIBGNOMEUI_LIBS) +NetworkManagerInfo_LDADD = $(NM_LIBS) \ + $(GLADE_LIBS) \ + $(GCONF_LIBS) \ + $(GTK_LIBS) \ + $(GDK_PIXBUF_LIBS) \ + $(LIBGNOMEUI_LIBS) gladedir = $(datadir)/NetworkManagerInfo/glade glade_DATA = passphrase.glade keyring.png networks.glade diff --git a/info-daemon/NetworkManagerInfo.c b/info-daemon/NetworkManagerInfo.c index efd1e05a76..cf9f32c977 100644 --- a/info-daemon/NetworkManagerInfo.c +++ b/info-daemon/NetworkManagerInfo.c @@ -35,6 +35,9 @@ #include #include #include +#include +#include +#include "config.h" #include "NetworkManagerInfoDbus.h" #include "NetworkManagerInfo.h" #include "NetworkManagerInfoPassphraseDialog.h" @@ -91,6 +94,7 @@ int main( int argc, char *argv[] ) NMIAppInfo *app_info = NULL; GMainLoop *loop; guint notify_id; + GError *error; struct poptOption options[] = { @@ -99,6 +103,8 @@ int main( int argc, char *argv[] ) { NULL, '\0', 0, NULL, 0, NULL, NULL } }; + gchar *notification_icon_cmd[] = {LIBEXECDIR"/NetworkManagerNotification"}; + options[0].arg = &no_daemon; program = gnome_program_init ("NetworkManagerInfo", VERSION, @@ -175,16 +181,38 @@ int main( int argc, char *argv[] ) if (err == -1) exit (1); - gtk_init (&argc, &argv); + gnome_program_init ("NetworkManagerInfo", VERSION, LIBGNOMEUI_MODULE, + argc, argv, + GNOME_PARAM_NONE); + + + app_info->notification_icon_pid = 0; + +#ifdef BUILD_NOTIFICATION_ICON + /*spawn the panel notification icon*/ + if (!g_spawn_async (NULL, + notification_icon_cmd, + NULL, 0, NULL, NULL, + &(app_info->notification_icon_pid), + &error)) + { + g_warning ("Could not spawn NetworkManager's notification icon (%s)", error->message); + g_error_free (error); + } + +#endif if (nmi_passphrase_dialog_init (app_info) != 0) exit (1); - loop = g_main_loop_new (NULL, FALSE); - g_main_loop_run (loop); + gtk_main (); + + if (app_info->notification_icon_pid > 0) + kill (app_info->notification_icon_pid, SIGTERM); gconf_client_notify_remove (app_info->gconf_client, notify_id); g_object_unref (G_OBJECT (app_info->gconf_client)); + /*g_object_unref (app_info->notification_icon);*/ g_free (app_info); return 0; diff --git a/info-daemon/NetworkManagerInfo.h b/info-daemon/NetworkManagerInfo.h index 29c46ab4d1..72a55f6bb5 100644 --- a/info-daemon/NetworkManagerInfo.h +++ b/info-daemon/NetworkManagerInfo.h @@ -42,6 +42,12 @@ struct NMIAppInfo GtkListStore *networks_list_store; GdkPixbuf *padlock_pixbuf; + + /* + GtkWidget *notification_icon; + */ + GPid notification_icon_pid; + }; typedef struct NMIAppInfo NMIAppInfo; diff --git a/info-daemon/NetworkManagerInfoDbus.c b/info-daemon/NetworkManagerInfoDbus.c index dbe6444d7a..a9ab7e624e 100644 --- a/info-daemon/NetworkManagerInfoDbus.c +++ b/info-daemon/NetworkManagerInfoDbus.c @@ -586,7 +586,7 @@ int nmi_dbus_service_init (DBusConnection *dbus_connection, NMIAppInfo *info) dbus_bus_acquire_service (dbus_connection, NMI_DBUS_SERVICE, 0, &dbus_error); if (dbus_error_is_set (&dbus_error)) { - syslog (LOG_ERR, "nmi_dbus_service_init() could not acquire service %s. dbus_bus_acquire_service() says: '%s'", NMI_DBUS_SERVICE, dbus_error.message); + syslog (LOG_ERR, "nmi_dbus_service_init() could not acquire its service. dbus_bus_acquire_service() says: '%s'", dbus_error.message); dbus_error_free (&dbus_error); return (-1); } diff --git a/panel-applet/Makefile.am b/panel-applet/Makefile.am index a0b20e11c8..a1df1e7b18 100644 --- a/panel-applet/Makefile.am +++ b/panel-applet/Makefile.am @@ -1,12 +1,16 @@ SUBDIRS=icons NULL= +NOTIFICATION_ICON_SOURCE=@NOTIFICATION_ICON_SRC@ INCLUDES = \ $(NM_CFLAGS) \ $(GLADE_CFLAGS) \ $(DBUS_CFLAGS) \ $(DBUS_GLIB_CFLAGS) \ + $(GTK_CFLAGS) \ + $(GCONF_CFLAGS) \ + $(LIBGNOMEUI_CFLAGS) \ $(PANEL_APPLET_CFLAGS) \ -DICONDIR=\""$(datadir)/pixmaps"\" \ -DG_DISABLE_DEPRECATED \ @@ -15,11 +19,11 @@ INCLUDES = \ -DGNOMELOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ $(NULL) -libexec_PROGRAMS = NMWirelessApplet +noinst_LTLIBRARIES = libnm_notification_applet.la -NMWirelessApplet_SOURCES = \ - NMWirelessApplet.c \ - NMWirelessApplet.h \ +libnm_notification_applet_la_SOURCES = \ + NMWirelessApplet.c \ + NMWirelessApplet.h \ NMWirelessAppletDbus.c \ NMWirelessAppletDbus.h \ menu-info.c \ @@ -30,20 +34,25 @@ NMWirelessApplet_SOURCES = \ gtkcellrendererprogress.h \ $(NULL) -NMWirelessApplet_LDADD = \ +libnm_notification_applet_la_SOURCES += \ + eggtrayicon.c \ + eggtrayicon.h + +libnm_notification_applet_la_LIBADD = \ $(NM_LIBS) \ - $(LIBGLADE_LIBS) \ + $(GLADE_LIBS) \ $(DBUS_LIBS) \ $(DBUS_GLIB_LIBS) \ - $(PANEL_APPLET_LIBS) \ + $(PANEL_APPLET_LIBS) \ + $(GTK_LIBS) \ + $(GCONF_LIBS) \ + $(LIBGNOMEUI_LIBS) \ $(NULL) -serverdir = $(libdir)/bonobo/servers -server_in_files = NMWirelessApplet.server.in -server_DATA = NMWirelessApplet.server +libexec_PROGRAMS = NetworkManagerNotification -$(server_DATA): $(srcdir)/$(server_in_files) - sed -e "s|\@LIBEXECDIR\@|$(libexecdir)|" $< > $@ +NetworkManagerNotification_SOURCES = main.c +NetworkManagerNotification_LDADD = ./libnm_notification_applet.la uidir = $(datadir)/gnome-2.0/ui ui_DATA = NMWirelessApplet.xml @@ -73,7 +82,6 @@ pixmap_DATA = \ CLEANFILES = $(server_DATA) *.bak *.gladep EXTRA_DIST = \ - $(server_in_files) \ $(pixmap_DATA) \ $(ui_DATA) \ $(glade_DATA) \ diff --git a/panel-applet/NMWirelessApplet.c b/panel-applet/NMWirelessApplet.c index 7c01ffba6b..d1138b59bb 100644 --- a/panel-applet/NMWirelessApplet.c +++ b/panel-applet/NMWirelessApplet.c @@ -36,13 +36,14 @@ #include #include +#include "config.h" + #include -#include -#include + +#include #include #include -#include "config.h" #include "NMWirelessApplet.h" #include "NMWirelessAppletDbus.h" #include "menu-info.h" @@ -67,38 +68,23 @@ static char * pixmap_names[] = static char *glade_file; -static void nmwa_about_cb (BonoboUIComponent *uic, NMWirelessApplet *applet); +static void nmwa_about_cb (NMWirelessApplet *applet); + static GtkWidget * nmwa_populate_menu (NMWirelessApplet *applet); static void nmwa_dispose_menu_items (NMWirelessApplet *applet); static gboolean do_not_eat_button_press (GtkWidget *widget, GdkEventButton *event); +static GObject * nmwa_constructor (GType type, guint n_props, GObjectConstructParam *construct_props); + +#ifndef BUILD_NOTIFICATION_ICON static const BonoboUIVerb nmwa_context_menu_verbs [] = -{ + BONOBO_UI_UNSAFE_VERB ("NMWirelessAbout", nmwa_about_cb), BONOBO_UI_VERB_END }; +#endif - -static GType nmwa_get_type (void) -{ - static GType type = 0; - - if (!type) - { - static const GTypeInfo info = - { - sizeof (PanelAppletClass), - NULL, NULL, NULL, NULL, NULL, - sizeof (NMWirelessApplet), - 0, NULL, NULL - }; - - type = g_type_register_static (PANEL_TYPE_APPLET, "NMWirelessApplet", &info, 0); - } - - return (type); -} - +G_DEFINE_TYPE(NMWirelessApplet, nmwa, EGG_TYPE_TRAY_ICON) /* * nmwa_redraw @@ -264,7 +250,7 @@ static void show_warning_dialog (gboolean error, gchar *mesg, ...) * Display our about dialog * */ -static void nmwa_about_cb (BonoboUIComponent *uic, NMWirelessApplet *applet) +static void nmwa_about_cb (NMWirelessApplet *applet) { GdkPixbuf *pixbuf; char *file; @@ -279,7 +265,7 @@ static void nmwa_about_cb (BonoboUIComponent *uic, NMWirelessApplet *applet) if (applet->about_dialog != NULL) { - gtk_window_set_screen (GTK_WINDOW (applet->about_dialog), gtk_widget_get_screen (GTK_WIDGET (&applet->base))); + gtk_window_set_screen (GTK_WINDOW (applet->about_dialog), gtk_widget_get_screen (GTK_WIDGET (&applet->parent))); gtk_window_present (GTK_WINDOW (applet->about_dialog)); return; } @@ -358,6 +344,7 @@ static void nmwa_get_menu_pos (GtkMenu *menu, gint *x, gint *y, gboolean *push_i gdk_window_get_origin (GTK_WIDGET (applet)->window, &tempx, &tempy); gdk_window_get_geometry (GTK_WIDGET (applet)->window, NULL, NULL, &width, &height, NULL); +#ifndef BUILD_NOTIFICATION_ICON switch (panel_applet_get_orient (PANEL_APPLET (applet))) { case PANEL_APPLET_ORIENT_DOWN: @@ -373,6 +360,7 @@ static void nmwa_get_menu_pos (GtkMenu *menu, gint *x, gint *y, gboolean *push_i tempx += width; break; } +#endif screen_width = gdk_screen_width (); screen_height = gdk_screen_height (); *x = CLAMP (tempx, 0, MAX (0, screen_width - reqmenu.width)); @@ -849,6 +837,7 @@ static void nmwa_setup_widgets (NMWirelessApplet *applet) gint panel_size; GtkWidget *menu_bar; +#if 0 panel_size = panel_applet_get_size (PANEL_APPLET (applet)); switch (panel_applet_get_orient(PANEL_APPLET (applet))) { @@ -861,6 +850,7 @@ static void nmwa_setup_widgets (NMWirelessApplet *applet) horizontal = TRUE; break; } +#endif /* construct pixmap widget */ applet->pixmap = gtk_image_new (); @@ -883,7 +873,7 @@ static void nmwa_setup_widgets (NMWirelessApplet *applet) applet->menu = gtk_menu_new(); gtk_menu_item_set_submenu (GTK_MENU_ITEM(applet->toplevel_menu), applet->menu); - g_signal_connect (applet->menu, "button_press_event", G_CALLBACK (do_not_eat_button_press), NULL); + g_signal_connect (menu_bar, "button_press_event", G_CALLBACK (do_not_eat_button_press), NULL); applet->image_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); applet->encryption_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); @@ -897,25 +887,25 @@ static void nmwa_setup_widgets (NMWirelessApplet *applet) applet->about_dialog = NULL; } -static void change_size_cb(PanelApplet *pa, gint s, NMWirelessApplet *applet) -{ - nmwa_setup_widgets (applet); - nmwa_redraw_timeout (applet); -} - -static void change_orient_cb(PanelApplet *pa, gint s, NMWirelessApplet *applet) -{ - nmwa_setup_widgets (applet); - nmwa_redraw_timeout (applet); -} static gboolean do_not_eat_button_press (GtkWidget *widget, GdkEventButton *event) { + /* Don't worry about this for now + We can use it if we need a contectual menu + if (event->button != 1) g_signal_stop_emission_by_name (widget, "button_press_event"); + + if (event->button == 3) { + g_message ("3nd button pressed"); + return (TRUE); + } + */ + return (FALSE); } +#if 0 static void change_background_cb(PanelApplet *a, PanelAppletBackgroundType type, GdkColor *color, GdkPixmap *pixmap, NMWirelessApplet *applet) { @@ -943,19 +933,18 @@ static void change_background_cb(PanelApplet *a, PanelAppletBackgroundType type, gtk_rc_style_unref (rc_style); } - +#endif /* - * nmwa_new + * nmwa_get_instance * * Create the initial instance of our wireless applet * */ -static GtkWidget * nmwa_new (NMWirelessApplet *applet) +static GtkWidget * nmwa_get_instance (NMWirelessApplet *applet) { GError *error = NULL; - panel_applet_set_flags (PANEL_APPLET (applet), PANEL_APPLET_EXPAND_MINOR); gtk_widget_hide(GTK_WIDGET(applet)); applet->gconf_client = gconf_client_get_default (); @@ -995,20 +984,12 @@ static GtkWidget * nmwa_new (NMWirelessApplet *applet) g_signal_connect (applet,"destroy", G_CALLBACK (nmwa_destroy),NULL); +#ifndef BUILD_NOTIFICATION_ICON panel_applet_setup_menu_from_file (PANEL_APPLET (applet), NULL, "NMWirelessApplet.xml", NULL, nmwa_context_menu_verbs, applet); +#endif - if (panel_applet_get_locked_down (PANEL_APPLET (applet))) - { - BonoboUIComponent *popup_component; - - popup_component = panel_applet_get_popup_component (PANEL_APPLET (applet)); - bonobo_ui_component_set_prop (popup_component, "/commands/NMWirelessApplet", "hidden", "1", NULL); - } - - g_signal_connect (G_OBJECT (applet), "change_size", G_CALLBACK (change_size_cb), applet); - g_signal_connect (G_OBJECT (applet), "change_orient", G_CALLBACK (change_orient_cb), applet); - g_signal_connect (G_OBJECT (applet), "change_background", G_CALLBACK (change_background_cb), applet); + /* Start redraw timeout */ nmwa_start_redraw_timeout (applet); @@ -1029,7 +1010,7 @@ static gboolean nmwa_fill (NMWirelessApplet *applet) return (FALSE); } - gtk_widget_show (nmwa_new (applet)); + gtk_widget_show (nmwa_get_instance (applet)); return (TRUE); } @@ -1074,10 +1055,45 @@ static gboolean nmwa_factory (NMWirelessApplet *applet, const gchar *iid, gpoint return (retval); } -PANEL_APPLET_BONOBO_FACTORY ("OAFIID:NMWirelessApplet_Factory", - nmwa_get_type (), - "wireless", - "0", - (PanelAppletFactoryCallback) nmwa_factory, - NULL) +static void +nmwa_init (NMWirelessApplet *applet) +{ + setup_stock (); + nmwa_fill (applet); +} + +static GObjectClass *parent_class = NULL; + +static void nmwa_class_init (NMWirelessAppletClass *klass) +{ + GObjectClass *gobject_class; + gobject_class = G_OBJECT_CLASS (klass); + + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (gobject_class)); + + gobject_class->constructor = nmwa_constructor; + +} + +static GObject *nmwa_constructor (GType type, + guint n_props, + GObjectConstructParam *construct_props) +{ + GObject *obj; + NMWirelessApplet *applet; + NMWirelessAppletClass *klass; + + klass = NM_WIRELESS_APPLET_CLASS (g_type_class_peek (type)); + obj = parent_class->constructor (type, + n_props, + construct_props); + applet = NM_WIRELESS_APPLET (obj); + + return obj; +} + +NMWirelessApplet *nmwa_new () +{ + return g_object_new (NM_TYPE_WIRELESS_APPLET, "title", "NetworkManager", NULL); +} diff --git a/panel-applet/NMWirelessApplet.h b/panel-applet/NMWirelessApplet.h index 933c49202c..c1e3c53874 100644 --- a/panel-applet/NMWirelessApplet.h +++ b/panel-applet/NMWirelessApplet.h @@ -21,14 +21,18 @@ #ifndef NM_WIRELESS_APPLET_H #define NM_WIRELESS_APPLET_H - +#include "config.h" #include -#include -#include #include #include #include #include +#ifndef BUILD_NOTIFICATION_ICON +#include +#include +#else +#include "eggtrayicon.h" +#endif typedef enum { @@ -90,13 +94,29 @@ typedef struct } NetworkDevice; + +#ifdef BUILD_NOTIFICATION_ICON + +#define NM_TYPE_WIRELESS_APPLET (nmwa_get_type()) +#define NM_WIRELESS_APPLET(object) (G_TYPE_CHECK_INSTANCE_CAST((object), NM_TYPE_WIRELESS_APPLET, NMWirelessApplet)) +#define NM_WIRELESS_APPLET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_WIRELESS_APPLET, NMWirelessAppletClass)) +#define NM_IS_WIRELESS_APPLET(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), NM_TYPE_WIRELESS_APPLET)) +#define NM_IS_WIRELESS_APPLET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_WIRELESS_APPLET)) +#define NM_WIRELESS_APPLET_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), NM_TYPE_WIRELESS_APPLET, NMWirelessAppletClass)) + +typedef struct +{ + EggTrayIconClass parent_class; +} NMWirelessAppletClass; +#endif + /* * Applet instance data * */ typedef struct { - PanelApplet base; + EggTrayIcon parent; DBusConnection *connection; GConfClient *gconf_client; @@ -129,6 +149,6 @@ typedef struct } NMWirelessApplet; -NetworkDevice *nmwa_get_device_for_nm_device (NMWirelessApplet *applet, const char *nm_dev); - +NetworkDevice *nmwa_get_device_for_nm_device (NMWirelessApplet *applet, const char *nm_dev); +NMWirelessApplet *nmwa_new (); #endif