ewmh: Add _NET_CLIENT_LIST ewmh support and UTF8_STRING for _NET_DESKTOP_NAMES
This commit is contained in:
parent
1454d4e7f7
commit
41e432371b
@ -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);
|
||||
|
||||
54
src/event.c
54
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;
|
||||
|
||||
30
src/ewmh.c
30
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);
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user