diff --git a/curses/wicd-curses.py b/curses/wicd-curses.py index d08b4bc..b2429a5 100755 --- a/curses/wicd-curses.py +++ b/curses/wicd-curses.py @@ -542,6 +542,7 @@ class appGUI(): ('H' ,'Help' ,None), ('right','Config',None), #(' ',' ',None), + ('K' , 'RfKill',None), ('C' ,'Connect',None), ('D' ,'Disconn',None), ('R' ,'Refresh',None), @@ -803,6 +804,9 @@ class appGUI(): if "f5" in keys or 'R' in keys: self.lock_screen() self.doScan() + if 'k' in keys or 'K' in keys: + wireless.SwitchRfKill() + self.update_netlist() if "D" in keys: # Disconnect from all networks. daemon.Disconnect() diff --git a/data/wicd.ui b/data/wicd.ui index a68a376..7d20d9c 100644 --- a/data/wicd.ui +++ b/data/wicd.ui @@ -71,6 +71,21 @@ False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + _Switch Off Wi-Fi + True + gtk-media-stop + + + + False + True + + True diff --git a/gtk/gui.py b/gtk/gui.py index de7f854..1d1a4d8 100644 --- a/gtk/gui.py +++ b/gtk/gui.py @@ -157,7 +157,8 @@ class appGui(object): self.window.resize(width, int(gtk.gdk.screen_height() / 1.7)) dic = { "refresh_clicked" : self.refresh_clicked, - "quit_clicked" : self.exit, + "quit_clicked" : self.exit, + "rfkill_clicked" : self.switch_rfkill, "disconnect_clicked" : self.disconnect_all, "main_exit" : self.exit, "cancel_clicked" : self.cancel_connect, @@ -174,7 +175,8 @@ class appGui(object): probar = self.wTree.get_object("progressbar") probar.set_text(language['connecting']) - + + self.rfkill_button = self.wTree.get_object("rfkill_button") self.all_network_list = self.wTree.get_object("network_list_vbox") self.all_network_list.show_all() self.wired_network_box = gtk.VBox(False, 0) @@ -287,6 +289,16 @@ class appGui(object): """ Toggles the encryption key entry box for the ad-hoc dialog. """ self.key_entry.set_sensitive(self.chkbox_use_encryption.get_active()) + def switch_rfkill(self, widget=None): + """ Switches wifi card on/off. """ + wireless.SwitchRfKill() + if wireless.GetRfKillEnabled(): + self.rfkill_button.set_stock_id(gtk.STOCK_MEDIA_PLAY) + self.rfkill_button.set_label(language['switch_on_wifi']) + else: + self.rfkill_button.set_stock_id(gtk.STOCK_MEDIA_STOP) + self.rfkill_button.set_label(language['switch_off_wifi']) + def disconnect_all(self, widget=None): """ Disconnects from any active network. """ def handler(*args): diff --git a/wicd/networking.py b/wicd/networking.py index 4e38a87..8112d6e 100644 --- a/wicd/networking.py +++ b/wicd/networking.py @@ -765,6 +765,37 @@ class Wireless(Controller): """ return self.wiface.GetKillSwitchStatus() + def SwitchRfKill(self): + """ Switches the rfkill on/off for wireless cards. """ + types = ['wifi', 'wlan', 'wimax', 'wwan'] + try: + if self.GetRfKillStatus(): + action = 'unblock' + else: + action = 'block' + for t in types: + cmd = ['rfkill', action, t] + print "rfkill: %sing %s" % (action, t) + misc.Run(cmd) + return True + except Exception, e: + raise e + return False + + def GetRfKillStatus(self): + """ Determines if rfkill switch is active or not. + + Returns: + True if rfkill (soft-)switch is enabled. + """ + cmd = 'rfkill list' + rfkill_out = misc.Run(cmd) + soft_blocks = filter(lambda x: x.startswith('Soft'), rfkill_out.split('\t')) + for line in map(lambda x: x.strip(), soft_blocks): + if line.endswith('yes'): + return True + return False + def Disconnect(self): """ Disconnect the given iface. diff --git a/wicd/translations.py b/wicd/translations.py index 78f45e6..cd14ab1 100644 --- a/wicd/translations.py +++ b/wicd/translations.py @@ -242,3 +242,5 @@ language['conn_info_wired_labels'] = _('''Wired IP: RX: TX:''') +language['switch_on_wifi'] = _('''Switch On Wi-Fi''') +language['switch_off_wifi'] = _('''Switch Off Wi-Fi''') diff --git a/wicd/wicd-daemon.py b/wicd/wicd-daemon.py index 3cc152e..0c1e8b9 100644 --- a/wicd/wicd-daemon.py +++ b/wicd/wicd-daemon.py @@ -1025,6 +1025,16 @@ class WirelessDaemon(dbus.service.Object): status = self.wifi.GetKillSwitchStatus() return status + @dbus.service.method('org.wicd.daemon.wireless') + def SwitchRfKill(self): + """ Switches the rfkill on/off for wireless cards. """ + return self.wifi.SwitchRfKill() + + @dbus.service.method('org.wicd.daemon.wireless') + def GetRfKillEnabled(self): + """ Returns true if rfkill switch is enabled. """ + return self.wifi.GetRfKillStatus() + @dbus.service.method('org.wicd.daemon.wireless') def GetWirelessProperty(self, networkid, property): """ Retrieves wireless property from the network specified """