You are not logged in.

#176 2010-11-01 22:49:12

ngoonee
Forum Fellow
From: Between Thailand and Singapore
Registered: 2009-03-17
Posts: 7,354

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Oh, and something else I realized, none of my wine apps are touched at all. Are they filtered out, or is it something to do with how they represent themselves to the WM?


Allan-Volunteer on the (topic being discussed) mailn lists. You never get the people who matters attention on the forums.
jasonwryan-Installing Arch is a measure of your literacy. Maintaining Arch is a measure of your diligence. Contributing to Arch is a measure of your competence.
Griemak-Bleeding edge, not bleeding flat. Edge denotes falls will occur from time to time. Bring your own parachute.

Offline

#177 2010-11-09 18:35:43

BurntSushi
Member
From: Massachusetts
Registered: 2009-06-28
Posts: 362
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Sorry I haven't been responding ngoonee, grad school is kicking my ass :-)

Anyway, I don't currently have time to setup a Wine environment, but yes, I suspect you are correct--there is probably something special in the way they represent themselves to the WM.

With that said, and with regards to your invisible window problem, your two best shots at helping me debug your problems quickly are wmctrl and xprop.

Xprop is probably already installed on your system. Simply open a terminal, run xprop, and your cursor ought to become a crosshair. Click on a window (i.e., a Wine window) and copy and paste the output back here.

wmctrl is a way to view window information. For example, the command

wmctrl -lG

Will list all windows opened and their geometries. What I'd like you to do, with regards to your invisible window problem, is give me two things:

1. What windows you see open when the invisible window happens (try to make your environment as simple as possible).
2. The output of wmctrl -lG

Finally, I should add, this approach is a long shot, but maybe I'll see something and know how to fix it quickly. I just don't have to time to be fiddling with different environments at the moment (which includes Wine and Compiz).


Education is favorable to liberty. Freedom can exist only in a society of knowledge. Without learning, men are incapable of knowing their rights, and where learning is confined to a few people, liberty can be neither equal nor universal.

Tu ne cede malis sed contra audentior ito

Offline

#178 2010-11-10 03:15:43

ngoonee
Forum Fellow
From: Between Thailand and Singapore
Registered: 2009-03-17
Posts: 7,354

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Okay, so here it is. With regards to the wine apps, I took xprop from one app (utorrent) which works, and one app (e-sword) which doesn't.

This is for the working wine app

_NET_WM_ICON_GEOMETRY(CARDINAL) = 897, 944, 42, 84
_COMPIZ_WINDOW_DECOR(INTEGER) = 20080529, 60853213, 2, 2, 22, 2, 0, 0, 22, 0, 84, 0, 589925, -9, -29, -64, 0, 452, 32767, 0, 0, 524389, 443, -29, -64, 0, 32767, 32767, 452, 0, 590182, -64, -29, 11, 0, 75, 32767, 528, 0, 395413, -9, 0, 0, -489, 32767, 490, 1, 31, 264341, -9, 490, 0, -489, 32767, 32767, 491, 31, 395929, -9, -489, 0, 0, 32767, 489, 981, 31, 395430, 0, 0, 11, -489, 32767, 490, 1, 42, 264358, 0, 490, 11, -489, 32767, 32767, 491, 42, 395946, 0, -489, 11, 0, 32767, 489, 981, 42, 589993, -9, 0, -253, 11, 263, 32767, 0, 55, 524457, 254, 0, -253, 11, 32767, 32767, 263, 55, 590250, -253, 0, 11, 11, 264, 32767, 528, 55
XKLAVIER_STATE(INTEGER) = 0, 0
WM_STATE(WM_STATE):
        window state: Normal
        icon window: 0x0
_NET_WM_DESKTOP(CARDINAL) = 0
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 22, 2
_NET_FRAME_WINDOW(WINDOW): window id # 0xe0274a
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_MOVE, _NET_WM_ACTION_RESIZE, _NET_WM_ACTION_STICK, _NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_MAXIMIZE_VERT, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_CLOSE, _NET_WM_ACTION_SHADE, _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_ABOVE, _NET_WM_ACTION_BELOW
_NET_WM_STATE(ATOM) = 
_NET_WM_NAME(UTF8_STRING) = 0xc2, 0xb5, 0x54, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x32, 0x2e, 0x30, 0x2e, 0x32
WM_ICON_NAME(STRING) = "µTorrent 2.0.2"
WM_NAME(STRING) = "µTorrent 2.0.2"
WM_HINTS(WM_HINTS):
        Client accepts input or input focus: False
        Initial state is Normal State.
        bitmap id # to use for icon: 0x4600d30
        bitmap id # of mask for icon: 0x4600d36
        window id # of group leader: 0x5400001
_MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x3, 0x3e, 0x7e, 0xfffffff0, 0x7aebdc
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
WM_NORMAL_HINTS(WM_SIZE_HINTS):
        program specified location: 770, 42
        window gravity: Static
_NET_WM_ICON(CARDINAL) =     Icon (32 x 32):
      
                                  
                                  
        
        
        
        
        
                
                
                
                
                
                
                
                 
                      
                      
                    
            
            
            
            
            
        
        
        
        
                                
                                  
                                  
      


_NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0x4600d2c
XdndAware(ATOM) = ATOM
_NET_WM_PID(CARDINAL) = 802
WM_LOCALE_NAME(STRING) = "en_US.utf8"
WM_CLIENT_MACHINE(STRING) = "ngoonee-laptop"
WM_CLASS(STRING) = "uTorrent.exe", "Wine"
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, _NET_WM_PING, WM_TAKE_FOCUS

This is for the not-working wine app

_NET_WM_ICON_GEOMETRY(CARDINAL) = 897, 944, 42, 84
_COMPIZ_WINDOW_DECOR(INTEGER) = 20080529, 60853971, 2, 2, 22, 2, 0, 0, 22, 0, 86, 0, 589925, -7, -29, -66, 0, 1220, 32767, 0, 0, 524389, 1213, -29, -66, 0, 32767, 32767, 1220, 0, 590182, -66, -29, 9, 0, 75, 32767, 1296, 0, 592021, -7, 0, 0, -5, 32767, 5, 0, 29, 67733, -7, 5, 0, -5, 32767, 32767, 0, 34, 592537, -7, -5, 0, 0, 32767, 5, 0, 40, 592038, 0, 0, 9, -5, 32767, 5, 1287, 29, 67750, 0, 5, 9, -5, 32767, 32767, 1287, 34, 592554, 0, -5, 9, 0, 32767, 5, 1287, 40, 589993, -7, 0, -639, 9, 647, 32767, 0, 40, 524457, 640, 0, -639, 9, 32767, 32767, 647, 40, 590250, -639, 0, 9, 9, 648, 32767, 1296, 40
XKLAVIER_STATE(INTEGER) = 0, 0
WM_STATE(WM_STATE):
        window state: Normal
        icon window: 0x0
_NET_WM_DESKTOP(CARDINAL) = 0
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 22, 0
_NET_FRAME_WINDOW(WINDOW): window id # 0xe0279c
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_MOVE, _NET_WM_ACTION_RESIZE, _NET_WM_ACTION_STICK, _NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_MAXIMIZE_VERT, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_CLOSE, _NET_WM_ACTION_SHADE, _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_ABOVE, _NET_WM_ACTION_BELOW
_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_MAXIMIZED_HORZ
_NET_WM_NAME(UTF8_STRING) = 0x65, 0x2d, 0x53, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x4f, 0x52, 0x44, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x65, 0x64, 0x67, 0x65
WM_ICON_NAME(STRING) = "e-Sword - the Sword of the LORD with an electronic edge"
WM_NAME(STRING) = "e-Sword - the Sword of the LORD with an electronic edge"
WM_HINTS(WM_HINTS):
        Client accepts input or input focus: False
        Initial state is Normal State.
        bitmap id # to use for icon: 0x5e019ae
        bitmap id # of mask for icon: 0x5e019b4
        window id # of group leader: 0x6000001
_MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x3, 0x3e, 0x7e, 0x7e8b4860, 0x33e704
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
WM_NORMAL_HINTS(WM_SIZE_HINTS):
        window gravity: Static
WM_TRANSIENT_FOR(WINDOW): window id # 0x6000001
_NET_WM_ICON(CARDINAL) =     Icon (16 x 16):
                    
               
               
               
           
      
       
        
        
          
            
              
               
                
                    
                    

    Icon (32 x 32):
                                    
                                    
                          
                          
                          
                          
                          
                          
                  
                  
        
        
          
          
            
            
            
            
                
                
                    
                    
                        
                        
                          
                          
                            
                            
                                    
                                    
                                    
                                    


_NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0x5e0003b
XdndAware(ATOM) = ATOM
_NET_WM_PID(CARDINAL) = 1699
WM_LOCALE_NAME(STRING) = "en_US.utf8"
WM_CLIENT_MACHINE(STRING) = "ngoonee-laptop"
WM_CLASS(STRING) = "e-Sword.exe", "Wine"
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, _NET_WM_PING, WM_TAKE_FOCUS

Now, for the other bug, here's wmctrl -lG when I have the bug. What I see is simply my single terminal window in the master position and an empty space (only showing the desktop and my conky windows) where a single slave window would normally be.

0x01200003 -1 0    0    1280 20   ngoonee-laptop Top Expanded Edge Panel
0x01400020  0 1536 40   1280 800  ngoonee-laptop x-nautilus-desktop
0x04c00006  0 4    84   763  746  ngoonee-laptop ngoonee@ngoonee-laptop: wmctrl -lG > wmctrlbug 

Here's when i don't have the bug (either by switching back and forth from compiz to metacity to compiz or by doing 'killall nautilus').

0x01200003 -1 0    0    1280 20   ngoonee-laptop Top Expanded Edge Panel
0x04200006  0 4    84   1275 746  ngoonee-laptop ngoonee@ngoonee-laptop: wmctrl -lG > wmctrlnobug 
0x01400020 -1 0    0    1280 800  ngoonee-laptop x-nautilus-desktop

As you can see from my 'killall nautilus', I think its caused by nautilus in some way. I don't have any other DE to test with though... perhaps if I find time I'll try openbox.

Oh, and if I use metacity instead of compiz from the start I still get the same problem (invisible window).

EDIT: I realize I took an xprop of the empty area (invisible window), being careful to avoid my conkys. Here it is:-

_NET_WM_USER_TIME(CARDINAL) = 13056325
XKLAVIER_STATE(INTEGER) = 0, 0
WM_STATE(WM_STATE):
        window state: Normal
        icon window: 0x0
_NET_WM_DESKTOP(CARDINAL) = 0
_NET_WM_STATE(ATOM) = 
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_ABOVE, _NET_WM_ACTION_BELOW
WM_HINTS(WM_HINTS):
        Client accepts input or input focus: True
        Initial state is Normal State.
        bitmap id # to use for icon: 0x14000ba
        bitmap id # of mask for icon: 0x14000bb
        window id # of group leader: 0x1400001
XdndAware(ATOM) = BITMAP
_MOTIF_DRAG_RECEIVER_INFO(_MOTIF_DRAG_RECEIVER_INFO) = 0x6c, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0
_NET_WM_ICON(CARDINAL) =     Icon (22 x 22):
                          
                          
       ▒▒▒▒▒▒▒            
      ▒░░░░░░░▒           
      ▒░░░░░░░░▒▒▒▒▒▒▒▒   
      ▒░░░░░░░░░░░░░░░░▒  
      ▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ 
      ▒▒▒▒▒▒▒░          ▒ 
      ▒▒▒▒▒▒░ ░░░░░░░░░ ▒ 
     ▒░      ░░░░░░░░░░ ▒ 
     ▒░░░░░░░░░░░░░▒░░░ ▒ 
     ▒ ░░░░ ░░▒░░░ ░░░░ ▒ 
     ▒ ░░░  ░░ ░░░  ░░░ ▒ 
     ▒       ░  ░       ▒ 
     ▒       ░  ▒       ▒ 
     ▒    ░░ ░▒▒░ ░░    ▒ 
     ▒    ░░      ░▒    ▒ 
     ▒░                ░▒ 
     ░▒░░░░░░░░░░░░░░░░▒░ 
      ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░  
                          
                          

    Icon (16 x 16):
                    
     ▒▒▒▒▒▒         
    ▒░░░░░░▒        
    ▒░░░░░▒▒▒▒▒▒▒▒▒░
    ▒░░░░▒         ▒
    ▒▒▒▒▒░ ░░░░░░░ ▒
    ▒     ░░░░░░░░ ▒
    ▒ ░░░░░░░░░░▒░ ▒
    ▒ ░░ ░░▒░░░ ░░ ▒
    ▒     ░ ░░     ▒
    ▒     ░  ░     ▒
    ▒     ░  ▒     ▒
    ▒  ░░ ░▒▒░ ░░  ▒
    ▒░░░░░    ░░▒░░▒
    ▒▒░░░░░░░░░░░░▒▒
     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 

    Icon (24 x 24):
                            
                            
                            
        ▒▒▒▒▒▒▒             
       ▒░░░░░░░▒            
       ▒░░░░░░░░▒▒▒▒▒▒▒▒    
       ▒░░░░░░░░░░░░░░░░▒   
       ▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░  
       ▒▒▒▒▒▒▒░          ▒  
       ▒▒▒▒▒▒░ ░░░░░░░░░ ▒  
      ▒░      ░░░░░░░░░░ ▒  
      ▒░░░░░░░░░░░░░▒░░░ ▒  
      ▒ ░░░░ ░░▒░░░ ░░░░ ▒  
      ▒ ░░░  ░░ ░░░  ░░░ ▒  
      ▒       ░  ░       ▒  
      ▒       ░  ▒       ▒  
      ▒    ░░ ░▒▒░ ░░    ▒  
      ▒    ░░      ░▒    ▒  
      ▒░                ░▒  
      ░▒░░░░░░░░░░░░░░░░▒░  
       ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░   
                            
                            
                            

    Icon (32 x 32):
                                    
                                    
                                    
                                    
      ░▒▒▒▒▒▒▒▒▒▒░                  
      ▒░░░░░░░░░░░▒                 
      ▒░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒░  
      ▒░░░░░░░░░░░░░░░░░░░░░░░░░░▒  
      ▒░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▒  
      ▒░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ 
      ▒▒▒▒▒▒▒▒▒░                  ▒ 
     ░▒▒▒▒▒▒▒▒░ ░░░░░░░░░░░░░░░░░ ▒ 
     ▒         ░░░░░░░░░░░░░░░░░░ ▒ 
     ▒ ░░░░░░░░░░░░░░░░░░░░░░░░░░ ▒ 
     ▒ ░░░░░░░░░░░░░░░░░░░░░░░░░░ ▒ 
     ▒ ░░░░░░░░░░░░░░░░░░░░░░░░░░ ▒ 
     ▒ ░░░░░░░░ ░░░░░░░░ ░░░░░░░░ ▒ 
     ▒       ░   ░░░░     ░       ▒ 
     ▒           ░  ░░            ▒ 
     ▒           ░   ░            ▒ 
     ▒           ░   ░            ▒ 
     ▒           ░   ░            ▒ 
     ▒       ░   ░   ░    ░       ▒ 
     ▒       ░░  ░░░░░   ░░       ▒ 
     ▒       ░░░        ░░░       ▒ 
     ▒                           ░▒ 
     ▒░░░                      ░░░▒ 
     ▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░▒░ 
     ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ 
                                    
                                    
                                    


_NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 20971554
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0x1400021
WM_CLIENT_LEADER(WINDOW): window id # 0x1400001
_NET_WM_PID(CARDINAL) = 4546
WM_LOCALE_NAME(STRING) = "en_US.utf8"
WM_CLIENT_MACHINE(STRING) = "ngoonee-laptop"
WM_NORMAL_HINTS(WM_SIZE_HINTS):
        program specified minimum size: 1280 by 800
        program specified maximum size: 1280 by 800
        window gravity: NorthWest
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST
WM_CLASS(STRING) = "desktop_window", "Nautilus"
WM_ICON_NAME(STRING) = "x-nautilus-desktop"
_NET_WM_ICON_NAME(UTF8_STRING) = 0x78, 0x2d, 0x6e, 0x61, 0x75, 0x74, 0x69, 0x6c, 0x75, 0x73, 0x2d, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70
WM_NAME(STRING) = "x-nautilus-desktop"
_NET_WM_NAME(UTF8_STRING) = 0x78, 0x2d, 0x6e, 0x61, 0x75, 0x74, 0x69, 0x6c, 0x75, 0x73, 0x2d, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70

Last edited by ngoonee (2010-11-10 23:30:08)


Allan-Volunteer on the (topic being discussed) mailn lists. You never get the people who matters attention on the forums.
jasonwryan-Installing Arch is a measure of your literacy. Maintaining Arch is a measure of your diligence. Contributing to Arch is a measure of your competence.
Griemak-Bleeding edge, not bleeding flat. Edge denotes falls will occur from time to time. Bring your own parachute.

Offline

#179 2010-11-16 05:50:14

ngoonee
Forum Fellow
From: Between Thailand and Singapore
Registered: 2009-03-17
Posts: 7,354

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Sorry for the noise, but I realize at least one app of mine (Matlab) seems to be offset horizontally in compiz (the bottom of the window decoration takes the place which the top is normally supposed to, so the whole window is offset upwards by the width of the window decoration).

I've tried in openbox, the same does not occur. The previous problems I reported do, however.

This is the xprop for matlab when the condition occurs.

_NET_WM_ICON_GEOMETRY(CARDINAL) = 836, 0, 192, 20
_COMPIZ_WINDOW_DECOR(INTEGER) = 20080529, 88084812, 2, 2, 22, 2, 0, 0, 22, 0, 84, 0, 589925, -9, -29, -64, 0, 708, 32767, 0, 0, 524389, 699, -29, -64, 0, 32767, 32767, 708, 0, 590182, -64, -29, 11, 0, 75, 32767, 784, 0, 395413, -9, 0, 0, -499, 32767, 500, 1, 31, 264341, -9, 500, 0, -499, 32767, 32767, 501, 31, 395929, -9, -499, 0, 0, 32767, 499, 1001, 31, 395430, 0, 0, 11, -499, 32767, 500, 1, 42, 264358, 0, 500, 11, -499, 32767, 32767, 501, 42, 395946, 0, -499, 11, 0, 32767, 499, 1001, 42, 589993, -9, 0, -381, 11, 391, 32767, 0, 55, 524457, 382, 0, -381, 11, 32767, 32767, 391, 55, 590250, -381, 0, 11, 11, 392, 32767, 784, 55
XKLAVIER_STATE(INTEGER) = 0, 0
WM_STATE(WM_STATE):
        window state: Normal
        icon window: 0x0
_NET_WM_DESKTOP(CARDINAL) = 0
_MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x3, 0x1, 0x1, 0x0, 0x0
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 22, 2
_NET_FRAME_WINDOW(WINDOW): window id # 0x46001d9
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_MOVE, _NET_WM_ACTION_RESIZE, _NET_WM_ACTION_STICK, _NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_MAXIMIZE_VERT, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_CLOSE, _NET_WM_ACTION_SHADE, _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_ABOVE, _NET_WM_ACTION_BELOW
_MOTIF_DRAG_RECEIVER_INFO(_MOTIF_DRAG_RECEIVER_INFO) = 0x6c, 0x0, 0x5, 0x0, 0x2f, 0x0, 0x80, 0x5, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0
XdndAware(ATOM) = BITMAP
_NET_WM_STATE(ATOM) = 
WM_HINTS(WM_HINTS):
        Client accepts input or input focus: False
        Initial state is Normal State.
WM_NORMAL_HINTS(WM_SIZE_HINTS):
        user specified location: 1280, 0
        program specified location: 1280, 0
        program specified size: 1276 by 1000
        window gravity: NorthWest
_NET_WM_ICON(CARDINAL) =     Icon (48 x 48):
                                                    
                                                    
                                                  
                                                
                                               
                                             
                                             
                                             
                                            
                                          
                                          
                                         
                                       
                                      
                                    
                                
                              
                             
                           
                          
                        
                       
                    
                 
              
            
         
         
           
           
            
              
                
                       
                             
                                
                                   
                                     
                                       
                                        
                                          
                                           
                                             
                                               
                                                  
                                                    
                                                    
                                                    

    Icon (16 x 16):
                   
                  
                 
               
              
             
           
         
       
      
       
          
               
                 
                   
                    


WM_PROTOCOLS(ATOM): protocols  WM_TAKE_FOCUS, WM_DELETE_WINDOW
WM_CLASS(STRING) = "sun-awt-X11-XFramePeer", "com-mathworks-util-PostVMInit"
WM_CLIENT_LEADER(WINDOW): window id # 0x5800023
_NET_WM_ICON_NAME(UTF8_STRING) = 0x4d, 0x41, 0x54, 0x4c, 0x41, 0x42, 0x20, 0x20, 0x37, 0x2e, 0x31, 0x31, 0x2e, 0x30, 0x20, 0x28, 0x52, 0x32, 0x30, 0x31, 0x30, 0x62, 0x29
WM_ICON_NAME(STRING) = "MATLAB  7.11.0 (R2010b)"
_NET_WM_NAME(UTF8_STRING) = 0x4d, 0x41, 0x54, 0x4c, 0x41, 0x42, 0x20, 0x20, 0x37, 0x2e, 0x31, 0x31, 0x2e, 0x30, 0x20, 0x28, 0x52, 0x32, 0x30, 0x31, 0x30, 0x62, 0x29
WM_NAME(STRING) = "MATLAB  7.11.0 (R2010b)"

Allan-Volunteer on the (topic being discussed) mailn lists. You never get the people who matters attention on the forums.
jasonwryan-Installing Arch is a measure of your literacy. Maintaining Arch is a measure of your diligence. Contributing to Arch is a measure of your competence.
Griemak-Bleeding edge, not bleeding flat. Edge denotes falls will occur from time to time. Bring your own parachute.

Offline

#180 2010-11-16 15:18:12

BurntSushi
Member
From: Massachusetts
Registered: 2009-06-28
Posts: 362
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

No problem... I'm honestly not sure when I'll get around to fixing your issues ngoonee--maybe over winter break? It's just that Compiz isn't a priority, and I got it working over a year ago and haven't look at it since then :-(

(Compiz is weird because it uses viewports instead of workspaces...)


Education is favorable to liberty. Freedom can exist only in a society of knowledge. Without learning, men are incapable of knowing their rights, and where learning is confined to a few people, liberty can be neither equal nor universal.

Tu ne cede malis sed contra audentior ito

Offline

#181 2010-11-16 16:03:45

ngoonee
Forum Fellow
From: Between Thailand and Singapore
Registered: 2009-03-17
Posts: 7,354

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

BurntSushi wrote:

No problem... I'm honestly not sure when I'll get around to fixing your issues ngoonee--maybe over winter break? It's just that Compiz isn't a priority, and I got it working over a year ago and haven't look at it since then :-(

(Compiz is weird because it uses viewports instead of workspaces...)

I understand. I'll wait smile it works as-is for now, the issues I report are minor annoyances.

Doubt you have some sort of bug-tracker around? More suitable for that rather than spamming this thread.


Allan-Volunteer on the (topic being discussed) mailn lists. You never get the people who matters attention on the forums.
jasonwryan-Installing Arch is a measure of your literacy. Maintaining Arch is a measure of your diligence. Contributing to Arch is a measure of your competence.
Griemak-Bleeding edge, not bleeding flat. Edge denotes falls will occur from time to time. Bring your own parachute.

Offline

#182 2010-11-16 16:41:29

BurntSushi
Member
From: Massachusetts
Registered: 2009-06-28
Posts: 362
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Ah yes, I suppose that would be a good idea! (But I do comb this thread whenever I'm fixing bugs/implementing features.)

Here's a link to the tracker in Sourceforge:

http://sourceforge.net/tracker/?group_i … id=1165733

Also, I saw this, and maybe it will help? He says he added "desktop_window" to the ignore list, but judging from your output above, you might want to add "x-nautilus-desktop".

http://sourceforge.net/tracker/index.ph … id=1165736

I've also added a note to myself in my google code page for PyTyle 2 to check Compiz/Metacity :-)


Education is favorable to liberty. Freedom can exist only in a society of knowledge. Without learning, men are incapable of knowing their rights, and where learning is confined to a few people, liberty can be neither equal nor universal.

Tu ne cede malis sed contra audentior ito

Offline

#183 2010-11-26 07:58:05

singral
Member
Registered: 2009-09-21
Posts: 27

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

When i use normaly pytyle there are holes between some windows(terminal ones)
001a0.th.jpg

Uploaded with ImageShack.us

But if i reload pytyle 2 times it fixes all windows. Anyone knows fix for this so it happens normally?
001bgc.th.jpg

Uploaded with ImageShack.us

Offline

#184 2010-11-26 17:54:36

BurntSushi
Member
From: Massachusetts
Registered: 2009-06-28
Posts: 362
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

I'm not sure why it is fixing itself in the second image, but this is a known and unfixable problem.

Some windows, usually terminals and also gVim, set a hint that tells the window manager to resize the window by certain pixel increments. Since PyTyle isn't a window manager and must work with the window manager, there isn't anything PyTyle can do.

This can be fixed on two fronts. Firstly, you can either change or hack your window manager to ignore said resize hints. Secondly, you can hack the application (i.e., gVim) to not set those hints.

Finally, as an example, a terminal called mrxvt has an option called "smoothResize" that does exactly that. I don't think urxvt has a similar option.


Education is favorable to liberty. Freedom can exist only in a society of knowledge. Without learning, men are incapable of knowing their rights, and where learning is confined to a few people, liberty can be neither equal nor universal.

Tu ne cede malis sed contra audentior ito

Offline

#185 2010-12-29 19:59:15

evilgnome
Member
Registered: 2009-02-20
Posts: 62

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

I just wanted to say thank you, I'm loving PyTyle. Finally, compiz and tiling are friends on my laptop.

Offline

#186 2011-01-02 23:58:37

cephalopoid
Member
Registered: 2009-08-05
Posts: 21

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

I got the following errors trying to run pytyle in fluxbox. Do you know what's wrong?

X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 21, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 22, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 23, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 24, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 25, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 26, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 27, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 28, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 29, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 30, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 31, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 32, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 33, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 34, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 35, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 36, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 37, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 38, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 39, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 40, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 41, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 42, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 43, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 44, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 45, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 46, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 47, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 48, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 49, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 50, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 51, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 52, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 53, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 54, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 55, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 56, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 57, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 58, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 59, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 60, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 61, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 62, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 63, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 64, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 65, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 66, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 67, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 68, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 69, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 70, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 71, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 72, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 73, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 74, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 75, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 76, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 77, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 78, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 79, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 80, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 81, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 82, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 83, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 84, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 85, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 86, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 87, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 88, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 91, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 92, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 93, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 94, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 95, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 96, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 97, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 98, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 99, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 100, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 101, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 102, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 103, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 104, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 105, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 106, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 107, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 108, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 109, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 110, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 111, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 346, sequence_number = 112, major_opcode = 33, minor_opcode = 0
^CKeyboardInterrupt caught.
1/2/2011 at 23:30:1:    Fatal error
1/2/2011 at 23:30:1:    Traceback (most recent call last):
  File "/usr/bin/pytyle", line 189, in <module>
    elif e.is_active_change():
  File "/usr/lib/python2.7/site-packages/PyTyle/Event.py", line 106, in is_active_change
    if self._event and self._event.type == X.PropertyNotify and self._event.atom == PROBE.atom("_NET_ACTIVE_WINDOW"):
  File "/usr/lib/python2.7/site-packages/PyTyle/Probe.py", line 68, in atom
    return self.get_display().intern_atom(name)
  File "/usr/lib/python2.7/site-packages/Xlib/display.py", line 446, in intern_atom
    only_if_exists = only_if_exists)
  File "/usr/lib/python2.7/site-packages/Xlib/protocol/rq.py", line 1428, in __init__
    self.reply()
  File "/usr/lib/python2.7/site-packages/Xlib/protocol/rq.py", line 1440, in reply
    self._display.send_and_recv(request = self._serial)
  File "/usr/lib/python2.7/site-packages/Xlib/protocol/display.py", line 502, in send_and_recv
    rs, ws, es = select.select([self.socket], writeset, [], timeout)
KeyboardInterrupt

close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

Offline

#187 2011-01-03 03:10:27

BurntSushi
Member
From: Massachusetts
Registered: 2009-06-28
Posts: 362
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

It looks like it can't grab the keys. You'll have to check if other programs are using the shortcuts that PyTyle uses, and change them in the pytylerc.


Education is favorable to liberty. Freedom can exist only in a society of knowledge. Without learning, men are incapable of knowing their rights, and where learning is confined to a few people, liberty can be neither equal nor universal.

Tu ne cede malis sed contra audentior ito

Offline

#188 2011-01-23 20:06:19

cirkit
Member
From: San Francisco
Registered: 2008-01-29
Posts: 80
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

First off, thank you for PyTyle. I find using PyTyle as a manual tiling solution to work extremely well with Openbox as it allows one to make better use of a workspace while still having the option to use floating windows. Thank you! smile

BurntSushi wrote:

Some windows, usually terminals and also gVim, set a hint that tells the window manager to resize the window by certain pixel increments. Since PyTyle isn't a window manager and must work with the window manager, there isn't anything PyTyle can do.

I take it the same applies to what I am seeing with PyTyle as there is a gap in between screens, specifically with URxvt as shown in this screenshot

However, a gap is no longer present when the Master is resized dominantly bigger than Slaves with Alt-H and/or Alt-L

is this still directly related to resize hints? I did stumble upon http://openbox.org/wiki/Help:Actions#ResizeRelative which may be what we are looking for with respect to window resizing. Although this is not critical, it would certainly be great to close these gaps. smile

Last edited by cirkit (2011-01-23 20:07:14)

Offline

#189 2011-01-24 02:08:27

BurntSushi
Member
From: Massachusetts
Registered: 2009-06-28
Posts: 362
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Thanks for your kind words :-)

In response, with Openbox, it is literally impossible unless you modify the Openbox source. When pytyle sends a configure request (which adjusts a window's geometry and position), Openbox intercepts it (since it is in the window manager) and enforces the resize increment hints. There are only two ways around this:

1. As I said, modify Openbox so that it doesn't enforce this policy (which would break the ICCCM standard).
2. Modify urxvt, so it doesn't set the hint.

Finally, you could also use another terminal. mrxvt doesn't support unicode, but it allows you to turn off this hint (while urxvt doesn't, I don't think).

It's quite likely that as you resize your windows, the gap sizes will change. This is because the resize increment in pytyle isn't the same as the resize increment specified by the application (in this case, urxvt). So the window size ends up in different places.


Education is favorable to liberty. Freedom can exist only in a society of knowledge. Without learning, men are incapable of knowing their rights, and where learning is confined to a few people, liberty can be neither equal nor universal.

Tu ne cede malis sed contra audentior ito

Offline

#190 2011-01-24 02:38:51

skottish
Forum Fellow
From: Here
Registered: 2006-06-16
Posts: 7,942

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

BurntSushi wrote:

It's quite likely that as you resize your windows, the gap sizes will change. This is because the resize increment in pytyle isn't the same as the resize increment specified by the application (in this case, urxvt). So the window size ends up in different places.

That's correct, of course.

@cirkit

The gap will grow or shrink depending on the size between the windows. I think that the gap at it's maximum is the font size plus the line spacing around it minus one pixel (I may be a bit off here, but not by much). It may seem a bit larger than that because the window manager may draw a frame depending on how it's set up.

Offline

#191 2011-01-29 10:35:40

ngoonee
Forum Fellow
From: Between Thailand and Singapore
Registered: 2009-03-17
Posts: 7,354

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Hi Burntsushi,

This is just to acknowledge the great work that you've done with pytyle. Due to the 'easing-in' it offered, I've just installed/setup an awesome configuration. Thanks for providing the bridge allowing me to do so smile. I'm sure pytyle2 will be even more 'awesome' (pardon the pun).


Allan-Volunteer on the (topic being discussed) mailn lists. You never get the people who matters attention on the forums.
jasonwryan-Installing Arch is a measure of your literacy. Maintaining Arch is a measure of your diligence. Contributing to Arch is a measure of your competence.
Griemak-Bleeding edge, not bleeding flat. Edge denotes falls will occur from time to time. Bring your own parachute.

Offline

#192 2011-01-29 16:53:16

BurntSushi
Member
From: Massachusetts
Registered: 2009-06-28
Posts: 362
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Excellent! I'm happy to help!

Keep an eye out for pyndow :-)

https://github.com/BurntSushi/pyndow


Education is favorable to liberty. Freedom can exist only in a society of knowledge. Without learning, men are incapable of knowing their rights, and where learning is confined to a few people, liberty can be neither equal nor universal.

Tu ne cede malis sed contra audentior ito

Offline

#193 2011-02-01 07:53:17

ngoonee
Forum Fellow
From: Between Thailand and Singapore
Registered: 2009-03-17
Posts: 7,354

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

ngoonee wrote:

Okay, so here it is. With regards to the wine apps, I took xprop from one app (utorrent) which works, and one app (e-sword) which doesn't.

<snip the rest, its on the same page anyway>

Hey BurntSushi, I was having this same issue on Awesome, managed to narrow it down to the WM_TRANSIENT_FOR hint. I'll let you know if the awesome folk have any suggestions on how to deal with it.


Allan-Volunteer on the (topic being discussed) mailn lists. You never get the people who matters attention on the forums.
jasonwryan-Installing Arch is a measure of your literacy. Maintaining Arch is a measure of your diligence. Contributing to Arch is a measure of your competence.
Griemak-Bleeding edge, not bleeding flat. Edge denotes falls will occur from time to time. Bring your own parachute.

Offline

#194 2011-04-14 23:41:30

measure
Member
Registered: 2009-07-17
Posts: 62

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

I recently obtained a notebook with 1600x1200 resolution, which was a bit big for a strictly tiled WM (I prefer DWM).  So I installed openbox, but sometimes found myself really wanting tiled settings.  I turned to PyTyle and it has been amazing.  So thank you BurntSushi!

I wanted to add that while urxvt has no option for resize hints, there is an existing (though out of date) package in AUR which patches urxvt to not send resize hints: https://aur.archlinux.org/packages.php?ID=33967 .  While it is out of date, the source where it gets the patch is not out of date (it just has the wrong version number), so changing the PKGBUILD file and running makepkg -g >> PKGBUILD was easy enough to get it installed.

For some reason or another I could not stand mrxvt.  I found it's tabs to be ugly and on my Pentium M with screen it lagged a bit (sometimes a lot).  At any rate, I really wanted urxvt back.  So I installed the patched urxvt and everything is PERFECT.  urxvt in openbox with pytyle and no gaps!

The only thing I would change about pytyle (which probably can be changed and I just don't know how/haven't really tried) would make it to where MOD+ENTER switched the master and the last-focused non-master if you're focused on the master window.  This is what DWM does.  Anyway, this isn't that big of a deal.  I am actually thinking about changing all my computers to openbox + pytyle now, but I am having trouble letting go of DWM.

Thanks,
Ryan

Offline

#195 2011-06-06 15:22:38

heptapod
Member
Registered: 2010-06-24
Posts: 35

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

PyTyle is awesome. I made two new layouts and I'm posting them here in case anyone else find them useful. This is for pytyle 1, just called pytyle in aur.

The problem these tries to solve is the following. When using automatic tilers and opening alot of windows, the windows in the slave area tends to get so small that you cant use them. Thus most tilers dont work well with alot of windows open. These tilers dedicate half of the screen for the master area, one fourth of the screen for the first of the slaves. Thus you always have two windows that are large enough to use. All other slaves end up in the remaining fourth of the screen. When you open alot of windows these windows will get so small that you only see the title of the window. So this is meant to use as a list of open windows that you are not using at the moment. Select on of them and hit alt-enter to move it into the first slave area. When in the first slave area, hit alt-enter again to move the window into the master area.

How to use:

In the file: ~/.config/pytyle/pytylerc
Add HorizontalLowRight And VerticalLowRight to the tilers line like this:

'tilers': ['Vertical', 'Horizontal', 'VerticalLowRight', 'HorizontalLowRight'],

In the same file add this to the config.LAYOUT section:

'VerticalLowRight': {
                               # The default width factor. This is used when
                               # the screen is initially tiled (or reset).
                               # Possible values: 0 < x <= 1.0
                               'width_factor': 0.5,

                               # Allows you to set a margin around *each*
                               # window (in pixels, must be greater than 0).
                               'margin': 0,
                              },

 'HorizontalLowRight': {

                                   # Determines the height of the windows relative
                                   # to the screen height. Possible
                                   # values: 0 < y <= 1.0
                                   'height_factor': 0.5,

                                   # Allows you to set a margin around *each*
                                   # window (in pixels, must be greater than 0).
                                   'margin': 0,
                                   },

Copy the text below into a new file with the name: /usr/lib/python2.7/site-packages/PyTyle/Tilers/HorizontalLowRight.py

#===============================================================================
# PyTyle - A manual tiling manager
# Copyright (C) 2009  Andrew Gallant <andrew@pytyle.com>
#
# 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 2 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
#===============================================================================

"""
HorizontalLowRight.py

Puts the master on the top, one "firstslave" in the lower left corner  and all other slaves in the 
lower right corner. The make_active_master function will exchange the current slave for 
firstslave, unless first slave is the active window, in which case firstslave gets exchanged
with master.

"""

from PyTyle.Tilers.TileDefault import TileDefault

class HorizontalLowRight (TileDefault):
    #------------------------------------------------------------------------------
    # OVERLOADED INSTANCE METHODS
    #------------------------------------------------------------------------------

    #
    # The core tiling algorithm. Every core tiling algorithm should start with
    # grabbing the current screen's workarea and factoring that into your
    # calculations. Feel free to follow my approach to tiling algorithms, or
    # come up with something else.
    #
    # Note: As I've been going through the source code writing these comments,
    # I've been thinking about generalizing tiling algorithms even more. So this
    # approach could change a little in the future. (Although I imagine the class
    # hierarchy will be staying the same, I like it.)
    #
    def _tile(self):

        x, y, width, height = self.screen.get_workarea()
        
        # set some vars...
        masters = self.storage.get_masters()
        slaves = self.storage.get_slaves()
        
        # settings for master
        masterWidth = width if not masters else (width / len(masters))
        masterHeight = height if not slaves else int(height * self.state.get('height_factor'))
        masterY = y
        masterX = x

        # resize the master windows
        for master in masters:
            self.help_resize(master, masterX, masterY, masterWidth, masterHeight, self.state.get('margin'))
            masterX += masterWidth
            
        if ( len(slaves)>=1 ) :
            
            # settings for first slave
            firstSlaveWidth = width / 2 if not (len(slaves)==1) else width
            firstSlaveHeight = height if not masters else (height-masterHeight)
            firstSlaveY = y + masterHeight if masters else y
            firstSlaveX = x

            # resize first slave
            firstSlave=slaves[0]
            self.help_resize(firstSlave,firstSlaveX, firstSlaveY, firstSlaveWidth, firstSlaveHeight, self.state.get('margin'))
             
            if( len(slaves)>=2 ):
                
                # settings for other slaves
                slaveWidth = width / 2
                slaveHeight =  height / (len(slaves)-1)  if not masters else ((height-masterHeight)/(len(slaves)-1))
                slaveY= y if not masters else y+masterHeight
                slaveX = width/2
            
                # resize other slaves
                for i in range (1,len(slaves)):
                    self.help_resize(slaves[i], slaveX, slaveY, slaveWidth, slaveHeight, self.state.get('margin'))
                    slaveY=slaveY+slaveHeight
                    
    
    # Overloaded make_active_master for this tiler. Exchange any slave with firstslave, only firstslave gets
    # exchanged with master
    def _make_active_master(self):
        slaves = self.storage.get_slaves()
        active = self.screen.get_active()
        if(  (active.id in self.storage.get_slaves_by_id()) and (active.id!=slaves[0].id)  ):
            # Slave and not firstSlave
            self.help_switch(slaves[0],active)
        else:
            if self.storage.get_masters():
                self.help_switch(self.storage.get_masters()[0], self.screen.get_active())


    # Increases the height of all master windows. Don't forget to decrease
    # the height of all slave windows. Won't do anything if there are either
    # no masters or no slaves.
    #
    def _master_increase(self, factor = 0.05):
        

        self.state.set('height_factor',self.state.get('height_factor')+factor)
        self.tile()
        
    #
    # Decreases the height of all master windows. Don't forget to increase
    # the height of all slave windows. Won't do anything if there are either
    # no masters or no slaves.
    #
    def _master_decrease(self, factor = 0.05):
        self.state.set('height_factor',self.state.get('height_factor')-factor)
        self.tile()

# You must have this line's equivalent for your tiling algorithm!
# This makes it possible to dynamically load tiling algorithms.
# (So that you may simply drop them into the Tilers directory,
# and add their name to the configuration- vini, vidi, vicci!)
CLASS = HorizontalLowRight

Copy the text below into a new file with the name: /usr/lib/python2.7/site-packages/PyTyle/Tilers/VerticalLowRight.py

#===============================================================================
# PyTyle - A manual tiling manager
# Copyright (C) 2009  Andrew Gallant <andrew@pytyle.com>
#
# 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 2 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
#===============================================================================

"""
VerticalLowRight.py

Puts the master on the right, one "firstslave" on top right and all other slaves in the 
lower right corner. The make_active_master function will exchange the current slave for 
firstslave, unless first slave is the active window, in which case firstslave gets exchanged
with master.
"""

from PyTyle.Tilers.TileDefault import TileDefault

class VerticalLowRight (TileDefault):
    #------------------------------------------------------------------------------
    # OVERLOADED INSTANCE METHODS
    #------------------------------------------------------------------------------

    #
    # The core tiling algorithm. Every core tiling algorithm should start with
    # grabbing the current screen's workarea and factoring that into your
    # calculations. Feel free to follow my approach to tiling algorithms, or
    # come up with something else.
    #
    # Note: As I've been going through the source code writing these comments,
    # I've been thinking about generalizing tiling algorithms even more. So this
    # approach could change a little in the future. (Although I imagine the class
    # hierarchy will be staying the same, I like it.)
    #
    def _tile(self):
        x, y, width, height = self.screen.get_workarea()

        # set some vars...
        masters = self.storage.get_masters()
        slaves = self.storage.get_slaves()
        
        # settings for master
        masterWidth = width if not slaves else width * self.state.get('width_factor')
        masterHeight = height if not masters else (height / len(masters))
        masterY = y
        masterX = x

        # resize the master windows
        for master in masters:
            self.help_resize(master, masterX, masterY, masterWidth, masterHeight, self.state.get('margin'))
            masterY += masterHeight
            
        if ( len(slaves)>=1 ) :

            # settings for first slave
            firstSlaveWidth = width if not masters else width - masterWidth   
            firstSlaveHeight = height / 2 if not (len(slaves)<=1) else height
            firstSlaveY = y
            firstSlaveX = x if not masters else (x + masterWidth)

            # resize the slave windows
            firstSlave=slaves[0]
            self.help_resize(firstSlave,firstSlaveX, firstSlaveY, firstSlaveWidth, firstSlaveHeight, self.state.get('margin'))

            if ( len(slaves)>=2 ):
            
                # settings for all other slaves
                slaveWidth = width if not masters else (width - masterWidth)
                slaveHeight = (height/2)/(len(slaves)-1) 
                slaveY = y + firstSlaveHeight
                slaveX = x if not masters else (x + masterWidth)

                # resize other slaves
                for i in range (1,len(slaves)):
                    self.help_resize(slaves[i], slaveX, slaveY, slaveWidth, slaveHeight, self.state.get('margin'))
                    slaveY=slaveY+slaveHeight
           
    # Overloaded make_active_master for this tiler. Exchange any slave with firstslave, only firstslave gets
    # exchanged with master
    def _make_active_master(self):
        slaves = self.storage.get_slaves()
        active = self.screen.get_active()
        if(  (active.id in self.storage.get_slaves_by_id()) and (active.id!=slaves[0].id)  ):
            # Slave and not firstSlave
            self.help_switch(slaves[0],active)
        else:
            if self.storage.get_masters():
                self.help_switch(self.storage.get_masters()[0], self.screen.get_active())


    #
    # Increases the width of all master windows. Don't forget to decrease
    # the width of all slave windows. Won't do anything if there are either
    # no masters or no slaves.
    #
    def _master_increase(self, factor = 0.05):

        self.state.set('width_factor', self.state.get('width_factor') + factor)
        self.tile()
        
        
    #
    # Decreases the width of all master windows. Don't forget to increase
    # the width of all slave windows. Won't do anything if there are either
    # no masters or no slaves.
    #
    def _master_decrease(self, factor = 0.05):

        self.state.set('width_factor', self.state.get('width_factor') - factor)
        self.tile()
        

# You must have this line's equivalent for your tiling algorithm!
# This makes it possible to dynamically load tiling algorithms.
# (So that you may simply drop them into the Tilers directory,
# and add their name to the configuration- vini, vidi, vicci!)
CLASS = VerticalLowRight

Start pytyle and use alt-z to cycle to these modes.

Offline

#196 2011-06-06 16:28:09

BurntSushi
Member
From: Massachusetts
Registered: 2009-06-28
Posts: 362
Website

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

@heptapod - Nice work! Do you mind if I include those layouts in the main distribution? (When I get time to build another release...)


Education is favorable to liberty. Freedom can exist only in a society of knowledge. Without learning, men are incapable of knowing their rights, and where learning is confined to a few people, liberty can be neither equal nor universal.

Tu ne cede malis sed contra audentior ito

Offline

#197 2011-06-06 17:11:58

heptapod
Member
Registered: 2010-06-24
Posts: 35

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

Glad you like them. Please do.

Offline

#198 2011-06-06 19:25:18

heptapod
Member
Registered: 2010-06-24
Posts: 35

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

This modification changes the movement (pressing alt-k, alt-j to move forwards and backwards ) in the following way. When moving forward we go from the first master to the last master window, then to the first slave through to the last slave, and then back to first master, and vice versa for backwards. The default is to go backwards through the master windows and forward through the slaves.

BurntSushi: Feel free to add this (maybe as an option) to main if you like it.

How to use:

Replace the following file with the code below. Make a backup of the file first if you want to be able to change back to default behaviour.
/usr/lib/python2.7/site-packages/PyTyle/Tilers/TileDefault.py

#===============================================================================
# PyTyle - A manual tiling manager
# Copyright (C) 2009  Andrew Gallant <andrew@pytyle.com>
#
# 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 2 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
#===============================================================================

"""
TileDefault.py

TileDefault, in and of itself, cannot be used as a tiling algorithm. It
represents the methods that both the Vertical and Horizontal layouts have
in common. Both Vertical and Horizontal are subclasses of TileDefault.

Modified version: 
Find next goes from first to last master and then first to last slave and back to first master
find previous goes from last to first master and then last to first slave and back to last master

"""

from PyTyle.Tile import Tile

class TileDefault (Tile):
    #------------------------------------------------------------------------------
    # OVERLOADED INSTANCE METHODS
    #------------------------------------------------------------------------------
    
    #
    # The common algorithm to cycle through all slaves for both the Horizontal
    # and Vertical layouts. Note that if there is more than one master, the first
    # master window will be swapped out. Also note that this will do nothing if
    # there are either no slaves or no masters. There will be nothing to cycle.
    #
    def _cycle(self):
        slaves = self.storage.get_slaves()
        masters = self.storage.get_masters()
        
        # Stop if neither of either... haha
        if not slaves or not masters:
            return
        
        # Might be a little high...
        if self.cycleIndex >= len(slaves):
            self.cycleIndex = len(slaves) - 1
        
        # use the index first to fetch the window to cycle
        self.help_switch(masters[0], slaves[self.cycleIndex])
        self.storage.get_masters()[0].activate()
        
        self.cycleIndex = self.cycleIndex + 1
        if self.cycleIndex == len(slaves): self.cycleIndex = 0
        
        
    #------------------------------------------------------------------------------
    # OVERLOADED PRIVATE HELPER METHODS
    #------------------------------------------------------------------------------ 
        
    #
    # Finds the next window. This is used both by the win_next and switch_next
    # tiling actions. It's a bit hairy, so I've commented the code as we go.
    #
    def help_find_next(self):

        masters = self.storage.get_masters()
        slaves = self.storage.get_slaves()
                
        # Active is last master
        if masters and self.screen.get_active().id==masters[-1].id:
            if not slaves:
                return masters[0]
            else:
                return slaves[0]

        # Active is any master other than last
        elif masters:
            for i in range(0, len(masters)-1):
                if self.screen.get_active().id == masters[i].id:
                    return masters[(i + 1)]    
        
        # Active is last slave    
        if slaves and self.screen.get_active().id == slaves[-1].id:
            if not masters:
                return slaves[0]
            else:
                return masters[0]
            
        # Active is any slave other than last
        elif slaves:
            for i in range(0, len(slaves)-1):
                if self.screen.get_active().id == slaves[i].id:
                    return slaves[(i + 1)]
    
            
    def help_find_previous(self):

        masters = self.storage.get_masters()
        slaves = self.storage.get_slaves()

        # Active is first master
        if masters and self.screen.get_active().id==masters[0].id:
            if not slaves:
                return masters[-1]
            else:
                return slaves[-1]

        # Active is any master other than first
        elif masters:
            for i in range(1, len(masters)):
                if self.screen.get_active().id == masters[i].id:
                    return masters[(i - 1)]    
        
        # Active is first slave    
        if slaves and self.screen.get_active().id == slaves[0].id:
            if not masters:
                return slaves[-1]
            else:
                return masters[-1]
            
        # Active is any slave other than first
        elif slaves:
            for i in range(1, len(slaves)):
                if self.screen.get_active().id == slaves[i].id:
                    return slaves[(i - 1)]
        

Edit: This is also for pytyle 1.

Last edited by heptapod (2011-06-06 19:25:57)

Offline

#199 2011-06-07 10:37:58

heptapod
Member
Registered: 2010-06-24
Posts: 35

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

I looked through the code a bit but I couldn't figure this out:

Is there a way to program a tiler so that new windows will be opened in a specific place? That is choose where in the storage they get added, at the moment it seems like new windows always becomes the last slave.

Is there a way to save the info on which windows are masters and slaves (and positions in that list), when cycling between layouts? As it is now, when I cycle between layouts (alt-z), and come back to the first layout the order of the windows will be different.

Offline

#200 2011-08-03 19:27:36

GSF1200S
Member
Registered: 2008-12-24
Posts: 474

Re: PyTyle: Manual tiling manager for EWMH compliant WM's

BurntSushi wrote:

Thanks for your kind words :-)

In response, with Openbox, it is literally impossible unless you modify the Openbox source. When pytyle sends a configure request (which adjusts a window's geometry and position), Openbox intercepts it (since it is in the window manager) and enforces the resize increment hints. There are only two ways around this:

1. As I said, modify Openbox so that it doesn't enforce this policy (which would break the ICCCM standard).
2. Modify urxvt, so it doesn't set the hint.

Finally, you could also use another terminal. mrxvt doesn't support unicode, but it allows you to turn off this hint (while urxvt doesn't, I don't think).

It's quite likely that as you resize your windows, the gap sizes will change. This is because the resize increment in pytyle isn't the same as the resize increment specified by the application (in this case, urxvt). So the window size ends up in different places.

I went crazy over the wasted pixels even though its not Pytyles fault. I prefer having a terminal with right-click options, etc, so I thought id post that Terminator has a "Window Geometry hints" option under the global tab of its preferences. Unchecking that box allows it to work perfect with no wasted pixels under pytyle/openbox. I should mention that terminator is capable of splitting, tabbing, etc which is kind of cool considering its a form of tiling itself..

Just in case anyone wanted to know..

Offline

Board footer

Powered by FluxBB