fix for a regression is found; this bug has been around for a long time
it seems, but this change exposed it. Likely need to track clients in to
and out of regions.
region_find() which no longer needs to recalculate gap each time
a client (or menu) is created or altered. If no RandR, fall back
to display dimensions while building regions instead of during
execution.
* refs/heads/master:
Only when mapping clients from an initial wm start or restart, query the pointer and if it matches the child window, activate it; new clients will not need to make this roundtrip to the server.
On execwm, we should properly release resources before exec'ing into a new window manager; so allow CWM_EXEC_WM to assign new wm to wm_argv and pass through cwm_status (now EXECWM) so that x_teardown() gets called before exec'ing the new window manager. Removes the need for a separate x_restart() now, using new wm_argv; and consolidates errno for execvp.
pointer and if it matches the child window, activate it; new clients
will not need to make this roundtrip to the server.
Based on a patch from Preben Guldberg.
* refs/heads/master: (21 commits)
Lost fix from r1.112; add comment.
Mechanical change: group->gc
Add consistent checks against NULL.
Move client cycle grab/ungrab into a more relevant place; while here, update comments about why we need to grab/ungrab the keyboard.
Re-add lost chunk in group_cycle from r1.113.
Further simplify _NET_WM_DESKTOP handling using new group_assign().
oops; remove left over debug print
Allowing sending a valid 'nogroup' (0) group_ctx to group_assign() (since we init all groups), though assigning the client's group to NULL for 'sticky'; use this simplification in a few places (others to follow).
Split out sticky mode checks and the restoring of a client's group and _NET_WM_DESKTOP from the config-based auto-grouping; no (intentional) behavior changes. Needed for further work in cleaning up this area.
Implement _NET_CLIENT_LIST_STACKING (from Thomas Admin), but bottom-to-top order, as per spec (notified Thomas as well).
Don't allow freeze operations on fullscreen (consistent with what fullscreen does).
Sort _NET_WM_STATE Atoms like the spec.
Move CLIENT_STICKY logic from client hide/unhide to group hide/unhide; rationale being that clients should be able to hide/unhide independently of group switching.
Add Xkb modifier to ignore mask; from Alexander Polakov.
Fix whitespace.
Add client freeze extension to _NET_WM_STATE Atom, allowing flag to persist. As usual with new Atoms, requires X restart.
_NET_WM_STATE_STICKY implies only sticky at the group/desktop level, not position and size; based on discussion with a few.
Instead of special casing the 'term' and 'lock' commands, go back to keeping them hidden; showing them has apparently caused confusion/angst.
Leave command list order from .cwmrc alone; remove sort.
Bring group and client cycle closer together.
...
client_find valid resources as needed, relieving the need for
screen_find to ungracefully handle invalid root windows. Removes a long
standing XXX. Should theoretically allow XClientMessage handling on
more than one X screen. Alter callers of screen_find to handle
failures.
from re-hiding on restart due to flag toggling (note that this is ripe
for re-vamping). Behavior only observed on restarts.
Problem found by, and initial patch from, Henri Kemppainen (thanks!),
though ever so slightly different one applied.
global Clientq and place it inside screen_ctx since every client belongs
to a screen, then use the same per screen clientq to track stacking
order (the sole reason for mruq).
client to 'stick' to all desktops (ewmh speak) or groups - this
currently has the same affect as setting a client's group to 'nogroup',
with the exception that the client can also be in a group, so when
un-sticking, the client will go back to its original group/desktop.
clients) directly into client_init, performing the X roundtrip only
once. With the previous change in maprequest, this moves decision making
into one place for creating new clients.
Since we already have a form of 'maximize', we need to differentiate
between 'maximize' and the new 'fullscreen' mode. The 'maximize' mode
will continue to honor gap but now *retains* the border, matching the
'vert/horz maximize' behaviour. The new 'fullscreen' mode supports and
follows the _NET_WM_STATE_FULLSCREEN hint, allowing the client perform
additional window modifications; in this mode, cwm(1) will *ignore* gap,
remove borders and freeze(move/resize) the client. Additionally,
'fullscreen' mode will remember various combinations of previous states.
* default keybinding changes: CM-f 'fullscreen', CM-m 'maximize' (re-map
as desired).
Positive feedback from a few, testing and ok sthen@
used for focus events, but rather the timestamp of the generated event.
Track the last event timestamp and send it down for a WM_TAKE_FOCUS
ClientMessage. I suspect we should do this for clients that don't
announce this Atom as well, though the raciness gets us into a bind.
Solves focus order issue since WM_TAKE_FOCUS; fix verified by sthen@
ok sthen@
client_leave() served no real purpose, likewise no reason to handle
LeaveNotify events since an EnterNotify will process the next active
client (and we don't have anything important to process anyway), so
xev_handle_leavenotify() goes as well. Allows a simplification of
client_mtf() and client_cycle_leave() for clarity. While here, unify a
few client_current() checks.
No intended behaviour change.
queue check (removing the need for a server grab/ungrab) - if the client
is going away, let it fall all the way through to a DestroyNotify event.
There's no longer a need for us to manually destroy a client ourselves
(removing yet another server grab/ungrab). Instead, when the
UnmapNotify event is synthetic, simply set the state to Withdrawn (as
per ICCCM), else Iconic (in our case 'hidden').
Verified with test case from the 2009 race which was the original reason
for r1.35 of event.c.
XSetInputFocus() for clients that have the InputHint; latter fix
discovered by Valery Masiutsin with a PoC patch - solves keyboard input
focus loss for java apps.
triggering event was unmap (with pending destroy) log destroy; we only
need to grab/ungrab the server lock, set WithdrawnState and
XRemoveFromSaveSet clients coming from an unmap event - doing so for
clients coming from destroy are already gone, hence we generate errors.
BadValue) when the modifier is already AnyModifier . Instead alter
xu_btn_ungrab() to ungrab AnyButton/AnyModifier and call it only when a
client is coming into focus in client_setactive(), instead of iterating
over ignore mods - matches how we handle key grabs.