1
0
mirror of https://github.com/gryf/wicd.git synced 2025-12-22 05:48:03 +01:00

experimental branch:

- Enhance dbus manager to handle settings up mainloops, etc.
- Early work on getting wicd-client to recover from a daemon crash.
- Simply how the the scripts editor gets launched.
- Remove unneeded cleanup code from netentry.py
- More ralink legacy work.
- Run scans in a thread, this should make the UI more responsive while a scan is going on.  Rework the UI code to never expect a scan to be blocking.
- Don't require the daemon to be restarted when we switch backends, just try to prevent any calls to the backend until the switch is made.
This commit is contained in:
imdano
2008-11-02 14:26:42 +00:00
parent 11bd0266ff
commit fd0a41def6
10 changed files with 284 additions and 345 deletions

View File

@@ -36,9 +36,9 @@ from dbus import version as dbus_version
from wicd import misc
from wicd import wpath
from wicd import dbusmanager
from wicd.misc import noneToString
from wicd.netentry import WiredNetworkEntry, WirelessNetworkEntry
from wicd.dbusmanager import DBusManager
from wicd.prefs import PreferencesDialog
if __name__ == '__main__':
@@ -50,41 +50,32 @@ try:
except:
pass
if not dbus_version or (dbus_version < (0, 80, 0)):
import dbus.glib
else:
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
proxy_obj = daemon = wireless = wired = bus = None
language = misc.get_language_list_gui()
def setup_dbus(dbus_man=None):
global bus, daemon, wireless, wired, dbus_manager
if dbus_man:
dbus_manager = dbus_man
else:
dbus_manager = DBusManager()
def setup_dbus():
global bus, daemon, wireless, wired
try:
dbusmanager.connect_to_dbus()
except DBusException:
print "Can't connect to the daemon, trying to start it automatically..."
misc.PromptToStartDaemon()
try:
dbus_manager.connect_to_dbus()
dbusmanager.connect_to_dbus()
except DBusException:
print "Can't connect to the daemon, trying to start it automatically..."
misc.PromptToStartDaemon()
try:
dbus_manager.connect_to_dbus()
except DBusException:
error(None, "Could not connect to wicd's D-Bus interface. " +
"Make sure the daemon is started.")
sys.exit(1)
error(None, "Could not connect to wicd's D-Bus interface. " +
"Make sure the daemon is started.")
sys.exit(1)
bus = dbus_manager.get_bus()
dbus_ifaces = dbus_manager.get_dbus_ifaces()
bus = dbusmanager.get_bus()
dbus_ifaces = dbusmanager.get_dbus_ifaces()
daemon = dbus_ifaces['daemon']
wireless = dbus_ifaces['wireless']
wired = dbus_ifaces['wired']
return True
def error(parent, message):
""" Shows an error dialog """
dialog = gtk.MessageDialog(parent, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR,
@@ -172,7 +163,7 @@ class WiredProfileChooser:
""" Initializes and runs the wired profile chooser. """
# Import and init WiredNetworkEntry to steal some of the
# functions and widgets it uses.
wired_net_entry = WiredNetworkEntry(dbus_manager.get_dbus_ifaces())
wired_net_entry = WiredNetworkEntry(dbusmanager.get_dbus_ifaces())
dialog = gtk.Dialog(title = language['wired_network_found'],
flags = gtk.DIALOG_MODAL,
@@ -220,20 +211,21 @@ class WiredProfileChooser:
class appGui(object):
""" The main wicd GUI class. """
def __init__(self, dbus_man=None, standalone=False):
def __init__(self, standalone=False):
""" Initializes everything needed for the GUI. """
if dbus_man:
setup_dbus(dbus_man)
if standalone:
bus.add_signal_receiver(self.dbus_scan_finished, 'SendEndScanSignal',
'org.wicd.daemon.wireless')
bus.add_signal_receiver(self.dbus_scan_started, 'SendStartScanSignal',
'org.wicd.daemon.wireless')
bus.add_signal_receiver(self.update_connect_buttons, 'StatusChanged',
'org.wicd.daemon')
setup_dbus()
gladefile = wpath.share + "wicd.glade"
self.wTree = gtk.glade.XML(gladefile)
self.window = self.wTree.get_widget("window1")
size = daemon.ReadWindowSize("main")
width = size[0]
height = size[1]
if width > -1 and height > -1:
self.window.resize(int(width), int(height))
else:
self.window.resize(gtk.gdk.screen_width() / 3,
gtk.gdk.screen_height() / 2)
dic = { "refresh_clicked" : self.refresh_clicked,
"quit_clicked" : self.exit,
@@ -254,7 +246,6 @@ class appGui(object):
probar = self.wTree.get_widget("progressbar")
probar.set_text(language['connecting'])
self.window = self.wTree.get_widget("window1")
self.network_list = self.wTree.get_widget("network_list_vbox")
self.status_area = self.wTree.get_widget("connecting_hbox")
self.status_bar = self.wTree.get_widget("statusbar")
@@ -271,28 +262,27 @@ class appGui(object):
self.standalone = standalone
self.wpadrivercombo = None
self.connecting = False
self.refreshing = False
self.prev_state = None
self.network_list.set_sensitive(False)
label = gtk.Label("%s..." % language['scanning'])
self.network_list.pack_start(label)
label.show()
self.network_list.set_sensitive(False)
self.wait_for_events(0.2)
self.window.connect('delete_event', self.exit)
self.window.connect('key-release-event', self.key_event)
size = daemon.ReadWindowSize("main")
width = size[0]
height = size[1]
if width > -1 and height > -1:
self.window.resize(int(width), int(height))
else:
self.window.resize(gtk.gdk.screen_width() / 3,
gtk.gdk.screen_height() / 2)
bus.add_signal_receiver(self.dbus_scan_finished, 'SendEndScanSignal',
'org.wicd.daemon.wireless')
bus.add_signal_receiver(self.dbus_scan_started, 'SendStartScanSignal',
'org.wicd.daemon.wireless')
bus.add_signal_receiver(self.update_connect_buttons, 'StatusChanged',
'org.wicd.daemon')
bus.add_signal_receiver(setup_dbus, "DaemonClosing", "org.wicd.daemon")
try:
gobject.timeout_add_seconds(1, self.update_statusbar)
except:
gobject.timeout_add(1000, self.update_statusbar)
self.refresh_clicked()
def create_adhoc_network(self, widget=None):
@@ -367,7 +357,7 @@ class appGui(object):
def settings_dialog(self, widget, event=None):
""" Displays a general settings dialog. """
pref = PreferencesDialog(self.wTree, dbus_manager.get_dbus_ifaces())
pref = PreferencesDialog(self.wTree, dbusmanager.get_dbus_ifaces())
if pref.run() == 1:
pref.save_results()
pref.hide()
@@ -408,7 +398,7 @@ class appGui(object):
if not self.is_visible:
return True
try:
self.wTree.get_widget("progressbar").pulse()
gobject.idle_add(self.wTree.get_widget("progressbar").pulse)
except:
pass
return True
@@ -420,9 +410,9 @@ class appGui(object):
updates the GUI status bar based on the results.
"""
if not self.is_visible:
if not self.is_visible or self.refreshing:
return True
fast = not daemon.NeedsExternalCalls()
wired_connecting = wired.CheckIfWiredConnecting()
wireless_connecting = wireless.CheckIfWirelessConnecting()
@@ -432,30 +422,29 @@ class appGui(object):
if not self.pulse_active:
self.pulse_active = True
gobject.timeout_add(100, self.pulse_progress_bar)
self.network_list.set_sensitive(False)
self.status_area.show_all()
gobject.idle_add(self.network_list.set_sensitive, False)
gobject.idle_add(self.status_area.show_all)
if self.statusID:
self.status_bar.remove(1, self.statusID)
gobject.idle_add(self.status_bar.remove, 1, self.statusID)
if wireless_connecting:
if not fast:
iwconfig = wireless.GetIwconfig()
else:
iwconfig = ''
self.set_status(wireless.GetCurrentNetwork(iwconfig) + ': ' +
gobject.idle_add(self.set_status, wireless.GetCurrentNetwork(iwconfig) + ': ' +
language[str(wireless.CheckWirelessConnectingMessage())])
if wired_connecting:
self.set_status(language['wired_network'] + ': ' +
gobject.idle_add(self.set_status, language['wired_network'] + ': ' +
language[str(wired.CheckWiredConnectingMessage())])
return True
else:
if self.pulse_active:
self.pulse_progress_bar()
self.pulse_active = False
self.network_list.set_sensitive(True)
self.status_area.hide_all()
gobject.idle_add(self.network_list.set_sensitive, True)
gobject.idle_add(self.status_area.hide_all)
if self.statusID:
self.status_bar.remove(1, self.statusID)
gobject.idle_add(self.status_bar.remove, 1, self.statusID)
# Determine connection status.
if self.check_for_wired(wired.GetWiredIP("")):
@@ -532,15 +521,16 @@ class appGui(object):
"""
if not self.connecting:
self.refresh_networks(fresh=False)
gobject.idle_add(self.refresh_networks, None, False, None)
def dbus_scan_started(self):
""" Called when a wireless scan starts. """
self.network_list.set_sensitive(False)
def refresh_clicked(self, widget=None):
""" Kick off an asynchronous wireless scan. """
wireless.Scan(reply_handler=dummy, error_handler=dummy)
self.refreshing = True
wireless.Scan(reply_handler=None, error_handler=None)
def refresh_networks(self, widget=None, fresh=True, hidden=None):
""" Refreshes the network list.
@@ -552,6 +542,11 @@ class appGui(object):
iwconfig <wireless interface> essid <hidden>.
"""
if fresh:
# Even if it is None, it can still be passed.
wireless.SetHiddenNetworkESSID(noneToString(hidden))
self.refresh_clicked()
return
print "refreshing..."
self.network_list.set_sensitive(False)
self.wait_for_events()
@@ -564,7 +559,7 @@ class appGui(object):
if wired.CheckPluggedIn() or daemon.GetAlwaysShowWiredInterface():
printLine = True # In this case we print a separator.
wirednet = WiredNetworkEntry(dbus_manager.get_dbus_ifaces())
wirednet = WiredNetworkEntry(dbusmanager.get_dbus_ifaces())
self.network_list.pack_start(wirednet, False, False)
wirednet.connect_button.connect("button-press-event", self.connect,
"wired", 0, wirednet)
@@ -573,11 +568,6 @@ class appGui(object):
wirednet.advanced_button.connect("button-press-event",
self.edit_advanced, "wired", 0,
wirednet)
# Scan
if fresh:
# Even if it is None, it can still be passed.
wireless.SetHiddenNetworkESSID(noneToString(hidden))
wireless.Scan()
num_networks = wireless.GetNumberOfNetworks()
instruct_label = self.wTree.get_widget("label_instructions")
@@ -591,7 +581,7 @@ class appGui(object):
sep.show()
else:
printLine = True
tempnet = WirelessNetworkEntry(x, dbus_manager.get_dbus_ifaces())
tempnet = WirelessNetworkEntry(x, dbusmanager.get_dbus_ifaces())
self.network_list.pack_start(tempnet, False, False)
tempnet.connect_button.connect("button-press-event",
self.connect, "wireless", x,
@@ -612,6 +602,7 @@ class appGui(object):
label.show()
self.update_connect_buttons(force_check=True)
self.network_list.set_sensitive(True)
self.refreshing = False
def save_settings(self, nettype, networkid, networkentry):
""" Verifies and saves the settings for the network entry. """
@@ -823,7 +814,10 @@ class appGui(object):
"""
self.window.hide()
[width, height] = self.window.get_size()
daemon.WriteWindowSize(width, height, "main")
try:
daemon.WriteWindowSize(width, height, "main")
except:
pass
if self.standalone:
sys.exit(0)