diff options
author | SurferRosa <SurferRosa@web> | 2012-09-08 10:42:44 -0700 |
---|---|---|
committer | XCB site <xcb@freedesktop.org> | 2012-09-08 10:42:44 -0700 |
commit | 7641419dbbe6ea3a998b4ce376fa72f71e1c2243 (patch) | |
tree | e5c5ad382d10598de58e27ad599854517fba0901 | |
parent | 51118c10d411873b01216a501d202608d2bf3a3f (diff) |
Fixed a few typos in the complete example. Now it is compileable (gcc -std=c99 -lxcb main.c).
-rw-r--r-- | tutorial/mousecursors.mdwn | 509 |
1 files changed, 242 insertions, 267 deletions
diff --git a/tutorial/mousecursors.mdwn b/tutorial/mousecursors.mdwn index 5b63550..c49041f 100644 --- a/tutorial/mousecursors.mdwn +++ b/tutorial/mousecursors.mdwn @@ -72,210 +72,191 @@ The following example displays a window with a button. When entering the window, #include <xcb/xcb.h> - #define WIDTH 300 - #define HEIGHT 150 + #define WIDTH 300 + #define HEIGHT 150 + static void testCookie(xcb_void_cookie_t, xcb_connection_t*, char *); + static void drawButton(xcb_connection_t*, xcb_screen_t*, xcb_window_t, int16_t, int16_t, const char*); + static void drawText(xcb_connection_t*, xcb_screen_t*, xcb_window_t, int16_t, int16_t, const char*); + static xcb_gc_t getFontGC(xcb_connection_t*, xcb_screen_t*, xcb_window_t, const char*); + static void setCursor (xcb_connection_t*, xcb_screen_t*, xcb_window_t, int); - /* ...assume prototypes for function defs below here... */ - - - /* - */ + /* + */ static void testCookie (xcb_void_cookie_t cookie, - xcb_connection_t *connection, - char *errMessage ) - { - xcb_generic_error_t *error = xcb_request_check (connection, cookie); - if (error) { - fprintf (stderr, "ERROR: %s : %d\n", errMessage , error->error_code); - xcb_disconnect (connection); - exit (-1); - } - } - + xcb_connection_t *connection, + char *errMessage ) + { + xcb_generic_error_t *error = xcb_request_check (connection, cookie); + if (error) { + fprintf (stderr, "ERROR: %s : %d\n", errMessage , error->error_code); + xcb_disconnect (connection); + exit (-1); + } + } - /* - */ + /* + */ static void drawButton (xcb_connection_t *connection, - xcb_screen_t *screen, - xcb_window_t window, - int16_t x1, - int16_t y1, - const char *label ) - { - uint8_t length = strlen (label); - int16_t inset = 2; - int16_t width = 7 * length + 2 * (inset + 1); - int16_t height = 13 + 2 * (inset + 1); - - xcb_point_t points[5]; - points[0].x = x1; - points[0].y = y1; - points[1].x = x1 + width; - points[1].y = y1; - points[2].x = x1 + width; - points[2].y = y1 - height; - points[3].x = x1; - points[3].y = y1 - height; - points[4].x = x1; - points[4].y = y1; - - - xcb_gcontext_t gc = getFontGC (connection, screen, window, "7x13"); - - - xcb_void_cookie_t lineCookie = xcb_poly_line_checked (connection, - XCB_COORD_MODE_ORIGIN, - window, - gc, - 5, - points ); - testCookie (lineCookie, connection, "can't draw lines"); - - - xcb_void_cookie_t textCookie = xcb_image_text_8_checked (connection, - length, - window, - gc, - x1 + inset + 1, - y1 - inset - 1, - label ); - testCookie (textCookie, connection, "can't paste text"); - - - gcCookie = xcb_free_gc (connection, gc); - testCookie (gcCookie, connection, "can't free gc"); + xcb_screen_t *screen, + xcb_window_t window, + int16_t x1, + int16_t y1, + const char *label ) + { + uint8_t length = strlen (label); + int16_t inset = 2; + int16_t width = 7 * length + 2 * (inset + 1); + int16_t height = 13 + 2 * (inset + 1); + + xcb_point_t points[5]; + points[0].x = x1; + points[0].y = y1; + points[1].x = x1 + width; + points[1].y = y1; + points[2].x = x1 + width; + points[2].y = y1 - height; + points[3].x = x1; + points[3].y = y1 - height; + points[4].x = x1; + points[4].y = y1; + + xcb_gcontext_t gc = getFontGC (connection, screen, window, "7x13"); + xcb_void_cookie_t lineCookie = xcb_poly_line_checked (connection, + XCB_COORD_MODE_ORIGIN, + window, + gc, + 5, + points ); + testCookie (lineCookie, connection, "can't draw lines"); + + xcb_void_cookie_t textCookie = xcb_image_text_8_checked (connection, + length, + window, + gc, + x1 + inset + 1, + y1 - inset - 1, + label ); + testCookie (textCookie, connection, "can't paste text"); + + xcb_void_cookie_t gcCookie = xcb_free_gc (connection, gc); + testCookie (gcCookie, connection, "can't free gc"); } - - + /* */ static void drawText (xcb_connection_t *connection, - xcb_screen_t *screen, - xcb_window_t window, - int16_t x1, - int16_t y1, - const char *label ) + xcb_screen_t *screen, + xcb_window_t window, + int16_t x1, + int16_t y1, + const char *label ) { - xcb_gcontext_t gc = getFontGC (connection, screen, window, "7x13"); - - - xcb_void_cookie_t textCookie = xcb_image_text_8_checked (connection, - strlen (label), - window, - gc, - x1, - y1, - label ); - testCookie(textCookie, connection, "can't paste text"); - - - xcb_void_cookie_t gcCookie = xcb_free_gc (connection, gc); - testCookie (gcCookie, connection, "can't free gc"); + xcb_gcontext_t gc = getFontGC (connection, screen, window, "7x13"); + xcb_void_cookie_t textCookie = xcb_image_text_8_checked (connection, + strlen (label), + window, + gc, + x1, + y1, + label ); + testCookie(textCookie, connection, "can't paste text"); + + xcb_void_cookie_t gcCookie = xcb_free_gc (connection, gc); + testCookie (gcCookie, connection, "can't free gc"); } - /* */ static xcb_gc_t getFontGC (xcb_connection_t *connection, - xcb_screen_t *screen, - xcb_window_t window, - const char *fontName ) + xcb_screen_t *screen, + xcb_window_t window, + const char *fontName ) { - xcb_font_t font = xcb_generate_id (connection); - xcb_void_cookie_t fontCookie = xcb_open_font_checked (cookie, - font, - strlen (fontName), - font_name ); - testCookie (fontCookie, connection, "can't open font"); - - - xcb_gcontext_t gc = xcb_generate_id (c); - uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT; - uint32_t value_list[3]; - value_list[0] = screen->black_pixel; - value_list[1] = screen->white_pixel; - value_list[2] = font; - - - xcb_void_cookie_t gcCookie = xcb_create_gc_checked (connection, - gc, - window, - mask, - value_list ); - testCookie (gcCookie, connection, "can't create gc"); - - - fontCookie = xcb_close_font_checked (connection, font); - testCookie (fontCookie, connection, "can't close font"); - - return gc; + xcb_font_t font = xcb_generate_id (connection); + xcb_void_cookie_t fontCookie = xcb_open_font_checked (connection, + font, + strlen (fontName), + fontName ); + testCookie (fontCookie, connection, "can't open font"); + + xcb_gcontext_t gc = xcb_generate_id (connection); + uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT; + uint32_t value_list[3]; + value_list[0] = screen->black_pixel; + value_list[1] = screen->white_pixel; + value_list[2] = font; + + xcb_void_cookie_t gcCookie = xcb_create_gc_checked (connection, + gc, + window, + mask, + value_list ); + testCookie (gcCookie, connection, "can't create gc"); + + fontCookie = xcb_close_font_checked (connection, font); + testCookie (fontCookie, connection, "can't close font"); + + return gc; } - /* */ static void setCursor (xcb_connection_t *connection, - xcb_screen_t *screen, - xcb_window_t window, - int cursorId ) + xcb_screen_t *screen, + xcb_window_t window, + int cursorId ) { - xcb_font_t font = xcb_generate_id (connection); - xcb_void_cookie_t fontCookie = xcb_open_font_checked (connection, - font, - strlen ("cursor"), - "cursor" ); - testCookie (fontCookie, connection, "can't open font"); - - - xcb_cursor_t cursor = xcb_generate_id (connection); - xcb_create_glyph_cursor (connection, - cursor, - font, - font, - cursorId, - cursorId + 1, - 0, 0, 0, 0, 0, 0 ); - - - xcb_gcontext_t gc = xcb_generate_id (connection); - - uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT; - uint32_t values_list[3]; - values_list[0] = screen->black_pixel; - values_list[1] = screen->white_pixel; - values_list[2] = font; - - xcb_void_cookie_t gcCookie = xcb_create_gc_checked (connection, gc, window, mask, values_list); - testCookie (gcCookie, connection, "can't create gc"); - - - uint32_t mask = XCB_CW_CURSOR; - uint32_t value_list = cursor; - xcb_change_window_attributes (connection, window, mask, &value_list); - - - xcb_free_cursor (connection, cursor); - - - fontCookie = xcb_close_font_checked (connection, font); - testCookie (fontCookie, connection, "can't close font"); + xcb_font_t font = xcb_generate_id (connection); + xcb_void_cookie_t fontCookie = xcb_open_font_checked (connection, + font, + strlen ("cursor"), + "cursor" ); + testCookie (fontCookie, connection, "can't open font"); + + xcb_cursor_t cursor = xcb_generate_id (connection); + xcb_create_glyph_cursor (connection, + cursor, + font, + font, + cursorId, + cursorId + 1, + 0, 0, 0, 0, 0, 0 ); + + xcb_gcontext_t gc = xcb_generate_id (connection); + + uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT; + uint32_t values_list[3]; + values_list[0] = screen->black_pixel; + values_list[1] = screen->white_pixel; + values_list[2] = font; + + xcb_void_cookie_t gcCookie = xcb_create_gc_checked (connection, gc, window, mask, values_list); + testCookie (gcCookie, connection, "can't create gc"); + + mask = XCB_CW_CURSOR; + uint32_t value_list = cursor; + xcb_change_window_attributes (connection, window, mask, &value_list); + + xcb_free_cursor (connection, cursor); + + fontCookie = xcb_close_font_checked (connection, font); + testCookie (fontCookie, connection, "can't close font"); } /* */ - int + int main () { - /* get the connection */ - + /* get the connection */ int screenNum; xcb_connection_t *connection = xcb_connect (NULL, &screenNum); if (!connection) { @@ -283,7 +264,6 @@ The following example displays a window with a button. When entering the window, return -1; } - /* get the current screen */ xcb_screen_iterator_t iter = xcb_setup_roots_iterator (xcb_get_setup (connection)); @@ -300,101 +280,96 @@ The following example displays a window with a button. When entering the window, xcb_disconnect (connection); return -1; } - - - /* create the window */ - - xcb_window_t window = xcb_generate_id (connection); - uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; - uint32_t values[2]; - values[0] = screen->white_pixel; - values[1] = XCB_EVENT_MASK_KEY_RELEASE | - XCB_EVENT_MASK_BUTTON_PRESS | - XCB_EVENT_MASK_EXPOSURE | - XCB_EVENT_MASK_POINTER_MOTION; - - - windowCookie = xcb_create_window_checked (connection, - screen->root_depth, - window, - screen->root, - 20, 200, WIDTH, HEIGHT, - 0, - XCB_WINDOW_CLASS_INPUT_OUTPUT, - screen->root_visual, - mask, values ); - testCookie (windowCookie, connection, "can't create window"); - - - mapCookie = xcb_map_window_checked (connection, window); - testCookie (mapCookie, connection, "can't map window"); - - - setCursor (connection, screen, window, 68); - - xcb_flush(connection); - - - /* event loop */ - - uint8_t isHand = 0; - - while (1) { - xcb_generic_event_t *event = xcb_poll_for_event (connection); - if (event) { - switch (event->response_type & ~0x80) { - case XCB_EXPOSE: { - char *text = "click here to change cursor"; - drawButton (connection, - screen, - window, - (WIDTH - 7 * strlen(text)) / 2, - (HEIGHT - 16) / 2, - text ); - - text = "Press ESC key to exit..."; - drawText (connection, - screen, - window, - 10, - HEIGHT - 10, - text ); - break; - } - case XCB_BUTTON_PRESS: { - xcb_button_press_event_t *press = (xcb_button_press_event_t *)event; - - int length = strlen ("click here to change cursor"); - if ((press->event_x >= (WIDTH - 7 * length) / 2) && - (press->event_x <= ((WIDTH - 7 * length) / 2 + 7 * length + 6)) && - (press->event_y >= (HEIGHT - 16) / 2 - 19) && - (press->event_y <= ((HEIGHT - 16) / 2))) { - is_hand = 1 - is_hand; - } - - if (isHand) { - cursor_set (connection, screen, window, 58) - } - else { - cursor_set (connection, screen, window, 68); - } - } - case XCB_KEY_RELEASE: { - xcb_key_release_event_t *kr = (xcb_key_release_event_t *)event; - - switch (kr->detail) { - /* ESC */ - case 9: - free (event); - xcb_disconnect (connection); - return 0; - } - } - } - free (event); - } - } - - return 0; - } + + /* create the window */ + + xcb_window_t window = xcb_generate_id (connection); + uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; + uint32_t values[2]; + values[0] = screen->white_pixel; + values[1] = XCB_EVENT_MASK_KEY_RELEASE | + XCB_EVENT_MASK_BUTTON_PRESS | + XCB_EVENT_MASK_EXPOSURE | + XCB_EVENT_MASK_POINTER_MOTION; + + xcb_void_cookie_t windowCookie = xcb_create_window_checked (connection, + screen->root_depth, + window, + screen->root, + 20, 200, WIDTH, HEIGHT, + 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + screen->root_visual, + mask, values ); + testCookie (windowCookie, connection, "can't create window"); + + xcb_void_cookie_t mapCookie = xcb_map_window_checked (connection, window); + testCookie (mapCookie, connection, "can't map window"); + + setCursor (connection, screen, window, 68); + + xcb_flush(connection); + + /* event loop */ + + uint8_t isHand = 0; + + while (1) { + xcb_generic_event_t *event = xcb_poll_for_event (connection); + if (event) { + switch (event->response_type & ~0x80) { + case XCB_EXPOSE: { + char *text = "click here to change cursor"; + drawButton (connection, + screen, + window, + (WIDTH - 7 * strlen(text)) / 2, + (HEIGHT - 16) / 2, + text ); + + text = "Press ESC key to exit..."; + drawText (connection, + screen, + window, + 10, + HEIGHT - 10, + text ); + break; + } + case XCB_BUTTON_PRESS: { + xcb_button_press_event_t *press = (xcb_button_press_event_t *)event; + + int length = strlen ("click here to change cursor"); + if ((press->event_x >= (WIDTH - 7 * length) / 2) && + (press->event_x <= ((WIDTH - 7 * length) / 2 + 7 * length + 6)) && + (press->event_y >= (HEIGHT - 16) / 2 - 19) && + (press->event_y <= ((HEIGHT - 16) / 2))) { + isHand = 1 - isHand; + } + + if (isHand) { + setCursor (connection, screen, window, 58); + } + else { + setCursor (connection, screen, window, 68); + } + } + case XCB_KEY_RELEASE: { + xcb_key_release_event_t *kr = (xcb_key_release_event_t *)event; + + switch (kr->detail) { + /* ESC */ + case 9: + free (event); + xcb_disconnect (connection); + return 0; + } + } + } + free (event); + } + } + + return 0; + } |