You are not logged in.
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
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
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
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
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
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 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
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
When i use normaly pytyle there are holes between some windows(terminal ones)
Uploaded with ImageShack.us
But if i reload pytyle 2 times it fixes all windows. Anyone knows fix for this so it happens normally?
Uploaded with ImageShack.us
Offline
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
I just wanted to say thank you, I'm loving PyTyle. Finally, compiz and tiling are friends on my laptop.
Offline
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
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
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!
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.
Last edited by cirkit (2011-01-23 20:07:14)
Offline
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
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
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 . 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
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
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
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
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
@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
Glad you like them. Please do.
Offline
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
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
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