pcremote-client-n8x0 -> client sources
[remotepc] / pcremote-server-desktop-60 / debian / pcremote-server / usr / share / pcremote-server / services / ServerHandlers.py
diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.py
new file mode 100755 (executable)
index 0000000..4b16012
--- /dev/null
@@ -0,0 +1,201 @@
+# -*- coding: utf-8 -*-
+
+# ****************************************************************************
+# Copyright (c) 2008 INdT/Fucapi.
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public License
+#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# ============================================================================
+# Project Name : PC Remote
+# Author       : Nilson Silva
+# Email        : fergus.mao@gmail.com
+# Reviewer     : Jônatas Isvi
+# Email        : jonatas.nona@gmail.com
+# Version      : 1.0
+# Package      : service
+# Description  : Singleton, Mouse and Keyboard
+# ============================================================================
+
+import Xlib
+from Xlib import display, X, XK
+
+class Singleton_Xlib():
+
+    """ Singleton
+    defines a singleton. 
+    """
+    def __init__(self):
+       self.display = display.Display()
+       self.screen = self.display.screen()
+
+xlib_srv = Singleton_Xlib()
+
+class Mouse(object):
+
+    """ Mouse
+    pass mouse information to Xorg
+    """
+
+    #Initialize the class
+    def __init__(self):
+        self.disp = xlib_srv.display
+        self.screen = xlib_srv.screen
+        self.fator = 10
+        self.lbutton = False
+        self.mbutton = False
+        self.rbutton = False
+       self.buttons = []
+
+    #Set the mouse pointer position
+    def position(self,x=None,y=None):            
+        
+        if (x == None):
+            x = self.fator
+            
+        if (y == None):
+            y = self.fator
+
+        #Get the current mouse pointer position
+        current_x = self.screen.root.query_pointer()._data["root_x"]
+        current_y = self.screen.root.query_pointer()._data["root_y"]
+        
+        def absolute(ax = None, ay = None):
+            if (ax == None):
+                ax = x
+            if (ay == None):
+                ay = y
+
+            self.screen.root.warp_pointer(ax, ay)
+            self.disp.sync()
+
+        def relative():
+            rX = current_x + x
+            rY = current_y + y
+            absolute(rX,rY)
+
+        relative()
+
+    #Returns the current X position
+    def get_x(self):
+        return self.screen.root.query_pointer()._data["root_x"]
+
+    #Returns the current Y position
+    def get_y(self):
+        return self.screen.root.query_pointer()._data["root_y"]
+
+    #Defines the factor(px) of the mouse pointer move
+    def set_fator(self,fator):
+        self.fator = fator
+
+    #Returns the factor
+    def get_fator(self):
+        return self.fator
+        
+    #Mouse Left Click 
+    def left_click(self, fg_lbutton = None):
+
+        if (fg_lbutton != None):
+            self.lbutton = not fg_lbutton
+
+        if not self.lbutton:
+            self.disp.xtest_fake_input(X.ButtonPress, 1, 0)
+           self.buttons.append('left_button')
+            self.lbutton = True
+        else:
+            self.disp.xtest_fake_input(X.ButtonRelease, 1, 5)
+           self.buttons.remove('left_button')
+            self.lbutton = False
+
+        self.disp.flush()
+        
+    #Mouse Middle Click 
+    def middle_click(self):
+        if not self.mbutton:    
+            self.disp.xtest_fake_input(X.ButtonPress, 2, 0)
+           self.buttons.append('middle_button')
+            self.mbutton = True
+        else:
+            self.disp.xtest_fake_input(X.ButtonRelease, 2, 5)
+           self.buttons.remove('middle_button')
+            self.mbutton = False
+
+        self.disp.flush()
+
+    #Mouse Right Click 
+    def right_click(self, fg_rbutton = None):
+
+        if (fg_rbutton != None):
+            self.rbutton = not fg_rbutton
+
+        if not self.rbutton:
+            self.disp.xtest_fake_input(X.ButtonPress, 3, 0)
+           self.buttons.append('right_button')
+            self.rbutton = True
+        else:
+            self.disp.xtest_fake_input(X.ButtonRelease, 3, 5)
+           self.buttons.remove('right_button')
+            self.rbutton = False
+
+        self.disp.flush()
+
+    def clean_up(self):
+        if self.buttons:
+            while self.buttons:
+               button = self.buttons.pop()
+              if button == 'left_button':
+                  self.disp.xtest_fake_input(X.ButtonRelease, 1, 5)
+                  self.disp.xtest_fake_input(X.ButtonPress, 3, 5)
+                  self.disp.xtest_fake_input(X.ButtonRelease, 3, 5)
+              elif button == 'middle_button':
+                  self.disp.xtest_fake_input(X.ButtonRelease, 2, 5)
+              elif button == 'right_button':
+                  self.disp.xtest_fake_input(X.ButtonRelease, 3, 5)
+
+       print self.buttons
+
+class Keyboard():
+
+    """ Keyboard
+    pass keyboard information to Xorg 
+    """
+
+    def __init__(self):
+       self.display = xlib_srv.display
+       self.screen = xlib_srv.screen
+        self.keys = []
+
+    # encode key 
+    def __key_to_code(self,key):
+       new_key = getattr(XK, "XK_" + key)
+       code = self.display.keysym_to_keycode(new_key)
+       return code
+
+    # reproduce key pressed
+    def reproduce_key_press(self, key):
+       Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key))
+       self.display.sync()
+        self.keys.append(key)
+
+    # reproduce key release
+    def reproduce_key_release(self, key):
+       Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key))
+       self.display.sync()
+        self.keys.remove(key)
+
+    # clean all pressed keys
+    def clean_up(self):
+        if self.keys:
+            while self.keys:
+                key = self.keys.pop()
+                self.reproduce_key_release(key)
+