Implemented the show/hide feature

added the following options to make terminator
	able to behave like a drop-down terminal:
		hide from taskbar
		always on top
		hide on lose focus (experimental)
		sticky (Show on all workspaces)
This commit is contained in:
Peter Bjørn Jørgensen 2010-05-15 20:07:07 +02:00
parent f02f08314e
commit b956c0ede3
5 changed files with 215 additions and 11 deletions

View File

@ -85,6 +85,10 @@ DEFAULTS = {
'close_button_on_tab' : True, 'close_button_on_tab' : True,
'hide_tabbar' : False, 'hide_tabbar' : False,
'scroll_tabbar' : False, 'scroll_tabbar' : False,
'hide_from_taskbar' : False,
'always_on_top' : False,
'hide_on_lose_focus' : False,
'sticky' : False,
'try_posix_regexp' : platform.system() != 'Linux', 'try_posix_regexp' : platform.system() != 'Linux',
'title_transmit_fg_color' : '#ffffff', 'title_transmit_fg_color' : '#ffffff',
'title_transmit_bg_color' : '#c80003', 'title_transmit_bg_color' : '#c80003',

View File

@ -278,7 +278,7 @@
<child> <child>
<object class="GtkTable" id="global_config_table"> <object class="GtkTable" id="global_config_table">
<property name="visible">True</property> <property name="visible">True</property>
<property name="n_rows">6</property> <property name="n_rows">10</property>
<property name="n_columns">2</property> <property name="n_columns">2</property>
<property name="column_spacing">6</property> <property name="column_spacing">6</property>
<child> <child>
@ -469,6 +469,126 @@
<property name="x_padding">20</property> <property name="x_padding">20</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel" id="label24">
<property name="visible">True</property>
<property name="label" translatable="yes">Hide from taskbar</property>
</object>
<packing>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="x_options"></property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="hidefromtaskbcheck">
<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_hidefromtaskbcheck_toggled"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="x_options"></property>
<property name="y_options">GTK_EXPAND</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label25">
<property name="visible">True</property>
<property name="label" translatable="yes">Always on top</property>
</object>
<packing>
<property name="top_attach">7</property>
<property name="bottom_attach">8</property>
<property name="x_options"></property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label26">
<property name="visible">True</property>
<property name="label" translatable="yes">Hide on lose focus</property>
</object>
<packing>
<property name="top_attach">8</property>
<property name="bottom_attach">9</property>
<property name="x_options"></property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="alwaysontopcheck">
<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_alwaysontopcheck_toggled"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">7</property>
<property name="bottom_attach">8</property>
<property name="x_options"></property>
<property name="y_options">GTK_EXPAND</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="hideonlosefocuscheck">
<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_hideonlosefocuscheck_toggled"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">8</property>
<property name="bottom_attach">9</property>
<property name="x_options"></property>
<property name="y_options">GTK_EXPAND</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label27">
<property name="visible">True</property>
<property name="label" translatable="yes">Show on all workspaces</property>
</object>
<packing>
<property name="top_attach">9</property>
<property name="bottom_attach">10</property>
<property name="x_options"></property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="stickycheck">
<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_stickycheck_toggled"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">9</property>
<property name="bottom_attach">10</property>
<property name="x_options"></property>
<property name="y_options">GTK_EXPAND</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="position">0</property> <property name="position">0</property>

View File

@ -207,6 +207,18 @@ class PrefsEditor:
else: else:
active = 0 active = 0
widget.set_active(active) widget.set_active(active)
#Hide from taskbar
widget = guiget('hidefromtaskbcheck')
widget.set_active(self.config['hide_from_taskbar'])
#Always on top
widget = guiget('alwaysontopcheck')
widget.set_active(self.config['always_on_top'])
#Hide on lose focus
widget = guiget('hideonlosefocuscheck')
widget.set_active(self.config['hide_on_lose_focus'])
#Show on all workspaces
widget = guiget('stickycheck')
widget.set_active(self.config['sticky'])
## Profile tab ## Profile tab
# Populate the profile list # Populate the profile list
@ -496,6 +508,26 @@ class PrefsEditor:
self.config['borderless'] = not widget.get_active() self.config['borderless'] = not widget.get_active()
self.config.save() self.config.save()
def on_hidefromtaskbcheck_toggled(self, widget):
"""Hide from taskbar setting changed"""
self.config['hide_from_taskbar'] = widget.get_active()
self.config.save()
def on_alwaysontopcheck_toggled(self, widget):
"""Always on top setting changed"""
self.config['always_on_top'] = widget.get_active()
self.config.save()
def on_hideonlosefocuscheck_toggled(self, widget):
"""Hide on lose focus setting changed"""
self.config['hide_on_lose_focus'] = widget.get_active()
self.config.save()
def on_stickycheck_toggled(self, widget):
"""Sticky setting changed"""
self.config['sticky'] = widget.get_active()
self.config.save()
def on_allow_bold_checkbutton_toggled(self, widget): def on_allow_bold_checkbutton_toggled(self, widget):
"""Allow bold setting changed""" """Allow bold setting changed"""
self.config['allow_bold'] = widget.get_active() self.config['allow_bold'] = widget.get_active()

View File

@ -145,7 +145,7 @@ class Terminator(Borg):
window = maker.make('Window') window = maker.make('Window')
terminal = maker.make('Terminal') terminal = maker.make('Terminal')
window.add(terminal) window.add(terminal)
window.show() window.show(True)
terminal.spawn_child() terminal.spawn_child()
return(window, terminal) return(window, terminal)

View File

@ -32,8 +32,11 @@ class Window(Container, gtk.Window):
title = None title = None
isfullscreen = None isfullscreen = None
ismaximised = None ismaximised = None
iswithdrawn = None
hidebound = None hidebound = None
hidefunc = None hidefunc = None
position = None
ignore_startup_show = None
zoom_data = None zoom_data = None
term_zoomed = gobject.property(type=bool, default=False) term_zoomed = gobject.property(type=bool, default=False)
@ -99,6 +102,10 @@ class Window(Container, gtk.Window):
fullscreen = self.config['window_state'] == 'fullscreen' fullscreen = self.config['window_state'] == 'fullscreen'
hidden = self.config['window_state'] == 'hidden' hidden = self.config['window_state'] == 'hidden'
borderless = self.config['borderless'] borderless = self.config['borderless']
skiptaskbar = self.config['hide_from_taskbar']
alwaysontop = self.config['always_on_top']
hideonlosefocus = self.config['hide_on_lose_focus']
sticky = self.config['sticky']
if options: if options:
if options.maximise: if options.maximise:
@ -113,9 +120,13 @@ class Window(Container, gtk.Window):
self.set_fullscreen(fullscreen) self.set_fullscreen(fullscreen)
self.set_maximised(maximise) self.set_maximised(maximise)
self.set_borderless(borderless) self.set_borderless(borderless)
self.set_always_on_top(alwaysontop)
self.set_hide_on_lose_focus(hideonlosefocus)
self.set_real_transparency() self.set_real_transparency()
self.set_sticky(sticky)
if self.hidebound: if self.hidebound:
self.set_hidden(hidden) self.set_hidden(hidden)
self.set_skip_taskbar_hint(skiptaskbar)
else: else:
self.set_iconified(hidden) self.set_iconified(hidden)
@ -203,8 +214,18 @@ class Window(Container, gtk.Window):
def on_hide_window(self, data=None): def on_hide_window(self, data=None):
"""Handle a request to hide/show the window""" """Handle a request to hide/show the window"""
# FIXME: Implement or drop, or explain why its empty if self.iswithdrawn == True:
pass if self.position:
self.move(self.position[0], self.position[1])
self.present()
else:
self.position = self.get_position()
self.hidefunc()
def on_lose_focus(self, widget, event):
"""Handle when window lose focus"""
self.position = self.get_position()
self.hidefunc()
# pylint: disable-msg=W0613 # pylint: disable-msg=W0613
def on_window_state_changed(self, window, event): def on_window_state_changed(self, window, event):
@ -213,8 +234,11 @@ class Window(Container, gtk.Window):
gtk.gdk.WINDOW_STATE_FULLSCREEN) gtk.gdk.WINDOW_STATE_FULLSCREEN)
self.ismaximised = bool(event.new_window_state & self.ismaximised = bool(event.new_window_state &
gtk.gdk.WINDOW_STATE_MAXIMIZED) gtk.gdk.WINDOW_STATE_MAXIMIZED)
dbg('Window::on_window_state_changed: fullscreen=%s, maximised=%s' % self.iswithdrawn = bool(event.new_window_state &
(self.isfullscreen, self.ismaximised)) gtk.gdk.WINDOW_STATE_WITHDRAWN)
dbg('Window::on_window_state_changed: fullscreen=%s, maximised=%s,\
withdrawn=%s' %
(self.isfullscreen, self.ismaximised, self.iswithdrawn))
return(False) return(False)
@ -238,13 +262,29 @@ class Window(Container, gtk.Window):
def set_hidden(self, value): def set_hidden(self, value):
"""Set the visibility of the window from the supplied value""" """Set the visibility of the window from the supplied value"""
# FIXME: Implement or drop this if value == True:
pass self.ignore_startup_show = True
else:
self.ignore_startup_show = False
def set_iconified(self, value): def set_iconified(self, value):
"""Set the minimised state of the window from the value""" """Set the minimised state of the window from the supplied value"""
# FIXME: Implement or drop this if value == True:
pass self.iconify()
def set_always_on_top(self, value):
"""Set the always on top window hint from the supplied value"""
self.set_keep_above(value)
def set_sticky(self, value):
"""Set the sticky hint from the supplied value"""
if value == True:
self.stick()
def set_hide_on_lose_focus(self,value):
"""Registers the callback for lost focus from the supplied value"""
if value == True:
self.connect('focus-out-event', self.on_lose_focus)
def set_real_transparency(self, value=True): def set_real_transparency(self, value=True):
"""Enable RGBA if supported on the current screen""" """Enable RGBA if supported on the current screen"""
@ -262,6 +302,14 @@ class Window(Container, gtk.Window):
if colormap: if colormap:
self.set_colormap(colormap) self.set_colormap(colormap)
def show(self, startup=False):
"""Undo the startup show request if started in hidden mode"""
gtk.Window.show(self)
#Window must be shown, then hidden for the hotkeys to be registered
if (self.ignore_startup_show and startup == True):
self.hide()
def add(self, widget): def add(self, widget):
"""Add a widget to the window by way of gtk.Window.add()""" """Add a widget to the window by way of gtk.Window.add()"""
maker = Factory() maker = Factory()