add support for NET_CLOSE_WINDOW

This commit is contained in:
Julien Danjou 2007-12-27 20:49:38 +01:00
parent 38c3547dfb
commit 87fce96644
7 changed files with 51 additions and 15 deletions

View File

@ -366,6 +366,7 @@ main(int argc, char *argv[])
handler[MapRequest] = handle_event_maprequest;
handler[PropertyNotify] = handle_event_propertynotify;
handler[UnmapNotify] = handle_event_unmapnotify;
handler[ClientMessage] = handle_event_clientmessage;
/* check for shape extension */
if((globalconf.have_shape = XShapeQueryExtension(dpy, &shape_event, &e_dummy)))

View File

@ -781,6 +781,26 @@ uicb_client_moveresize(int screen, char *arg)
}
}
void
client_kill(Client *c)
{
XEvent ev;
if(isprotodel(c->display, c->win))
{
ev.type = ClientMessage;
ev.xclient.window = c->win;
ev.xclient.message_type = XInternAtom(globalconf.display, "WM_PROTOCOLS", False);
ev.xclient.format = 32;
ev.xclient.data.l[0] = XInternAtom(globalconf.display, "WM_DELETE_WINDOW", False);
ev.xclient.data.l[1] = CurrentTime;
XSendEvent(globalconf.display, c->win, False, NoEventMask, &ev);
}
else
XKillClient(globalconf.display, c->win);
}
/** Kill selected client
* \param screen Screen ID
* \param arg unused
@ -789,22 +809,9 @@ uicb_client_moveresize(int screen, char *arg)
void
uicb_client_kill(int screen __attribute__ ((unused)), char *arg __attribute__ ((unused)))
{
XEvent ev;
Client *sel = globalconf.focus->client;
if(!sel)
return;
if(isprotodel(sel->display, sel->win))
{
ev.type = ClientMessage;
ev.xclient.window = sel->win;
ev.xclient.message_type = XInternAtom(globalconf.display, "WM_PROTOCOLS", False);
ev.xclient.format = 32;
ev.xclient.data.l[0] = XInternAtom(globalconf.display, "WM_DELETE_WINDOW", False);
ev.xclient.data.l[1] = CurrentTime;
XSendEvent(globalconf.display, sel->win, False, NoEventMask, &ev);
}
else
XKillClient(globalconf.display, sel->win);
if(sel)
client_kill(sel);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -39,6 +39,7 @@ void client_updatewmhints(Client *);
void client_updatesizehints(Client *);
void client_updatetitle(Client *);
void client_saveprops(Client *, int);
void client_kill(Client *);
UICB_PROTO(uicb_client_kill);
UICB_PROTO(uicb_client_moveresize);

View File

@ -34,6 +34,7 @@
#include "util.h"
#include "window.h"
#include "mouse.h"
#include "ewmh.h"
#include "layouts/tile.h"
#include "layouts/floating.h"
@ -403,6 +404,12 @@ handle_event_randr_screen_change_notify(XEvent *e)
XRRUpdateConfiguration(e);
}
void
handle_event_clientmessage(XEvent *e)
{
ewmh_process_client_message(&e->xclient);
}
void
grabkeys(int phys_screen)
{

View File

@ -42,6 +42,7 @@ void handle_event_propertynotify(XEvent *);
void handle_event_unmapnotify(XEvent *);
void handle_event_shape(XEvent *);
void handle_event_randr_screen_change_notify(XEvent *);
void handle_event_clientmessage(XEvent *);
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

16
ewmh.c
View File

@ -36,6 +36,8 @@ static Atom net_current_desktop;
static Atom net_desktop_names;
static Atom net_active_window;
static Atom net_close_window;
static Atom net_wm_name;
static Atom net_wm_icon;
@ -56,6 +58,8 @@ static AtomItem AtomNames[] =
{ "_NET_DESKTOP_NAMES", &net_desktop_names },
{ "_NET_ACTIVE_WINDOW", &net_active_window },
{ "_NET_CLOSE_WINDOW", &net_close_window },
{ "_NET_WM_NAME", &net_wm_name },
{ "_NET_WM_ICON", &net_wm_icon },
@ -90,6 +94,8 @@ ewmh_set_supported_hints(int phys_screen)
atom[i++] = net_current_desktop;
atom[i++] = net_desktop_names;
atom[i++] = net_active_window;
atom[i++] = net_close_window;
atom[i++] = net_wm_name;
atom[i++] = net_wm_icon;
@ -184,4 +190,14 @@ ewmh_update_net_active_window(int phys_screen)
net_active_window, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &win, 1);
}
void
ewmh_process_client_message(XClientMessageEvent *ev)
{
Client *c;
if(ev->message_type == net_close_window)
if((c = get_client_bywin(globalconf.clients, ev->window)))
client_kill(c);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

3
ewmh.h
View File

@ -22,6 +22,8 @@
#ifndef AWESOME_EWMH_H
#define AWESOME_EWMH_H
#include <X11/Xlib.h>
void ewmh_init_atoms(void);
void ewmh_set_supported_hints(int);
void ewmh_update_net_client_list(int);
@ -29,6 +31,7 @@ void ewmh_update_net_numbers_of_desktop(int);
void ewmh_update_net_current_desktop(int);
void ewmh_update_net_desktop_names(int);
void ewmh_update_net_active_window(int);
void ewmh_process_client_message(XClientMessageEvent *);
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80