[X2Go-Commits] pyhoca-gui.git - twofactorauth (branch) updated: 4e565a5ce2c87f19af6eb2402b1c8bed7f469700
X2Go dev team
git-admin at x2go.org
Sat Sep 14 15:54:11 CEST 2013
The branch, twofactorauth has been updated
via 4e565a5ce2c87f19af6eb2402b1c8bed7f469700 (commit)
from 32c541af677a17485c8c8f1b61152826ec03ed12 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
pyhoca-gui | 10 +-
pyhoca/wxgui/__init__.pyc | Bin 0 -> 243 bytes
pyhoca/wxgui/{ => _delete_}/x2goLogon.py | 0
pyhoca/wxgui/chooser.py | 316 +++++++++++
pyhoca/wxgui/chooser.pyc | Bin 0 -> 10365 bytes
pyhoca/wxgui/frontend.py | 834 ++++++++++--------------------
pyhoca/wxgui/frontend.pyc | Bin 0 -> 9254 bytes
pyhoca/wxgui/images.py | 22 +-
pyhoca/wxgui/images.pyc | Bin 0 -> 8317 bytes
pyhoca/wxgui/logon.py | 176 +++++++
pyhoca/wxgui/logon.pyc | Bin 0 -> 5513 bytes
pyhoca/wxgui/menus_chooser.py | 184 +++++++
pyhoca/wxgui/menus_chooser.pyc | Bin 0 -> 5223 bytes
pyhoca/wxgui/menus_taskbar.py | 260 ++++++++++
pyhoca/wxgui/menus_taskbar.pyc | Bin 0 -> 7630 bytes
pyhoca/wxgui/messages.py | 40 +-
pyhoca/wxgui/messages.pyc | Bin 0 -> 1630 bytes
pyhoca/wxgui/profilemanager.py | 40 +-
pyhoca/wxgui/profilemanager.pyc | Bin 0 -> 22748 bytes
pyhoca/wxgui/taskbar.py | 113 ++++
pyhoca/wxgui/taskbar.pyc | Bin 0 -> 3707 bytes
21 files changed, 1390 insertions(+), 605 deletions(-)
create mode 100644 pyhoca/wxgui/__init__.pyc
rename pyhoca/wxgui/{ => _delete_}/x2goLogon.py (100%)
create mode 100644 pyhoca/wxgui/chooser.py
create mode 100644 pyhoca/wxgui/chooser.pyc
create mode 100644 pyhoca/wxgui/frontend.pyc
create mode 100644 pyhoca/wxgui/images.pyc
create mode 100644 pyhoca/wxgui/logon.py
create mode 100644 pyhoca/wxgui/logon.pyc
create mode 100644 pyhoca/wxgui/menus_chooser.py
create mode 100644 pyhoca/wxgui/menus_chooser.pyc
create mode 100644 pyhoca/wxgui/menus_taskbar.py
create mode 100644 pyhoca/wxgui/menus_taskbar.pyc
create mode 100644 pyhoca/wxgui/messages.pyc
create mode 100644 pyhoca/wxgui/profilemanager.pyc
create mode 100644 pyhoca/wxgui/taskbar.py
create mode 100644 pyhoca/wxgui/taskbar.pyc
The diff of changes is:
diff --git a/pyhoca-gui b/pyhoca-gui
index 1cdc108..ec3786e 100755
--- a/pyhoca-gui
+++ b/pyhoca-gui
@@ -21,6 +21,12 @@
modules ={}
+import gevent
+import gevent.monkey
+gevent.monkey.patch_all()
+
+import x2go.gevent_subprocess as subprocess
+
try:
import wxversion
wxversion.select('2.8')
@@ -31,7 +37,6 @@ import os.path
import sys
import platform
import exceptions
-from subprocess import Popen, PIPE
# Python X2go modules
import x2go
@@ -48,6 +53,7 @@ VERSION_TEXT="""
%s[%s] - an X2go GUI client written in Python
----------------------------------------------------------------------
developed by Dick Kniep <dick.kniep at lindix.nl>
+ and Mike Gabriel <m.gabriel at das-netzwerkteam.de>
VERSION: %s
@@ -130,7 +136,7 @@ def version():
def check_running(logger):
if platform.system() in ('Linux', 'Mac'):
- p = Popen(['ps', '-A'], stdout=PIPE)
+ p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
psA_out = p.communicate()
#logger('psa_out %s' % (psA_out,), x2go.loglevel_DEBUG )
return psA_out[0].count(PROG_NAME) > 1
diff --git a/pyhoca/wxgui/__init__.pyc b/pyhoca/wxgui/__init__.pyc
new file mode 100644
index 0000000..4f35946
Binary files /dev/null and b/pyhoca/wxgui/__init__.pyc differ
diff --git a/pyhoca/wxgui/x2goLogon.py b/pyhoca/wxgui/_delete_/x2goLogon.py
similarity index 100%
rename from pyhoca/wxgui/x2goLogon.py
rename to pyhoca/wxgui/_delete_/x2goLogon.py
diff --git a/pyhoca/wxgui/chooser.py b/pyhoca/wxgui/chooser.py
new file mode 100644
index 0000000..25d59b9
--- /dev/null
+++ b/pyhoca/wxgui/chooser.py
@@ -0,0 +1,316 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+# Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+#
+# PyHoca GUI 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+modules ={}
+
+try:
+ import wxversion
+ wxversion.select('2.8')
+except: pass
+
+# Python X2go
+import x2go
+
+import gevent
+import gevent.monkey
+gevent.monkey.patch_all()
+
+import wx
+import wx.lib.scrolledpanel as scrolled
+import wx.lib.mixins.listctrl as listmix
+
+import time
+import sys
+import platform
+import types
+import copy
+import threading
+
+# PyHoca-GUI modules
+import menus_chooser
+import taskbar
+import profilemanager
+import images
+from messages import Message
+
+try:
+ from agw import knobctrl as KC
+ knobctrlavailable = True
+except ImportError: # if it's not there locally, try the wxPython lib.
+ try:
+ import wx.lib.agw.knobctrl as KC
+ knobctrlavailable = True
+ except ImportError:
+ knobctrlavailable = False
+
+import wx.lib.sized_controls as sc
+
+
+class PyHocaGUI_SessionChooser(wx.Frame):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, iconized=True):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ #self._pyhoca_logger('session chooser screen starts iconized in systray: %s' % iconized,
+ # loglevel=x2go.loglevel_INFO, )
+
+ #self.current_session_uuid = _PyHocaGUI.current_session_uuid
+
+ #self.selected_session_uuid = None
+ self.currentItem = None
+
+ #if self.current_session_uuid:
+ # self._pyhoca_logger('with current session profile %s' % _PyHocaGUI.get_profile_name(current_session_uuid),
+ # loglevel=x2go.loglevel_INFO, )
+
+ wx.Frame.__init__(self, None, -1)
+ self.CentreOnScreen()
+ self.il = wx.ImageList(16, 16)
+ self.list = PyHocaGUI_ListCtrl(self, -1,
+ style=wx.LC_REPORT | wx.BORDER_NONE | wx.LC_SORT_ASCENDING
+ )
+ self.idx1 = self.il.Add(images.getnetwork_disconnected_lanBitmap())
+ self.idx2 = self.il.Add(images.getnetwork_connected_lan_kncBitmap())
+ self.idx3 = self.il.Add(images.getresumeBitmap())
+
+ self.list.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
+
+ self.TaskBarIcon = taskbar.PyHocaGUI_TaskBarIcon(self._PyHocaGUI)
+ self.TaskBarIcon.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, lambda _Show: self.Show(True))
+ self.TaskBarIcon.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.TaskBarIcon.CreateSessionManagerPopupMenu)
+
+ self.Main_MenuBar = wx.MenuBar()
+ self.SetMenuBar(self.Main_MenuBar)
+ self.Main_MenuBar.Append(menus_chooser.PyHocaGUI_Menu_ChooserSessions(self._PyHocaGUI, caller=self), '&Sessions')
+ self.Main_MenuBar.Append(menus_chooser.PyHocaGUI_Menu_ChooserProfiles(self._PyHocaGUI, caller=self), '&Profiles')
+ self.Main_MenuBar.Append(menus_chooser.PyHocaGUI_Menu_ChooserExtras(self._PyHocaGUI, caller=self), '&Extras')
+
+ self.PopulateList()
+
+ self.Bind(wx.EVT_SIZE, self.OnSize)
+
+ self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
+ self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list)
+
+ self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
+ self.list.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
+
+ # for wxMSW
+ self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
+
+ # for wxGTK
+ self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
+
+ self.Bind(wx.EVT_CLOSE, self.OnCancel)
+
+ if iconized:
+ if not self.IsIconized():
+ self.Iconize(True)
+ #if parent.args.password and parent.args.username and self.current_profile:
+ # X2GoPasswordScrn(self)
+ #elif parent.args.profile:
+ # Message(self, 4)
+ # self.Iconize(False)
+ else:
+ self.Show(True)
+
+ def OnSize(self, event):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ w,h = self.GetClientSizeTuple()
+ self.list.SetDimensions(0, 0, w, h)
+
+ def PopulateList(self):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ info = wx.ListItem()
+ info.m_mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT
+ info.m_image = -1
+ info.m_format = 0
+ info.m_text = "Session Profile"
+ self.list.InsertColumnInfo(0, info)
+
+ info.m_format = wx.LIST_FORMAT_RIGHT
+ info.m_text = ""
+ self.list.InsertColumnInfo(1, info)
+
+ info.m_format = wx.LIST_FORMAT_RIGHT
+ info.m_text = "Status"
+ self.list.InsertColumnInfo(2, info)
+
+ info.m_format = wx.LIST_FORMAT_RIGHT
+ info.m_text = "Profile ID"
+ self.list.InsertColumnInfo(3, info)
+
+ #self._pyhoca_logger('sessions profiles: %s' % self.session_profiles.profile_names, loglevel=x2go.loglevel_INFO, )
+ for session_uuid in [ s() for s in self._PyHocaGUI.control_sessions.values() ]:
+
+ _rs = registered_session = self._PyHocaGUI.get_registered_session(session_uuid)
+ profile_name = registered_session.get_profile_name()
+ session_name = registered_session.get_session_name()
+ self.addRow(profile_name, session_name=session_name, connected=_rs.is_connected(), running=_rs.is_running(), suspended=_rs.is_suspended(), alive=_rs.session_ok())
+
+ self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
+
+ def addRow(self, profile_name, session_name=None, connected=False, running=False, suspended=False, alive=False):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ if connected and alive and running:
+ imageNr = self.idx2
+ statusText = 'Connected'
+ elif suspended or (not connected and (alive or running)):
+ imageNr = self.idx3
+ statusText = 'Suspended'
+ else:
+ imageNr = self.idx1
+ statusText = 'Not Connected'
+ _index = self.list.InsertImageStringItem(sys.maxint, profile_name, imageNr)
+ #self.list.SetStringItem(_index, 1, str(idx))
+ self.list.SetStringItem(_index, 2, statusText)
+ if session_name: self.list.SetStringItem(_index, 3, session_name)
+
+ def OnRightDown(self, event):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ x = event.GetX()
+ y = event.GetY()
+ item, flags = self.list.HitTest((x, y))
+
+ if flags & wx.LIST_HITTEST_ONITEM:
+ self.list.Select(item)
+ event.Skip()
+
+ def OnItemSelected(self, event):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ ##print event.GetItem().GetTextColour()
+ self.currentItem = event.m_itemIndex
+ self.selected_profile = self.current_profile = self.parent.SessionProfiles.get_profile_config(self.list.GetItemText(self.currentItem))
+
+ def OnItemActivated(self, event):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self.currentItem = event.m_itemIndex
+ self.selected_profile = self.current_profile = self.SessionProfiles.get_profile_config(self.list.GetItemText(self.currentItem))
+
+ def OnDoubleClick(self, event):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._pyhoca_logger('DoubleClick', x2go.loglevel_INFO, )
+ PyHocaGUI_PasswordScrn(self)
+ event.Skip()
+
+ def OnRightClick(self, event):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ # only do this part the first time so the events are only bound once
+ # Popup the menu. If an item is selected then its handler
+ # will be called before PopupMenu returns.
+ self.PopupMenu(menus.PyHocaGUI_MenuProfileManager(self._PyHocaGUI, caller=self))
+
+ def OnCancel(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ #if not self._PyHocaGUI.has_running_sessions:
+ # self.TaskBarIcon.Destroy()
+ self.Iconize(True)
+
+ def callbackConnection(self, error):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ if self.currentItem:
+ if error:
+ self.list.SetItemImage(self.currentItem, self.idx1)
+ else:
+ self.list.SetItemImage(self.currentItem, self.idx2)
+
+ def callbackupdList(self, action, profile):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ if action == 'Add':
+ self.addRow(profile.name, False, False)
+ else:
+ self.list.SetStringItem(self.currentItem, 0, profile['name'])
+
+
+class PyHocaGUI_ListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, parent, ID, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0):
+
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
+ listmix.ListCtrlAutoWidthMixin.__init__(self)
+ self.sm_up = parent.il.Add(images.getSmallUpArrowBitmap())
+ self.sm_dn = parent.il.Add(images.getSmallDnArrowBitmap())
+ listmix.ColumnSorterMixin.__init__(self, 2)
+ self.SortListItems(0, True)
+
+ # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
+ def GetListCtrl(self):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ return self
+
+ # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
+ def GetSortImages(self):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ return (self.sm_dn, self.sm_up)
+
diff --git a/pyhoca/wxgui/chooser.pyc b/pyhoca/wxgui/chooser.pyc
new file mode 100644
index 0000000..96548f9
Binary files /dev/null and b/pyhoca/wxgui/chooser.pyc differ
diff --git a/pyhoca/wxgui/frontend.py b/pyhoca/wxgui/frontend.py
index 98dedfb..ea11f13 100644
--- a/pyhoca/wxgui/frontend.py
+++ b/pyhoca/wxgui/frontend.py
@@ -24,40 +24,35 @@ try:
import wxversion
wxversion.select('2.8')
except: pass
-import wx
+
+# Python X2go
import x2go
-import time
-import sys
+
+import gevent
+import gevent.monkey
+gevent.monkey.patch_all()
+
+import wx
import wx.lib.scrolledpanel as scrolled
import wx.lib.mixins.listctrl as listmix
+
+import time
+import sys
import platform
import types
+import copy
+import threading
# PyHoca-GUI modules
+import logon
+import taskbar
+import chooser
+import menus_chooser
+import menus_taskbar
import profilemanager
import images
from messages import Message
-
-class PyHocaGUI(wx.App, x2go.X2goClient):
- def __init__(self, args, logger, liblogger):
- self.args = args
- self.logger = logger
- self.liblogger = liblogger
- wx.App.__init__(self)
-
- def OnInit(self):
- wx.BeginBusyCursor()
- self.SetAppName('PyHoca-GUI -- Python based X2go Client')
- self.SetVendorName('Lindix BV. Almere (c) 2010')
- startX2Go(self)
- wx.EndBusyCursor()
- return True
-
- def OnExit(self):
- pass
-
-
try:
from agw import knobctrl as KC
knobctrlavailable = True
@@ -70,557 +65,284 @@ except ImportError: # if it's not there locally, try the wxPython lib.
import wx.lib.sized_controls as sc
-class menuActions(wx.Menu):
- def __init__(self, parent, fromTaskBarIcon=False, popupMenu=False):
- if fromTaskBarIcon:
- self.parent = parent.parent
- else:
- self.parent = parent
- self.fromTaskBarIcon = fromTaskBarIcon
- self.popupMenu = popupMenu
- if hasattr(parent,'logger'):
- self.logger = self.parent.logger
- else:
- self.logger = self.parent.parent.logger
- if hasattr(parent,'settingsProfile'):
- self.settingsProfile = parent.settingsProfile
- self.SessionProfiles = parent.SessionProfiles
- self.printProfile = parent.printProfile
- self.registeredSessions = parent.registeredSessions
+
+class PyHocaGUI(wx.App, x2go.X2goClient):
+
+ def __init__(self, args, logger, liblogger,
+ appname='PyHoca-GUI -- Python based X2go Client',
+ vendorname='Open Source Software Foundation',):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self.appname = appname
+ self.vendorname = vendorname
+
+ self.args = args
+ if logger is None:
+ self._pyhoca_logger = x2go.X2goLogger(tag='PyHocaGUI')
else:
- self.settingsProfile = parent.parent.settingsProfile
- self.SessionProfiles = parent.parent.SessionProfiles
- self.printProfile = parent.parent.printProfile
- self.registeredSessions = parent.parent.registeredSessions
- if hasattr(parent,'selected_profile'):
- self.selected_profile = parent.selected_profile
+ self._pyhoca_logger = copy.deepcopy(logger)
+ self._pyhoca_logger.tag = 'PyHocaGUI'
+
+ if liblogger is None:
+ self._pyhoca_liblogger = x2go.X2goLogger()
else:
- self.selected_profile = parent.parent.selected_profile
-
- ADDPROFILEMENUTXT = "Add &New profile"
- OPENNEWMENUTXT = "&Open new Session"
- RUNNINGMENUTXT = "R&Unning sessions"
- SUSPENDMENUTXT = "&Suspend session"
- RESUMEMENUTXT = "&Resume suspended session"
- UPDATEPROFMNUTEXT = "&Update current Profile"
- CLOSEMENUTXT = "&Close running Session"
- EXITMENUTXT = "E&xit"
- MENU_NEWSESSION = wx.NewId()
- MENU_LISTSESSIONS = wx.NewId()
- MENU_SUSPEND = wx.NewId()
- MENU_RESUME = wx.NewId()
- MENU_EDITSESSION = wx.NewId()
- MENU_CLOSESESSION = wx.NewId()
- MENU_EXIT = wx.NewId()
- MENU_NEWPROFILE = wx.NewId()
- wx.Menu.__init__(self)
- self.logger('settingsProfile.newProfile %s' % dir(self.settingsProfile), x2go.loglevel_INFO, )
- self.Append(MENU_NEWSESSION, OPENNEWMENUTXT)
- parent.Bind(wx.EVT_MENU, self.OnNewSession, id=MENU_NEWSESSION)
- if self.settingsProfile.get('Authorization','newprofile',types.BooleanType):
- self.Append(MENU_NEWPROFILE, ADDPROFILEMENUTXT)
- parent.Bind(wx.EVT_MENU, self.OnAddProfile, id=MENU_NEWPROFILE)
- if self.registeredSessions.has_running_session and popupMenu is False:
- self.Append(MENU_LISTSESSIONS, RUNNINGMENUTXT)
- parent.Bind(wx.EVT_MENU, self.OnListSessions, id=MENU_LISTSESSIONS)
- if self.settingsProfile.get('Authorization','suspend',types.BooleanType) and ((popupMenu is False and self.registeredSessions.has_running_session)
- or (popupMenu and self.registeredSessions.running_sessions_of_name(self.parent.selected_profile['name']) is False and self.selected_profile.session_ok())):
- self.Append(MENU_SUSPEND, SUSPENDMENUTXT)
- parent.Bind(wx.EVT_MENU, self.OnSuspend, id=MENU_SUSPEND)
- if self.settingsProfile.get('Authorization','resume',types.BooleanType) and self.registeredSessions.has_suspended_session:
- self.Append(MENU_RESUME, RESUMEMENUTXT)
- parent.Bind(wx.EVT_MENU, self.OnResume, id=MENU_RESUME)
- if self.settingsProfile.get('Authorization','editprofile',types.BooleanType):
- self.AppendSeparator()
- self.Append(MENU_EDITSESSION, UPDATEPROFMNUTEXT)
- parent.Bind(wx.EVT_MENU, self.OnUpdateProfile, id=MENU_EDITSESSION)
- self.AppendSeparator()
- self.Append(MENU_EXIT, EXITMENUTXT)
- parent.Bind(wx.EVT_MENU, self.OnExit, id=MENU_EXIT)
- #self.parent.Bind(wx.EVT_CLOSE, self.OnClose)
-
- def OnAddProfile(self, evt):
- self.logger('Add Profile started', x2go.loglevel_INFO, )
- profilemanager.X2goMaintProfile('Add', self.parent, self.SessionProfiles, self.parent.callbackupdList)
-
- def OnNewSession(self, evt):
- if hasattr(self.parent,'selected_profile'):
- X2GoPasswordScrn(self.parent)
- elif len(self.SessionProfiles.x2goprofs) > 1:
- self.logger('self.parent.IsIconized() %s' % self.parent.IsIconized(), x2go.loglevel_INFO, )
- if self.parent.IsIconized() or not self.parent.IsShown():
- self.parent.Iconize(False)
- if not self.parent.IsShown():
- self.parent.Show(True)
- self.parent.Raise()
- self.parent.SetFocus()
+ self._pyhoca_liblogger = copy.deepcopy(liblogger)
- def OnListSessions(self, evt):
- self.logger('List Sessions started', x2go.loglevel_INFO, )
+ x2go.X2goClient.__init__(self, logger=self._pyhoca_liblogger)
+ wx.App.__init__(self)
+ self.Bind (wx.EVT_IDLE, self.OnIdle)
- def OnSuspend(self, evt):
- self.logger('Suspend Sessions started', x2go.loglevel_INFO, )
+ def OnInit(self):
+ """\
+ STILL UNDOCUMENTED
- def OnResume(self, evt):
- self.logger('Resume Sessions started', x2go.loglevel_INFO, )
+ """
+ wx.BeginBusyCursor()
+ self.SetAppName(self.appname)
+ self.SetVendorName(self.vendorname)
+ self.startGUI()
+ wx.EndBusyCursor()
+ return True
- def OnUpdateProfile(self, evt):
- self.logger('Update Profile started', x2go.loglevel_INFO, )
- if self.selected_profile:
- profilemanager.X2goMaintProfile('Upd', self.parent, self.SessionProfiles, self.parent.callbackupdList, self.selected_profile)
+ def OnIdle(self, evt):
+ """\
+ STILL UNDOCUMENTED
- def OnExit(self, evt):
- self.logger('Exit application', x2go.loglevel_INFO, )
- self.__getFrameParent().Close(True)
+ """
+ gevent.sleep(.01)
+ evt.RequestMore()
+ return True
+
+ def startGUI(self):
+ """\
+ This routine starts all PyHoca-GUI processing. On startup PyHoca-GUI behaves
+ as below:
+
+ 1. If there is only one profile available, or if there is one (1) single
+ profile that has the default switch, and the password has not been passed,
+ the logon screen is shown immediately.
+
+ 2. If there is only one profile available, or if there is one (1) single
+ profile that has the default switch, and the password has been passed,
+ the connection can be made immediately and the screens should not be shown,
+ but if there is an error in the connection, the logon screen should be shown with an errormessage.
+
+ 3. If there are more than one profile available, and there is no default,
+ the list of available profiles should be shown. After the user chooses
+ a profile, the connection should be made to that specific profile, turning
+ it into a session. After that all screens should be minimized.
- def OnClose(self, evt):
- self.logger('Close application', x2go.loglevel_INFO, )
- self.__getFrameParent().Close()
-
- def __getFrameParent(self):
- if isinstance(self, wx.Frame):
- return self
- if isinstance(self.parent, wx.Frame):
- return self.parent
- elif isinstance(self.parent.parent, wx.Frame):
- return self.parent.parent
-
-
-class LogonStatusBar(wx.StatusBar):
- def __init__(self, parent):
- wx.StatusBar.__init__(self, parent, -1)
- font = self.GetFont()
- font.SetPointSize(7)
- self.SetFont(font)
- self.SetFieldsCount(2)
- self.SetStatusWidths([-1,200])
- self.parent = parent
-
- self.timer = wx.PyTimer(self.Notify)
- self.timer.Start(1000)
- self.Notify()
-
- def Notify(self):
- self.SetStatusText(self.parent.Environment, 0)
- self.SetStatusText(self.parent.StatusText, 1)
- t = time.localtime(time.time())
-
-class X2GoResumeSessions(sc.SizedFrame):
- def __init__(self, parent, SessionProfiles, settingsProfile, printProfile, Iconize):
- sc.SizedFrame.__init__(self, None, -1, "X2go Password entry",
- style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
-
-class X2GoPasswordScrn(sc.SizedFrame):
- def __init__(self, parent):
"""
- Screen to enter the userid and password for the session
+ self._pyhoca_logger('starting a new X2go GUI session', loglevel=x2go.loglevel_INFO, )
+
+ # THIS HAS TO MOVE INTO Python X2go
+ #if platform.system() == 'Windows':
+ # #parent.settingsProfile = SessionProfile.XServer(parent.liblogger)
+ # import x2go.X2goXServer as _xserver
+ # _xserver.startXserver(parent)
+
+ # We register one session per available session profile.
+ # These registered sessions we call ,,control'' sessions
+ # On control sessions we will never start an X2go session
+ # X2go sessions are started on siblings of the control session
+
+ self._pyhoca_logger('registering PyHocaGUI control sessions', loglevel=x2go.loglevel_INFO, )
+ self.control_sessions = self.register_all_session_profiles(return_objects=True)
+
+ #default_session = None
+ #_defaults = _session_profiles.get_default_profiles()
+ #if _defaultProfiles and len(_defaultProfiles) == 1:
+ # self.current_profile = defaultProfile = _defaultProfiles[0]
+
+ # auto-resume suspended sessions
+ #_suspended_sessions = self.suspended_sessions
+ #if _suspended_sessions and len(_suspended_sessions) > 0:
+ # if _client_settings.autoresume:
+ #
+ # self._pyhoca_logger('autoresuming suspended sessions: %s' % _suspended_sessions, loglevel=x2go.loglevel_INFO, )
+ # ChoiceScrn = X2GoChooseSessionScrn(self, Iconize=True)
+ # for suspended in _suspended_sessions:
+ # suspended.resume()
+ # else:
+ #
+ # self._pyhoca_logger('select sessions to be resumed from suspended sessions: %s' % _suspended_sessions, loglevel=x2go.loglevel_INFO, )
+ # X2GoResumeSessions(self, _suspended_sessions)
+ #
+ #elif defaultProfile:
+ #
+ # # start minimized and immediately connect to the default sessions
+ # ChoiceScrn = X2GoChooseSessionScrn(self, Iconize=self.args.minimized)
+
+ #elif len(_session_profiles.profile_ids) > 0:
+ #
+ # self._pyhoca_logger('starting profile selection window', loglevel=x2go.loglevel_INFO, )
+ self._chooser_selected_profile_name = None
+ self.chooser = chooser.PyHocaGUI_SessionChooser(self)
+ self.taskbar = self.chooser.TaskBarIcon
+ self._eventid_profilenames_map = {}
+ self._eventid_sessionnames_map = {}
+
+ #else:
+ #
+ # self._pyhoca_logger('starting profile manager with new/empty session profile', loglevel=x2go.loglevel_INFO, )
+ # defScrn = X2GoSessionDefScrn(self, directCall=True)
+
+ # wx.App's OnExit method
+ def OnExit(self):
+ x2go.x2go_cleanup()
+
+ # the taskbar's OnExit method...
+ def OnTaskbarExit(self, evt):
+ """\
+ STILL UNDOCUMENTED
- if the screen is iconized, but an error occurs, the screen is displayed
- and the user can enter another userid/password
"""
- captionText = "X2go Profile " + parent.current_profile['name']
- sc.SizedFrame.__init__(self, None, -1, captionText,
- style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
- self.CentreOnScreen()
-
- self.SetSize((350,250))
-
- self.settingsProfile = parent.settingsProfile
- self.SessionProfiles = parent.SessionProfiles
- self.current_profile = parent.current_profile
- self.registeredSessions = parent.registeredSessions
- self.printProfile = parent.printProfile
- self.parent = parent
- self.logger = parent.logger
- self.logger('Password entry screen started', x2go.loglevel_INFO, )
- pane = self.GetContentsPane()
- pane.SetSizerType("form")
- pwScrn = self.passwordScrn(pane)
- self.Fit()
- if parent.parent.args.password and parent.parent.args.username and self.current_profile:
- self.onConnect()
- else:
- self.Show(True)
-
- def passwordScrn(self, pnl):
- wx.StaticText(pnl, -1, ' User'),
- self.username_ctl = wx.TextCtrl(pnl, -1)
- self.username_ctl.SetSizerProps(expand=True)
- if hasattr(self.current_profile,'username'):
- self.username_ctl.SetValue(self.current_profile.username)
- else:
- self.username_ctl.SetValue(self.parent.parent.args.username)
-
- wx.StaticText(pnl, -1, ' Password'),
- self.passwd_ctl = wx.TextCtrl(pnl, -1, style=wx.TE_PASSWORD)
-
- self.ConnectButton = wx.Button(pnl, -1, "Connect")
- self.ConnectButton.Bind(wx.EVT_BUTTON, self.OnOK)
- self.ConnectButton.SetDefault()
-
- self.CancelButton = wx.Button(pnl, -1, "Cancel")
- self.CancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)
-
- def OnOK(self, evt):
- username = self.username_ctl.GetValue()
- password = self.passwd_ctl.GetValue()
- if len(username) == 0:
- Message(self,1)
- return
- if len(password) == 0:
- Message(self,2)
- return
- self.onConnect(username, password)
-
- def onConnect(self, username, password):
- removeParms = ['defsndport', 'useiconv', 'iconvfrom', 'height', 'width', 'export', 'speed', 'quality', 'fullscreen','xdmcpserver', 'rdpoptions', 'print', 'sndport', 'usekbd','fstunnel', 'sound', 'rootless', 'icon', 'default', 'iconvto', 'dpi','rdpserver', 'soundtunnel', 'name','applications', 'setdpi', 'startsoundsystem']
- error = True
- profile_name = self.current_profile['name']
- profile_id = self.SessionProfiles.to_profile_id(profile_name)
- _params = self.SessionProfiles.get_profile_config(profile_name)
- if 'export' in _params:
- _params['share_local_folders'] = _params['export'].split(',')
- else:
- _params['share_local_folders'] = self.settingsProfile.get('General','sharefolders')
-
- _params['geometry'] = str(_params['width']) + 'x' + str(_params['height'])
- for fromparm, toparm in x2go.defaults.X2GO_INIPARMS_TO_SESSION_PARMS:
- if fromparm in _params:
- _params[toparm] = _params[fromparm]
- del _params[fromparm]
-
- for parm in removeParms:
- if parm in _params:
- del _params[parm]
-
- _params['printing'] = self.settingsProfile.get('General','printing')
- #try:
- session_uuid = self.registeredSessions.register(profile_id, profile_name, **_params)
- self.registeredSessions(session_uuid).connect(password=password)
- self.registeredSessions(session_uuid).start()
- error = False
- #except x2go.AuthenticationException:
- #Message(self,3)
- #except x2go.BadHostKeyException:
- #Message(self,message='SSH host key verification for remote host [%s]:%s failed' % (self.current_profile['host'], self.current_profile['sshport'] ))
- #except x2go.SSHException, e:
- #Message(self,message='Problem with ssh tunnel for host [%s]:%s failed' % (self.current_profile['host'], self.current_profile['sshport'] ))
- #except:
- #Message(self,message='Unknown problem with connection to host [%s]:%s' % (self.current_profile['host'], self.current_profile['sshport'] ))
- if error:
- self.Show(True)
- if self.IsIconized():
- self.Iconize(False)
- else:
- self.Show(False)
- if not self.IsIconized():
- self.Iconize(True)
- self.parent.callbackConnection(error)
- return
-
- def OnCancel(self, evt):
- self.Destroy()
-
-class X2GoListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
- def __init__(self, parent, ID, pos=wx.DefaultPosition,
- size=wx.DefaultSize, style=0):
- wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
- listmix.ListCtrlAutoWidthMixin.__init__(self)
- self.sm_up = parent.il.Add(images.getSmallUpArrowBitmap())
- self.sm_dn = parent.il.Add(images.getSmallDnArrowBitmap())
- listmix.ColumnSorterMixin.__init__(self, 2)
- self.SortListItems(0, True)
-
- # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
- def GetListCtrl(self):
- return self
-
- # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
- def GetSortImages(self):
- return (self.sm_dn, self.sm_up)
-
-
-class X2GoChooseSessionScrn(wx.Frame):
- def __init__(self, parent, Iconize=False):
- self.parent = parent
- self.logger = parent.logger
- self.settingsProfile = parent.settingsProfile
- self.SessionProfiles = parent.SessionProfiles
- self.current_profile = parent.current_profile
- self.registeredSessions = parent.registeredSessions
- self.selected_profile = None
- self.currentItem = None
- self.printProfile = parent.printProfile
- self.logger('Choose Session screen started iconize %s' % Iconize, x2go.loglevel_INFO, )
- if self.current_profile: self.logger('With current session %s' % self.current_profile['name'], x2go.loglevel_INFO, )
- wx.Frame.__init__(self, None, -1)
- self.CentreOnScreen()
- self.il = wx.ImageList(16, 16)
- self.list = X2GoListCtrl(self, -1,
- style=wx.LC_REPORT | wx.BORDER_NONE | wx.LC_SORT_ASCENDING
- )
- self.idx1 = self.il.Add(images.getnetwork_disconnected_lanBitmap())
- self.idx2 = self.il.Add(images.getnetwork_connected_lan_kncBitmap())
- self.idx3 = self.il.Add(images.getresumeBitmap())
-
- self.list.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
-
- self.PopulateList()
-
- self.Main_MenuBar = wx.MenuBar()
- self.SetMenuBar(self.Main_MenuBar)
- self.Main_MenuBar.Append(menuActions(self), '&Connection')
- self.tb = X2GoLogonTaskBarIcon(self)
-
- self.Bind(wx.EVT_SIZE, self.OnSize)
-
- self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
- self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list)
-
- self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
- self.list.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
-
- # for wxMSW
- self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
-
- # for wxGTK
- self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
-
- self.Bind(wx.EVT_CLOSE, self.OnCancel)
- if Iconize:
- if not self.IsIconized():
- self.Iconize(True)
- if parent.args.password and parent.args.username and self.current_profile:
- X2GoPasswordScrn(self)
- elif parent.args.profile:
- Message(self, 4)
- self.Iconize(False)
- else:
- self.Show(True)
-
- def OnSize(self, event):
- w,h = self.GetClientSizeTuple()
- self.list.SetDimensions(0, 0, w, h)
-
- def PopulateList(self):
- sessions = self.parent.SessionProfiles.profile_names
- info = wx.ListItem()
- info.m_mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT
- info.m_image = -1
- info.m_format = 0
- info.m_text = "Profile"
- self.list.InsertColumnInfo(0, info)
-
- info.m_format = wx.LIST_FORMAT_RIGHT
- info.m_text = ""
- self.list.InsertColumnInfo(1, info)
-
- info.m_format = wx.LIST_FORMAT_RIGHT
- info.m_text = "Status"
- self.list.InsertColumnInfo(2, info)
-
- info.m_format = wx.LIST_FORMAT_RIGHT
- info.m_text = "Sessie-Id"
- self.list.InsertColumnInfo(3, info)
-
- self.logger('sessions %s' % sessions, x2go.loglevel_INFO, )
- for profilename in sessions:
- registeredProfiles = self.registeredSessions.registered_sessions_of_name(profilename)
- if len(registeredProfiles):
- for idx, session in enumerate(registeredProfiles):
- if len(registeredProfiles) > 1:
- prName = profilename
- else:
- prName = profilename
- self.addRow(prName, idx, session, session.connected, session.is_running(), session.is_suspended(), sessions.session_ok())
- else:
- self.addRow(profilename)
- self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
-
- def addRow(self, profilename, idx='', sessionName=None, connected=False, running=False, suspended=False, alive=False):
- if connected and alive and running:
- imageNr = self.idx2
- statusText = 'Connected'
- elif suspended or (not connected and (alive or running)):
- imageNr = self.idx3
- statusText = 'Suspended'
- else:
- imageNr = self.idx1
- statusText = 'Not Connected'
- index = self.list.InsertImageStringItem(sys.maxint, profilename, imageNr)
- self.list.SetStringItem(index, 1, str(idx))
- self.list.SetStringItem(index, 2, statusText)
- if sessionName: self.list.SetStringItem(index, 3, sessionName)
-
- def OnRightDown(self, event):
- x = event.GetX()
- y = event.GetY()
- item, flags = self.list.HitTest((x, y))
-
- if flags & wx.LIST_HITTEST_ONITEM:
- self.list.Select(item)
- event.Skip()
-
- def OnItemSelected(self, event):
- ##print event.GetItem().GetTextColour()
- self.currentItem = event.m_itemIndex
- self.selected_profile = self.current_profile = self.parent.SessionProfiles.get_profile_config(self.list.GetItemText(self.currentItem))
-
- def OnItemActivated(self, event):
- self.currentItem = event.m_itemIndex
- self.selected_profile = self.current_profile = self.SessionProfiles.get_profile_config(self.list.GetItemText(self.currentItem))
-
- def OnDoubleClick(self, event):
- self.logger('DoubleClick', x2go.loglevel_INFO, )
- X2GoPasswordScrn(self)
- event.Skip()
-
- def OnRightClick(self, event):
- # only do this part the first time so the events are only bound once
-
- # Popup the menu. If an item is selected then its handler
- # will be called before PopupMenu returns.
- self.PopupMenu(menuActions(self, popupMenu=True))
-
- def OnCancel(self, evt):
- if not self.registeredSessions.has_running_session:
- #self.Close()
- self.tb.Destroy()
- self.Destroy()
-
- def callbackConnection(self, error):
- if self.currentItem:
- if error:
- self.list.SetItemImage(self.currentItem, self.idx1)
- else:
- self.list.SetItemImage(self.currentItem, self.idx2)
-
- def callbackupdList(self, action, profile):
- if action == 'Add':
- self.addRow(profile.name, False, False)
+ self._pyhoca_logger('Exit application', x2go.loglevel_INFO, )
+ self.taskbar.Destroy()
+ self.chooser.Destroy()
+
+ def OnControlSessionAuthenticate(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ profile_name = self._eventid_profilenames_map[evt.GetId()]
+ session_uuid = self.control_sessions[profile_name].get_uuid()
+ try:
+ # try SSH key auth first
+ self._X2goClient__connect_session(session_uuid)
+ except x2go.AuthenticationException:
+ logon.PyHocaGUI_DialogBoxPassword(self, caller=self, current_profile_name=profile_name)
+
+ def OnSessionStart(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ _username = self.control_sessions[self.current_profile_name].get_username()
+ _password = self.control_sessions[self.current_profile_name].get_password()
+ session_uuid = self._X2goClient__register_session(profile_name=self.current_profile_name)
+ if _password is None:
+ # use the SSH auth_pubkey mechanism
+ self._X2goClient__connect_session(session_uuid)
else:
- self.list.SetStringItem(self.currentItem, 0, profile['name'])
+ self._X2goClient__connect_session(session_uuid, username=_username, password=_password, force_password_auth=True)
+ gevent.spawn(self._X2goClient__start_session, session_uuid)
+
+ #pst = PyHocaGUI_SessionThread(self._X2goClient__start_session, session_uuid)
+ #pst.start()
+
+ def OnSessionResume(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ control_session = self._eventid_sessionnames_map[evt.GetId()]['control_session']
+ session_name = self._eventid_sessionnames_map[evt.GetId()]['session_name']
+ gevent.spawn(self._X2goClient__resume_session, control_session, session_name=session_name)
+ self._eventid_sessionnames_map = {}
+
+ def OnSessionSuspend(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ control_session = self._eventid_sessionnames_map[evt.GetId()]['control_session']
+ session_name = self._eventid_sessionnames_map[evt.GetId()]['session_name']
+ gevent.spawn(self._X2goClient__suspend_session, control_session, session_name=session_name)
+ self._eventid_sessionnames_map = {}
+ def OnSessionTerminate(self, evt):
+ """\
+ STILL UNDOCUMENTED
-class X2GoLogonTaskBarIcon(wx.TaskBarIcon):
+ """
+ control_session = self._eventid_sessionnames_map[evt.GetId()]['control_session']
+ session_name = self._eventid_sessionnames_map[evt.GetId()]['session_name']
+ gevent.spwan(self._X2goClient__terminate_session, control_session, session_name=session_name)
+ self._eventid_sessionnames_map = {}
- def __init__(self, parent=None):
- wx.TaskBarIcon.__init__(self)
- self.parent = parent
- self.parent.parent.logger('Start TaskBarIcon type %s' % (wx.PlatformInfo, ), x2go.loglevel_INFO, )
- icon = self.MakeIcon(images.getx2goclientImage())
- self.SetIcon(icon, "x2go connect")
- self.imgidx = 1
+ def OnCleanSessions(self, evt):
+ """\
+ STILL UNDOCUMENTED
- def CreatePopupMenu(self):
"""
- This method is called by the base class when it needs to popup
- the menu for the default EVT_RIGHT_DOWN event. Just create
- the menu how you want it and return it from this function,
- the base class takes care of the rest.
+ control_session = self.control_sessions[self.current_profile_name]
+ gevent.spawn(self._X2goClient__clean_sessions, control_session())
+
+ def OnSessionDisconnect(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
"""
- menu = menuActions(self, fromTaskBarIcon=True)
- return menu
+ session_uuid = self.control_sessions[self.current_profile_name]()
+ session_list = self._X2goClient__list_sessions(session_uuid)
+
+ # suspend all running server sessions
+ for session_name in self._X2goClient__server_running_sessions(session_uuid):
+ self._X2goClient__suspend_session(session_uuid, session_name=session_name)
+
+ # disconnect any non-control session that has been recently connected
+ for reg_session in self._X2goClient__client_connected_sessions(session_uuid):
+ reg_session.disconnect()
+
+ # disconnect control session
+ self._X2goClient__disconnect_session(session_uuid)
+
+# def OnProfileAdd(self, evt):
+# """\
+# STILL UNDOCUMENTED
+#
+# """
+# self._pyhoca_logger('Add Profile started', x2go.loglevel_INFO, )
+# profilemanager.PyHocaGUI_ProfileManager('Add', self._PyHocaGUI)
+#
+# def OnProfileEdit(self, evt):
+# """\
+# STILL UNDOCUMENTED
+#
+# """
+# self._pyhoca_logger('Update Profile started', x2go.loglevel_INFO, )
+# if self.selected_profile:
+# profilemanager.PyHocaGUI_ProfileManager('Upd', self.parent, self.SessionProfiles, self.parent.callbackupdList, self.selected_profile)
+#
+# def OnProfileDeleteEdit(self, evt):
+# """\
+# STILL UNDOCUMENTED
+#
+# """
+# self._pyhoca_logger('deleting session profile ...', x2go.loglevel_INFO, )
+#
+# def OnNewSession(self, evt):
+# """\
+# STILL UNDOCUMENTED
+#
+# """
+# if hasattr(self.parent,'selected_profile'):
+# PyHocaGUI_DialogBoxPassword(self.parent)
+# elif len(self.SessionProfiles.x2goprofs) > 1:
+# self._pyhoca_logger('self.parent.IsIconized() %s' % self.parent.IsIconized(), x2go.loglevel_INFO, )
+# if self.parent.IsIconized() or not self.parent.IsShown():
+# self.parent.Iconize(False)
+# if not self.parent.IsShown():
+# self.parent.Show(True)
+# self.parent.Raise()
+# self.parent.SetFocus()
+
+ def OnListSessions(self, evt):
+ """\
+ STILL UNDOCUMENTED
- def MakeIcon(self, img):
"""
- The various platforms have different requirements for the
- icon size...
+ self._pyhoca_logger('List Sessions started', x2go.loglevel_INFO, )
+
+ def OnClose(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
"""
- if "wxMSW" in wx.PlatformInfo:
- img = img.Scale(16, 16)
- elif "wxGTK" in wx.PlatformInfo:
- img = img.Scale(22, 22)
- # wxMac can be any size upto 128x128, so leave the source img alone....
- icon = wx.IconFromBitmap(img.ConvertToBitmap() )
- return icon
-
- def OnTaskBarEditSession(self, evt):
- if self.parent.IsIconized():
- self.parent.Iconize(False)
- if not self.parent.IsShown():
- self.parent.Show(True)
- self.parent.Raise()
-
-
- def OnTaskBarExitSessions(self, evt):
- if self.parent:
- wx.CallAfter(self.parent.Close)
-
-
- #def OnTaskBarResumeSession(self, evt):
- #names = [ "WXPdemo", "Mondrian", "Pencil", "Carrot" ]
- #name = names[self.imgidx]
-
- #eImg = getattr(images, name)
- #self.imgidx += 1
- #if self.imgidx >= len(names):
- #self.imgidx = 0
-
- #icon = self.MakeIcon(eImg.Image)
- #self.SetIcon(icon, "This is a new icon: " + name)
-
-
- #def OnTaskBarNewSession(self, evt):
- #self.RemoveIcon()
-
-def checkArgs(parent, args, SessionProfiles):
- if args.profile and not SessionProfiles.profileExists(args.profile):
- Message(parent, 5)
- exit(0)
-
-
-def startX2Go(parent):
- """
- This routine starts all processing
-
- If there is only one profile available, or if there is one (1) single
- profile that has the default switch, and the password has not been passed,
- the logon screen is shown immediately
-
- If there is only one profile available, or if there is one (1) single
- profile that has the default switch, and the password has been passed,
- the connection can be made immediately and the screens should not be shown,
- but if there is an error in the connection, the logon screen should be shown with an errormessage.
-
- if there are more than one profile available, and there is no default,
- the list of available profiles should be shown. After the user chooses
- a profile, the connection should be made to that specific profile, turning
- it into a session. After that all screens should be minimized.
-
- First all profile information is retrieved together with the settings and
- the printprofile.
-
- Then it is tested if there are more than one profile that can be selected
- """
- parent.logger('starting a new X2go GUI session', x2go.loglevel_INFO, )
-
- parent.printProfile = x2go.printing.X2goClientPrinting(logger=parent.liblogger)
- parent.settingsProfile = x2go.settings.X2goClientSettings(logger=parent.liblogger)
- if platform.system() == 'Windows':
- #parent.settingsProfile = SessionProfile.XServer(parent.liblogger)
- import X2goXserver
- X2goXserver.startXserver(parent)
-
- parent.SessionProfiles = x2go.profiles.X2goSessionProfiles(logger=parent.liblogger)
- parent.registeredSessions = x2go.registry.X2goSessionRegistry(logger=parent.liblogger)
-
- sessionsSuspended = parent.registeredSessions.suspended_sessions
- parent.current_profile = defaultProfile = parent.SessionProfiles.get_default_profile()
- if sessionsSuspended and len(sessionsSuspended) > 0:
- if parent.settingsProfile.autoresume:
- parent.logger('autoresume sessionsSuspended %s' % sessionsSuspended, x2go.loglevel_INFO, )
- ChoiceScrn = X2GoChooseSessionScrn(parent, Iconize=True)
- for suspended in sessionsSuspended:
- suspended.Resume(parent)
- else:
- parent.logger('Choose SuspendedSessions %s' % sessionsSuspended, x2go.loglevel_INFO, )
- X2GoResumeSessions(parent, sessionsSuspended)
- elif defaultProfile:
- ChoiceScrn = X2GoChooseSessionScrn(parent, Iconize=parent.args.minimized)
- elif len(parent.SessionProfiles.profile_names) > 0:
- parent.logger('Start Profile choice', x2go.loglevel_INFO, )
- choiceScrn = X2GoChooseSessionScrn(parent)
- else:
- parent.logger('Start Profile Definition', x2go.loglevel_INFO, )
- defScrn = X2GoSessionDefScrn(parent, directCall=True)
+ self.OnExit(evt)
+
+
diff --git a/pyhoca/wxgui/frontend.pyc b/pyhoca/wxgui/frontend.pyc
new file mode 100644
index 0000000..1e8bc9a
Binary files /dev/null and b/pyhoca/wxgui/frontend.pyc differ
diff --git a/pyhoca/wxgui/images.py b/pyhoca/wxgui/images.py
index 0590532..4510e0f 100644
--- a/pyhoca/wxgui/images.py
+++ b/pyhoca/wxgui/images.py
@@ -1,6 +1,26 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+# Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+#
+# PyHoca GUI 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
+
#----------------------------------------------------------------------
# This file was generated by /usr/bin/img2py
-#
+
from wx.lib.embeddedimage import PyEmbeddedImage
from wx import ImageFromStream, BitmapFromImage
from wx import EmptyIcon
diff --git a/pyhoca/wxgui/images.pyc b/pyhoca/wxgui/images.pyc
new file mode 100644
index 0000000..4306e52
Binary files /dev/null and b/pyhoca/wxgui/images.pyc differ
diff --git a/pyhoca/wxgui/logon.py b/pyhoca/wxgui/logon.py
new file mode 100644
index 0000000..20b5dd8
--- /dev/null
+++ b/pyhoca/wxgui/logon.py
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+# Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+#
+# PyHoca GUI 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+modules ={}
+
+try:
+ import wxversion
+ wxversion.select('2.8')
+except: pass
+
+# Python X2go
+import x2go
+
+import gevent
+import gevent.monkey
+gevent.monkey.patch_all()
+
+import wx
+import wx.lib.scrolledpanel as scrolled
+import wx.lib.mixins.listctrl as listmix
+
+import time
+import sys
+import platform
+import types
+import copy
+import threading
+
+# PyHoca-GUI modules
+import images
+from messages import Message
+
+try:
+ from agw import knobctrl as KC
+ knobctrlavailable = True
+except ImportError: # if it's not there locally, try the wxPython lib.
+ try:
+ import wx.lib.agw.knobctrl as KC
+ knobctrlavailable = True
+ except ImportError:
+ knobctrlavailable = False
+
+import wx.lib.sized_controls as sc
+
+
+class PyHocaGUI_LogonStatusBar(wx.StatusBar):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+
+ wx.StatusBar.__init__(self, self._PyHocaGUI, -1)
+ font = self.GetFont()
+ font.SetPointSize(7)
+ self.SetFont(font)
+ self.SetFieldsCount(2)
+ self.SetStatusWidths([-1,200])
+
+
+ self.timer = wx.PyTimer(self.Notify)
+ self.timer.Start(1000)
+ self.Notify()
+
+
+ def Notify(self):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self.SetStatusText(self._PyHocaGUI.Environment, 0)
+ self.SetStatusText(self._PyHocaGUI.parent.StatusText, 1)
+ t = time.localtime(time.time())
+
+
+class PyHocaGUI_DialogBoxPassword(sc.SizedFrame):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, current_profile_name, caller=None, ):
+ """\
+ Dialog box to enter the username and password for the selected
+ session profile.
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+ self._pyhoca_logger('password dialog box started', x2go.loglevel_INFO, )
+
+ self.current_profile_name = current_profile_name
+ self.current_profile_config = self._PyHocaGUI.session_profiles.get_profile_config(current_profile_name)
+
+ captionText = "Authentication X2go Session: " + current_profile_name
+ sc.SizedFrame.__init__(self, None, -1, captionText,
+ style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
+ self.CentreOnScreen()
+ self.SetSize((350,250))
+
+ pane = self.GetContentsPane()
+ pane.SetSizerType("form")
+ pwbox = self.enterPasswordForm(pane)
+ self.Fit()
+ self.Show()
+
+ def enterPasswordForm(self, pnl):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ wx.StaticText(pnl, -1, ' Username'),
+ self.username_ctl = wx.TextCtrl(pnl, -1)
+ self.username_ctl.SetSizerProps(expand=True)
+ if self.current_profile_config.has_key('user'):
+ self.username_ctl.SetValue(self.current_profile_config['user'])
+ else:
+ self.username_ctl.SetValue(self._PyHocaGUI.args.username)
+
+ wx.StaticText(pnl, -1, ' Password'),
+ self.passwd_ctl = wx.TextCtrl(pnl, -1, style=wx.TE_PASSWORD)
+
+ self.ConnectButton = wx.Button(pnl, -1, "Authenticate")
+ self.ConnectButton.Bind(wx.EVT_BUTTON, self.OnAuthenticate)
+ self.ConnectButton.SetDefault()
+
+ self.CancelButton = wx.Button(pnl, -1, "Cancel")
+ self.CancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)
+
+ def OnAuthenticate(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ username = self.username_ctl.GetValue()
+ password = self.passwd_ctl.GetValue()
+ if len(username) == 0:
+ Message(self,1)
+ return
+ if len(password) == 0:
+ Message(self,2)
+ return
+
+ if not self.IsIconized():
+ self.Iconize()
+
+ session_uuid = self._PyHocaGUI.control_sessions[self.current_profile_name].get_uuid()
+ self._PyHocaGUI._X2goClient__connect_session(session_uuid, username=username, password=password, force_password_auth=True)
+
+ self.Destroy()
+
+ def OnCancel(self, evt):
+ self.Destroy()
+
+
diff --git a/pyhoca/wxgui/logon.pyc b/pyhoca/wxgui/logon.pyc
new file mode 100644
index 0000000..5f0c973
Binary files /dev/null and b/pyhoca/wxgui/logon.pyc differ
diff --git a/pyhoca/wxgui/menus_chooser.py b/pyhoca/wxgui/menus_chooser.py
new file mode 100644
index 0000000..e1051e7
--- /dev/null
+++ b/pyhoca/wxgui/menus_chooser.py
@@ -0,0 +1,184 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+# Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+#
+# PyHoca GUI 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+try:
+ import wxversion
+ wxversion.select('2.8')
+except: pass
+
+import wx
+
+class PyHocaGUI_Menu_ChooserProfiles(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ profile_name = self._PyHocaGUI._chooser_selected_profile_name
+
+ ID_ADDPROFILE = wx.NewId()
+ ID_DELPROFILE = wx.NewId()
+ ID_RENPROFILE = wx.NewId()
+ ID_EDITPROFILE = wx.NewId()
+
+ self.Append(text="Add Profile", id=ID_ADDPROFILE)
+ self.AppendSeparator()
+ self.Append(text="Edit Profile", id=ID_EDITPROFILE)
+ self.Append(text="Delete Profile", id=ID_DELPROFILE)
+
+ #self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileAdd, id=ID_ADDPROFILE)
+ #self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileEdit, id=ID_EDITPROFILE)
+ #self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnProfileDelete, id=ID_DELPROFILE)
+
+
+class PyHocaGUI_Menu_ChooserExtras(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ ID_OPTIONS = wx.NewId()
+ ID_EXIT = wx.NewId()
+
+ self.Append(id=ID_OPTIONS, text="X2go Client Options")
+ #self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnOptions, id=ID_OPTIONS)
+ self.AppendSeparator()
+
+ self.Append(id=ID_EXIT, text="E&xit")
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnTaskbarExit, id=ID_EXIT)
+
+
+class PyHocaGUI_Menu_ChooserSessionActions(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ ID_RESUMESESSION = wx.NewId()
+ ID_SUSPENDSESSION = wx.NewId()
+ ID_TERMINATESESSION = wx.NewId()
+
+ # preparing information for the main PyHocaGUI instance
+ self._PyHocaGUI._eventid_sessionnames_map[ID_RESUMESESSION] = \
+ self._PyHocaGUI._eventid_sessionnames_map[ID_SUSPENDSESSION] = \
+ self._PyHocaGUI._eventid_sessionnames_map[ID_TERMINATESESSION] = {
+ 'session_name': session_name,
+ 'control_session': control_session,
+ }
+
+ if status == 'S':
+ self.Append(text="Resume Session", id=ID_RESUMESESSION)
+ elif status == 'R':
+ self.Append(text="Suspend Session", id=ID_SUSPENDSESSION)
+
+ self.Append(text="Terminate Session", id=ID_TERMINATESESSION)
+
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionResume, id=ID_RESUMESESSION)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionSuspend, id=ID_SUSPENDSESSION)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionTerminate, id=ID_TERMINATESESSION)
+
+
+class PyHocaGUI_Menu_ChooserSessions(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ profile_name = self._PyHocaGUI._chooser_selected_profile_name
+
+ wx.Menu.__init__(self)
+
+ ID_AUTHENTICATE = wx.NewId()
+ ID_SESSIONSTART=wx.NewId()
+ ID_CLEANSESSIONS = wx.NewId()
+ ID_DISCONNECT = wx.NewId()
+
+ self.Append(id=ID_AUTHENTICATE, text="Authenticate")
+ self.AppendSeparator()
+ self.Append(id=ID_SESSIONSTART, text="Start &new Session")
+
+ if self._PyHocaGUI._chooser_selected_profile_name:
+ _control_session = self._PyHocaGUI.control_sessions[self._PyHocaGUI._chooser_selected_profile_name].get_uuid()
+ _session_list = self._PyHocaGUI.list_sessions(_control_session)
+
+ if _session_list:
+
+ self.AppendSeparator()
+ for session_name in _session_list.keys():
+
+ _s_id = wx.NewId()
+
+ if _session_list[session_name].status == 'R':
+ state = 'Running'
+ elif _session_list[session_name].status == 'S':
+ state = 'Suspended'
+ self.AppendMenu(id=_s_id, text='%s: »%s«' % (state, session_name),
+ submenu=PyHocaGUI_Menu_TaskbarSessionActions(self._PyHocaGUI, caller=self,
+ control_session=_control_session,
+ session_name=session_name,
+ status=_session_list[session_name].status,
+ )
+ )
+
+ self.AppendSeparator()
+ self.Append(id=ID_CLEANSESSIONS, text="&Clean sessions")
+ self.AppendSeparator()
+ self.Append(id=ID_DISCONNECT, text="&Disconnect from Server")
+
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnControlSessionAuthenticate, id=ID_AUTHENTICATE)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionStart, id=ID_SESSIONSTART)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnCleanSessions, id=ID_CLEANSESSIONS)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionDisconnect, id=ID_DISCONNECT)
+
+
diff --git a/pyhoca/wxgui/menus_chooser.pyc b/pyhoca/wxgui/menus_chooser.pyc
new file mode 100644
index 0000000..f708bf1
Binary files /dev/null and b/pyhoca/wxgui/menus_chooser.pyc differ
diff --git a/pyhoca/wxgui/menus_taskbar.py b/pyhoca/wxgui/menus_taskbar.py
new file mode 100644
index 0000000..4aa89fb
--- /dev/null
+++ b/pyhoca/wxgui/menus_taskbar.py
@@ -0,0 +1,260 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+# Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+#
+# PyHoca GUI 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+try:
+ import wxversion
+ wxversion.select('2.8')
+except: pass
+
+import wx
+
+class PyHocaGUI_Menu_TaskbarManageProfile(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ #ID_ADDPROFILE = wx.NewId()
+ ID_DELPROFILE = wx.NewId()
+ ID_RENPROFILE = wx.NewId()
+ ID_EDITPROFILE = wx.NewId()
+
+ #self.Append(text="Add Profile", id=ID_ADDPROFILE)
+ self.Append(text="Edit Profile", id=ID_EDITPROFILE)
+ self.AppendSeparator()
+ self.Append(text="Delete Profile", id=ID_DELPROFILE)
+
+ #self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnAddProfile, id=ID_ADDPROFILE)
+ #self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnEditProfile, id=ID_EDITPROFILE)
+ #self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnDeleteProfile, id=ID_DELPROFILE)
+
+
+class PyHocaGUI_Menu_TaskbarOptionsManager(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ ID_NEWPROFILE = wx.NewId()
+ ID_PROFILEMANAGER = wx.NewId()
+ ID_OPTIONS = wx.NewId()
+ ID_EXIT = wx.NewId()
+
+ self.Append(id=ID_NEWPROFILE, text="Add new X2go Session Profile")
+ self.AppendMenu(id=ID_PROFILEMANAGER,
+ text="Maintain X2go Session Profiles",
+ submenu=PyHocaGUI_Menu_TaskbarProfileNames(self._PyHocaGUI,
+ caller=self,
+ submenu=PyHocaGUI_Menu_TaskbarManageProfile))
+
+ self.AppendSeparator()
+ self.Append(id=ID_OPTIONS, text="X2go Client Options")
+ #self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnOptions, id=ID_OPTIONS)
+
+ self.AppendSeparator()
+ self.Append(id=ID_EXIT, text="E&xit")
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnTaskbarExit, id=ID_EXIT)
+
+
+
+class PyHocaGUI_Menu_TaskbarSessionActions(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None, control_session=None, session_name=None, status=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ ID_RESUMESESSION = wx.NewId()
+ ID_SUSPENDSESSION = wx.NewId()
+ ID_TERMINATESESSION = wx.NewId()
+
+ # preparing information for the main PyHocaGUI instance
+ self._PyHocaGUI._eventid_sessionnames_map[ID_RESUMESESSION] = \
+ self._PyHocaGUI._eventid_sessionnames_map[ID_SUSPENDSESSION] = \
+ self._PyHocaGUI._eventid_sessionnames_map[ID_TERMINATESESSION] = {
+ 'session_name': session_name,
+ 'control_session': control_session,
+ }
+
+ if status == 'S':
+ self.Append(text="Resume Session", id=ID_RESUMESESSION)
+ elif status == 'R':
+ self.Append(text="Suspend Session", id=ID_SUSPENDSESSION)
+
+ self.Append(text="Terminate Session", id=ID_TERMINATESESSION)
+
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionResume, id=ID_RESUMESESSION)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionSuspend, id=ID_SUSPENDSESSION)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionTerminate, id=ID_TERMINATESESSION)
+
+
+class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None, profile_name=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ ID_CONNECT = wx.NewId()
+ ID_SESSIONSTART=wx.NewId()
+ ID_CLEANSESSIONS = wx.NewId()
+ ID_DISCONNECT = wx.NewId()
+
+ self.Append(id=ID_SESSIONSTART, text="Start &new Session")
+
+ _control_session = self._PyHocaGUI.control_sessions[profile_name].get_uuid()
+ _session_list = self._PyHocaGUI.list_sessions(_control_session)
+
+ if _session_list:
+
+ self.AppendSeparator()
+ for session_name in _session_list.keys():
+
+ _s_id = wx.NewId()
+
+ if _session_list[session_name].status == 'R':
+ state = 'Running'
+ elif _session_list[session_name].status == 'S':
+ state = 'Suspended'
+ self.AppendMenu(id=_s_id, text='%s: »%s«' % (state, session_name),
+ submenu=PyHocaGUI_Menu_TaskbarSessionActions(self._PyHocaGUI, caller=self,
+ control_session=_control_session,
+ session_name=session_name,
+ status=_session_list[session_name].status,
+ )
+ )
+
+ self.AppendSeparator()
+ self.Append(id=ID_CLEANSESSIONS, text="&Clean sessions")
+ self.AppendSeparator()
+ self.Append(id=ID_DISCONNECT, text="&Disconnect from Server")
+
+ self._PyHocaGUI.current_profile_name = profile_name
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionStart, id=ID_SESSIONSTART)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnCleanSessions, id=ID_CLEANSESSIONS)
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnSessionDisconnect, id=ID_DISCONNECT)
+
+
+class PyHocaGUI_Menu_TaskbarProfileNames(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None, filter_profiles=None, bind_method=None, submenu=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ _profile_names = self._PyHocaGUI.session_profiles.profile_names
+ _profile_names.sort()
+ if filter_profiles:
+ _profile_names = [ p for p in _profile_names if p not in filter_profiles ]
+ for profile_name in _profile_names:
+ _this_id = wx.NewId()
+ self._PyHocaGUI._eventid_profilenames_map[_this_id] = profile_name
+ if submenu is not None:
+ self.AppendMenu(text=profile_name, id=_this_id, submenu=submenu(self._PyHocaGUI, caller=self))
+ else:
+ self.Append(text=profile_name, id=_this_id)
+ if bind_method is not None:
+ self.Bind(wx.EVT_MENU, bind_method, id=_this_id)
+
+
+class PyHocaGUI_Menu_TaskbarSessionManager(wx.Menu):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI, caller=None):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+
+ wx.Menu.__init__(self)
+
+ ID_AUTHENTICATE = wx.NewId()
+ ID_EXIT = wx.NewId()
+
+ self.AppendMenu(id=ID_AUTHENTICATE,
+ text="Authenticate X2go Session",
+ submenu=PyHocaGUI_Menu_TaskbarProfileNames(self._PyHocaGUI,
+ caller=self,
+ filter_profiles=self._PyHocaGUI.client_connected_sessions(return_profile_names=True),
+ bind_method=self._PyHocaGUI.OnControlSessionAuthenticate))
+ self.AppendSeparator()
+
+ _connected_sessions = False
+ for profile_name in self._PyHocaGUI.session_profiles.profile_names:
+ if profile_name in self._PyHocaGUI._X2goClient__client_connected_sessions(return_profile_names=True):
+ _connected_sessions = True
+ _this_id = wx.NewId()
+ self.AppendMenu(text=profile_name,
+ id=_this_id,
+ submenu=PyHocaGUI_Menu_TaskbarSessionProfile(self._PyHocaGUI, caller=self, profile_name=profile_name))
+
+ if _connected_sessions:
+ self.AppendSeparator()
+
+ self.Append(id=ID_EXIT, text="E&xit")
+ self.Bind(wx.EVT_MENU, self._PyHocaGUI.OnTaskbarExit, id=ID_EXIT)
+
+
diff --git a/pyhoca/wxgui/menus_taskbar.pyc b/pyhoca/wxgui/menus_taskbar.pyc
new file mode 100644
index 0000000..986f669
Binary files /dev/null and b/pyhoca/wxgui/menus_taskbar.pyc differ
diff --git a/pyhoca/wxgui/messages.py b/pyhoca/wxgui/messages.py
index 21e0a0e..9673deb 100644
--- a/pyhoca/wxgui/messages.py
+++ b/pyhoca/wxgui/messages.py
@@ -1,28 +1,22 @@
-#!/usr/bin/env python
# -*- coding: utf-8 -*-
-"""
- Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
-
- 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 3 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.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- Contributors to the code of this programme:
- Jörg Sawatzki <joerg.sawatzki at web.de>
- Mike Gabriel <m.gabriel at das-netzwerkteam.de>
-"""
+# Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+# Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+#
+# PyHoca GUI 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
import wx
messages = { 1: 'Userid is invalid',
diff --git a/pyhoca/wxgui/messages.pyc b/pyhoca/wxgui/messages.pyc
new file mode 100644
index 0000000..b24e046
Binary files /dev/null and b/pyhoca/wxgui/messages.pyc differ
diff --git a/pyhoca/wxgui/profilemanager.py b/pyhoca/wxgui/profilemanager.py
index 320dfbb..607a19c 100644
--- a/pyhoca/wxgui/profilemanager.py
+++ b/pyhoca/wxgui/profilemanager.py
@@ -1,28 +1,22 @@
-#!/usr/bin/env python
# -*- coding: utf-8 -*-
-"""
- Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
-
- 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 3 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.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- Contributors to the code of this programme:
- Jörg Sawatzki <joerg.sawatzki at web.de>
- Mike Gabriel <m.gabriel at das-netzwerkteam.de>
-"""
+# Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+# Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+#
+# PyHoca GUI 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
import wx
import platform
diff --git a/pyhoca/wxgui/profilemanager.pyc b/pyhoca/wxgui/profilemanager.pyc
new file mode 100644
index 0000000..3328b85
Binary files /dev/null and b/pyhoca/wxgui/profilemanager.pyc differ
diff --git a/pyhoca/wxgui/taskbar.py b/pyhoca/wxgui/taskbar.py
new file mode 100644
index 0000000..b904855
--- /dev/null
+++ b/pyhoca/wxgui/taskbar.py
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2010 by Dick Kniep <dick.kniep at lindix.nl>
+# Copyright (C) 2010 by Mike Gabriel <m.gabriel at das-netzwerkteam.de>
+#
+# PyHoca GUI 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+modules ={}
+
+try:
+ import wxversion
+ wxversion.select('2.8')
+except: pass
+
+# Python X2go
+import x2go
+
+import gevent
+import gevent.monkey
+gevent.monkey.patch_all()
+
+import wx
+import wx.lib.scrolledpanel as scrolled
+import wx.lib.mixins.listctrl as listmix
+
+import time
+import sys
+import platform
+import types
+import copy
+import threading
+
+# PyHoca-GUI modules
+import menus_taskbar
+import profilemanager
+import images
+from messages import Message
+
+try:
+ from agw import knobctrl as KC
+ knobctrlavailable = True
+except ImportError: # if it's not there locally, try the wxPython lib.
+ try:
+ import wx.lib.agw.knobctrl as KC
+ knobctrlavailable = True
+ except ImportError:
+ knobctrlavailable = False
+
+import wx.lib.sized_controls as sc
+
+
+class PyHocaGUI_TaskBarIcon(wx.TaskBarIcon):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ def __init__(self, _PyHocaGUI):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ wx.TaskBarIcon.__init__(self)
+ self._PyHocaGUI = _PyHocaGUI
+ self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
+ self._pyhoca_logger('start TaskBarIcon of type: %s' % (wx.PlatformInfo, ), loglevel=x2go.loglevel_INFO)
+ icon = self.MakeIcon(images.getx2goclientImage())
+ self.SetIcon(icon, "PyHoca-GUI (Python X2go Client)")
+ self.imgidx = 1
+
+ def CreateSessionManagerPopupMenu(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self.PopupMenu(menus_taskbar.PyHocaGUI_Menu_TaskbarSessionManager(self._PyHocaGUI, caller=self))
+
+ def CreatePopupMenu(self):
+ """\
+ This method is called by the base class when it needs to popup
+ the menu for the default EVT_RIGHT_DOWN event. Just create
+ the menu how you want it and return it from this function,
+ the base class takes care of the rest.
+ """
+ return self.CreateProfileManagerPopupMenu()
+
+ def CreateProfileManagerPopupMenu(self):
+ return menus_taskbar.PyHocaGUI_Menu_TaskbarOptionsManager(self._PyHocaGUI, caller=self)
+
+ def MakeIcon(self, img):
+ """\
+ The various platforms have different requirements for the
+ icon size...
+ """
+ if "wxMSW" in wx.PlatformInfo:
+ img = img.Scale(16, 16)
+ elif "wxGTK" in wx.PlatformInfo:
+ img = img.Scale(22, 22)
+ # wxMac can be any size upto 128x128, so leave the source img alone....
+ icon = wx.IconFromBitmap(img.ConvertToBitmap() )
+ return icon
\ No newline at end of file
diff --git a/pyhoca/wxgui/taskbar.pyc b/pyhoca/wxgui/taskbar.pyc
new file mode 100644
index 0000000..364342c
Binary files /dev/null and b/pyhoca/wxgui/taskbar.pyc differ
hooks/post-receive
--
pyhoca-gui.git (Python X2Go Client (wxPython GUI))
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "pyhoca-gui.git" (Python X2Go Client (wxPython GUI)).
More information about the x2go-commits
mailing list