-# -*- 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)
-