[Xcb] is it possible to monitor events in other windows?
Christian Linhart
chris at DemoRecorder.com
Mon Oct 20 07:53:06 PDT 2014
Hi Patrick,
The function xcb_wait_for_event does not have an implicit window passed.
It waits for all events that have been selected using the appropriate X11-requests.
There are X11-requests for selecting which events your application subscribes to for which window.
Please read the man-pages for the Xlib-functions
XSelectInput
and
XSelectExtensionEvent
for details.
Selecting events via XCB is similar to the Xlib-functions.
You just have to use the underlying X11-request.
Hope this helps,
Chris
P.S.: This mailinglist is primarily for the development for XCB itself.
For questions about X11-programming, with or without XCB, there may be better forums or websites.
On 10/20/14 16:00, Patrick wrote:
> Hi Everyone
>
> So this is a bit of a long story and to keep it suitable for the mailing list, I am basically trying to monitor mouse clicks in a terminal under X as opposed to using gpm through ncurses.
>
> I have chopped down an example from freedsktop.org and I have it pasted at the end of this email.
>
> This is the part I am confused about:
> xcb_wait_for_event (c)
>
>
> This is responding to events in the window created but is the windows ID passed implicitly ? Is there a way to pass another windows ID ? I am basically planning on creating a small xcb program that will take the window ID of the terminal that the program is running in, I don't want to create another window.
>
> Thanks for reading my post-Patrick
>
>
>
>
> code-->---------------------------->
>
> #include <stdlib.h>
> #include <stdio.h>
> #include <xcb/xcb.h>
>
> int main (int argc, int * argv[])
> {
> xcb_connection_t *c;
> xcb_screen_t *screen;
> xcb_window_t win;
> xcb_generic_event_t *e;
> uint32_t mask = 0;
> uint32_t values[2];
>
> /* Open the connection to the X server */
> c = xcb_connect (NULL, NULL);
>
> /* Get the first screen */
> screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
>
> /* Ask for our window's Id */
> win = xcb_generate_id (c);
> // win = 65574484 ;
>
> /* Create the window */
> mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
> values[0] = screen->white_pixel;
> values[1] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE;
> xcb_create_window (c, /* Connection */
> 0, /* depth */
> win, /* window Id */
> screen->root, /* parent window */
> 0, 0, /* x, y */
> 150, 150, /* width, height */
> 10, /* border_width */
> XCB_WINDOW_CLASS_INPUT_OUTPUT, /* class */
> screen->root_visual, /* visual */
> mask, values); /* masks */
>
> /* Map the window on the screen */
> xcb_map_window (c, win);
> xcb_flush (c);
> //CONFUSED HERE
> while ( (e = xcb_wait_for_event (c) ) ) {
> switch (e->response_type & ~0x80) {
>
> case XCB_BUTTON_RELEASE: {
> xcb_button_release_event_t *ev = (xcb_button_release_event_t *)e;
> printf ("Button %d released in window %ld, at coordinates (%d,%d)\n", ev->detail, ev->event, ev->event_x, ev->event_y);
> break;
> }
>
> case XCB_KEY_PRESS: {
> xcb_key_press_event_t *ev = (xcb_key_press_event_t *)e;
> printf ("Key pressed in window %ld\n", ev->event);
> break;
> }
> case XCB_KEY_RELEASE: {
> xcb_key_release_event_t *ev = (xcb_key_release_event_t *)e;
> printf ("Key released in window %ld\n", ev->event);
> break;
> }
> default:
> ;
> break;
> }
> /* Free the Generic Event */
> free (e);
> }
>
> return 0;
> }
> _______________________________________________
> Xcb mailing list
> Xcb at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xcb
>
More information about the Xcb
mailing list