[Xcb] Handling Close Event
Cinolt
cinolt.yk at gmail.com
Fri Dec 31 10:18:29 PST 2010
Never mind, after experimenting more I figured it out. Thanks again for your
help.
#include <stdio.h>
#include <stdint.h>
#include <xcb/xcb.h>
int main()
{
xcb_connection_t* c = xcb_connect(0, 0);
xcb_screen_t* s = xcb_setup_roots_iterator(xcb_get_setup(c)).data;
xcb_window_t w = xcb_generate_id(c);
const uint32_t values = XCB_EVENT_MASK_EXPOSURE;
xcb_create_window(c, 0, w, (*s).root, 0, 0, 128, 128, 0,
XCB_WINDOW_CLASS_INPUT_OUTPUT, (*s).root_visual, XCB_CW_EVENT_MASK,
&values);
xcb_intern_atom_cookie_t cookie = xcb_intern_atom(c, 1, 12,
"WM_PROTOCOLS");
xcb_intern_atom_reply_t* reply = xcb_intern_atom_reply(c, cookie, 0);
xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(c, 0, 16,
"WM_DELETE_WINDOW");
xcb_intern_atom_reply_t* reply2 = xcb_intern_atom_reply(c, cookie2, 0);
xcb_change_property(c, XCB_PROP_MODE_REPLACE, w, (*reply).atom, 4, 32, 1,
&(*reply2).atom);
xcb_map_window(c, w);
xcb_flush(c);
xcb_generic_event_t* event;
while((event = xcb_wait_for_event(c)))
{
puts("Event occurred");
switch((*event).response_type & ~0x80)
{
case XCB_EXPOSE:
puts("Expose");
break;
case XCB_CLIENT_MESSAGE:
{
puts("Client Message");
if((*(xcb_client_message_event_t*)event).data.data32[0] ==
(*reply2).atom)
{
puts("Kill client");
return 0;
}
break;
}
}
}
return 0;
}
On Fri, Dec 31, 2010 at 1:00 PM, Cinolt <cinolt.yk at gmail.com> wrote:
> I've changed the property as you specified, however it seems the event
> isn't being sent. Here is my code:
>
> #include <stdio.h>
> #include <stdint.h>
> #include <xcb/xcb.h>
>
> int main()
> {
> xcb_connection_t* c = xcb_connect(0, 0);
> xcb_screen_t* s = xcb_setup_roots_iterator(xcb_get_setup(c)).data;
>
> xcb_window_t w = xcb_generate_id(c);
>
> const uint32_t values = XCB_EVENT_MASK_EXPOSURE;
>
> xcb_create_window(c, 0, w, (*s).root, 0, 0, 128, 128, 0,
> XCB_WINDOW_CLASS_INPUT_OUTPUT, (*s).root_visual, XCB_CW_EVENT_MASK,
> &values);
>
> xcb_intern_atom_cookie_t cookie = xcb_intern_atom(c, 1, 12,
> "WM_PROTOCOLS");
> xcb_intern_atom_reply_t* reply = xcb_intern_atom_reply(c, cookie, 0);
>
> xcb_change_property(c, XCB_PROP_MODE_REPLACE, w, (*reply).atom, 4, 32, 1,
> "WM_DELETE_WINDOW");
>
> xcb_map_window(c, w);
> xcb_flush(c);
>
> xcb_generic_event_t* event;
> while((event = xcb_wait_for_event(c)))
> {
> puts("Event occurred");
> switch((*event).response_type & ~0x80)
> {
> case XCB_EXPOSE:
> puts("Expose");
> break;
> }
> }
>
> return 0;
> }
>
> It should output "Event occurred" when any event occurs, and it does for
> Expose events, but not when I close out of the window. Any suggestions?
>
>
> On Fri, Dec 31, 2010 at 5:55 AM, Vincent Torri <vtorri at univ-evry.fr>wrote:
>
>>
>>
>> On Fri, 31 Dec 2010, Cinolt wrote:
>>
>> Hello, I'm assuming that I need to call xcb_change_property on my window
>>> to
>>> change one of its properties. What should I set the type argument to, and
>>> am
>>> I correct in assuming that the data argument should be
>>> "WM_DELETE_WINDOW"?
>>>
>>> xcb_void_cookie_t xcb_change_property (xcb_connection_t *c,
>>> /* Connection to the X server */
>>> uint8_t mode,
>>> /* Property mode */
>>> xcb_window_t window,
>>> /* Window */
>>> xcb_atom_t property,
>>> /* Property to change */
>>> xcb_atom_t type,
>>> /* Type of the property */
>>> uint8_t format,
>>> /* Format of the property (8, 16, 32) */
>>> uint32_t data_len,
>>> /* Length of the data parameter */
>>> const void *data); /*
>>> Data */
>>>
>>
>> I give you the way to find it by yourself if later you need to use ICCCM
>> or EWMH again).
>>
>> In the link i gave you [1], it is a subsection of the ClientMessage events
>> [2]. It is said that the window you want to delete should have the
>> WM_PROTOCOLS property, with the atom WM_DELETE_WINDOW and that is it related
>> to the ClientMessage event (see section 4.1.2.7) [3].
>>
>> So you need to change the property of your window. And indeed, you use
>> xcb_change_property() to do that:
>>
>>
>> xcb_void_cookie_t xcb_change_property(
>> xcb_connection_t *c, /* Connection */
>>
>> uint8_t mode, /* Property mode */
>> xcb_window_t window, /* Window */
>> xcb_atom_t property, /* Property to change */
>> xcb_atom_t type, /* Type of the property */
>> uint8_t format, /* Format of the property (8, 16, 32) */
>> uint32_t data_len, /* Length of the data parameter */
>> const void *data); /* Data */
>>
>> * the parameters c and window are trivial.
>> * mode: what you do with that property (replacing a value, append or
>> prepend it). Replace it by passing XCB_PROP_MODE_REPLACE
>> * property: create an atom with the "WM_PROTOCOLS" string (see
>> xcb_inter_atom* functions)
>> * type: the type of the property WM_PROTOCOLS is an atom (first ine of
>> [3], so create an atom with the "ATOM" string (or use the value 4
>> for the parameter 'type' as it is a predefined value).
>> * format: as [2] mentions, it is 32
>> * data is an array of the atoms you want to set for the WM_PROTOCOLS
>> property. Here, it is just one atom: the WM_DELETE_WINDOW one (create
>> it with "WM_DELETE_WINDOW")
>> * data_len is the length of the above array, so pass just 1.
>>
>> Note that you can pass several atoms and not just only one: see [3] or
>> [4].
>>
>> So now, when that window is deleted by clicking on the cross of the
>> titlebar, you'll get a ClientMessage event in your event loop. See [2] to
>> know what to do with that event.
>>
>> Vincent
>>
>>
>> [1] http://tronche.com/gui/x/icccm/sec-4.html#s-4.2.8.1
>> [2] http://tronche.com/gui/x/icccm/sec-4.html#s-4.2.8
>> [3] http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.2.7
>> [4] http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#id2507897
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/xcb/attachments/20101231/faa08a6c/attachment.html>
More information about the Xcb
mailing list