#!/usr/bin/env python # # Menubar Spinner - Epiphany Extension # Copyright (C) 2006 Stefan Stuhr # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import gtk import epiphany def get_child_in_widget(widget, child_path): if not hasattr(widget, "get_children"): return None current = child_path.pop(0) if current[0] == None: child = None for child_widget in widget.get_children(): if isinstance(child_widget, current[1]): child = child_widget break if child == None: return None else: try: child = widget.get_children()[current[0]] except IndexError: return None if not isinstance(child, current[1]): return None if len(child_path) > 0: return get_child_in_widget(child, child_path) else: return child def _mbs_menubar_show(menubar, window, data): spinner = data["spinner"] menuitem = data["menuitem"] toolitem = data["toolitem"] toolitem.hide() spinner.hide() spinner.parent.remove(spinner) size_req_handler_id = data["size_req_handler_id"] spinner.handler_block(size_req_handler_id) spinner.set_size(gtk.ICON_SIZE_MENU) spinner.handler_unblock(size_req_handler_id) menuitem.add(spinner) menuitem.show() spinner.show() def _mbs_menubar_hide(menubar, window, data): spinner = data["spinner"] menuitem = data["menuitem"] toolitem = data["toolitem"] menuitem.hide() spinner.hide() spinner.parent.remove(spinner) size_req_handler_id = data["size_req_handler_id"] spinner_toolbar = data["spinner_toolbar"] icon_size = spinner_toolbar.get_icon_size() size_req_handler_id = data["size_req_handler_id"] spinner.handler_block(size_req_handler_id) spinner.set_size(icon_size) spinner.handler_unblock(size_req_handler_id) toolitem.add(spinner) spinner.show() toolitem.show() def _mbs_spinner_size_request(spinner, requisition, data): menuitem = data["menuitem"] toolitem = data["toolitem"] if spinner.parent == menuitem: size_req_handler_id = data["size_req_handler_id"] spinner.handler_block(size_req_handler_id) spinner.set_size(gtk.ICON_SIZE_MENU) spinner.handler_unblock(size_req_handler_id) elif spinner.parent == toolitem: spinner_toolbar = data["spinner_toolbar"] icon_size = spinner_toolbar.get_icon_size() size_req_handler_id = data["size_req_handler_id"] spinner.handler_block(size_req_handler_id) spinner.set_size(icon_size) spinner.handler_unblock(size_req_handler_id) def _mbs_attach_window_helper(window): data = {} toolbar = window.get_toolbar() menubar = get_child_in_widget(window, [(0, gtk.VBox), (0, gtk.VBox), (0, gtk.MenuBar)]) if not menubar: return data["menubar"] = menubar menuitem = gtk.MenuItem() data["menuitem"] = menuitem menuitem.set_right_justified(True) menuitem.set_sensitive(False) menubar.append(menuitem) spinner_toolbar = toolitem = get_child_in_widget(toolbar, [(0, gtk.HBox), (-1, gtk.Toolbar)]) if not spinner_toolbar: return data["spinner_toolbar"] = spinner_toolbar toolitem = get_child_in_widget(spinner_toolbar, [(0, gtk.ToolItem)]) if not toolitem: return data["toolitem"] = toolitem spinner = get_child_in_widget(toolitem, [(0, epiphany.Spinner)]) if not spinner: return data["spinner"] = spinner data["spinner_req"] = spinner.get_size_request() size_req_handler_id = spinner.connect("size-request", _mbs_spinner_size_request, data) data["size_req_handler_id"] = size_req_handler_id if menubar.get_property("visible"): _mbs_menubar_show(menubar, window, data) show_handler_id = menubar.connect("show", _mbs_menubar_show, window, data) hide_handler_id = menubar.connect("hide", _mbs_menubar_hide, window, data) data["show_handler_id"] = show_handler_id data["hide_handler_id"] = hide_handler_id window._mbs_spinner_data = data def detach_window(window): if not hasattr(window, "_mbs_spinner_data"): return data = window._mbs_spinner_data menubar = data["menubar"] menubar.disconnect(data["show_handler_id"]) menubar.disconnect(data["hide_handler_id"]) if menubar.get_property("visible"): _mbs_menubar_hide(menubar, window, data) spinner = data["spinner"] spinner.disconnect(data["size_req_handler_id"]) menuitem = data["menuitem"] menuitem.hide() menuitem.parent.remove(menuitem) del data del window._mbs_spinner_data if hasattr(window, "_mbs_spinner_first_tab_attached"): del window._mbs_spinner_first_tab_attached def attach_tab(window, tab): if hasattr(window, "_mbs_spinner_first_tab_attached"): return window._mbs_spinner_first_tab_attached = True _mbs_attach_window_helper(window)