Changeset 138

Show
Ignore:
Timestamp:
02/13/08 16:57:28 (1 year ago)
Author:
poillubo
Message:

* removed useless import in ClientUnderPointer?
* corrected 2 focus bugs:

  • ClickToFocus? -> upper didn't work...
  • ClickToSLoppyFocus -> hook removing failed

* new Client.take_screenshot method; fixes #11
* PIL can convert from BGRX to RGB! no more manual conversion in Client.get_mini_icon
* new plugin to take a client screenshot: ScreenshotUnderPointer?

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/conf/config-example.py

    r137 r138  
    2828from pycawm import ClientUnderPointer 
    2929from pycawm import MoveUnderPointer 
     30from pycawm import ScreenshotUnderPointer 
    3031from pycawm import PycaWM 
    3132from pycawm.button import (CloseButton, MiniIconButton, ShadeButton, 
     
    143144                           ('Move Window', Menu.python, 
    144145                            lambda: MoveUnderPointer(self)), 
     146                           ('Take Window Screenshot', Menu.python, 
     147                            lambda: ScreenshotUnderPointer(self)), 
    145148                           ('Close Window', Menu.python, 
    146149                            lambda: ClientUnderPointer(self, Client.close)), 
  • trunk/pycawm/__init__.py

    r134 r138  
    2323from clientunderpointer import ClientUnderPointer 
    2424from moveunderpointer import MoveUnderPointer 
     25from screenshotunderpointer import ScreenshotUnderPointer 
    2526from pycawm import PycaWM 
  • trunk/pycawm/client.py

    r137 r138  
    2626 
    2727from Xlib import X, Xutil, protocol, error 
    28 from Xlib.error import BadDrawable, BadWindow, BadMatch 
     28from Xlib.error import BadDrawable, BadWindow, BadMatch, XError 
    2929from Xlib.X import ZPixmap 
    3030from Xlib.ext import shape 
     
    3535from patterns import Null, DictWrapper 
    3636 
     37 
     38AllPlanes = 4294967295L # from /usr/X11R6/include/Xlib.h 
    3739 
    3840class PseudoParent(object): 
     
    993995            height = value[1] 
    994996            data = value[2:width*height+2].tostring() 
    995             data_rgb = '' 
    996             for i in xrange(0, len(data), 4): 
    997                 data_rgb += data[i + 2] + data[i + 1] + data[i] 
    998997            image = Image.fromstring('RGB', (width, height), 
    999                                      data_rgb).resize(size, Image.ANTIALIAS
    1000             return image 
     998                                     data, 'raw', 'BGRX'
     999            return image.resize(size, Image.ANTIALIAS) 
    10011000        elif (self.wm_hints is not None and 
    10021001              self.wm_hints.flags & Xutil.IconPixmapHint): 
     
    10071006            data = self.wm_hints.icon_pixmap.get_image(0, 0, 
    10081007                                                       geo.width, geo.height, 
    1009                                                        ZPixmap, 4294967295).data 
     1008                                                       ZPixmap, AllPlanes).data 
    10101009            if len(data) != geo.width * geo.height * 4: 
    10111010                return None 
    1012             data_rgb = '' 
    1013             for i in xrange(0, len(data), 4): 
    1014                 data_rgb += data[i + 2] + data[i + 1] + data[i] 
    10151011            image = Image.fromstring('RGB', (geo.width, geo.height), 
    1016                                      data_rgb).resize(size, Image.ANTIALIAS
    1017             return image 
     1012                                     data, 'raw', 'BGRX'
     1013            return image.resize(size, Image.ANTIALIAS) 
    10181014        return None 
     1015 
     1016    def take_screenshot(self): 
     1017        geo = self.window.get_geometry() 
     1018        try: 
     1019            data = self.window.get_image(0, 0, geo.width, geo.height, 
     1020                                         ZPixmap, AllPlanes).data 
     1021        except XError: 
     1022            return None 
     1023        if len(data) != geo.width * geo.height * 4: 
     1024            return None 
     1025        screenshot = Image.fromstring('RGB', (geo.width, geo.height), 
     1026                                      data, 'raw', 'BGRX') 
     1027        return screenshot 
  • trunk/pycawm/clientunderpointer.py

    r134 r138  
    2222if sys.version_info < (2, 5): 
    2323    raise ImportError('clientunderpointer module needs at least Python 2.5!') 
    24  
    25 import time 
    2624 
    2725from Xlib import X 
  • trunk/pycawm/focuses.py

    r134 r138  
    4444class ClickToFocus(Focus): 
    4545    def init_focus(self, wm): 
    46         add_post_hook(Client.take_focus, Client.upper) 
     46        add_post_hook(Client.take_focus, self.client_upper) 
    4747        add_pre_hook(wm.button_press_reply, self.pre_button_press_reply) 
    4848        self.init_focus_aux(wm) 
     
    5757        for client in wm.clients: 
    5858            client.grab_button() 
     59 
     60    @staticmethod 
     61    def client_upper(client, *args, **kwargs): 
     62        client.upper() 
    5963 
    6064    @staticmethod 
     
    8185    def destroy_focus_aux(self, wm): 
    8286        # this method will be reused in ClickToSloppyFocus 
    83         remove_pre_hook(wm.button_press_reply, self.pre_button_press_reply) 
    8487        remove_post_hook(Client.__init__, self.client_grab_button) 
    8588        # a bit harsh, but it works... 
     
    8891 
    8992    def destroy_focus(self, wm): 
    90         remove_post_hook(Client.take_focus, Client.upper) 
     93        remove_post_hook(Client.take_focus, self.client_upper) 
     94        remove_pre_hook(wm.button_press_reply, self.pre_button_press_reply) 
    9195        self.destroy_focus_aux(wm) 
    9296