[kupfer] Added option for "Hide Kupfer when focus is lost"



commit c01a9c7ede246d786da474f7a7869b1e8f0d2e46
Author: Grigory Javadyan <grigoryj ovi com>
Date:   Mon Aug 23 21:16:24 2010 +0200

    Added option for "Hide Kupfer when focus is lost"
    
    Listen to focus-out events on the main window, and if the mouse
    pointer is outside Kupfer's window, we hide Kupfer.
    
    Co-authored-by: Ulrik

 data/defaults.cfg        |    1 +
 data/preferences.ui      |   40 ++++++++++++++++++++++++++++++----------
 kupfer/core/settings.py  |    7 +++++++
 kupfer/ui/browser.py     |   20 ++++++++++++++++++++
 kupfer/ui/preferences.py |    6 ++++++
 5 files changed, 64 insertions(+), 10 deletions(-)
---
diff --git a/data/defaults.cfg b/data/defaults.cfg
index 2c7d9a7..c3da557 100644
--- a/data/defaults.cfg
+++ b/data/defaults.cfg
@@ -12,6 +12,7 @@ Keybinding = <Ctrl>space
 MagicKeybinding =
 ShowStatusIcon = True
 UseCommandKeys = True
+CloseOnUnfocus = True
 
 [Keybindings]
 activate = <Alt>a
diff --git a/data/preferences.ui b/data/preferences.ui
index 98d4e66..459d61f 100644
--- a/data/preferences.ui
+++ b/data/preferences.ui
@@ -77,14 +77,37 @@
                                 <property name="top_padding">6</property>
                                 <property name="left_padding">12</property>
                                 <child>
-                                  <object class="GtkCheckButton" id="checkstatusicon">
-                                    <property name="label" translatable="yes">Show icon in notification area</property>
+                                  <object class="GtkVBox" id="vbox9">
                                     <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="receives_default">False</property>
-                                    <property name="active">True</property>
-                                    <property name="draw_indicator">True</property>
-                                    <signal name="toggled" handler="on_checkstatusicon_toggled"/>
+                                    <property name="orientation">vertical</property>
+                                    <property name="spacing">2</property>
+                                    <child>
+                                      <object class="GtkCheckButton" id="checkstatusicon">
+                                        <property name="label" translatable="yes">Show icon in notification area</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">False</property>
+                                        <property name="active">True</property>
+                                        <property name="draw_indicator">True</property>
+                                        <signal name="toggled" handler="on_checkstatusicon_toggled"/>
+                                      </object>
+                                      <packing>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkCheckButton" id="checkcloseonunfocus">
+                                        <property name="label" translatable="yes">Hide Kupfer when focus is lost</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">False</property>
+                                        <property name="draw_indicator">True</property>
+                                        <signal name="toggled" handler="on_checkcloseonunfocus_toggled"/>
+                                      </object>
+                                      <packing>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
                                   </object>
                                 </child>
                               </object>
@@ -102,9 +125,6 @@
                             <property name="position">1</property>
                           </packing>
                         </child>
-                        <child>
-                          <placeholder/>
-                        </child>
                       </object>
                       <packing>
                         <property name="position">0</property>
diff --git a/kupfer/core/settings.py b/kupfer/core/settings.py
index e09195d..090e077 100644
--- a/kupfer/core/settings.py
+++ b/kupfer/core/settings.py
@@ -36,6 +36,7 @@ class SettingsController (gobject.GObject, pretty.OutputMixin):
 			"magickeybinding": "",
 			"showstatusicon" : True,
 			"usecommandkeys" : True,
+			"closeonunfocus" : True,
 		},
 		"Directories" : { "direct" : default_directories, "catalog" : (), },
 		"DeepDirectories" : { "direct" : (), "catalog" : (), "depth" : 1, },
@@ -249,6 +250,12 @@ class SettingsController (gobject.GObject, pretty.OutputMixin):
 		return self.set_plugin_config(plugin_id, key,
 		                              value, value_type=strbool)
 
+	def get_close_on_unfocus(self):
+		return self.get_config("Kupfer", "closeonunfocus")
+
+	def set_close_on_unfocus(self, val):
+		return self._set_config("Kupfer", "closeonunfocus", val)
+
 	def get_keybinding(self):
 		"""Convenience: Kupfer keybinding as string"""
 		return self.get_config("Kupfer", "keybinding")
diff --git a/kupfer/ui/browser.py b/kupfer/ui/browser.py
index dcfe9dd..b9b1a6e 100644
--- a/kupfer/ui/browser.py
+++ b/kupfer/ui/browser.py
@@ -1406,6 +1406,7 @@ class WindowController (pretty.OutputMixin):
 		"""
 		"""
 		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+		self.window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
 		self.window_position = -1, -1
 		self._latest_window_position = None
 
@@ -1498,6 +1499,7 @@ class WindowController (pretty.OutputMixin):
 
 		self.window.connect("delete-event", self._close_window)
 		self.window.connect("configure-event", self._window_frame_event)
+		self.window.connect("focus-out-event", self._lost_focus)
 		widget = self.interface.get_widget()
 		widget.show()
 
@@ -1547,6 +1549,24 @@ class WindowController (pretty.OutputMixin):
 				setctl.set_session_position("main", self.window_position)
 			self._latest_window_position = window_pos
 
+	def _lost_focus(self, window, event):
+		setctl = settings.GetSettingsController()
+		if setctl.get_close_on_unfocus():
+			# Since focus-out-event is triggered even
+			# when we click inside the window, we'll
+			# do some additional math to make sure that
+			# that window won't close if teh mouse pointer
+			# is over it. Looks like a dirty hack, but a
+			# similar solution is used in gnome-do, so probably
+			# there's no better way of handling this.
+			# Any impovements are welcome.
+			x, y, mods = window.get_screen().get_root_window().get_pointer()
+			w_x, w_y = window.get_position()
+			w_w, w_h = window.get_size()
+			if (x not in xrange(w_x, w_x + w_w) or
+			    y not in xrange(w_y, w_y + w_h)):
+				self._window_hide_timer.set_ms(50, self.put_away)
+
 	def _move_window_to_position(self):
 		self._latest_window_position = None
 		pos = self.window.get_position()
diff --git a/kupfer/ui/preferences.py b/kupfer/ui/preferences.py
index 167fa0a..ce57104 100644
--- a/kupfer/ui/preferences.py
+++ b/kupfer/ui/preferences.py
@@ -104,6 +104,7 @@ class PreferencesWindowController (pretty.OutputMixin):
 		self.buttonremovedirectory = builder.get_object("buttonremovedirectory")
 		checkautostart = builder.get_object("checkautostart")
 		checkstatusicon = builder.get_object("checkstatusicon")
+		checkcloseonunfocus = builder.get_object("checkcloseonunfocus")
 		checkusecommandkeys = builder.get_object("checkusecommandkeys")
 		self.entry_plugins_filter = builder.get_object('entry_plugins_filter')
 		self.keybindings_list_parent = builder.get_object('keybindings_list_parent')
@@ -115,6 +116,7 @@ class PreferencesWindowController (pretty.OutputMixin):
 		checkautostart.set_active(self._get_should_autostart())
 		checkstatusicon.set_active(setctl.get_show_status_icon())
 		checkusecommandkeys.set_active(setctl.get_use_command_keys())
+		checkcloseonunfocus.set_active(setctl.get_close_on_unfocus())
 
 		# Plugin List
 		columns = [
@@ -732,6 +734,10 @@ class PreferencesWindowController (pretty.OutputMixin):
 		setctl = settings.GetSettingsController()
 		setctl.set_use_command_keys(widget.get_active())
 
+	def on_checkcloseonunfocus_toggled(self, widget):
+		setctl = settings.GetSettingsController()
+		setctl.set_close_on_unfocus(widget.get_active())
+
 	def dir_table_cursor_changed(self, table):
 		curpath, curcol = table.get_cursor()
 		if not curpath or not self.dir_store:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]