diff --git a/CMakeLists.txt b/CMakeLists.txt index 6592a31..becc390 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ set(wmfs_src src/mouse.c src/screen.c src/status.c + src/systray.c src/tag.c src/util.c src/viwmfs.c diff --git a/src/client.c b/src/client.c index 4506b26..bd24be5 100644 --- a/src/client.c +++ b/src/client.c @@ -356,6 +356,7 @@ client_focus(Client *c) sel->flags &= ~AboveFlag; frame_update(sel); + mouse_grabbuttons(sel, !conf.focus_pclick); } diff --git a/src/ewmh.c b/src/ewmh.c index 651c3eb..cc8e0d3 100644 --- a/src/ewmh.c +++ b/src/ewmh.c @@ -75,6 +75,7 @@ ewmh_init_hints(void) net_atom[net_wm_icon] = ATOM("_NET_WM_ICON"); net_atom[net_wm_state] = ATOM("_NET_WM_STATE"); net_atom[net_wm_state_fullscreen] = ATOM("_NET_WM_STATE_FULLSCREEN"); + net_atom[net_wm_state_sticky] = ATOM("_NET_WM_STATE_STICKY"); net_atom[net_wm_state_demands_attention] = ATOM("_NET_WM_STATE_DEMANDS_ATTENTION"); net_atom[utf8_string] = ATOM("UTF8_STRING"); @@ -326,6 +327,13 @@ ewmh_manage_net_wm_state(long data_l[], Client *c) client_moveresize(c, c->tmp_geo, False); } } + /* Manage _NET_WM_STATE_STICKY */ + else if(data_l[1] == net_atom[net_wm_state_sticky]) + { + /* == client_ignore_tag */ + c->tag = MAXTAG + 1; + arrange(c->screen, True); + } /* Manage _NET_WM_STATE_DEMANDS_ATTENTION */ else if(data_l[1] == net_atom[net_wm_state_demands_attention]) { @@ -350,6 +358,7 @@ ewmh_manage_window_type(Client *c) int i, f; ulong n, il; uchar *data = NULL; + long ldata[5] = { 0 }; if(XGetWindowProperty(dpy, c->win, net_atom[net_wm_window_type], 0L, 0x7FFFFFFFL, False, XA_ATOM, &rf, &f, &n, &il, &data) == Success && n) @@ -385,6 +394,22 @@ ewmh_manage_window_type(Client *c) XFree(data); } + /* Get NET_WM_STATE set without sending client message event */ + if(XGetWindowProperty(dpy, c->win, net_atom[net_wm_state], 0L, 0x7FFFFFFFL, + False, XA_ATOM, &rf, &f, &n, &il, &data) == Success && n) + { + atom = (Atom*)data; + + for(i = 0; i < n; ++i) + { + ldata[0] = _NET_WM_STATE_ADD; + ldata[1] = atom[i]; + ewmh_manage_net_wm_state(ldata, c); + } + + XFree(data); + } + return; } diff --git a/src/layout.c b/src/layout.c index 4bf98e0..93e08d3 100644 --- a/src/layout.c +++ b/src/layout.c @@ -39,7 +39,7 @@ arrange(int screen, Bool update_layout) { Client *c; - if(screen < 0 || screen > screen_count()) + if(screen < 0 || screen > screen_count() - 1) screen = screen_get_sel(); for(c = clients; c; c = c->next) diff --git a/src/structs.h b/src/structs.h index 8b11463..900cd51 100644 --- a/src/structs.h +++ b/src/structs.h @@ -123,6 +123,7 @@ enum net_wm_icon, net_wm_state, net_wm_state_fullscreen, + net_wm_state_sticky, net_wm_state_demands_attention, utf8_string, /* WMFS HINTS */ diff --git a/src/systray.c b/src/systray.c new file mode 100644 index 0000000..045ba31 --- /dev/null +++ b/src/systray.c @@ -0,0 +1,34 @@ +/* +* systray.c +* Copyright © 2008, 2009, 2010 Martin Duquesnoy +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following disclaimer +* in the documentation and/or other materials provided with the +* distribution. +* * Neither the name of the nor the names of its +* contributors may be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "wmfs.h" + diff --git a/src/wmfs.h b/src/wmfs.h index 8759a43..817391b 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -340,6 +340,9 @@ int statustext_text(StatusText *s, char *str); void statustext_normal(int sc, char *str); void statustext_handle(int sc, char *str); +/* systray.c */ + + /* layout.c */ void arrange(int screen, Bool update_layout); void freelayout(int screen);