2004-08-25 Dan Williams <dcbw@redhat.com>
* panel-applet/* - Rework the panel applet to do all DBUS communication in a separate thread git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@70 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
52
ChangeLog
52
ChangeLog
@@ -1,3 +1,54 @@
|
|||||||
|
2004-08-25 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
* panel-applet/*
|
||||||
|
- Rework the panel applet to do all DBUS communication in a separate
|
||||||
|
thread
|
||||||
|
|
||||||
|
2004-08-25 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
* info-daemon/NetworkManagerInfo.[ch]
|
||||||
|
- Remove "get_next_priority" function
|
||||||
|
|
||||||
|
* info-daemon/NetworkManagerInfoDbus.[ch]
|
||||||
|
- Convert "priority" functions to "timestamp"
|
||||||
|
|
||||||
|
2004-08-25 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
* src/NetworkManagerAP.[ch]
|
||||||
|
- Add a "enc_method_good" member and accessors to an Access Point
|
||||||
|
to signal when we've found the correct encryption method
|
||||||
|
for an access point
|
||||||
|
- Add a "timestamp" member and accessors, remove "priority" member
|
||||||
|
and accessors (use timestamps instead)
|
||||||
|
- Rename "wep_key"->"enc_key"
|
||||||
|
- (nm_ap_get_enc_key_hashed): new, return the correct mangled key
|
||||||
|
for a specified encryption method using the access points
|
||||||
|
source encryption key/passphrase
|
||||||
|
|
||||||
|
* src/NetworkManagerAPList.c
|
||||||
|
- When updating a network with dbus, grab timestamp now instead of
|
||||||
|
priority
|
||||||
|
|
||||||
|
* src/NetworkManagerDBus.[ch]
|
||||||
|
- Add signal for "DeviceActivating"
|
||||||
|
- Switch priority->timestamp
|
||||||
|
|
||||||
|
* src/NetworkManagerDevice.c
|
||||||
|
- Change references of "wep_key" -> "enc_key" or "key"
|
||||||
|
- Signal DeviceActivating when starting activation
|
||||||
|
- When activating a wireless device, if the access point we are connecting
|
||||||
|
to is encrypted, and we have a source key, try to generate a mangled
|
||||||
|
key and use that (ie, generate real WEP key from a passphrase)
|
||||||
|
- Rework device activation to fallback to other encryption methods if
|
||||||
|
a previous one didn't work (ie, try mangling a key as a 104-bit passphrase
|
||||||
|
first, then if that doesn't work fall back to direct hex key).
|
||||||
|
- (nm_device_update_best_ap): fix a deadlock, and use timestamps instead of
|
||||||
|
priority. We now prefer the latest access point used, rather than using
|
||||||
|
a priority scheme
|
||||||
|
- (nm_device_do_normal_scan): make the encryption method "unknown" on access
|
||||||
|
points we've just discovered, and merge in correct info from the global
|
||||||
|
access point lists
|
||||||
|
|
||||||
2004-08-25 Seth Nickell <seth@gnome.org>
|
2004-08-25 Seth Nickell <seth@gnome.org>
|
||||||
|
|
||||||
Patch from Matthew Garrett <mjg59@srcf.ucam.org> for adding
|
Patch from Matthew Garrett <mjg59@srcf.ucam.org> for adding
|
||||||
@@ -33,7 +84,6 @@
|
|||||||
- Refactored initscript code separately for each
|
- Refactored initscript code separately for each
|
||||||
distribution
|
distribution
|
||||||
|
|
||||||
|
|
||||||
2004-08-23 Dan Williams <dcbw@redhat.com>
|
2004-08-23 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
* configure.in
|
* configure.in
|
||||||
|
@@ -1,5 +1,3 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
NULL=
|
NULL=
|
||||||
|
|
||||||
INCLUDES = \
|
INCLUDES = \
|
||||||
@@ -41,6 +39,9 @@ $(server_DATA): $(srcdir)/$(server_in_files)
|
|||||||
uidir = $(datadir)/gnome-2.0/ui
|
uidir = $(datadir)/gnome-2.0/ui
|
||||||
ui_DATA = NMWirelessApplet.xml
|
ui_DATA = NMWirelessApplet.xml
|
||||||
|
|
||||||
|
gladedir = $(datadir)/NMWirelessApplet
|
||||||
|
glade_DATA = wireless-applet.glade
|
||||||
|
|
||||||
pixmapdir = $(datadir)/pixmaps/NMWirelessApplet
|
pixmapdir = $(datadir)/pixmaps/NMWirelessApplet
|
||||||
pixmap_DATA = no-link-0.png \
|
pixmap_DATA = no-link-0.png \
|
||||||
wired.png \
|
wired.png \
|
||||||
@@ -63,5 +64,6 @@ EXTRA_DIST = \
|
|||||||
$(server_in_files) \
|
$(server_in_files) \
|
||||||
$(pixmap_DATA) \
|
$(pixmap_DATA) \
|
||||||
$(ui_DATA) \
|
$(ui_DATA) \
|
||||||
|
$(glade_DATA) \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
@@ -42,13 +42,12 @@
|
|||||||
#include <glade/glade.h>
|
#include <glade/glade.h>
|
||||||
#include <gconf/gconf-client.h>
|
#include <gconf/gconf-client.h>
|
||||||
|
|
||||||
#include <dbus/dbus.h>
|
|
||||||
#include <dbus/dbus-glib.h>
|
|
||||||
|
|
||||||
#include "NMWirelessApplet.h"
|
#include "NMWirelessApplet.h"
|
||||||
#include "NMWirelessAppletDbus.h"
|
#include "NMWirelessAppletDbus.h"
|
||||||
|
|
||||||
#define CFG_UPDATE_INTERVAL 1
|
#define CFG_UPDATE_INTERVAL 1
|
||||||
|
#define NM_GCONF_TRUSTED_NETWORKS_PATH "/system/networking/wireless/trusted_networks"
|
||||||
|
#define NM_GCONF_PREFERRED_NETWORKS_PATH "/system/networking/wireless/preferred_networks"
|
||||||
|
|
||||||
static char * pixmap_names[] =
|
static char * pixmap_names[] =
|
||||||
{
|
{
|
||||||
@@ -66,14 +65,9 @@ static char * pixmap_names[] =
|
|||||||
|
|
||||||
static char *glade_file;
|
static char *glade_file;
|
||||||
|
|
||||||
/* Represents an access point */
|
static void nmwa_about_cb (BonoboUIComponent *uic, NMWirelessApplet *applet);
|
||||||
typedef struct
|
static GtkWidget * nmwa_populate_menu (NMWirelessApplet *applet);
|
||||||
{
|
static void nmwa_dispose_menu (NMWirelessApplet *applet);
|
||||||
char * essid;
|
|
||||||
gboolean encrypted;
|
|
||||||
} AccessPoint;
|
|
||||||
|
|
||||||
static void nmwa_about_cb (BonoboUIComponent *uic, NMWirelessApplet *applet);
|
|
||||||
|
|
||||||
static const BonoboUIVerb nmwa_context_menu_verbs [] =
|
static const BonoboUIVerb nmwa_context_menu_verbs [] =
|
||||||
{
|
{
|
||||||
@@ -104,13 +98,13 @@ static GType nmwa_get_type (void)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nmwa_draw
|
* nmwa_redraw
|
||||||
*
|
*
|
||||||
* Actually update the applet's pixmap so that our panel icon reflects
|
* Actually update the applet's pixmap so that our panel icon reflects
|
||||||
* the state of the applet
|
* the state of the applet
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static void nmwa_draw (NMWirelessApplet *applet)
|
static void nmwa_redraw (NMWirelessApplet *applet)
|
||||||
{
|
{
|
||||||
const char *label_text;
|
const char *label_text;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
@@ -132,73 +126,72 @@ static void nmwa_draw (NMWirelessApplet *applet)
|
|||||||
*/
|
*/
|
||||||
static void nmwa_update_state (NMWirelessApplet *applet)
|
static void nmwa_update_state (NMWirelessApplet *applet)
|
||||||
{
|
{
|
||||||
if (applet->nm_active)
|
fprintf( stderr, "state (%d)\n", applet->applet_state);
|
||||||
|
switch (applet->applet_state)
|
||||||
{
|
{
|
||||||
char *status = nmwa_dbus_get_nm_status (applet->connection);
|
case (APPLET_STATE_NO_NM):
|
||||||
char *active_device = nmwa_dbus_get_active_device (applet->connection);
|
break;
|
||||||
|
|
||||||
if (active_device && status)
|
case (APPLET_STATE_NO_CONNECTION):
|
||||||
{
|
|
||||||
int type = nmwa_dbus_get_device_type (applet->connection, active_device);
|
|
||||||
|
|
||||||
switch (type)
|
case (APPLET_STATE_WIRED):
|
||||||
{
|
case (APPLET_STATE_WIRED_CONNECTING):
|
||||||
case (DEVICE_TYPE_WIRELESS_ETHERNET):
|
applet->pix_state = PIX_WIRED;
|
||||||
if (strcmp (status, "connected") == 0)
|
break;
|
||||||
applet->pix_state = PIX_WIRELESS_SIGNAL_4;
|
|
||||||
else if (strcmp (status, "connecting") == 0)
|
|
||||||
{
|
|
||||||
if ( (applet->pix_state < PIX_WIRELESS_CONNECT_0)
|
|
||||||
|| (applet->pix_state > PIX_WIRELESS_CONNECT_2))
|
|
||||||
applet->pix_state = PIX_WIRELESS_CONNECT_0;
|
|
||||||
else
|
|
||||||
applet->pix_state++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case (DEVICE_TYPE_WIRED_ETHERNET):
|
case (APPLET_STATE_WIRELESS):
|
||||||
default:
|
applet->pix_state = PIX_WIRELESS_SIGNAL_4;
|
||||||
applet->pix_state = PIX_WIRED;
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (active_device) dbus_free (active_device);
|
case (APPLET_STATE_WIRELESS_CONNECTING):
|
||||||
if (status) dbus_free (status);
|
if (applet->pix_state < PIX_WIRELESS_CONNECT_0)
|
||||||
|
applet->pix_state = PIX_WIRELESS_CONNECT_0;
|
||||||
|
else if (applet->pix_state >= PIX_WIRELESS_CONNECT_3)
|
||||||
|
applet->pix_state = PIX_WIRELESS_CONNECT_0;
|
||||||
|
else
|
||||||
|
applet->pix_state++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
nmwa_draw (applet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nmwa_timeout_handler
|
* nmwa_redraw_timeout
|
||||||
*
|
*
|
||||||
* Called regularly to update the applet's state and icon in the panel
|
* Called regularly to update the applet's state and icon in the panel
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static int nmwa_timeout_handler (NMWirelessApplet *applet)
|
static int nmwa_redraw_timeout (NMWirelessApplet *applet)
|
||||||
{
|
{
|
||||||
/* Try to get a connection to dbus if we don't already have one */
|
|
||||||
if (!applet->connection)
|
|
||||||
applet->connection = nmwa_dbus_init (applet);
|
|
||||||
|
|
||||||
nmwa_update_state (applet);
|
nmwa_update_state (applet);
|
||||||
|
nmwa_redraw (applet);
|
||||||
|
|
||||||
|
if (applet->applet_state != applet->old_state)
|
||||||
|
{
|
||||||
|
if (applet->menu)
|
||||||
|
nmwa_dispose_menu (applet);
|
||||||
|
applet->menu = nmwa_populate_menu (applet);
|
||||||
|
applet->old_state = applet->applet_state;
|
||||||
|
}
|
||||||
|
|
||||||
return (TRUE);
|
return (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nmwa_start_timeout (NMWirelessApplet *applet)
|
static void nmwa_start_redraw_timeout (NMWirelessApplet *applet)
|
||||||
{
|
{
|
||||||
applet->timeout_handler_id = g_timeout_add (CFG_UPDATE_INTERVAL * 1000,
|
applet->redraw_timeout_id = g_timeout_add (CFG_UPDATE_INTERVAL * 1000,
|
||||||
(GtkFunction)nmwa_timeout_handler, applet);
|
(GtkFunction)nmwa_redraw_timeout, applet);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nmwa_cancel_timeout (NMWirelessApplet *applet)
|
static void nmwa_cancel_timeout (NMWirelessApplet *applet)
|
||||||
{
|
{
|
||||||
g_source_remove (applet->timeout_handler_id);
|
g_source_remove (applet->redraw_timeout_id);
|
||||||
applet->timeout_handler_id = -1;
|
applet->redraw_timeout_id = -1;
|
||||||
nmwa_update_state (applet);
|
nmwa_update_state (applet);
|
||||||
|
nmwa_redraw (applet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -314,10 +307,10 @@ static void nmwa_destroy (NMWirelessApplet *applet, gpointer user_data)
|
|||||||
if (applet->menu)
|
if (applet->menu)
|
||||||
nmwa_dispose_menu (applet);
|
nmwa_dispose_menu (applet);
|
||||||
|
|
||||||
if (applet->timeout_handler_id > 0)
|
if (applet->redraw_timeout_id > 0)
|
||||||
{
|
{
|
||||||
gtk_timeout_remove (applet->timeout_handler_id);
|
gtk_timeout_remove (applet->redraw_timeout_id);
|
||||||
applet->timeout_handler_id = 0;
|
applet->redraw_timeout_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < PIX_NUMBER; i++)
|
for (i = 0; i < PIX_NUMBER; i++)
|
||||||
@@ -384,11 +377,40 @@ static void nmwa_get_menu_pos (GtkMenu *menu, gint *x, gint *y, gboolean *push_i
|
|||||||
*/
|
*/
|
||||||
void nmwa_handle_network_choice (NMWirelessApplet *applet, char *network)
|
void nmwa_handle_network_choice (NMWirelessApplet *applet, char *network)
|
||||||
{
|
{
|
||||||
|
GConfEntry *gconf_entry;
|
||||||
|
char *key;
|
||||||
|
|
||||||
g_return_if_fail (applet != NULL);
|
g_return_if_fail (applet != NULL);
|
||||||
g_return_if_fail (network != NULL);
|
g_return_if_fail (network != NULL);
|
||||||
|
|
||||||
fprintf( stderr, "Forcing network '%s'\n", network);
|
/* Update GConf to set timestamp for this network, or add it if
|
||||||
|
* it doesn't already exist.
|
||||||
|
*/
|
||||||
|
key = g_strdup_printf ("%s/%s", NM_GCONF_TRUSTED_NETWORKS_PATH, network);
|
||||||
|
gconf_entry = gconf_client_get_entry (applet->gconf_client, key, NULL, TRUE, NULL);
|
||||||
|
g_free (key);
|
||||||
|
|
||||||
|
if (gconf_entry)
|
||||||
|
{
|
||||||
|
/* Update timestamp on existing network in trusted networks */
|
||||||
|
key = g_strdup_printf ("%s/%s/timestamp", NM_GCONF_TRUSTED_NETWORKS_PATH, network);
|
||||||
|
gconf_client_set_int (applet->gconf_client, key, time (NULL), NULL);
|
||||||
|
g_free (key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If its not already in trusted networks, add the chosen network to preferred networks */
|
||||||
|
key = g_strdup_printf ("%s/%s/timestamp", NM_GCONF_PREFERRED_NETWORKS_PATH, network);
|
||||||
|
gconf_client_set_int (applet->gconf_client, key, time (NULL), NULL);
|
||||||
|
g_free (key);
|
||||||
|
|
||||||
|
/* Force-set the essid too so that we have a semi-complete network entry */
|
||||||
|
key = g_strdup_printf ("%s/%s/essid", NM_GCONF_PREFERRED_NETWORKS_PATH, network);
|
||||||
|
gconf_client_set_string (applet->gconf_client, key, network, NULL);
|
||||||
|
g_free (key);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf (stderr, "Forcing network '%s'\n", network);
|
||||||
nmwa_dbus_set_network (applet->connection, network);
|
nmwa_dbus_set_network (applet->connection, network);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,14 +446,9 @@ static void nmwa_button_clicked (GtkWidget *button, NMWirelessApplet *applet)
|
|||||||
gtk_menu_popdown (GTK_MENU (applet->menu));
|
gtk_menu_popdown (GTK_MENU (applet->menu));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (applet->nm_active)
|
nmwa_redraw_timeout (applet);
|
||||||
{
|
gtk_menu_popup (GTK_MENU (applet->menu), NULL, NULL, nmwa_get_menu_pos,
|
||||||
if (!applet->menu)
|
applet, 0, gtk_get_current_event_time());
|
||||||
applet->menu = nmwa_populate_menu (applet);
|
|
||||||
|
|
||||||
gtk_menu_popup (GTK_MENU (applet->menu), NULL, NULL, nmwa_get_menu_pos,
|
|
||||||
applet, 0, gtk_get_current_event_time());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -439,8 +456,7 @@ static void nmwa_button_clicked (GtkWidget *button, NMWirelessApplet *applet)
|
|||||||
/*
|
/*
|
||||||
* nmwa_add_menu_item
|
* nmwa_add_menu_item
|
||||||
*
|
*
|
||||||
* Callback from nmwa_dbus_add_networks_to_menu() during network enumeration.
|
* Add a menu item
|
||||||
* Given a network, add it to our networks menu.
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void nmwa_add_menu_item (NMWirelessApplet *applet, GtkWidget *menu, char *text, char *tag, gboolean current,
|
void nmwa_add_menu_item (NMWirelessApplet *applet, GtkWidget *menu, char *text, char *tag, gboolean current,
|
||||||
@@ -452,7 +468,7 @@ void nmwa_add_menu_item (NMWirelessApplet *applet, GtkWidget *menu, char *text,
|
|||||||
|
|
||||||
g_return_if_fail (text != NULL);
|
g_return_if_fail (text != NULL);
|
||||||
g_return_if_fail (menu != NULL);
|
g_return_if_fail (menu != NULL);
|
||||||
fprintf( stderr, "text = %s\n", text);
|
|
||||||
menu_item = gtk_menu_item_new ();
|
menu_item = gtk_menu_item_new ();
|
||||||
hbox = gtk_hbox_new (FALSE, 5);
|
hbox = gtk_hbox_new (FALSE, 5);
|
||||||
gtk_container_add (GTK_CONTAINER (menu_item), hbox);
|
gtk_container_add (GTK_CONTAINER (menu_item), hbox);
|
||||||
@@ -461,7 +477,7 @@ fprintf( stderr, "text = %s\n", text);
|
|||||||
label = gtk_label_new (text);
|
label = gtk_label_new (text);
|
||||||
if (current)
|
if (current)
|
||||||
{
|
{
|
||||||
char *markup = g_strdup_printf ("<span weight=\"bold\">%s</span>", text);
|
char *markup = g_strdup_printf ("<span weight=\"bold\">%s (active)</span>", text);
|
||||||
gtk_label_set_markup (GTK_LABEL (label), markup);
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
||||||
g_free (markup);
|
g_free (markup);
|
||||||
}
|
}
|
||||||
@@ -534,11 +550,57 @@ GtkWidget * nmwa_populate_menu (NMWirelessApplet *applet)
|
|||||||
{
|
{
|
||||||
GtkWidget *menu;
|
GtkWidget *menu;
|
||||||
|
|
||||||
g_assert (applet->nm_active);
|
|
||||||
g_return_if_fail (applet != NULL);
|
g_return_if_fail (applet != NULL);
|
||||||
|
|
||||||
menu = gtk_menu_new ();
|
menu = gtk_menu_new ();
|
||||||
nmwa_dbus_add_networks_to_menu (applet, menu);
|
fprintf( stderr, "populate_menu() state (%d)\n", applet->applet_state);
|
||||||
|
switch (applet->applet_state)
|
||||||
|
{
|
||||||
|
case (APPLET_STATE_NO_NM):
|
||||||
|
nmwa_add_menu_item (applet, menu, "NetworkManager is not running...",
|
||||||
|
NULL, FALSE, FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (APPLET_STATE_NO_CONNECTION):
|
||||||
|
nmwa_add_menu_item (applet, menu, "No network connection is currently active...",
|
||||||
|
NULL, FALSE, FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (APPLET_STATE_WIRED):
|
||||||
|
case (APPLET_STATE_WIRED_CONNECTING):
|
||||||
|
nmwa_add_menu_item (applet, menu, "A wired network connection is currently active...",
|
||||||
|
NULL, FALSE, FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (APPLET_STATE_WIRELESS):
|
||||||
|
case (APPLET_STATE_WIRELESS_CONNECTING):
|
||||||
|
{
|
||||||
|
GSList *element = applet->networks;
|
||||||
|
g_mutex_lock (applet->networks_mutex);
|
||||||
|
if (!element)
|
||||||
|
nmwa_add_menu_item (applet, menu, "There are no wireless networks...",
|
||||||
|
NULL, FALSE, FALSE);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Add all networks in our network list to the menu */
|
||||||
|
while (element)
|
||||||
|
{
|
||||||
|
WirelessNetwork *net = (WirelessNetwork *)(element->data);
|
||||||
|
|
||||||
|
if (net)
|
||||||
|
nmwa_add_menu_item (applet, menu, net->essid,
|
||||||
|
net->essid, net->active, net->encrypted);
|
||||||
|
|
||||||
|
element = g_slist_next (element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_mutex_unlock (applet->networks_mutex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return (menu);
|
return (menu);
|
||||||
}
|
}
|
||||||
@@ -608,21 +670,19 @@ static void nmwa_setup_widgets (NMWirelessApplet *applet)
|
|||||||
|
|
||||||
applet->current_pixbuf = NULL;
|
applet->current_pixbuf = NULL;
|
||||||
applet->about_dialog = NULL;
|
applet->about_dialog = NULL;
|
||||||
|
applet->menu = NULL;
|
||||||
if (applet->nm_active)
|
|
||||||
applet->menu = nmwa_populate_menu (applet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void change_size_cb(PanelApplet *pa, gint s, NMWirelessApplet *applet)
|
static void change_size_cb(PanelApplet *pa, gint s, NMWirelessApplet *applet)
|
||||||
{
|
{
|
||||||
nmwa_setup_widgets (applet);
|
nmwa_setup_widgets (applet);
|
||||||
nmwa_timeout_handler (applet);
|
nmwa_redraw_timeout (applet);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void change_orient_cb(PanelApplet *pa, gint s, NMWirelessApplet *applet)
|
static void change_orient_cb(PanelApplet *pa, gint s, NMWirelessApplet *applet)
|
||||||
{
|
{
|
||||||
nmwa_setup_widgets (applet);
|
nmwa_setup_widgets (applet);
|
||||||
nmwa_timeout_handler (applet);
|
nmwa_redraw_timeout (applet);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean do_not_eat_button_press (GtkWidget *widget, GdkEventButton *event)
|
static gboolean do_not_eat_button_press (GtkWidget *widget, GdkEventButton *event)
|
||||||
@@ -669,37 +729,47 @@ static void change_background_cb(PanelApplet *a, PanelAppletBackgroundType type,
|
|||||||
*/
|
*/
|
||||||
static GtkWidget * nmwa_new (NMWirelessApplet *applet)
|
static GtkWidget * nmwa_new (NMWirelessApplet *applet)
|
||||||
{
|
{
|
||||||
panel_applet_set_flags (PANEL_APPLET (applet), PANEL_APPLET_EXPAND_MINOR);
|
GError *error = NULL;
|
||||||
|
|
||||||
|
panel_applet_set_flags (PANEL_APPLET (applet), PANEL_APPLET_EXPAND_MINOR);
|
||||||
gtk_widget_hide(GTK_WIDGET(applet));
|
gtk_widget_hide(GTK_WIDGET(applet));
|
||||||
|
|
||||||
applet->gconf_client = gconf_client_get_default ();
|
applet->gconf_client = gconf_client_get_default ();
|
||||||
if (!applet->gconf_client)
|
if (!applet->gconf_client)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
#if 0
|
applet->ui_resources = glade_xml_new(glade_file, NULL, NULL);
|
||||||
applet->net_dialog = glade_xml_new(GLADEDIR"/network_chocie.glade", NULL, NULL);
|
if (!applet->ui_resources)
|
||||||
if (!applet->net_dialog)
|
|
||||||
{
|
{
|
||||||
fprintf (stderr, "Could not open the network dialog glade file!\n");
|
fprintf (stderr, "Could not get our UI resources from the glade file\n");
|
||||||
g_object_unref (G_OBJECT (applet->gconf_client));
|
g_object_unref (G_OBJECT (applet->gconf_client));
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
applet->pix_state = PIX_WIRED;
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
applet->connection = nmwa_dbus_init(applet);
|
|
||||||
applet->nm_active = nmwa_dbus_nm_is_running(applet->connection);
|
|
||||||
|
|
||||||
|
/* Start our dbus thread */
|
||||||
|
if (!(applet->networks_mutex = g_mutex_new ()))
|
||||||
|
{
|
||||||
|
g_object_unref (G_OBJECT (applet->gconf_client));
|
||||||
|
/* FIXME: free glade file */
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
if (!(applet->dbus_thread = g_thread_create (nmwa_dbus_worker, applet, FALSE, &error)))
|
||||||
|
{
|
||||||
|
g_mutex_free (applet->networks_mutex);
|
||||||
|
g_object_unref (G_OBJECT (applet->gconf_client));
|
||||||
|
/* FIXME: free glade file */
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load pixmaps and create applet widgets */
|
||||||
nmwa_load_theme (applet);
|
nmwa_load_theme (applet);
|
||||||
nmwa_setup_widgets (applet);
|
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->button, "button_press_event", G_CALLBACK (do_not_eat_button_press), NULL);
|
g_signal_connect (applet->button, "button_press_event", G_CALLBACK (do_not_eat_button_press), NULL);
|
||||||
|
|
||||||
nmwa_timeout_handler (applet);
|
|
||||||
nmwa_start_timeout (applet);
|
|
||||||
|
|
||||||
panel_applet_setup_menu_from_file (PANEL_APPLET (applet), NULL, "NMWirelessApplet.xml", NULL,
|
panel_applet_setup_menu_from_file (PANEL_APPLET (applet), NULL, "NMWirelessApplet.xml", NULL,
|
||||||
nmwa_context_menu_verbs, applet);
|
nmwa_context_menu_verbs, applet);
|
||||||
|
|
||||||
@@ -715,6 +785,9 @@ static GtkWidget * nmwa_new (NMWirelessApplet *applet)
|
|||||||
g_signal_connect (G_OBJECT (applet), "change_orient", G_CALLBACK (change_orient_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);
|
g_signal_connect (G_OBJECT (applet), "change_background", G_CALLBACK (change_background_cb), applet);
|
||||||
|
|
||||||
|
/* Start redraw timeout */
|
||||||
|
nmwa_start_redraw_timeout (applet);
|
||||||
|
|
||||||
return (GTK_WIDGET (applet));
|
return (GTK_WIDGET (applet));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -725,6 +798,12 @@ static gboolean nmwa_fill (NMWirelessApplet *applet)
|
|||||||
glade_gnome_init ();
|
glade_gnome_init ();
|
||||||
glade_file = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_DATADIR,
|
glade_file = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_DATADIR,
|
||||||
"NMWirelessApplet/wireless-applet.glade", FALSE, NULL);
|
"NMWirelessApplet/wireless-applet.glade", FALSE, NULL);
|
||||||
|
if (!glade_file)
|
||||||
|
{
|
||||||
|
show_warning_dialog (TRUE, "The NetworkManager Applet could not find some required"
|
||||||
|
"resources (the glade file was not found).");
|
||||||
|
return (FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
gtk_widget_show (nmwa_new (applet));
|
gtk_widget_show (nmwa_new (applet));
|
||||||
return (TRUE);
|
return (TRUE);
|
||||||
|
@@ -27,6 +27,8 @@
|
|||||||
#include <panel-applet-gconf.h>
|
#include <panel-applet-gconf.h>
|
||||||
#include <gconf/gconf-client.h>
|
#include <gconf/gconf-client.h>
|
||||||
#include <glade/glade.h>
|
#include <glade/glade.h>
|
||||||
|
#include <dbus/dbus.h>
|
||||||
|
#include <dbus/dbus-glib.h>
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -40,42 +42,66 @@ typedef enum
|
|||||||
PIX_WIRELESS_CONNECT_1,
|
PIX_WIRELESS_CONNECT_1,
|
||||||
PIX_WIRELESS_CONNECT_2,
|
PIX_WIRELESS_CONNECT_2,
|
||||||
PIX_WIRELESS_CONNECT_3,
|
PIX_WIRELESS_CONNECT_3,
|
||||||
PIX_NUMBER,
|
PIX_NUMBER
|
||||||
} PixmapState;
|
} PixmapState;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
APPLET_STATE_NO_NM,
|
||||||
|
APPLET_STATE_NO_CONNECTION,
|
||||||
|
APPLET_STATE_WIRED,
|
||||||
|
APPLET_STATE_WIRED_CONNECTING,
|
||||||
|
APPLET_STATE_WIRELESS,
|
||||||
|
APPLET_STATE_WIRELESS_CONNECTING,
|
||||||
|
APPLET_STATE_IGNORE
|
||||||
|
} AppletState;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Applet instance data
|
||||||
|
*
|
||||||
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
PanelApplet base;
|
PanelApplet base;
|
||||||
|
|
||||||
DBusConnection *connection;
|
DBusConnection *connection;
|
||||||
gboolean nm_active;
|
|
||||||
GConfClient *gconf_client;
|
GConfClient *gconf_client;
|
||||||
GladeXML *net_dialog;
|
GladeXML *ui_resources;
|
||||||
|
guint redraw_timeout_id;
|
||||||
|
GThread *dbus_thread;
|
||||||
|
GMainContext *thread_context;
|
||||||
|
|
||||||
PixmapState pix_state;
|
PixmapState pix_state; // Index into pixmaps array
|
||||||
/* contains pointers into the images GList.
|
|
||||||
* 0-100 are for link */
|
|
||||||
GdkPixbuf *pixmaps[PIX_NUMBER];
|
GdkPixbuf *pixmaps[PIX_NUMBER];
|
||||||
/* pointer to the current used file name */
|
|
||||||
GdkPixbuf *current_pixbuf;
|
GdkPixbuf *current_pixbuf;
|
||||||
GdkPixbuf *key_pixbuf;
|
GdkPixbuf *key_pixbuf;
|
||||||
|
|
||||||
|
/* Data model elements */
|
||||||
|
GMutex *networks_mutex;
|
||||||
|
GSList *networks;
|
||||||
|
AppletState applet_state;
|
||||||
|
AppletState old_state;
|
||||||
|
|
||||||
|
/* Direct UI elements */
|
||||||
GtkWidget *pixmap;
|
GtkWidget *pixmap;
|
||||||
GtkWidget *button;
|
GtkWidget *button;
|
||||||
GtkWidget *box;
|
GtkWidget *box;
|
||||||
GtkWidget *about_dialog;
|
GtkWidget *about_dialog;
|
||||||
GtkWidget *menu;
|
GtkWidget *menu;
|
||||||
|
|
||||||
guint timeout_handler_id;
|
|
||||||
} NMWirelessApplet;
|
} NMWirelessApplet;
|
||||||
|
|
||||||
|
|
||||||
void nmwa_add_menu_item (NMWirelessApplet *applet, GtkWidget *menu, char *text, char *tag,
|
/*
|
||||||
gboolean current, gboolean encrypted);
|
* Representation of a wireless network
|
||||||
|
*
|
||||||
GtkWidget * nmwa_populate_menu (NMWirelessApplet *applet);
|
*/
|
||||||
|
typedef struct
|
||||||
void nmwa_dispose_menu (NMWirelessApplet *applet);
|
{
|
||||||
|
char *essid;
|
||||||
|
gboolean encrypted;
|
||||||
|
gboolean active;
|
||||||
|
} WirelessNetwork;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -35,153 +35,189 @@
|
|||||||
#define NMI_DBUS_PATH "/org/freedesktop/NetworkManagerInfo"
|
#define NMI_DBUS_PATH "/org/freedesktop/NetworkManagerInfo"
|
||||||
#define NMI_DBUS_INTERFACE "org.freedesktop.NetworkManagerInfo"
|
#define NMI_DBUS_INTERFACE "org.freedesktop.NetworkManagerInfo"
|
||||||
|
|
||||||
|
#define DBUS_NO_SERVICE_ERROR "org.freedesktop.DBus.Error.ServiceDoesNotExist"
|
||||||
|
#define NM_DBUS_NO_ACTIVE_NET_ERROR "org.freedesktop.NetworkManager.NoActiveNetwork"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nmwa_dbus_get_string
|
* nmwa_dbus_get_string
|
||||||
*
|
*
|
||||||
* NOTE: caller MUST free the returned string
|
* NOTE: caller MUST free the returned string
|
||||||
*
|
*
|
||||||
|
* Returns: RETURN_SUCCESS on success
|
||||||
|
* RETURN_FAILURE on failure
|
||||||
|
* RETURN_NO_NM if NetworkManager service no longer exists
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
char * nmwa_dbus_get_string (DBusConnection *connection, const char *path, const char *method)
|
int nmwa_dbus_get_string (DBusConnection *connection, const char *path, const char *method, char **string)
|
||||||
{
|
{
|
||||||
DBusMessage *message;
|
DBusMessage *message;
|
||||||
DBusMessage *reply;
|
DBusMessage *reply;
|
||||||
DBusError error;
|
DBusError error;
|
||||||
char *string = NULL;
|
char *dbus_string = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (connection != NULL, NULL);
|
g_return_val_if_fail (connection != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (path != NULL, NULL);
|
g_return_val_if_fail (path != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (method != NULL, NULL);
|
g_return_val_if_fail (method != NULL, RETURN_FAILURE);
|
||||||
|
g_return_val_if_fail (string != NULL, RETURN_FAILURE);
|
||||||
|
g_return_val_if_fail (*string == NULL, RETURN_FAILURE);
|
||||||
|
|
||||||
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
|
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
|
||||||
{
|
{
|
||||||
fprintf (stderr, "nmwa_dbus_get_string(): Couldn't allocate the dbus message\n");
|
fprintf (stderr, "nmwa_dbus_get_string(): Couldn't allocate the dbus message\n");
|
||||||
return (NULL);
|
return (RETURN_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
|
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
|
||||||
|
dbus_message_unref (message);
|
||||||
if (dbus_error_is_set (&error))
|
if (dbus_error_is_set (&error))
|
||||||
{
|
{
|
||||||
|
int ret = RETURN_FAILURE;
|
||||||
|
|
||||||
fprintf (stderr, "nmwa_dbus_get_string(): %s raised:\n %s\n\n", error.name, error.message);
|
fprintf (stderr, "nmwa_dbus_get_string(): %s raised:\n %s\n\n", error.name, error.message);
|
||||||
dbus_message_unref (message);
|
if (strcmp (error.name, DBUS_NO_SERVICE_ERROR) == 0)
|
||||||
return (NULL);
|
ret = RETURN_NO_NM;
|
||||||
|
else if (strcmp (error.name, NM_DBUS_NO_ACTIVE_NET_ERROR) == 0)
|
||||||
|
ret = RETURN_SUCCESS;
|
||||||
|
|
||||||
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reply == NULL)
|
if (reply == NULL)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "nmwa_dbus_get_string(): dbus reply message was NULL\n" );
|
fprintf (stderr, "nmwa_dbus_get_string(): dbus reply message was NULL\n" );
|
||||||
dbus_message_unref (message);
|
return (RETURN_FAILURE);
|
||||||
return (NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &string, DBUS_TYPE_INVALID))
|
if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &dbus_string, DBUS_TYPE_INVALID))
|
||||||
{
|
{
|
||||||
fprintf (stderr, "nmwa_dbus_get_string(): error while getting args: name='%s' message='%s'\n", error.name, error.message);
|
fprintf (stderr, "nmwa_dbus_get_string(): error while getting args: name='%s' message='%s'\n", error.name, error.message);
|
||||||
string = NULL;
|
dbus_message_unref (reply);
|
||||||
|
return (RETURN_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_message_unref (reply);
|
dbus_message_unref (reply);
|
||||||
dbus_message_unref (message);
|
|
||||||
|
|
||||||
return (string);
|
*string = dbus_string;
|
||||||
|
return (RETURN_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nmwa_dbus_get_int
|
* nmwa_dbus_get_int
|
||||||
*
|
*
|
||||||
|
* Returns: RETURN_SUCCESS on success
|
||||||
|
* RETURN_FAILURE on failure
|
||||||
|
* RETURN_NO_NM if NetworkManager service no longer exists
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
gint32 nmwa_dbus_get_int (DBusConnection *connection, const char *path, const char *method)
|
int nmwa_dbus_get_int (DBusConnection *connection, const char *path, const char *method, gint32 *num)
|
||||||
{
|
{
|
||||||
DBusMessage *message;
|
DBusMessage *message;
|
||||||
DBusMessage *reply;
|
DBusMessage *reply;
|
||||||
DBusError error;
|
DBusError error;
|
||||||
gint32 num;
|
int dbus_num;
|
||||||
|
|
||||||
g_return_val_if_fail (connection != NULL, 0);
|
g_return_val_if_fail (connection != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (path != NULL, 0);
|
g_return_val_if_fail (path != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (method != NULL, 0);
|
g_return_val_if_fail (method != NULL, RETURN_FAILURE);
|
||||||
|
g_return_val_if_fail (num != NULL, RETURN_FAILURE);
|
||||||
|
|
||||||
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
|
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
|
||||||
{
|
{
|
||||||
fprintf (stderr, "nmwa_dbus_get_int(): Couldn't allocate the dbus message\n");
|
fprintf (stderr, "nmwa_dbus_get_int(): Couldn't allocate the dbus message\n");
|
||||||
return (0);
|
return (RETURN_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
|
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
|
||||||
|
dbus_message_unref (message);
|
||||||
if (dbus_error_is_set (&error))
|
if (dbus_error_is_set (&error))
|
||||||
{
|
{
|
||||||
|
int ret = RETURN_FAILURE;
|
||||||
|
|
||||||
fprintf (stderr, "nmwa_dbus_get_int(): %s raised:\n %s\n\n", error.name, error.message);
|
fprintf (stderr, "nmwa_dbus_get_int(): %s raised:\n %s\n\n", error.name, error.message);
|
||||||
dbus_message_unref (message);
|
if (strcmp (error.name, DBUS_NO_SERVICE_ERROR) == 0)
|
||||||
return (0);
|
ret = RETURN_NO_NM;
|
||||||
|
|
||||||
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reply == NULL)
|
if (reply == NULL)
|
||||||
{
|
{
|
||||||
fprintf( stderr, "nmwa_dbus_get_int(): dbus reply message was NULL\n" );
|
fprintf( stderr, "nmwa_dbus_get_int(): dbus reply message was NULL\n" );
|
||||||
dbus_message_unref (message);
|
return (RETURN_FAILURE);
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
if (!dbus_message_get_args (reply, &error, DBUS_TYPE_INT32, &num, DBUS_TYPE_INVALID))
|
if (!dbus_message_get_args (reply, &error, DBUS_TYPE_INT32, &dbus_num, DBUS_TYPE_INVALID))
|
||||||
num = 0;
|
{
|
||||||
|
dbus_message_unref (reply);
|
||||||
|
return (RETURN_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
dbus_message_unref (reply);
|
dbus_message_unref (reply);
|
||||||
dbus_message_unref (message);
|
*num = dbus_num;
|
||||||
|
return (RETURN_SUCCESS);
|
||||||
return (num);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nmwa_dbus_get_bool
|
* nmwa_dbus_get_bool
|
||||||
*
|
*
|
||||||
|
* Returns: RETURN_SUCCESS on success
|
||||||
|
* RETURN_FAILURE on failure
|
||||||
|
* RETURN_NO_NM if NetworkManager service no longer exists
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
gboolean nmwa_dbus_get_bool (DBusConnection *connection, const char *path, const char *method)
|
int nmwa_dbus_get_bool (DBusConnection *connection, const char *path, const char *method, gboolean *val)
|
||||||
{
|
{
|
||||||
DBusMessage *message;
|
DBusMessage *message;
|
||||||
DBusMessage *reply;
|
DBusMessage *reply;
|
||||||
DBusError error;
|
DBusError error;
|
||||||
gboolean val;
|
|
||||||
|
|
||||||
g_return_val_if_fail (connection != NULL, 0);
|
g_return_val_if_fail (connection != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (path != NULL, 0);
|
g_return_val_if_fail (path != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (method != NULL, 0);
|
g_return_val_if_fail (method != NULL, RETURN_FAILURE);
|
||||||
|
g_return_val_if_fail (val != NULL, RETURN_FAILURE);
|
||||||
|
|
||||||
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
|
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
|
||||||
{
|
{
|
||||||
fprintf (stderr, "nmwa_dbus_get_int(): Couldn't allocate the dbus message\n");
|
fprintf (stderr, "nmwa_dbus_get_bool(): Couldn't allocate the dbus message\n");
|
||||||
return (0);
|
return (RETURN_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
|
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
|
||||||
|
dbus_message_unref (message);
|
||||||
if (dbus_error_is_set (&error))
|
if (dbus_error_is_set (&error))
|
||||||
{
|
{
|
||||||
fprintf (stderr, "nmwa_dbus_get_int(): %s raised:\n %s\n\n", error.name, error.message);
|
int ret = RETURN_FAILURE;
|
||||||
dbus_message_unref (message);
|
|
||||||
return (0);
|
fprintf (stderr, "nmwa_dbus_get_bool(): %s raised:\n %s\n\n", error.name, error.message);
|
||||||
|
if (strcmp (error.name, DBUS_NO_SERVICE_ERROR) == 0)
|
||||||
|
ret = RETURN_NO_NM;
|
||||||
|
|
||||||
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reply == NULL)
|
if (reply == NULL)
|
||||||
{
|
{
|
||||||
fprintf( stderr, "nmwa_dbus_get_int(): dbus reply message was NULL\n" );
|
fprintf( stderr, "nmwa_dbus_get_bool(): dbus reply message was NULL\n" );
|
||||||
dbus_message_unref (message);
|
dbus_message_unref (message);
|
||||||
return (0);
|
return (RETURN_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
if (!dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN, &val, DBUS_TYPE_INVALID))
|
if (!dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN, val, DBUS_TYPE_INVALID))
|
||||||
val = FALSE;
|
{
|
||||||
|
dbus_message_unref (reply);
|
||||||
|
return (RETURN_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
dbus_message_unref (reply);
|
dbus_message_unref (reply);
|
||||||
dbus_message_unref (message);
|
*val = FALSE;
|
||||||
|
return (RETURN_SUCCESS);
|
||||||
return (val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -238,51 +274,71 @@ double nmwa_dbus_get_double (DBusConnection *connection, const char *path, const
|
|||||||
*
|
*
|
||||||
* NOTE: caller MUST free the returned string array
|
* NOTE: caller MUST free the returned string array
|
||||||
*
|
*
|
||||||
|
* Returns: RETURN_SUCCESS on success
|
||||||
|
* RETURN_FAILURE on failure
|
||||||
|
* RETURN_NO_NM if NetworkManager service no longer exists
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
char **nmwa_dbus_get_string_array (DBusConnection *connection, const char *path, const char *method, int *num_items)
|
int nmwa_dbus_get_string_array (DBusConnection *connection, const char *path, const char *method,
|
||||||
|
int *num_items, char ***string_array)
|
||||||
{
|
{
|
||||||
DBusMessage *message;
|
DBusMessage *message;
|
||||||
DBusMessage *reply;
|
DBusMessage *reply;
|
||||||
DBusMessageIter iter;
|
DBusMessageIter iter;
|
||||||
DBusError error;
|
DBusError error;
|
||||||
char **array;
|
char **array = NULL;
|
||||||
|
int items = 0;
|
||||||
|
|
||||||
g_return_val_if_fail (connection != NULL, NULL);
|
g_return_val_if_fail (connection != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (path != NULL, NULL);
|
g_return_val_if_fail (path != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (method != NULL, NULL);
|
g_return_val_if_fail (method != NULL, RETURN_FAILURE);
|
||||||
g_return_val_if_fail (num_items != NULL, NULL);
|
g_return_val_if_fail (num_items != NULL, RETURN_FAILURE);
|
||||||
|
g_return_val_if_fail (string_array != NULL, RETURN_FAILURE);
|
||||||
|
|
||||||
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
|
if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, method)))
|
||||||
{
|
{
|
||||||
fprintf (stderr, "nmwa_dbus_get_string_array(): Couldn't allocate the dbus message\n");
|
fprintf (stderr, "nmwa_dbus_get_string_array(): Couldn't allocate the dbus message\n");
|
||||||
return (NULL);
|
return (RETURN_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
|
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
|
||||||
|
dbus_message_unref (message);
|
||||||
if (dbus_error_is_set (&error))
|
if (dbus_error_is_set (&error))
|
||||||
{
|
{
|
||||||
|
int ret = RETURN_FAILURE;
|
||||||
|
|
||||||
fprintf (stderr, "nmwa_dbus_get_string_array(): %s raised:\n %s\n\n", error.name, error.message);
|
fprintf (stderr, "nmwa_dbus_get_string_array(): %s raised:\n %s\n\n", error.name, error.message);
|
||||||
dbus_message_unref (message);
|
if (strcmp (error.name, DBUS_NO_SERVICE_ERROR) == 0)
|
||||||
return (NULL);
|
ret = RETURN_NO_NM;
|
||||||
|
else if (strcmp (error.name, "NoNetworks") == 0)
|
||||||
|
{
|
||||||
|
*string_array = NULL;
|
||||||
|
*num_items = 0;
|
||||||
|
ret = RETURN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reply == NULL)
|
if (reply == NULL)
|
||||||
{
|
{
|
||||||
fprintf( stderr, "nmwa_dbus_get_string_array(): dbus reply message was NULL\n" );
|
fprintf( stderr, "nmwa_dbus_get_string_array(): dbus reply message was NULL\n" );
|
||||||
dbus_message_unref (message);
|
return (RETURN_FAILURE);
|
||||||
return (NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now analyze reply */
|
/* now analyze reply */
|
||||||
dbus_message_iter_init (reply, &iter);
|
dbus_message_iter_init (reply, &iter);
|
||||||
if (!dbus_message_iter_get_string_array (&iter, &array, num_items))
|
if (!dbus_message_iter_get_string_array (&iter, &array, &items))
|
||||||
array = NULL;
|
{
|
||||||
|
dbus_message_unref (reply);
|
||||||
|
return (RETURN_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
dbus_message_unref (reply);
|
dbus_message_unref (reply);
|
||||||
dbus_message_unref (message);
|
*num_items = items;
|
||||||
|
*string_array = array;
|
||||||
return (array);
|
return (RETURN_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -292,20 +348,22 @@ char **nmwa_dbus_get_string_array (DBusConnection *connection, const char *path,
|
|||||||
* Returns the object_path of the currently active device, if any.
|
* Returns the object_path of the currently active device, if any.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
char * nmwa_dbus_get_active_device (DBusConnection *connection)
|
char * nmwa_dbus_get_active_device (NMWirelessApplet *applet, AppletState failure_state)
|
||||||
{
|
{
|
||||||
char *active_device;
|
char *active_device = NULL;
|
||||||
|
|
||||||
if (!connection)
|
switch (nmwa_dbus_get_string (applet->connection, NM_DBUS_PATH, "getActiveDevice", &active_device))
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
if ((active_device = nmwa_dbus_get_string (connection, NM_DBUS_PATH, "getActiveDevice")))
|
|
||||||
{
|
{
|
||||||
if (strlen (active_device) < 1)
|
case (RETURN_NO_NM):
|
||||||
{
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
dbus_free (active_device);
|
break;
|
||||||
active_device = NULL;
|
|
||||||
}
|
case (RETURN_FAILURE):
|
||||||
|
applet->applet_state = failure_state;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (active_device);
|
return (active_device);
|
||||||
@@ -318,20 +376,23 @@ char * nmwa_dbus_get_active_device (DBusConnection *connection)
|
|||||||
* Returns the object_path of the currently active network of the active device.
|
* Returns the object_path of the currently active network of the active device.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
char * nmwa_dbus_get_active_network (DBusConnection *connection, char *dev_path)
|
char * nmwa_dbus_get_active_network (NMWirelessApplet *applet, char *dev_path, AppletState failure_state)
|
||||||
{
|
{
|
||||||
char *network;
|
char *network = NULL;
|
||||||
|
|
||||||
if (!connection)
|
switch (nmwa_dbus_get_string (applet->connection, dev_path, "getActiveNetwork", &network))
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
if ((network = nmwa_dbus_get_string (connection, dev_path, "getActiveNetwork")))
|
|
||||||
{
|
{
|
||||||
if (strlen (network) < 1)
|
case (RETURN_NO_NM):
|
||||||
{
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
dbus_free (network);
|
break;
|
||||||
network = NULL;
|
|
||||||
}
|
case (RETURN_FAILURE):
|
||||||
|
if (failure_state != APPLET_STATE_IGNORE)
|
||||||
|
applet->applet_state = failure_state;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (network);
|
return (network);
|
||||||
@@ -341,15 +402,28 @@ char * nmwa_dbus_get_active_network (DBusConnection *connection, char *dev_path)
|
|||||||
/*
|
/*
|
||||||
* nmwa_dbus_get_device_type
|
* nmwa_dbus_get_device_type
|
||||||
*
|
*
|
||||||
* Returns the object_path of the currently active device, if any.
|
* Returns the device type of the specified device.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nmwa_dbus_get_device_type (DBusConnection *connection, char *path)
|
int nmwa_dbus_get_device_type (NMWirelessApplet *applet, char *path, AppletState failure_state)
|
||||||
{
|
{
|
||||||
if (!connection || !path)
|
int type = -1;
|
||||||
return (0);
|
|
||||||
|
|
||||||
return (nmwa_dbus_get_int (connection, path, "getType"));
|
switch (nmwa_dbus_get_int (applet->connection, path, "getType", &type))
|
||||||
|
{
|
||||||
|
case (RETURN_NO_NM):
|
||||||
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (RETURN_FAILURE):
|
||||||
|
applet->applet_state = failure_state;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -359,20 +433,22 @@ int nmwa_dbus_get_device_type (DBusConnection *connection, char *path)
|
|||||||
* Returns NetworkManager's status
|
* Returns NetworkManager's status
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
char * nmwa_dbus_get_nm_status (DBusConnection *connection)
|
char * nmwa_dbus_get_nm_status (NMWirelessApplet *applet, AppletState failure_state)
|
||||||
{
|
{
|
||||||
char *status;
|
char *status = NULL;
|
||||||
|
|
||||||
if (!connection)
|
switch (nmwa_dbus_get_string (applet->connection, NM_DBUS_PATH, "status", &status))
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
if ((status = nmwa_dbus_get_string (connection, NM_DBUS_PATH, "status")))
|
|
||||||
{
|
{
|
||||||
if (strlen (status) < 1)
|
case (RETURN_NO_NM):
|
||||||
{
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
dbus_free (status);
|
break;
|
||||||
status = NULL;
|
|
||||||
}
|
case (RETURN_FAILURE):
|
||||||
|
applet->applet_state = failure_state;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (status);
|
return (status);
|
||||||
@@ -380,101 +456,83 @@ char * nmwa_dbus_get_nm_status (DBusConnection *connection)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nmwa_dbus_add_networks_to_menu
|
* nmwa_dbus_get_network_name
|
||||||
*
|
*
|
||||||
* Query NetworkManager for networks and add any to the networks menu
|
* Returns the name of a specified wireless network
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void nmwa_dbus_add_networks_to_menu (NMWirelessApplet *applet, GtkWidget *menu)
|
char * nmwa_dbus_get_network_name (NMWirelessApplet *applet, char *net_path)
|
||||||
{
|
{
|
||||||
char *active_device;
|
char *name = NULL;
|
||||||
char *active_network;
|
|
||||||
char **networks;
|
|
||||||
int num_items = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
g_return_if_fail (applet != NULL);
|
switch (nmwa_dbus_get_string (applet->connection, net_path, "getName", &name))
|
||||||
g_return_if_fail (applet->connection != NULL);
|
|
||||||
g_return_if_fail (menu != NULL);
|
|
||||||
|
|
||||||
if (!applet->connection)
|
|
||||||
{
|
{
|
||||||
nmwa_add_menu_item (applet, menu, "No wireless networks found...", NULL, FALSE, FALSE);
|
case (RETURN_NO_NM):
|
||||||
return;
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
}
|
|
||||||
|
|
||||||
if (!(active_device = nmwa_dbus_get_active_device (applet->connection)))
|
|
||||||
{
|
|
||||||
nmwa_add_menu_item (applet, menu, "No network connection is present.", NULL, FALSE, FALSE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (nmwa_dbus_get_device_type (applet->connection, active_device))
|
|
||||||
{
|
|
||||||
case (DEVICE_TYPE_WIRED_ETHERNET):
|
|
||||||
nmwa_add_menu_item (applet, menu, "A wired ethernet card is currently active.", NULL, FALSE, FALSE);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case (DEVICE_TYPE_WIRELESS_ETHERNET):
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
nmwa_add_menu_item (applet, menu, "Some other network device is currently active.", NULL, FALSE, FALSE);
|
break;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
active_network = nmwa_dbus_get_active_network (applet->connection, active_device);
|
return (name);
|
||||||
|
}
|
||||||
|
|
||||||
/* Get each of the networks in turn and add them to the menu */
|
|
||||||
if (!(networks = nmwa_dbus_get_string_array (applet->connection, active_device, "getNetworks", &num_items)))
|
/*
|
||||||
|
* nmwa_dbus_get_network_encrypted
|
||||||
|
*
|
||||||
|
* Returns whether or not the specified network is encrypted
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
gboolean nmwa_dbus_get_network_encrypted (NMWirelessApplet *applet, char *net_path)
|
||||||
|
{
|
||||||
|
gboolean enc = FALSE;
|
||||||
|
|
||||||
|
switch (nmwa_dbus_get_bool (applet->connection, net_path, "getName", &enc))
|
||||||
{
|
{
|
||||||
dbus_free (active_device);
|
case (RETURN_NO_NM):
|
||||||
if (active_network)
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
dbus_free (active_network);
|
break;
|
||||||
return;
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen (networks[0]) == 0)
|
return (enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nmwa_dbus_get_device_networks
|
||||||
|
*
|
||||||
|
* Returns an array of wireless networks that the specified device knows about.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
char **nmwa_dbus_get_device_networks (NMWirelessApplet *applet, char *path, int *num_items, AppletState failure_state)
|
||||||
|
{
|
||||||
|
char **array = NULL;
|
||||||
|
int items;
|
||||||
|
|
||||||
|
switch (nmwa_dbus_get_string_array (applet->connection, path, "getNetworks", &items, &array))
|
||||||
{
|
{
|
||||||
nmwa_add_menu_item (applet, menu, "No wireless networks found...", NULL, FALSE, FALSE);
|
case (RETURN_NO_NM):
|
||||||
dbus_free (active_device);
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
if (active_network)
|
break;
|
||||||
dbus_free (active_network);
|
|
||||||
return;
|
case (RETURN_FAILURE):
|
||||||
|
applet->applet_state = failure_state;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (RETURN_SUCCESS):
|
||||||
|
*num_items = items;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_items; i++)
|
return (array);
|
||||||
{
|
|
||||||
char *name = nmwa_dbus_get_string (applet->connection, networks[i], "getName");
|
|
||||||
|
|
||||||
if (name && strlen (name))
|
|
||||||
{
|
|
||||||
gboolean found = FALSE;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
/* Only show one menu item per network. NetworkManager really passes back a list
|
|
||||||
* of access points, and there may be more than one that have the same ESSID. Filter
|
|
||||||
* them here.
|
|
||||||
*/
|
|
||||||
for (j = 0; j < i; j++)
|
|
||||||
if (found = (networks[j] && (strcmp (networks[i], networks[j]) == 0)))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (!found)
|
|
||||||
{
|
|
||||||
gboolean active = active_network ? (strcmp (networks[i], active_network) == 0) : FALSE;
|
|
||||||
gboolean encrypted = nmwa_dbus_get_bool (applet->connection, networks[i], "getEncrypted");
|
|
||||||
|
|
||||||
fprintf( stderr, "Adding '%s' active (%d), enc (%d)\n", name, active, encrypted);
|
|
||||||
nmwa_add_menu_item (applet, menu, name, name, active, encrypted);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dbus_free (name);
|
|
||||||
}
|
|
||||||
|
|
||||||
dbus_free_string_array (networks);
|
|
||||||
dbus_free (active_network);
|
|
||||||
dbus_free (active_device);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -498,26 +556,174 @@ void nmwa_dbus_set_network (DBusConnection *connection, char *network)
|
|||||||
dbus_connection_send (connection, message, NULL);
|
dbus_connection_send (connection, message, NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fprintf (stderr, "nm_dbus_get_network_priority(): Couldn't allocate the dbus message\n");
|
fprintf (stderr, "nm_dbus_set_network(): Couldn't allocate the dbus message\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nmwa_dbus_nm_is_running
|
* wireless_network_free
|
||||||
*
|
*
|
||||||
* Ask dbus whether or not NetworkManager is running
|
* Frees the representation of a wireless network
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
gboolean nmwa_dbus_nm_is_running (DBusConnection *connection)
|
static void wireless_network_free (void *element, void *user_data)
|
||||||
{
|
{
|
||||||
DBusError error;
|
WirelessNetwork *net = (WirelessNetwork *)(element);
|
||||||
gboolean exists;
|
|
||||||
|
|
||||||
g_return_val_if_fail (connection != NULL, FALSE);
|
if (net) g_free (net->essid);
|
||||||
|
g_free (net);
|
||||||
|
}
|
||||||
|
|
||||||
dbus_error_init (&error);
|
|
||||||
exists = dbus_bus_service_exists (connection, NM_DBUS_SERVICE, &error);
|
/*
|
||||||
return (exists);
|
* nmwa_dbus_update_wireless_network_list
|
||||||
|
*
|
||||||
|
* Query NetworkManager for the wireless networks the active device
|
||||||
|
* knows about, if the active device is wireless.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void nmwa_dbus_update_wireless_network_list (NMWirelessApplet *applet)
|
||||||
|
{
|
||||||
|
char *active_device = NULL;
|
||||||
|
char *active_network = NULL;
|
||||||
|
int dev_type;
|
||||||
|
char **networks = NULL;
|
||||||
|
int num_items = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Grab the lock for the network list. */
|
||||||
|
g_mutex_lock (applet->networks_mutex);
|
||||||
|
|
||||||
|
/* Clear out existing entries in the list */
|
||||||
|
if (applet->networks)
|
||||||
|
{
|
||||||
|
g_slist_foreach (applet->networks, wireless_network_free, NULL);
|
||||||
|
g_slist_free (applet->networks);
|
||||||
|
applet->networks = NULL;
|
||||||
|
}
|
||||||
|
g_mutex_unlock (applet->networks_mutex);
|
||||||
|
|
||||||
|
if ( (applet->applet_state != APPLET_STATE_WIRELESS)
|
||||||
|
&& (applet->applet_state != APPLET_STATE_WIRELESS_CONNECTING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!(active_device = nmwa_dbus_get_active_device (applet, APPLET_STATE_NO_CONNECTION)))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if ( ((dev_type = nmwa_dbus_get_device_type (applet, active_device, APPLET_STATE_NO_CONNECTION)) == -1)
|
||||||
|
|| (dev_type != DEVICE_TYPE_WIRELESS_ETHERNET))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
active_network = nmwa_dbus_get_active_network (applet, active_device, APPLET_STATE_IGNORE);
|
||||||
|
if (applet->applet_state == APPLET_STATE_NO_NM)
|
||||||
|
goto out; /* Don't proceed if NetworkManager died during the call to get the active network */
|
||||||
|
|
||||||
|
/* Get each of the networks in turn and add them to the menu */
|
||||||
|
networks = nmwa_dbus_get_device_networks (applet, active_device, &num_items, APPLET_STATE_NO_CONNECTION);
|
||||||
|
if ((applet->applet_state != APPLET_STATE_WIRELESS) && (applet->applet_state != APPLET_STATE_WIRELESS_CONNECTING))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (!networks)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
g_mutex_lock (applet->networks_mutex);
|
||||||
|
|
||||||
|
for (i = 0; i < num_items; i++)
|
||||||
|
{
|
||||||
|
char *name = NULL;
|
||||||
|
|
||||||
|
if (!(name = nmwa_dbus_get_network_name (applet, networks[i])))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (name && strlen (name))
|
||||||
|
{
|
||||||
|
gboolean found = FALSE;
|
||||||
|
int j;
|
||||||
|
WirelessNetwork *net = NULL;
|
||||||
|
|
||||||
|
/* Only show one menu item per network. NetworkManager really passes back a list
|
||||||
|
* of access points, and there may be more than one that have the same ESSID. Filter
|
||||||
|
* them here.
|
||||||
|
*/
|
||||||
|
for (j = 0; j < i; j++)
|
||||||
|
if (found = (networks[j] && (strcmp (networks[i], networks[j]) == 0)))
|
||||||
|
break;
|
||||||
|
if (found)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
net = g_new0 (WirelessNetwork, 1);
|
||||||
|
net->essid = g_strdup (name);
|
||||||
|
net->active = active_network ? (strcmp (networks[i], active_network) == 0) : FALSE;
|
||||||
|
net->encrypted = nmwa_dbus_get_network_encrypted (applet, networks[i]);
|
||||||
|
|
||||||
|
fprintf( stderr, "Adding '%s' active (%d), enc (%d)\n", name, net->active, net->encrypted);
|
||||||
|
applet->networks = g_slist_append (applet->networks, net);
|
||||||
|
}
|
||||||
|
dbus_free (name);
|
||||||
|
}
|
||||||
|
g_mutex_unlock (applet->networks_mutex);
|
||||||
|
|
||||||
|
out:
|
||||||
|
dbus_free (active_device);
|
||||||
|
dbus_free (active_network);
|
||||||
|
dbus_free_string_array (networks);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nmwa_dbus_update_network_state
|
||||||
|
*
|
||||||
|
* Update our state based on what NetworkManager's network state is
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void nmwa_dbus_update_network_state (NMWirelessApplet *applet)
|
||||||
|
{
|
||||||
|
char *active_device = NULL;
|
||||||
|
char *nm_status = NULL;
|
||||||
|
int dev_type = -1;
|
||||||
|
|
||||||
|
g_return_if_fail (applet != NULL);
|
||||||
|
|
||||||
|
/* Grab NetworkManager's status */
|
||||||
|
if (!(nm_status = nmwa_dbus_get_nm_status (applet, APPLET_STATE_NO_CONNECTION)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (strcmp (nm_status, "disconnected") == 0)
|
||||||
|
{
|
||||||
|
applet->applet_state = APPLET_STATE_NO_CONNECTION;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(active_device = nmwa_dbus_get_active_device (applet, APPLET_STATE_NO_CONNECTION)))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if ((dev_type = nmwa_dbus_get_device_type (applet, active_device, APPLET_STATE_NO_CONNECTION)) == -1)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* If the device is not 802.x, we don't show state for it (yet) */
|
||||||
|
if ((dev_type != DEVICE_TYPE_WIRED_ETHERNET) && (dev_type != DEVICE_TYPE_WIRELESS_ETHERNET))
|
||||||
|
{
|
||||||
|
applet->applet_state = APPLET_STATE_NO_CONNECTION;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
else if (dev_type == DEVICE_TYPE_WIRED_ETHERNET)
|
||||||
|
{
|
||||||
|
if (strcmp (nm_status, "connecting") == 0)
|
||||||
|
applet->applet_state = APPLET_STATE_WIRED_CONNECTING;
|
||||||
|
else if (strcmp (nm_status, "connected") == 0)
|
||||||
|
applet->applet_state = APPLET_STATE_WIRED;
|
||||||
|
}
|
||||||
|
else if (dev_type == DEVICE_TYPE_WIRELESS_ETHERNET)
|
||||||
|
{
|
||||||
|
if (strcmp (nm_status, "connecting") == 0)
|
||||||
|
applet->applet_state = APPLET_STATE_WIRELESS_CONNECTING;
|
||||||
|
else if (strcmp (nm_status, "connected") == 0)
|
||||||
|
applet->applet_state = APPLET_STATE_WIRELESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
dbus_free (nm_status);
|
||||||
|
dbus_free (active_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -541,8 +747,11 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa
|
|||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
if ( dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &service, DBUS_TYPE_INVALID)
|
if ( dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &service, DBUS_TYPE_INVALID)
|
||||||
&& (strcmp (service, NM_DBUS_SERVICE) == 0))
|
&& (strcmp (service, NM_DBUS_SERVICE) == 0) && (applet->applet_state == APPLET_STATE_NO_NM))
|
||||||
applet->nm_active = TRUE;
|
{
|
||||||
|
applet->applet_state = APPLET_STATE_NO_CONNECTION;
|
||||||
|
fprintf( stderr, "ServiceCreate state = (%d)\n", applet->applet_state);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (dbus_message_is_signal (message, DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, "ServiceDeleted"))
|
else if (dbus_message_is_signal (message, DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, "ServiceDeleted"))
|
||||||
{
|
{
|
||||||
@@ -552,20 +761,23 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa
|
|||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
if ( dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &service, DBUS_TYPE_INVALID)
|
if ( dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &service, DBUS_TYPE_INVALID)
|
||||||
&& (strcmp (service, NM_DBUS_SERVICE) == 0))
|
&& (strcmp (service, NM_DBUS_SERVICE) == 0))
|
||||||
applet->nm_active = FALSE;
|
{
|
||||||
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
|
fprintf( stderr, "ServiceDeleted state = (%d)\n", applet->applet_state);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if ( dbus_message_is_signal (message, NM_DBUS_INTERFACE, "WirelessNetworkAppeared")
|
else if ( dbus_message_is_signal (message, NM_DBUS_INTERFACE, "WirelessNetworkAppeared")
|
||||||
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "WirelessNetworkDisappeared")
|
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "WirelessNetworkDisappeared"))
|
||||||
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNowActive")
|
|
||||||
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive"))
|
|
||||||
{
|
{
|
||||||
if (applet->menu && !GTK_WIDGET_VISIBLE (applet->menu))
|
fprintf( stderr, "Updating wireless networks\n");
|
||||||
{
|
nmwa_dbus_update_wireless_network_list (applet);
|
||||||
nmwa_dispose_menu (applet);
|
}
|
||||||
applet->menu = nmwa_populate_menu (applet);
|
else if ( dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNowActive")
|
||||||
}
|
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive")
|
||||||
else if (!applet->menu)
|
|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceActivating"))
|
||||||
applet->menu = nmwa_populate_menu (applet);
|
{
|
||||||
|
fprintf( stderr, "Updating network state\n");
|
||||||
|
nmwa_dbus_update_network_state (applet);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
handled = FALSE;
|
handled = FALSE;
|
||||||
@@ -574,17 +786,38 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nmwa_dbus_nm_is_running
|
||||||
|
*
|
||||||
|
* Ask dbus whether or not NetworkManager is running
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
gboolean nmwa_dbus_nm_is_running (DBusConnection *connection)
|
||||||
|
{
|
||||||
|
DBusError error;
|
||||||
|
gboolean exists;
|
||||||
|
|
||||||
|
g_return_val_if_fail (connection != NULL, FALSE);
|
||||||
|
|
||||||
|
dbus_error_init (&error);
|
||||||
|
exists = dbus_bus_service_exists (connection, NM_DBUS_SERVICE, &error);
|
||||||
|
return (exists);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nmwa_dbus_init
|
* nmwa_dbus_init
|
||||||
*
|
*
|
||||||
* Initialize a connection to NetworkManager if we can get one
|
* Initialize a connection to NetworkManager if we can get one
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
DBusConnection * nmwa_dbus_init (gpointer user_data)
|
static DBusConnection * nmwa_dbus_init (NMWirelessApplet *applet, GMainContext *context)
|
||||||
{
|
{
|
||||||
DBusConnection *connection;
|
DBusConnection *connection = NULL;
|
||||||
DBusError error;
|
DBusError error;
|
||||||
|
|
||||||
|
g_return_val_if_fail (applet != NULL, NULL);
|
||||||
|
|
||||||
dbus_error_init (&error);
|
dbus_error_init (&error);
|
||||||
connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
|
connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
|
||||||
|
|
||||||
@@ -594,13 +827,11 @@ DBusConnection * nmwa_dbus_init (gpointer user_data)
|
|||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert(connection);
|
if (!dbus_connection_add_filter (connection, nmwa_dbus_filter, applet, NULL))
|
||||||
|
|
||||||
if (!dbus_connection_add_filter (connection, nmwa_dbus_filter, user_data, NULL))
|
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
dbus_connection_set_exit_on_disconnect (connection, FALSE);
|
dbus_connection_set_exit_on_disconnect (connection, FALSE);
|
||||||
dbus_connection_setup_with_g_main (connection, NULL);
|
dbus_connection_setup_with_g_main (connection, context);
|
||||||
|
|
||||||
dbus_bus_add_match(connection,
|
dbus_bus_add_match(connection,
|
||||||
"type='signal',"
|
"type='signal',"
|
||||||
@@ -615,6 +846,73 @@ DBusConnection * nmwa_dbus_init (gpointer user_data)
|
|||||||
"sender='" NM_DBUS_SERVICE "'",
|
"sender='" NM_DBUS_SERVICE "'",
|
||||||
&error);
|
&error);
|
||||||
|
|
||||||
|
fprintf( stderr, "returning good DBUS connection\n");
|
||||||
return (connection);
|
return (connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nmwa_dbus_timeout_worker
|
||||||
|
*
|
||||||
|
* Timer to update our state from NetworkManager
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static gboolean nmwa_dbus_timeout_worker (gpointer user_data)
|
||||||
|
{
|
||||||
|
NMWirelessApplet *applet = (NMWirelessApplet *)user_data;
|
||||||
|
|
||||||
|
g_return_val_if_fail (applet != NULL, TRUE);
|
||||||
|
|
||||||
|
if (!applet->connection)
|
||||||
|
{
|
||||||
|
/* After our first connection, update the state. After that, we listen
|
||||||
|
* for signals from NetworkManager to trigger state updates.
|
||||||
|
*/
|
||||||
|
if ((applet->connection = nmwa_dbus_init (applet, applet->thread_context)))
|
||||||
|
nmwa_dbus_update_network_state (applet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nmwa_dbus_worker
|
||||||
|
*
|
||||||
|
* Thread worker function that periodically grabs the NetworkManager state
|
||||||
|
* and updates our local applet state to reflect that.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
gpointer nmwa_dbus_worker (gpointer user_data)
|
||||||
|
{
|
||||||
|
NMWirelessApplet *applet = (NMWirelessApplet *)user_data;
|
||||||
|
GMainLoop *thread_loop;
|
||||||
|
guint timeout_id;
|
||||||
|
GSource *timeout_source;
|
||||||
|
|
||||||
|
g_return_val_if_fail (applet != NULL, NULL);
|
||||||
|
|
||||||
|
if (!(applet->thread_context = g_main_context_new ()))
|
||||||
|
return (NULL);
|
||||||
|
if (!(thread_loop = g_main_loop_new (applet->thread_context, FALSE)))
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
applet->connection = nmwa_dbus_init (applet, applet->thread_context);
|
||||||
|
|
||||||
|
timeout_source = g_timeout_source_new (2000);
|
||||||
|
g_source_set_callback (timeout_source, nmwa_dbus_timeout_worker, applet, NULL);
|
||||||
|
timeout_id = g_source_attach (timeout_source, applet->thread_context);
|
||||||
|
|
||||||
|
if (applet->connection && nmwa_dbus_nm_is_running (applet->connection))
|
||||||
|
{
|
||||||
|
nmwa_dbus_update_network_state (applet);
|
||||||
|
if ((applet->applet_state == APPLET_STATE_WIRELESS) || (applet->applet_state == APPLET_STATE_WIRELESS_CONNECTING))
|
||||||
|
nmwa_dbus_update_wireless_network_list (applet);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
applet->applet_state = APPLET_STATE_NO_NM;
|
||||||
|
|
||||||
|
g_main_loop_run (thread_loop);
|
||||||
|
|
||||||
|
g_source_destroy (timeout_source);
|
||||||
|
}
|
||||||
|
@@ -26,6 +26,14 @@
|
|||||||
#include <dbus/dbus-glib.h>
|
#include <dbus/dbus-glib.h>
|
||||||
#include "NMWirelessApplet.h"
|
#include "NMWirelessApplet.h"
|
||||||
|
|
||||||
|
/* Return codes for functions that use dbus */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
RETURN_SUCCESS = 1,
|
||||||
|
RETURN_FAILURE = 0,
|
||||||
|
RETURN_NO_NM = -1
|
||||||
|
};
|
||||||
|
|
||||||
/* Must match NetworkManager device types */
|
/* Must match NetworkManager device types */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@@ -34,17 +42,7 @@ enum
|
|||||||
DEVICE_TYPE_WIRELESS_ETHERNET
|
DEVICE_TYPE_WIRELESS_ETHERNET
|
||||||
};
|
};
|
||||||
|
|
||||||
DBusConnection * nmwa_dbus_init (gpointer user_data);
|
gpointer nmwa_dbus_worker (gpointer user_data);
|
||||||
|
|
||||||
gboolean nmwa_dbus_nm_is_running (DBusConnection *connection);
|
|
||||||
|
|
||||||
void nmwa_dbus_add_networks_to_menu (NMWirelessApplet *applet, GtkWidget *menu);
|
|
||||||
|
|
||||||
char * nmwa_dbus_get_active_device (DBusConnection *connection);
|
|
||||||
|
|
||||||
int nmwa_dbus_get_device_type (DBusConnection *connection, char *path);
|
|
||||||
|
|
||||||
char * nmwa_dbus_get_nm_status (DBusConnection *connection);
|
|
||||||
|
|
||||||
void nmwa_dbus_set_network (DBusConnection *connection, char *network);
|
void nmwa_dbus_set_network (DBusConnection *connection, char *network);
|
||||||
|
|
||||||
|
156
panel-applet/wireless-applet.glade
Normal file
156
panel-applet/wireless-applet.glade
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
|
||||||
|
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
|
||||||
|
|
||||||
|
<glade-interface>
|
||||||
|
|
||||||
|
<widget class="GtkDialog" id="trust_dialog">
|
||||||
|
<property name="border_width">6</property>
|
||||||
|
<property name="title" translatable="yes"> </property>
|
||||||
|
<property name="type">GTK_WINDOW_TOPLEVEL</property>
|
||||||
|
<property name="window_position">GTK_WIN_POS_CENTER_ALWAYS</property>
|
||||||
|
<property name="modal">True</property>
|
||||||
|
<property name="resizable">True</property>
|
||||||
|
<property name="destroy_with_parent">False</property>
|
||||||
|
<property name="decorated">True</property>
|
||||||
|
<property name="skip_taskbar_hint">False</property>
|
||||||
|
<property name="skip_pager_hint">False</property>
|
||||||
|
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
|
||||||
|
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
|
||||||
|
<property name="has_separator">False</property>
|
||||||
|
|
||||||
|
<child internal-child="vbox">
|
||||||
|
<widget class="GtkVBox" id="dialog-vbox1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="homogeneous">False</property>
|
||||||
|
<property name="spacing">12</property>
|
||||||
|
|
||||||
|
<child internal-child="action_area">
|
||||||
|
<widget class="GtkHButtonBox" id="dialog-action_area1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="layout_style">GTK_BUTTONBOX_END</property>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkButton" id="cancel_button">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_default">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="label">gtk-cancel</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||||
|
<property name="focus_on_click">True</property>
|
||||||
|
<property name="response_id">-6</property>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkButton" id="login_button">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_default">True</property>
|
||||||
|
<property name="has_default">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="label" translatable="yes">_Login to Network</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||||
|
<property name="focus_on_click">True</property>
|
||||||
|
<property name="response_id">-5</property>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="padding">0</property>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="pack_type">GTK_PACK_END</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkHBox" id="hbox1">
|
||||||
|
<property name="border_width">6</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="homogeneous">False</property>
|
||||||
|
<property name="spacing">12</property>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkImage" id="image1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="stock">gtk-dialog-warning</property>
|
||||||
|
<property name="icon_size">6</property>
|
||||||
|
<property name="xalign">0.5</property>
|
||||||
|
<property name="yalign">0</property>
|
||||||
|
<property name="xpad">0</property>
|
||||||
|
<property name="ypad">0</property>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="padding">0</property>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkVBox" id="vbox1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="homogeneous">False</property>
|
||||||
|
<property name="spacing">12</property>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkLabel" id="label1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes"><span weight="bold" size="larger">Wireless Network Login Confirmation</span>
|
||||||
|
|
||||||
|
You have chosen log in to the wireless network '%s'. If you are sure this wireless network is secure, click the checkbox below and NetworkManager will no longer pester you with stupid questions when you connect to it.</property>
|
||||||
|
<property name="use_underline">False</property>
|
||||||
|
<property name="use_markup">True</property>
|
||||||
|
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||||
|
<property name="wrap">True</property>
|
||||||
|
<property name="selectable">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="yalign">0.5</property>
|
||||||
|
<property name="xpad">0</property>
|
||||||
|
<property name="ypad">0</property>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="padding">0</property>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkCheckButton" id="trust_checkbutton">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="label" translatable="yes">Always Trust this Wireless Network</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||||
|
<property name="focus_on_click">True</property>
|
||||||
|
<property name="active">False</property>
|
||||||
|
<property name="inconsistent">False</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="padding">0</property>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="padding">0</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="padding">0</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
</glade-interface>
|
Reference in New Issue
Block a user