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@
ewmh hint; urgencyborder is configurable. The urgency flag will stick,
even while on a client in a non-viewable group, until the client
receives focus (where the border is reset). Initial diff from Thomas
Adam with some changes/enhancements from me.
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.
event on the screen's root window, there's no need to pass down the
entire XButtonEvent event, at least to group_menu(), the only callback
which takes an argument at this point; instead use the already populated
screen.
to grab keys in keybindingq. we don't need to ungrab/grab on every
addition to the queue, just once with a complete keybindingq; simplify
grabbing keys per screen (during init) and during a MappingNotify.
while here, change conf_grab_{kbd,mouse} to require only a Window.
validity during the parse phase and not bother adding it to the queue,
instead of each time a client needs to grab (when it's too late);
furthermore, make this a config error, stop parsing and load the
default config.
- merge border/menu color structures/functions since they now both use Xft
- switch xu_xorcolor to operating on XftColor instead of just
XRenderColor (basically adding pixel)
- if color name allocation fails, revert back to default (this, along
with font validation should occur during config parse, but we don't
have screens setup yet - likely to change at some point)
note that a re-exec of cwm will not rewrite the group number atom of
*existing* clients, so they will remain off-by-one until each client has
its atom updated, or of course a restart of X.
existing argv; same idea with respect to argv saving as Alexander
Polakov. reload support was half-complete and is getting in the way.
agreed to by many
bwidth; this allows a client to be resized from a max state, which now
gets treated like a non-max'd client. based on a diff that does part of
this in a different way from Alexander Polakov.
don't need to pass down the new values to screen_update_geometry(); so
just read the width/height values directly for both uses of
screen_update_geometry(). prep for further changes in this area.
i.e. horiz-max + vertmax = full maximisation. full - horiz = vertmax.
etc.
Martynas wrote something like this once, so I did okan, this version
seems to finally deal with the corner cases.
ok okan@.
sense and to be slightly less un-expected. from Alexander Polakov.
re-use 'normal' cursor now instead XC_hand1 for menu selection. i
really wish X had real docs and made sense.
ok on earlier diff with '?' removed (but it's back now) oga@
keyword taken from a diff from Sviatoslav Chagaev to do the same thing,
but implemented in a completely way (based on some very old code from
mk@). default set to 0, so no behavior change.
ok oga@ (who would also like to take it further...)
any window, after which all move/resize requests will be ignored,
essentially freezing the window in place.
there's a possibility to merge this with the 'ignore' concept, pending
on how ignore+freeze should behave (really more ewmh stuff), but punting
for now since ponies are on the line.
requested and tested by thib at k2k11 with ponies, unicorns and rainbows.
'save the unicorns' todd@, ok oga@
it works kinda like _CWM_GRP, which we added to aid restarts a while
ago, but it's standardised and clients are specifically allowed to set
it to request a desktop.
for noe we leave _CWM_GRP support in, but its days are now numbered.
while i'm here fixup an int/long mixup with an earlier diff.
ok okan@
says that a pager can change the property at any time (most need a
clientmessage). So deal with property updates.
Needed to shuffle some of the other code around since we can't just use
shortcut_to_name[] everywhere now.
ok okan@
remove screen_current() it was utterly bogus when nscreens > 1.
pass a fake client_ctx in the case where there's no client and the
kbfunc or mousefunc doesn't need a real one, it just contains the
current screen, modify these functions so that they pass down the screen
context to their callees.
make groups per screen, it's the only way it makes sense in this regard.
ok okan@.
into screen_ctx and start passing screen_ctx around to in order get rid
of Curscreen; fixup per-screen config colors the same way.
diff mostly from oga@, with a bit harsher reaction to the state of screen_ctx.
"please commit" oga@
the x property api doesn't let you remove one entry from an X property
array, so client_remove is kinda expensive, but there's no real way
around that..
ok okan@
allows java to be happy, but additionally stops others from whinning
about a non-netwm complaint wm. more to come.
written a few times; this one includes a clever hack from oga@ to
populate _NET_SUPPORTED.
ok oga@
every other window manager since twm.
The event layer is very nice, very shiny, very flexible, and very much
underutilised. We don't need any of those shiny features so it's
probably better to earn ourselves 1k smaller text size instead.
ok todd@, okan@
using Xft(3), use it to select the font color as well instead of trying
to build one; properly allocate and free colors at-will, e.g. we now
have configurable colors.
feedback and ok's todd@ and oga@
display and moves it to another group. useful with the recently added
"grouponly" function, giving the ability to use groups as simple
virtual desktops (similar to e.g. xmonad, dwm and scrotwm).
this doesn't have default keyboard bindings; cwmrc(5) now shows how
you could use these functions (use M-1...9 for grouponly1...9 and
MS-1...9 for movetogroup1...9 to emulate the default dwm bindings).
ok oga@
This works like the group select binding, but hides all other groups.
So, the people who've been complaining that they don't get "virtual
desktops" in cwm may want to try this out in cwmrc (from memory, untested):
---
#cwmrc
# add new windows to the current group
set sticky
# automatically sticky windows. xclock for now.
# to make more windows sticky use group_toggle to unset their group
autogroup 0 xclock
# make the group selection keys hide other groups, emulate virtual desktops
bind CM-1 grouponly1
bind CM-2 grouponly2
bind CM-3 grouponly3
bind CM-4 grouponly4
bind CM-5 grouponly5
bind CM-6 grouponly6
bind CM-7 grouponly7
bind CM-8 grouponly8
bind CM-9 grouponly9
---
mostly by sthen, tweaks from me.
ok todd@, "if it works i'm ok with it" okan@, ok sthen@
your group state. Fix this up by using an X Atom (_CWM_GRP) to store the
name of the group that we're using (the name, not the number is because
at one point we may make the group numbers dynamic). I've been talking
about this since c2k8. so CM-w means you keep all of your windows grouped
properly.
ok okan@, todd@
Do this instead of querying for them every time we use them. This
removes an XXX that has been in there since time began. This will become
more important as we move towards supporting netwm.
ok todd@, okan@.
times you'd end up losing clients (thinking they had gone away).
From the ICCCM (which should not be read without a stiff drink in hand,
I made this mistake so you don't have to): to request a window to be
withdrawn one should send a synthetic UnmapRequest event when iconified.
To request iconification one should just unmap the window. The ICCM
further recommends that the synthetic event should just be taken as a
cue to withdraw, to deal with legacy clients. Taking a hint from this,
rework xev_handle_unmaprequest to correctly detect these situations. A
Withdrawn window may come back anywhere, even as a subwindow of
something else, so the correct way to handle this state is to forget it
ever existed.
While i'm here, kill a dumb attempt to notice this in client_delete, and
nuke the very unnecessary arguments.
Todd confirmed this fixes the `race'.
ok todd@, ok ok okan@