From 80ae816a2fd1b68f1799de7a4a624bea91bbeefe Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 13 May 2013 09:53:11 +0000 Subject: [PATCH] osx fixes: move some osx client code to xpra/client/ dir git-svn-id: https://xpra.org/svn/Xpra/trunk@3370 3bb7dfac-3a0b-4e04-842a-767bc560f471 --- src/xpra/client/osx/__init__.py | 4 + src/xpra/client/osx/osx_client_menu.py | 138 +++++++++++++++++++++++++ src/xpra/platform/darwin/gui.py | 4 +- src/xpra/platform/darwin/osx_menu.py | 9 +- src/xpra/platform/darwin/osx_tray.py | 3 + 5 files changed, 153 insertions(+), 5 deletions(-) create mode 100644 src/xpra/client/osx/__init__.py create mode 100644 src/xpra/client/osx/osx_client_menu.py diff --git a/src/xpra/client/osx/__init__.py b/src/xpra/client/osx/__init__.py new file mode 100644 index 0000000000..0f7a10c3e4 --- /dev/null +++ b/src/xpra/client/osx/__init__.py @@ -0,0 +1,4 @@ +# This file is part of Xpra. +# Copyright (C) 2013 Antoine Martin +# Xpra is released under the terms of the GNU GPL v2, or, at your option, any +# later version. See the file COPYING for details. diff --git a/src/xpra/client/osx/osx_client_menu.py b/src/xpra/client/osx/osx_client_menu.py new file mode 100644 index 0000000000..a30e3ec237 --- /dev/null +++ b/src/xpra/client/osx/osx_client_menu.py @@ -0,0 +1,138 @@ +# This file is part of Xpra. +# Copyright (C) 2011-2013 Antoine Martin +# Xpra is released under the terms of the GNU GPL v2, or, at your option, any +# later version. See the file COPYING for details. + +from xpra.gtk_common.gobject_compat import import_gtk +from xpra.gtk_common.gtk_util import CheckMenuItem +gtk = import_gtk() + +from xpra.log import Logger +log = Logger() + +#for attention_request: +CRITICAL_REQUEST = 0 +INFO_REQUEST = 10 + + +class OSXMenuHelper(object): + """ + we have to do this stuff here so we can + re-use the same instance + """ + + def __init__(self, client): + self.client = client + self.menu_bar = None + self.hidden_window = None + self.quit_menu_item = None + + def quit(self): + self.client.quit(0) + + def build(self): + if self.menu_bar is None: + self.build_menu_bar() + return self.menu_bar + + def rebuild(self): + if self.menu_bar: + self.remove_all_menus() + self.menu_bar = None + self.build() + + def remove_all_menus(self): + if self.menu_bar: + for x in self.menu_bar.get_children(): + self.menu_bar.remove(x) + x.hide() + self.info_menu = None + self.features_menu = None + self.encodings_menu = None + self.quality_menu = None + self.actions_menu = None + #if self.macapp: + # self.macapp.sync_menubar() + + def build_menu_bar(self): + self.menu_bar = gtk.MenuBar() + def make_menu(name, submenu): + item = gtk.MenuItem(name) + item.set_submenu(submenu) + item.show_all() + self.menu_bar.add(item) + return submenu + self.info_menu = make_menu("Info", gtk.Menu()) + self.features_menu = make_menu("Features", gtk.Menu()) + self.encodings_menu = make_menu("Encodings", self.make_encodingssubmenu(False)) + if (self.client.speaker_allowed and len(self.client.speaker_codecs)>0) or \ + (self.client.microphone_allowed and len(self.client.microphone_codecs)>0): + self.sound_menu = make_menu("Sound", gtk.Menu()) + self.quality_menu = make_menu("Min Quality", self.make_qualitysubmenu()) + self.speed_menu = make_menu("Speed", self.make_speedsubmenu()) + self.actions_menu = make_menu("Actions", gtk.Menu()) + def reset_encodings(*args): + self.reset_encoding_options(self.encodings_menu) + self.client.connect("handshake-complete", reset_encodings) + + #info + self.info_menu.add(self.make_aboutmenuitem()) + self.info_menu.add(self.make_sessioninfomenuitem()) + #features + self.features_menu.add(self.make_bellmenuitem()) + self.features_menu.add(self.make_cursorsmenuitem()) + self.features_menu.add(self.make_notificationsmenuitem()) + if not self.client.readonly: + self.features_menu.add(self.make_layoutsmenuitem()) + #sound: + if self.client.speaker_allowed and len(self.client.speaker_codecs)>0: + self.sound_menu.add(self.make_speakermenuitem()) + if self.client.microphone_allowed and len(self.client.microphone_codecs)>0: + self.sound_menu.add(self.make_microphonemenuitem()) + #actions: + self.actions_menu.add(self.make_refreshmenuitem()) + self.actions_menu.add(self.make_raisewindowsmenuitem()) + + self.menu_bar.show_all() + + + def make_speakermenuitem(self): + speaker = CheckMenuItem("Speaker", "Forward sound output from the server") + def speaker_toggled(*args): + if speaker.active: + self.spk_on() + else: + self.spk_off() + def set_speaker(*args): + speaker.set_active(self.client.speaker_enabled) + speaker.connect('toggled', speaker_toggled) + self.client.connect("handshake-complete", set_speaker) + return speaker + + def make_microphonemenuitem(self): + microphone = CheckMenuItem("Microphone", "Forward sound input to the server") + def microphone_toggled(*args): + if microphone.active: + self.mic_on() + else: + self.mic_off() + def set_microphone(*args): + microphone.set_active(self.client.microphone_enabled) + microphone.connect('toggled', microphone_toggled) + self.client.connect("handshake-complete", set_microphone) + return microphone + + def set_speedmenu(self, *args): + for x in self.speed_menu.get_children(): + if isinstance(x, gtk.CheckMenuItem): + x.set_sensitive(self.client.encoding=="x264") + + def set_qualitymenu(self, *args): + vq = not self.client.mmap_enabled and self.client.encoding in ("jpeg", "webp", "x264") + if not vq: + self.quality_menu.hide() + else: + self.quality_menu.show() + self.quality_menu.set_sensitive(vq) + for i in self.quality_menu.get_children(): + i.set_sensitive(vq) diff --git a/src/xpra/platform/darwin/gui.py b/src/xpra/platform/darwin/gui.py index bc8873ba06..42653a5cb0 100644 --- a/src/xpra/platform/darwin/gui.py +++ b/src/xpra/platform/darwin/gui.py @@ -33,15 +33,13 @@ def get_OSXApplication(): def do_init(): - from xpra.gtk_common.quit import gtk_main_quit_really - def quit_launcher(*args): - gtk_main_quit_really() from osx_menu import getOSXMenu from xpra.platform.paths import get_icon osxapp = get_OSXApplication() icon = get_icon("xpra.png") if icon: osxapp.set_dock_icon_pixbuf(icon) + osxapp.set_dock_menu(getOSXMenu().build_dock_menu()) osxapp.set_menu_bar(getOSXMenu().rebuild()) osxapp.ready() diff --git a/src/xpra/platform/darwin/osx_menu.py b/src/xpra/platform/darwin/osx_menu.py index 42525772be..74887cf4db 100644 --- a/src/xpra/platform/darwin/osx_menu.py +++ b/src/xpra/platform/darwin/osx_menu.py @@ -73,12 +73,17 @@ def make_menu(name, submenu): item.show_all() self.menu_bar.add(item) return submenu - self.menuitem("About Xpra", "information.png", None, about) - info_menu = make_menu("Info", gtk.Menu()) + info_menu = make_menu("Info", gtk.Menu()) info_menu.add(self.menuitem("About Xpra", "information.png", None, about)) self.menu_bar.show_all() + def build_dock_menu(self): + self.dock_menu = gtk.Menu() + self.dock_menu.add(self.menuitem("About Xpra", "information.png", None, about)) + self.dock_menu.show_all() + return self.dock_menu + #the code below is mostly duplicated from xpra/client/gtk2... def menuitem(self, title, icon_name=None, tooltip=None, cb=None): diff --git a/src/xpra/platform/darwin/osx_tray.py b/src/xpra/platform/darwin/osx_tray.py index 6b4ac2a797..e486c1f6d1 100644 --- a/src/xpra/platform/darwin/osx_tray.py +++ b/src/xpra/platform/darwin/osx_tray.py @@ -32,6 +32,9 @@ def __init__(self, menu_helper, tray_icon): #not needed?: #self.macapp.connect("NSApplicationBlockTermination", self.quit) + def cleanup(self): + pass + def quit(self, *args): self.menu_helper.quit()