diff --git a/src/client.c b/src/client.c index f7e53b9..a66ad23 100644 --- a/src/client.c +++ b/src/client.c @@ -418,6 +418,7 @@ client_manage(Window w, XWindowAttributes *wa) client_raise(c); client_focus(c); setwinstate(c->win, NormalState); + ewmh_get_client_list(); ewmh_manage_window_type(c); arrange(); @@ -487,6 +488,8 @@ client_moveresize(Client *c, XRectangle geo, bool r) || c->geo.width != geo.width || c->geo.height != geo.height) { + if(tags[selscreen][seltag[selscreen]].layout.func == freelayout + || c->free); c->geo = c->ogeo = geo; /* Set the client screen */ @@ -665,6 +668,7 @@ client_unmanage(Client *c) frame_delete(c); XSync(dpy, False); XUngrabServer(dpy); + ewmh_get_client_list(); arrange(); XFree(c->title); free(c); diff --git a/src/event.c b/src/event.c index b72a548..bc8b7e3 100644 --- a/src/event.c +++ b/src/event.c @@ -70,32 +70,24 @@ buttonpress(XButtonEvent *ev) if(conf.root.mouse[i].func) conf.root.mouse[i].func(conf.root.mouse[i].cmd); - /* Tag */ + /* Tags */ for(i = 1; i < conf.ntag[selscreen] + 1; ++i) - { if(ev->window == infobar[selscreen].tags[i]->win) - { - if(ev->button == Button1) - tag_set(i); - if(ev->button == Button3) - tag_transfert(sel, i); - if(ev->button == Button4) - tag_set(seltag[selscreen] + 1); - if (ev->button == Button5) - tag_set(seltag[selscreen] - 1); - } - } + switch(ev->button) + { + case Button1: tag_set(i); break; + case Button3: tag_transfert(sel, i); break; + case Button4: tag_set(seltag[selscreen] + 1); break; + case Button5: tag_set(seltag[selscreen] - 1); break; + } /* Layout button */ if(ev->window == infobar[selscreen].layout_button->win) - { - if(ev->button == Button1 - || ev->button == Button4) - layoutswitch(True); - if(ev->button == Button3 - || ev->button == Button5) - layoutswitch(False); - } + switch(ev->button) + { + case Button1: case Button4: layoutswitch(True); break; + case Button3: case Button5: layoutswitch(False); break; + } return; } @@ -115,6 +107,7 @@ clientmessageevent(XClientMessageEvent *ev) for(i = 0; i < net_last; ++i) if(net_atom[i] == ev->message_type) mess_t = i; + if(ev->window == ROOT) { /* Manage _NET_CURRENT_DESKTOP */ @@ -125,19 +118,21 @@ clientmessageevent(XClientMessageEvent *ev) /* Manage _NET_ACTIVE_WINDOW */ else if(mess_t == net_active_window) - if((c = client_gb_win(ev->data.l[0]))) + if((c = client_gb_win((Window)ev->data.l[0]))) + { + tag_set(c->tag); client_focus(c); + } } - if((c = client_gb_win(ev->window))) - { - /* Manage _NET_WM_STATE */ - if(mess_t == net_wm_state) + /* Manage _NET_WM_STATE */ + if(mess_t == net_wm_state) + if((c = client_gb_win(ev->window))) ewmh_manage_net_wm_state(ev->data.l, c); - /* Manage _NET_CLOSE_WINDOW */ - if(mess_t == net_close_window) + /* Manage _NET_CLOSE_WINDOW */ + if(mess_t == net_close_window) + if((c = client_gb_win(ev->window))) client_kill(c); - } return; } @@ -426,7 +421,6 @@ getevent(XEvent ev) case UnmapNotify: unmapnotify(&ev.xunmap); break; } - //ewmh_get_current_desktop(); wait(&st); return; diff --git a/src/ewmh.c b/src/ewmh.c index 9671547..10d4b4c 100644 --- a/src/ewmh.c +++ b/src/ewmh.c @@ -43,6 +43,7 @@ void ewmh_init_hints(void) { net_atom[net_supported] = ATOM("_NET_SUPPORTED"); + net_atom[net_client_list] = ATOM("_NET_CLIENT_LIST"); net_atom[net_number_of_desktops] = ATOM("_NET_NUMBER_OF_DESKTOPS"); net_atom[net_current_desktop] = ATOM("_NET_CURRENT_DESKTOP"); net_atom[net_desktop_names] = ATOM("_NET_DESKTOP_NAMES"); @@ -61,6 +62,7 @@ ewmh_init_hints(void) net_atom[net_wm_state_skip_taskbar] = ATOM("_NET_WM_STATE_SKIP_TASKBAR"); net_atom[net_wm_state_fullscreen] = ATOM("_NET_WM_STATE_FULLSCREEN"); net_atom[net_wm_state_demands_attention] = ATOM("_NET_WM_STATE_DEMANDS_ATTENTION"); + net_atom[utf8_string] = ATOM("UTF8_STRING"); XChangeProperty(dpy, ROOT, net_atom[net_supported], XA_ATOM, 32, PropModeReplace, (uchar*)net_atom, net_last); @@ -101,6 +103,29 @@ ewmh_get_current_desktop(void) return; } +/** Get _NET_CLIENT_LIST +*/ +void +ewmh_get_client_list(void) +{ + Window *list; + Client *c; + int win_n; + + for(win_n = 0, c = clients; c; c = c->next, ++win_n); + list = emalloc(win_n, sizeof(Window)); + + for(win_n = 0, c = clients; c; c = c->next, ++win_n) + list[win_n] = c->win; + + XChangeProperty(dpy, ROOT, net_atom[net_client_list], XA_WINDOW, 32, + PropModeReplace, (uchar *)list, win_n); + + free(list); + + return; +} + /** The desktop names */ void @@ -123,7 +148,7 @@ ewmh_get_desktop_names(void) str[pos] = '\0'; } - XChangeProperty(dpy, ROOT, net_atom[net_desktop_names], XA_STRING, 8, + XChangeProperty(dpy, ROOT, net_atom[net_desktop_names], net_atom[utf8_string], 8, PropModeReplace, (uchar*)str, pos); free(str); @@ -158,7 +183,10 @@ ewmh_manage_net_wm_state(long data_l[], Client *c) else if(data_l[1] == net_atom[net_wm_state_demands_attention]) { if(data_l[0] == _NET_WM_STATE_ADD) + { + tag_set(c->tag); client_focus(c); + } if(data_l[0] == _NET_WM_STATE_REMOVE) if(c == sel) client_focus(NULL); diff --git a/src/layout.c b/src/layout.c index 8dfe526..a7ccd6d 100644 --- a/src/layout.c +++ b/src/layout.c @@ -85,11 +85,8 @@ layoutswitch(Bool b) screen_get_sel(); if(tags[selscreen][seltag[selscreen]].layout.func == freelayout) - { - deb(666); for(c = clients; c && (c->tag != seltag[selscreen] && c->screen != selscreen); c = c->next) c->ogeo = c->geo; - } for(i = 0; i < conf.nlayout; ++i) { diff --git a/src/structs.h b/src/structs.h index fe0b574..6f37bea 100644 --- a/src/structs.h +++ b/src/structs.h @@ -53,6 +53,7 @@ enum { net_supported, net_wm_name, + net_client_list, net_number_of_desktops, net_current_desktop, net_desktop_names, @@ -70,6 +71,7 @@ enum net_wm_state_skip_taskbar, net_wm_state_fullscreen, net_wm_state_demands_attention, + utf8_string, net_last }; typedef enum { Top, Bottom, Right, Left, Center, PositionLast } Position; diff --git a/src/wmfs.h b/src/wmfs.h index 19652fa..43b8f2f 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -144,6 +144,7 @@ void uicb_client_kill(uicb_t); void ewmh_init_hints(void); void ewmh_get_number_of_desktop(void); void ewmh_get_current_desktop(void); +void ewmh_get_client_list(void); void ewmh_get_desktop_names(void); void ewmh_manage_net_wm_state(long data_l[], Client *c); void ewmh_manage_window_type(Client *c);