2006-02-26 Dan Williams <dcbw@redhat.com>

* configure.in
	  gnome/applet/Makefile.am
		- Conditionalize all the notify stuff

	Merge most of Chris Aillon's notification patch:

	* gnome/applet/applet-notifications.[ch]
		- New files; show a notification

	* gnome/applet/applet-dbus-devices.[ch]
		- (nmwa_dbus_device_activated, nmwa_dbus_device_activated_cb,
		   nmwa_dbus_device_deactivated, nmwa_dbus_device_deactivated_cb):
			new functions, do the right thing when a device change occurs

	* gnome/applet/applet-dbus.c
		- (nmwa_dbus_filter): Split out DeviceNowActive and DeviceNoLongerActive
			signals, so we can handle them specially

	* gnome/applet/applet.[ch]
		- nmwa_schedule_vpn_login_banner -> nmwa_show_vpn_login_banner
		- nmwa_schedule_vpn_failure_alert -> nmwa_show_vpn_failure_alert
		- (nmwa_notify_state): remove
		- (nmwa_update_state); remove call to nmwa_notify_state, since the
			notification work is now done when the appropriate dbus signals
			are received.
		- (nmwa_show_vpn_login_banner, nmwa_show_vpn_failure_alert): don't
			defer execution of the notification/dialog stuff.  That was an
			artifact of the previous multi-threaded nature of the applet
			and is now pointless.
		- (nmwa_notify_vpn_failure, nmwa_notify_vpn_login_banner): remove,
			no longer needed.  Function folded into applet-notifications.c

	* src/NetworkManagerPolicy.c
		- (nm_policy_activation_finish): send the AP along with the device
			status change signal, if the connection is wireless.  Should
			fix the race where applet would show a connection to "unknown"


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1498 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams
2006-02-26 06:52:26 +00:00
parent 07438b0165
commit ad38b25413
11 changed files with 345 additions and 274 deletions

View File

@@ -1,3 +1,42 @@
2006-02-26 Dan Williams <dcbw@redhat.com>
* configure.in
gnome/applet/Makefile.am
- Conditionalize all the notify stuff
Merge most of Chris Aillon's notification patch:
* gnome/applet/applet-notifications.[ch]
- New files; show a notification
* gnome/applet/applet-dbus-devices.[ch]
- (nmwa_dbus_device_activated, nmwa_dbus_device_activated_cb,
nmwa_dbus_device_deactivated, nmwa_dbus_device_deactivated_cb):
new functions, do the right thing when a device change occurs
* gnome/applet/applet-dbus.c
- (nmwa_dbus_filter): Split out DeviceNowActive and DeviceNoLongerActive
signals, so we can handle them specially
* gnome/applet/applet.[ch]
- nmwa_schedule_vpn_login_banner -> nmwa_show_vpn_login_banner
- nmwa_schedule_vpn_failure_alert -> nmwa_show_vpn_failure_alert
- (nmwa_notify_state): remove
- (nmwa_update_state); remove call to nmwa_notify_state, since the
notification work is now done when the appropriate dbus signals
are received.
- (nmwa_show_vpn_login_banner, nmwa_show_vpn_failure_alert): don't
defer execution of the notification/dialog stuff. That was an
artifact of the previous multi-threaded nature of the applet
and is now pointless.
- (nmwa_notify_vpn_failure, nmwa_notify_vpn_login_banner): remove,
no longer needed. Function folded into applet-notifications.c
* src/NetworkManagerPolicy.c
- (nm_policy_activation_finish): send the AP along with the device
status change signal, if the connection is wireless. Should
fix the race where applet would show a connection to "unknown"
2006-02-25 Robert Love <rml@novell.com> 2006-02-25 Robert Love <rml@novell.com>
Add WPA Enterprise support: Add WPA Enterprise support:

View File

@@ -165,6 +165,7 @@ if test "x$enable_notify" != "xno"; then
AC_DEFINE_UNQUOTED([ENABLE_NOTIFY], [1], AC_DEFINE_UNQUOTED([ENABLE_NOTIFY], [1],
[Enable notifications with libnotify]) [Enable notifications with libnotify])
fi fi
AM_CONDITIONAL(WITH_NOTIFY, test x"$enable_notify" != xno)
PKG_CHECK_MODULES(LIBNL, libnl-1) PKG_CHECK_MODULES(LIBNL, libnl-1)
AC_SUBST(LIBNL_CFLAGS) AC_SUBST(LIBNL_CFLAGS)

View File

@@ -17,7 +17,6 @@ nm_applet_CPPFLAGS = \
$(LIBGNOMEUI_CFLAGS) \ $(LIBGNOMEUI_CFLAGS) \
$(PANEL_APPLET_CFLAGS) \ $(PANEL_APPLET_CFLAGS) \
$(GNOME_KEYRING_CFLAGS) \ $(GNOME_KEYRING_CFLAGS) \
$(NOTIFY_CFLAGS) \
-DICONDIR=\""$(datadir)/pixmaps"\" \ -DICONDIR=\""$(datadir)/pixmaps"\" \
-DGLADEDIR=\""$(gladedir)"\" \ -DGLADEDIR=\""$(gladedir)"\" \
-DBINDIR=\""$(bindir)"\" \ -DBINDIR=\""$(bindir)"\" \
@@ -31,6 +30,10 @@ nm_applet_CPPFLAGS = \
-DVERSION=\"$(VERSION)\" \ -DVERSION=\"$(VERSION)\" \
$(NULL) $(NULL)
if WITH_NOTIFY
nm_applet_CPPFLAGS += $(NOTIFY_CFLAGS)
endif
nm_applet_SOURCES = \ nm_applet_SOURCES = \
main.c \ main.c \
applet.c \ applet.c \
@@ -91,6 +94,10 @@ nm_applet_SOURCES = \
gconf-helpers.h \ gconf-helpers.h \
$(NULL) $(NULL)
if WITH_NOTIFY
nm_applet_SOURCES += applet-notifications.c applet-notifications.h
endif
nm_applet_LDADD = \ nm_applet_LDADD = \
$(DBUS_LIBS) \ $(DBUS_LIBS) \
$(HAL_LIBS) \ $(HAL_LIBS) \
@@ -102,11 +109,14 @@ nm_applet_LDADD = \
$(GCONF_LIBS) \ $(GCONF_LIBS) \
$(LIBGNOMEUI_LIBS) \ $(LIBGNOMEUI_LIBS) \
$(GNOME_KEYRING_LIBS) \ $(GNOME_KEYRING_LIBS) \
$(NOTIFY_LIBS) \
$(top_builddir)/utils/libnmutils.la \ $(top_builddir)/utils/libnmutils.la \
$(top_builddir)/libnm-util/libnm-util.la \ $(top_builddir)/libnm-util/libnm-util.la \
$(NULL) $(NULL)
if WITH_NOTIFY
nm_applet_LDADD += $(NOTIFY_LIBS)
endif
gladedir = $(datadir)/nm-applet gladedir = $(datadir)/nm-applet
glade_DATA = wireless-applet.glade keyring.png glade_DATA = wireless-applet.glade keyring.png

View File

@@ -24,11 +24,16 @@
#include <config.h> #include <config.h>
#endif #endif
#ifdef ENABLE_NOTIFY
#include <libnotify/notify.h>
#endif
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <dbus/dbus.h> #include <dbus/dbus.h>
#include <dbus/dbus-glib-lowlevel.h> #include <dbus/dbus-glib-lowlevel.h>
#include "applet-notifications.h"
#include "applet-dbus-devices.h" #include "applet-dbus-devices.h"
#include "applet-dbus.h" #include "applet-dbus.h"
#include "applet.h" #include "applet.h"
@@ -865,6 +870,130 @@ void nmwa_dbus_device_update_one_device (NMWirelessApplet *applet, const char *d
} }
} }
typedef struct _DeviceActivatedCBData
{
NMWirelessApplet *applet;
char *essid;
} DeviceActivatedCBData;
static void free_device_activated_cb_data (DeviceActivatedCBData *obj)
{
if (!obj)
return;
obj->applet = NULL;
if (obj->essid)
g_free (obj->essid);
memset (obj, 0, sizeof (DeviceActivatedCBData));
g_free (obj);
}
static void nmwa_dbus_device_activated_cb (DBusPendingCall *pcall, void *user_data)
{
DeviceActivatedCBData * cb_data = (DeviceActivatedCBData*) user_data;
NMWirelessApplet * applet = cb_data->applet;
char * essid = cb_data->essid;
NetworkDevice * active_device;
char * message = NULL;
char * icon = NULL;
nmwa_dbus_device_properties_cb (pcall, applet);
/* Don't show anything if the applet isn't shown */
if (!GTK_WIDGET_VISIBLE (GTK_WIDGET (applet)))
goto out;
#ifdef ENABLE_NOTIFY
active_device = nmwa_get_first_active_device (applet->device_list);
if (active_device && network_device_is_wireless (active_device))
{
if (applet->is_adhoc)
{
message = g_strdup_printf (_("You are now connected to the Ad-Hoc wireless network '%s'."), essid);
icon = "nm-adhoc";
}
else
{
message = g_strdup_printf (_("You are now connected to the wireless network '%s'."), essid);
icon = "nm-device-wireless";
}
}
else
{
message = g_strdup (_("You are now connected to the wired network."));
icon = "nm-device-wired";
}
nm_info ("%s", message);
nmwa_send_event_notification (applet, NOTIFY_URGENCY_LOW, _("Connection Established"), message, icon);
g_free (message);
#endif
out:
free_device_activated_cb_data (cb_data);
}
void nmwa_dbus_device_activated (NMWirelessApplet *applet, const char *dev_path, const char *essid)
{
DBusMessage * message;
DBusPendingCall * pcall = NULL;
DeviceActivatedCBData *cb_data = NULL;
g_return_if_fail (applet != NULL);
g_return_if_fail (dev_path != NULL);
cb_data = g_malloc0 (sizeof (DeviceActivatedCBData));
cb_data->applet = applet;
if (essid)
cb_data->essid = g_strdup (essid);
if ((message = dbus_message_new_method_call (NM_DBUS_SERVICE, dev_path, NM_DBUS_INTERFACE_DEVICES, "getProperties")))
{
dbus_connection_send_with_reply (applet->connection, message, &pcall, -1);
if (pcall)
dbus_pending_call_set_notify (pcall, nmwa_dbus_device_activated_cb, cb_data, NULL);
dbus_message_unref (message);
}
}
static void nmwa_dbus_device_deactivated_cb (DBusPendingCall *pcall, void *user_data)
{
NMWirelessApplet * applet = (NMWirelessApplet *) user_data;
nmwa_dbus_device_properties_cb (pcall, applet);
#ifdef ENABLE_NOTIFY
/* Don't show anything if the applet isn't shown */
if (GTK_WIDGET_VISIBLE (GTK_WIDGET (applet)))
{
nmwa_send_event_notification (applet, NOTIFY_URGENCY_NORMAL, _("Disconnected"),
_("The network connection has been disconnected."), "nm-no-connection");
}
#endif
}
void nmwa_dbus_device_deactivated (NMWirelessApplet *applet, const char *dev_path)
{
DBusMessage * message;
DBusPendingCall * pcall = NULL;
g_return_if_fail (applet != NULL);
g_return_if_fail (dev_path != NULL);
if ((message = dbus_message_new_method_call (NM_DBUS_SERVICE, dev_path, NM_DBUS_INTERFACE_DEVICES, "getProperties")))
{
dbus_connection_send_with_reply (applet->connection, message, &pcall, -1);
if (pcall)
dbus_pending_call_set_notify (pcall, nmwa_dbus_device_deactivated_cb, applet, NULL);
dbus_message_unref (message);
}
}
/* /*
* nmwa_dbus_update_devices_cb * nmwa_dbus_update_devices_cb

View File

@@ -42,6 +42,8 @@ void nmwa_dbus_update_dialup (NMWirelessApplet *applet);
void nmwa_dbus_dialup_activate_connection (NMWirelessApplet *applet, const char *name); void nmwa_dbus_dialup_activate_connection (NMWirelessApplet *applet, const char *name);
void nmwa_dbus_dialup_deactivate_connection (NMWirelessApplet *applet, const char *name); void nmwa_dbus_dialup_deactivate_connection (NMWirelessApplet *applet, const char *name);
void nmwa_dbus_device_update_one_device (NMWirelessApplet *applet, const char *dev_path); void nmwa_dbus_device_update_one_device (NMWirelessApplet *applet, const char *dev_path);
void nmwa_dbus_device_activated (NMWirelessApplet *applet, const char *dev_path, const char *essid);
void nmwa_dbus_device_deactivated (NMWirelessApplet *applet, const char *dev_path);
void nmwa_dbus_device_remove_one_device (NMWirelessApplet *applet, const char *dev_path); void nmwa_dbus_device_remove_one_device (NMWirelessApplet *applet, const char *dev_path);
void nmwa_dbus_device_update_one_network (NMWirelessApplet *applet, const char *dev_path, const char *net_path, const char *active_net_path); void nmwa_dbus_device_update_one_network (NMWirelessApplet *applet, const char *dev_path, const char *net_path, const char *active_net_path);

View File

@@ -123,8 +123,6 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa
} }
} }
else if ( dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceAdded") else if ( dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceAdded")
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNowActive")
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive")
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceActivating") || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceActivating")
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceCarrierOn") || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceCarrierOn")
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceCarrierOff")) || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceCarrierOff"))
@@ -134,6 +132,23 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa
if (dbus_message_get_args (message, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) if (dbus_message_get_args (message, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID))
nmwa_dbus_device_update_one_device (applet, path); nmwa_dbus_device_update_one_device (applet, path);
} }
else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNowActive"))
{
char *path = NULL;
char *essid = NULL;
if (dbus_message_get_args (message, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_STRING, &essid, DBUS_TYPE_INVALID))
nmwa_dbus_device_activated (applet, path, essid);
else if (dbus_message_get_args (message, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID))
nmwa_dbus_device_activated (applet, path, NULL);
}
else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive"))
{
char *path = NULL;
if (dbus_message_get_args (message, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID))
nmwa_dbus_device_deactivated (applet, path);
}
else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceRemoved")) else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceRemoved"))
{ {
char *path = NULL; char *path = NULL;
@@ -210,7 +225,7 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa
char *error_msg; char *error_msg;
if (dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &vpn_name, DBUS_TYPE_STRING, &error_msg, DBUS_TYPE_INVALID)) { if (dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &vpn_name, DBUS_TYPE_STRING, &error_msg, DBUS_TYPE_INVALID)) {
nmwa_schedule_vpn_failure_alert (applet, member, vpn_name, error_msg); nmwa_show_vpn_failure_alert (applet, member, vpn_name, error_msg);
/* clear the 'last_attempt_success' key in gconf so we prompt for password next time */ /* clear the 'last_attempt_success' key in gconf so we prompt for password next time */
nmwa_dbus_vpn_set_last_attempt_status (applet, vpn_name, FALSE); nmwa_dbus_vpn_set_last_attempt_status (applet, vpn_name, FALSE);
} }
@@ -224,7 +239,7 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa
{ {
char *stripped = g_strstrip (g_strdup (banner)); char *stripped = g_strstrip (g_strdup (banner));
nmwa_schedule_vpn_login_banner (applet, vpn_name, stripped); nmwa_show_vpn_login_banner (applet, vpn_name, stripped);
g_free (stripped); g_free (stripped);
/* set the 'last_attempt_success' key in gconf so we DON'T prompt for password next time */ /* set the 'last_attempt_success' key in gconf so we DON'T prompt for password next time */

View File

@@ -0,0 +1,46 @@
/* NetworkManager -- Network link manager
*
* Christopher Aillon <caillon@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#include <libnotify/notify.h>
#include "applet-notifications.h"
void
nmwa_send_event_notification (NMWirelessApplet *applet,
NotifyUrgency urgency,
const char *summary,
const char *message,
const char *icon)
{
NotifyNotification *notification;
g_return_if_fail (applet != NULL);
g_return_if_fail (summary != NULL);
g_return_if_fail (message != NULL);
if (!notify_is_initted ())
notify_init ("NetworkManager");
notification = notify_notification_new (summary, message,
icon ? icon : GTK_STOCK_NETWORK, GTK_WIDGET (applet));
notify_notification_set_urgency (notification, urgency);
notify_notification_show (notification, NULL);
}

View File

@@ -0,0 +1,34 @@
/* NetworkManager -- Network link manager
*
* Christopher Aillon <caillon@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#ifndef NM_NOTIFICATION_H__
#define NM_NOTIFICATION_H__
#include "applet.h"
void
nmwa_send_event_notification (NMWirelessApplet *applet,
NotifyUrgency urgency,
const char *summary,
const char *message,
const char *icon);
#endif /* NM_NOTIFICATION_H__ */

View File

@@ -53,6 +53,7 @@
#include "applet-dbus-devices.h" #include "applet-dbus-devices.h"
#include "applet-dbus-vpn.h" #include "applet-dbus-vpn.h"
#include "applet-dbus-info.h" #include "applet-dbus-info.h"
#include "applet-notifications.h"
#include "other-network-dialog.h" #include "other-network-dialog.h"
#include "passphrase-dialog.h" #include "passphrase-dialog.h"
#include "menu-items.h" #include "menu-items.h"
@@ -363,56 +364,27 @@ static void nmwa_about_cb (NMWirelessApplet *applet)
#endif #endif
} }
typedef struct DialogCBData
{
NMWirelessApplet *applet;
char *msg;
char *title;
} DialogCBData;
static void free_dialog_cb_data (DialogCBData *data)
{
g_return_if_fail (data != NULL);
g_free (data->msg);
g_free (data->title);
memset (data, 0, sizeof (DialogCBData));
g_free (data);
}
#ifndef ENABLE_NOTIFY #ifndef ENABLE_NOTIFY
static void vpn_failure_dialog_close_cb (GtkWidget *dialog, gpointer user_data)
{
DialogCBData *data;
if ((data = g_object_get_data (G_OBJECT (dialog), "data")))
{
g_object_set_data (G_OBJECT (dialog), "data", NULL);
free_dialog_cb_data (data);
}
gtk_widget_destroy (dialog);
}
/* /*
* nmwa_show_vpn_failure_dialog * nmwa_show_vpn_failure_dialog
* *
* Present the VPN failure dialog. * Present the VPN failure dialog.
* *
*/ */
static gboolean nmwa_show_vpn_failure_dialog (DialogCBData *cb_data) static void
nmwa_show_vpn_failure_dialog (const char *title,
const char *msg)
{ {
GtkWidget *dialog; GtkWidget *dialog;
g_return_val_if_fail (cb_data != NULL, FALSE); g_return_val_if_fail (title != NULL, FALSE);
g_return_val_if_fail (cb_data->msg != NULL, FALSE); g_return_val_if_fail (msg != NULL, FALSE);
g_return_val_if_fail (cb_data->title != NULL, FALSE);
dialog = gtk_message_dialog_new_with_markup (NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, cb_data->msg, NULL); dialog = gtk_message_dialog_new_with_markup (NULL, 0, GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK, msg, NULL);
gtk_window_set_title (GTK_WINDOW (dialog), cb_data->title); gtk_window_set_title (GTK_WINDOW (dialog), cb_data->title);
g_signal_connect (dialog, "response", G_CALLBACK (vpn_failure_dialog_close_cb), NULL); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
g_signal_connect (dialog, "close", G_CALLBACK (vpn_failure_dialog_close_cb), NULL); g_signal_connect (dialog, "close", G_CALLBACK (gtk_widget_destroy), NULL);
g_object_set_data (G_OBJECT (dialog), "data", cb_data); g_object_set_data (G_OBJECT (dialog), "data", cb_data);
/* Bash focus-stealing prevention in the face */ /* Bash focus-stealing prevention in the face */
@@ -420,44 +392,6 @@ static gboolean nmwa_show_vpn_failure_dialog (DialogCBData *cb_data)
gtk_widget_realize (dialog); gtk_widget_realize (dialog);
gdk_x11_window_set_user_time (dialog->window, gtk_get_current_event_time ()); gdk_x11_window_set_user_time (dialog->window, gtk_get_current_event_time ());
gtk_widget_show_all (dialog); gtk_widget_show_all (dialog);
return FALSE;
}
#endif
#ifdef ENABLE_NOTIFY
/*
* nmwa_notify_vpn_failure
*
* Notify the user of that the VPN connection failed
*
*/
static gboolean nmwa_notify_vpn_failure (DialogCBData *cb_data)
{
NotifyNotification * n;
NotifyUrgency urgency = NOTIFY_URGENCY_NORMAL;
char * icon = NULL;
g_return_val_if_fail (cb_data != NULL, FALSE);
g_return_val_if_fail (cb_data->msg != NULL, FALSE);
g_return_val_if_fail (cb_data->title != NULL, FALSE);
if (!notify_is_initted ())
notify_init ("NetworkManager");
icon = g_strdup ("gnome-lockscreen");
urgency = NOTIFY_URGENCY_CRITICAL;
n = notify_notification_new (cb_data->title, cb_data->msg, icon,
(GtkWidget *) cb_data->applet);
notify_notification_set_urgency (n, urgency);
notify_notification_show (n, NULL);
g_object_unref (n);
g_free (icon);
free_dialog_cb_data (cb_data);
return FALSE;
} }
#endif #endif
@@ -468,147 +402,87 @@ static gboolean nmwa_notify_vpn_failure (DialogCBData *cb_data)
* Schedule display of a VPN failure message. * Schedule display of a VPN failure message.
* *
*/ */
void nmwa_schedule_vpn_failure_alert (NMWirelessApplet *applet, const char *member, const char *vpn_name, const char *error_msg) void nmwa_show_vpn_failure_alert (NMWirelessApplet *applet, const char *member, const char *vpn_name, const char *error_msg)
{ {
DialogCBData *cb_data = NULL; char *title = NULL;
gchar *error_head = NULL; char *desc = NULL;
gchar *error_desc = NULL;
gchar *error_data = NULL;
g_return_if_fail (applet != NULL); g_return_if_fail (applet != NULL);
g_return_if_fail (member != NULL); g_return_if_fail (member != NULL);
g_return_if_fail (vpn_name != NULL); g_return_if_fail (vpn_name != NULL);
g_return_if_fail (error_msg != NULL); g_return_if_fail (error_msg != NULL);
cb_data = g_malloc0 (sizeof (DialogCBData));
cb_data->applet = applet;
if (!strcmp (member, NM_DBUS_VPN_SIGNAL_LOGIN_FAILED)) if (!strcmp (member, NM_DBUS_VPN_SIGNAL_LOGIN_FAILED))
{ {
error_head = g_strdup (_("VPN Login Failure")); title = g_strdup (_("VPN Login Failure"));
error_desc = g_strdup_printf (_("Could not start the VPN connection '%s' due to a login failure."), vpn_name); desc = g_strdup_printf (_("Could not start the VPN connection '%s' due to a login failure."), vpn_name);
} }
else if (!strcmp (member, NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED)) else if (!strcmp (member, NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED))
{ {
error_head = g_strdup (_("VPN Start Failure")); title = g_strdup (_("VPN Start Failure"));
error_desc = g_strdup_printf (_("Could not start the VPN connection '%s' due to a failure launching the VPN program."), vpn_name); desc = g_strdup_printf (_("Could not start the VPN connection '%s' due to a failure launching the VPN program."), vpn_name);
} }
else if (!strcmp (member, NM_DBUS_VPN_SIGNAL_CONNECT_FAILED)) else if (!strcmp (member, NM_DBUS_VPN_SIGNAL_CONNECT_FAILED))
{ {
error_head = g_strdup (_("VPN Connect Failure")); title = g_strdup (_("VPN Connect Failure"));
error_desc = g_strdup_printf (_("Could not start the VPN connection '%s' due to a connection error."), vpn_name); desc = g_strdup_printf (_("Could not start the VPN connection '%s' due to a connection error."), vpn_name);
} }
else if (!strcmp (member, NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD)) else if (!strcmp (member, NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD))
{ {
error_head = g_strdup (_("VPN Configuration Error")); title = g_strdup (_("VPN Configuration Error"));
error_desc = g_strdup_printf (_("The VPN connection '%s' was not correctly configured."), vpn_name); desc = g_strdup_printf (_("The VPN connection '%s' was not correctly configured."), vpn_name);
} }
else if (!strcmp (member, NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD)) else if (!strcmp (member, NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD))
{ {
error_head = g_strdup (_("VPN Connect Failure")); title = g_strdup (_("VPN Connect Failure"));
error_desc = g_strdup_printf (_("Could not start the VPN connection '%s' because the VPN server did not return an adequate network configuration."), vpn_name); desc = g_strdup_printf (_("Could not start the VPN connection '%s' because the VPN server did not return an adequate network configuration."), vpn_name);
}
else
{
free_dialog_cb_data (cb_data);
return;
} }
error_data = g_strdup_printf (_("The VPN service said: \"%s\""), error_msg); if (title && desc)
{
char * msg;
#ifdef ENABLE_NOTIFY #ifdef ENABLE_NOTIFY
cb_data->title = g_strdup (error_head); msg = g_strdup_printf ("\n%s\n%s", desc, error_msg);
cb_data->msg = g_strdup_printf ("\n%s\n\n%s", error_desc, error_data); nmwa_send_event_notification (applet, NOTIFY_URGENCY_CRITICAL,
g_idle_add ((GSourceFunc) nmwa_notify_vpn_failure, cb_data); title, msg, "gnome-lockscreen");
#else #else
cb_data->title = g_strdup (_("VPN Error")); msg = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n"
cb_data->msg = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n" "%s\n\n%s", title, desc, error_msg);
"%s\n\n%s", error_head, error_desc, error_data); nmwa_show_vpn_failure_dialog (title, msg);
g_idle_add ((GSourceFunc) nmwa_show_vpn_failure_dialog, cb_data);
#endif #endif
g_free (error_head); g_free (msg);
g_free (error_desc); }
g_free (error_data);
g_free (title);
g_free (desc);
} }
#ifndef ENABLE_NOTIFY #ifndef ENABLE_NOTIFY
static void vpn_login_banner_dialog_close_cb (GtkWidget *dialog, gpointer user_data)
{
DialogCBData *data;
if ((data = g_object_get_data (G_OBJECT (dialog), "data")))
{
g_object_set_data (G_OBJECT (dialog), "data", NULL);
free_dialog_cb_data (data);
}
gtk_widget_destroy (dialog);
}
/* /*
* nmwa_show_vpn_login_banner_dialog * nmwa_show_vpn_login_banner_dialog
* *
* Present the VPN login banner dialog. * Present the VPN login banner dialog.
* *
*/ */
static gboolean nmwa_show_vpn_login_banner_dialog (gpointer user_data) static void
nmwa_show_vpn_login_banner_dialog (const char *title,
const char *msg)
{ {
DialogCBData *cb_data = (DialogCBData *) user_data;
GtkWidget *dialog; GtkWidget *dialog;
g_return_val_if_fail (cb_data != NULL, FALSE);
g_return_val_if_fail (cb_data->msg != NULL, FALSE);
dialog = gtk_message_dialog_new_with_markup (NULL, 0, GTK_MESSAGE_INFO, dialog = gtk_message_dialog_new_with_markup (NULL, 0, GTK_MESSAGE_INFO,
GTK_BUTTONS_OK, cb_data->msg, NULL); GTK_BUTTONS_OK, msg, NULL);
g_signal_connect (dialog, "response", G_CALLBACK (vpn_login_banner_dialog_close_cb), NULL); gtk_window_set_title (GTK_WINDOW (dialog), title);
g_signal_connect (dialog, "close", G_CALLBACK (vpn_login_banner_dialog_close_cb), NULL); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
g_object_set_data (G_OBJECT (dialog), "data", cb_data); g_signal_connect (dialog, "close", G_CALLBACK (gtk_widget_destroy), NULL);
/* Bash focus-stealing prevention in the face */ /* Bash focus-stealing prevention in the face */
gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ALWAYS); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ALWAYS);
gtk_widget_realize (dialog); gtk_widget_realize (dialog);
gdk_x11_window_set_user_time (dialog->window, gtk_get_current_event_time ()); gdk_x11_window_set_user_time (dialog->window, gtk_get_current_event_time ());
gtk_widget_show_all (dialog); gtk_widget_show_all (dialog);
return FALSE;
}
#endif
#ifdef ENABLE_NOTIFY
/*
* nmwa_notify_vpn_login_banner
*
* Notify the user of that the VPN's login banner
*
*/
static gboolean nmwa_notify_vpn_login_banner (DialogCBData *cb_data)
{
NotifyNotification * n;
NotifyUrgency urgency = NOTIFY_URGENCY_NORMAL;
char * icon = NULL;
g_return_val_if_fail (cb_data != NULL, FALSE);
g_return_val_if_fail (cb_data->msg != NULL, FALSE);
g_return_val_if_fail (cb_data->title != NULL, FALSE);
if (!notify_is_initted ())
notify_init ("NetworkManager");
icon = g_strdup ("gnome-lockscreen");
urgency = NOTIFY_URGENCY_LOW;
n = notify_notification_new (cb_data->title, cb_data->msg, icon,
(GtkWidget *) cb_data->applet);
notify_notification_set_urgency (n, urgency);
notify_notification_show (n, NULL);
g_object_unref (n);
g_free (icon);
free_dialog_cb_data (cb_data);
return FALSE;
} }
#endif #endif
@@ -619,30 +493,26 @@ static gboolean nmwa_notify_vpn_login_banner (DialogCBData *cb_data)
* Schedule a display of the VPN banner * Schedule a display of the VPN banner
* *
*/ */
void nmwa_schedule_vpn_login_banner (NMWirelessApplet *applet, const char *vpn_name, const char *banner) void nmwa_show_vpn_login_banner (NMWirelessApplet *applet, const char *vpn_name, const char *banner)
{ {
DialogCBData * cb_data = NULL; const char * title;
char *msg2; char * msg;
g_return_if_fail (applet != NULL); g_return_if_fail (applet != NULL);
g_return_if_fail (vpn_name != NULL); g_return_if_fail (vpn_name != NULL);
g_return_if_fail (banner != NULL); g_return_if_fail (banner != NULL);
cb_data = g_malloc0 (sizeof (DialogCBData)); title = _("VPN Login Message");
cb_data->applet = applet;
msg2 = g_strdup_printf (_("VPN connection '%s' said:"), vpn_name);
#ifdef ENABLE_NOTIFY #ifdef ENABLE_NOTIFY
cb_data->title = g_strdup (_("VPN Login Message")); msg = g_strdup_printf ("\n%s", banner);
cb_data->msg = g_strdup_printf ("\n%s\n\n%s", msg2, banner); nmwa_send_event_notification (applet, NOTIFY_URGENCY_LOW,
g_idle_add ((GSourceFunc) nmwa_notify_vpn_login_banner, cb_data); title, msg, "gnome-lockscreen");
#else #else
cb_data->msg = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s\n\n\"%s\"", msg = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s",
_("VPN Login Message"), msg2, banner); title, banner);
g_idle_add ((GSourceFunc) nmwa_show_vpn_login_banner_dialog, cb_data); nmwa_show_vpn_login_banner_dialog (title, msg);
#endif #endif
g_free (msg2); g_free (msg);
} }
@@ -1161,81 +1031,6 @@ static gboolean animation_timeout (NMWirelessApplet *applet)
} }
/*
* nmwa_notify_state
*
* Notify the user of change in connectivity
*
*/
static void nmwa_notify_state (NMWirelessApplet *applet, NetworkDevice *act_dev, WirelessNetwork *active_network)
{
#ifdef ENABLE_NOTIFY
NotifyNotification * n;
NotifyUrgency urgency = NOTIFY_URGENCY_NORMAL;
char * title = NULL;
char * msg = NULL;
char * icon = NULL;
static int state = NM_STATE_ASLEEP;
if (!notify_is_initted ())
notify_init ("NetworkManager");
switch (applet->nm_state)
{
case NM_STATE_ASLEEP:
case NM_STATE_DISCONNECTED:
title = g_strdup (_("Disconnected"));
msg = g_strdup (_("The network connection has been disconnected."));
icon = g_strdup ("nm-no-connection");
urgency = NOTIFY_URGENCY_CRITICAL;
break;
case NM_STATE_CONNECTED:
title = g_strdup (_("Connected"));
if (network_device_is_wired (act_dev))
{
msg = g_strdup (_("Connected to a wired network interface."));
icon = g_strdup ("nm-device-wired");
urgency = NOTIFY_URGENCY_LOW;
}
else if (network_device_is_wireless (act_dev))
{
if (applet->is_adhoc)
{
msg = g_strdup (_("An ad-hoc wireless network connection has been established."));
icon = g_strdup ("nm-adhoc");
}
else
{
msg = g_strdup_printf (_("A wireless network connection to '%s' has been established."),
active_network ? wireless_network_get_essid (active_network) : "(unknown)");
icon = g_strdup ("nm-device-wireless");
}
}
break;
default:
break;
}
if (state != applet->nm_state && title && msg && icon) {
n = notify_notification_new (title, msg, icon, (GtkWidget *) applet);
notify_notification_set_urgency (n, urgency);
notify_notification_show (n, NULL);
g_object_unref (n);
}
g_free (icon);
g_free (msg);
g_free (title);
state = applet->nm_state;
#endif
}
/* /*
* nmwa_update_state * nmwa_update_state
* *
@@ -1297,9 +1092,7 @@ static void nmwa_update_state (NMWirelessApplet *applet)
tip = g_strdup_printf (_("Wireless network connection to '%s' (%d%%)"), tip = g_strdup_printf (_("Wireless network connection to '%s' (%d%%)"),
active_network ? wireless_network_get_essid (active_network) : "(unknown)", strength); active_network ? wireless_network_get_essid (active_network) : "(unknown)", strength);
} }
pixbuf = nmwa_get_connected_icon (applet, act_dev); pixbuf = nmwa_get_connected_icon (applet, act_dev);
break; break;
case NM_STATE_CONNECTING: case NM_STATE_CONNECTING:
@@ -1361,8 +1154,6 @@ done:
show_applet = FALSE; show_applet = FALSE;
} }
nmwa_notify_state (applet, act_dev, active_network);
/* determine if we should hide the notification icon */ /* determine if we should hide the notification icon */
if (show_applet) if (show_applet)
gtk_widget_show (GTK_WIDGET (applet)); gtk_widget_show (GTK_WIDGET (applet));

View File

@@ -139,8 +139,8 @@ NetworkDevice * nmwa_get_device_for_nm_path (GSList *dev_list, const char *nm_
NMWirelessApplet * nmwa_new (void); NMWirelessApplet * nmwa_new (void);
void nmwa_schedule_warning_dialog (NMWirelessApplet *applet, const char *msg); void nmwa_schedule_warning_dialog (NMWirelessApplet *applet, const char *msg);
gboolean nmwa_driver_notify (gpointer user_data); gboolean nmwa_driver_notify (gpointer user_data);
void nmwa_schedule_vpn_failure_alert (NMWirelessApplet *applet, const char *member, const char *vpn_name, const char *error_msg); void nmwa_show_vpn_failure_alert (NMWirelessApplet *applet, const char *member, const char *vpn_name, const char *error_msg);
void nmwa_schedule_vpn_login_banner (NMWirelessApplet *applet, const char *vpn_name, const char *banner); void nmwa_show_vpn_login_banner (NMWirelessApplet *applet, const char *vpn_name, const char *banner);
NetworkDevice * nmwa_get_first_active_device (GSList *dev_list); NetworkDevice * nmwa_get_first_active_device (GSList *dev_list);
VPNConnection * nmwa_get_first_active_vpn_connection (NMWirelessApplet *applet); VPNConnection * nmwa_get_first_active_vpn_connection (NMWirelessApplet *applet);

View File

@@ -51,6 +51,7 @@ static gboolean nm_policy_activation_finish (NMActRequest *req)
{ {
NMDevice *dev = NULL; NMDevice *dev = NULL;
NMData *data = NULL; NMData *data = NULL;
NMAccessPoint * ap = NULL;
g_return_val_if_fail (req != NULL, FALSE); g_return_val_if_fail (req != NULL, FALSE);
@@ -60,10 +61,13 @@ static gboolean nm_policy_activation_finish (NMActRequest *req)
dev = nm_act_request_get_dev (req); dev = nm_act_request_get_dev (req);
g_assert (dev); g_assert (dev);
if (nm_device_is_802_11_wireless (dev))
ap = nm_act_request_get_ap (req);
nm_device_activation_success_handler (dev, req); nm_device_activation_success_handler (dev, req);
nm_info ("Activation (%s) successful, device activated.", nm_device_get_iface (dev)); nm_info ("Activation (%s) successful, device activated.", nm_device_get_iface (dev));
nm_dbus_schedule_device_status_change_signal (data, dev, NULL, DEVICE_NOW_ACTIVE); nm_dbus_schedule_device_status_change_signal (data, dev, ap, DEVICE_NOW_ACTIVE);
nm_schedule_state_change_signal_broadcast (data); nm_schedule_state_change_signal_broadcast (data);
return FALSE; return FALSE;