[Xcb-commit] tutorial
XCB site
xcb at freedesktop.org
Fri Jan 18 08:19:35 PST 2008
tutorial/mousecursors.mdwn | 533 +++++++++++++++++++--------------------------
1 file changed, 236 insertions(+), 297 deletions(-)
New commits:
commit cda7a6fb0e61602159c7333fe2c005d99bab90c3
Author: XCB site <xcb at freedesktop.org>
Date: Fri Jan 18 08:19:34 2008 -0800
web commit by bram
diff --git a/tutorial/mousecursors.mdwn b/tutorial/mousecursors.mdwn
index 7551e3f..5b63550 100644
--- a/tutorial/mousecursors.mdwn
+++ b/tutorial/mousecursors.mdwn
@@ -26,24 +26,19 @@ TODO: Describe source_char and mask_char, for example by giving an example on ho
So we first open that font (see Loading a Font) and create the new cursor. As for every X ressource, we have to ask for an X id with xcb\_generate\_id first:
- font;
- xcb_cursor_t cursor;
-
-
-
xcb_font_t font = xcb_generate_id (connection);
xcb_open_font (connection, font, strlen ("cursor"), "cursor");
cursor = xcb_generate_id (connection);
xcb_create_glyph_cursor (connection,
- cursor, // cursor id
- font, // source glyph font
- font, // mask glyph font
- 58, // source character glyph
- 58 + 1, // mask character glyph
- 0, 0, 0, 0, 0, 0); // r b g r b g
+ cursor, /* cursor id */
+ source_font, /* source glyph font */
+ mask_font, /* mask glyph font */
+ 58, /* source character glyph */
+ 58 + 1, /* mask character glyph */
+ 0, 0, 0, 0, 0, 0); /* r b g r b g */
-We have created the cursor "right hand" by specifying 58 to the source\_font argument and 58 + 1 to the mask\_font.
+We have created the cursor "right hand" by specifying 58 to the `source_font` argument and 58 + 1 to the `mask_font`.
The cursor is freed by using the function:
@@ -61,7 +56,7 @@ Once the cursor is created, we can modify the cursor of our window by using xcb\
/* ...assume cursor created here... */
- uint32_t mask = XCB_CWCURSOR;
+ uint32_t mask = XCB_CW_CURSOR;
uint32_t value_list = cursor;
xcb_change_window_attributes (connection, window, mask, &value_list);
@@ -81,61 +76,41 @@ The following example displays a window with a button. When entering the window,
#define HEIGHT 150
- static xcb_gc_t
- gc_font_get (xcb_connection_t *connection,
- xcb_screen_t *screen,
- xcb_window_t window,
- const char *font_name );
-
- static void
- button_draw (xcb_connection_t *connection,
- xcb_screen_t *screen,
- xcb_window_t window,
- int16_t x1,
- int16_t y1,
- const char *label );
+ /* ...assume prototypes for function defs below here... */
- static void
- text_draw (xcb_connection_t *connection,
- xcb_screen_t *screen,
- xcb_window_t window,
- int16_t x1,
- int16_t y1,
- const char *label );
+
+ /*
+ */
+ 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);
+ }
+ }
+
- static void
- cursor_set (xcb_connection_t *connection,
+ /*
+ */
+ static void
+ drawButton (xcb_connection_t *connection,
xcb_screen_t *screen,
xcb_window_t window,
- int cursor_id );
-
-
- static void
- button_draw (xcb_connection_t *connection,
- xcb_screen_t *screen,
- xcb_window_t window,
- int16_t x1,
- int16_t y1,
- const char *label )
+ int16_t x1,
+ int16_t y1,
+ const char *label )
{
- xcb_point_t points[5];
- xcb_void_cookie_t cookie_gc;
- xcb_void_cookie_t cookie_line;
- xcb_void_cookie_t cookie_text;
- xcb_generic_error_t *error;
- xcb_gcontext_t gc;
- int16_t width;
- int16_t height;
- uint8_t length;
- int16_t inset;
-
- length = strlen (label);
- inset = 2;
-
- gc = gc_font_get(c, screen, window, "7x13");
-
- width = 7 * length + 2 * (inset + 1);
- height = 13 + 2 * (inset + 1);
+ 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;
@@ -146,188 +121,152 @@ The following example displays a window with a button. When entering the window,
points[3].y = y1 - height;
points[4].x = x1;
points[4].y = y1;
- cookie_line = xcb_poly_line_checked (c, XCB_COORD_MODE_ORIGIN,
- window, gc, 5, points);
+
+
+ xcb_gcontext_t gc = getFontGC (connection, screen, window, "7x13");
- error = xcb_request_check (c, cookie_line);
- if (error) {
- fprintf (stderr, "ERROR: can't draw lines : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
- cookie_text = xcb_image_text_8_checked (c, length, window, gc,
- x1 + inset + 1,
- y1 - inset - 1, label);
-
- error = xcb_request_check (c, cookie_text);
- if (error) {
- fprintf (stderr, "ERROR: can't paste text : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
+ 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");
- cookie_gc = xcb_free_gc (c, gc);
- error = xcb_request_check (c, cookie_gc);
- if (error) {
- fprintf (stderr, "ERROR: can't free gc : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
+
+ 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");
}
+
/*
*/
static void
- text_draw (xcb_connection_t *connection,
- xcb_screen_t *screen,
- xcb_window_t window,
- int16_t x1,
- int16_t y1,
- const char *label )
+ drawText (xcb_connection_t *connection,
+ xcb_screen_t *screen,
+ xcb_window_t window,
+ int16_t x1,
+ int16_t y1,
+ const char *label )
{
- xcb_void_cookie_t cookie_gc;
- xcb_void_cookie_t cookie_text;
- xcb_generic_error_t *error;
- xcb_gcontext_t gc;
- uint8_t length;
- length = strlen (label);
+ xcb_gcontext_t gc = getFontGC (connection, screen, window, "7x13");
+
- gc = gc_font_get(c, 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");
- cookie_text = xcb_image_text_8_checked (c, length, window, gc,
- x1,
- y1, label);
- error = xcb_request_check (c, cookie_text);
- if (error) {
- fprintf (stderr, "ERROR: can't paste text : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
- cookie_gc = xcb_free_gc (c, gc);
- error = xcb_request_check (c, cookie_gc);
- if (error) {
- fprintf (stderr, "ERROR: can't free gc : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
+ xcb_void_cookie_t gcCookie = xcb_free_gc (connection, gc);
+ testCookie (gcCookie, connection, "can't free gc");
}
+
/*
*/
static xcb_gc_t
- gc_font_get (xcb_connection_t *connection,
- xcb_screen_t *screen,
- xcb_window_t window,
- const char *font_name )
+ getFontGC (xcb_connection_t *connection,
+ xcb_screen_t *screen,
+ xcb_window_t window,
+ const char *fontName )
{
- uint32_t value_list[3];
- xcb_void_cookie_t cookie_font;
- xcb_void_cookie_t cookie_gc;
- xcb_generic_error_t *error;
- xcb_font_t font;
- xcb_gcontext_t gc;
- uint32_t mask;
-
- font = xcb_generate_id (c);
- cookie_font = xcb_open_font_checked (c, font,
- strlen (font_name),
- font_name);
-
- error = xcb_request_check (c, cookie_font);
- if (error) {
- fprintf (stderr, "ERROR: can't open font : %d\n", error->error_code);
- xcb_disconnect (c);
- return -1;
- }
- gc = xcb_generate_id (c);
- mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT;
+ 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;
- cookie_gc = xcb_create_gc_checked (c, gc, window, mask, value_list);
- error = xcb_request_check (c, cookie_gc);
- if (error) {
- fprintf (stderr, "ERROR: can't create gc : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
+
+
+ xcb_void_cookie_t gcCookie = xcb_create_gc_checked (connection,
+ gc,
+ window,
+ mask,
+ value_list );
+ testCookie (gcCookie, connection, "can't create gc");
- cookie_font = xcb_close_font_checked (c, font);
- error = xcb_request_check (c, cookie_font);
- if (error) {
- fprintf (stderr, "ERROR: can't close font : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
+
+ fontCookie = xcb_close_font_checked (connection, font);
+ testCookie (fontCookie, connection, "can't close font");
return gc;
}
+
/*
*/
static void
- cursor_set (xcb_connection_t *connection,
+ setCursor (xcb_connection_t *connection,
xcb_screen_t *screen,
xcb_window_t window,
- int cursor_id )
+ int cursorId )
{
- uint32_t values_list[3];
- xcb_void_cookie_t cookie_font;
- xcb_void_cookie_t cookie_gc;
- xcb_generic_error_t *error;
- xcb_font_t font;
- xcb_cursor_t cursor;
- xcb_gcontext_t gc;
- uint32_t mask;
- uint32_t value_list;
-
- font = xcb_generate_id (c);
- cookie_font = xcb_open_font_checked (c, font,
- strlen ("cursor"),
- "cursor");
- error = xcb_request_check (c, cookie_font);
- if (error) {
- fprintf (stderr, "ERROR: can't open font : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
+ 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");
- cursor = xcb_generate_id (c);
- xcb_create_glyph_cursor (c, cursor, font, font,
- cursor_id, cursor_id + 1,
- 0, 0, 0,
- 0, 0, 0);
- gc = xcb_generate_id (c);
- mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_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;
- cookie_gc = xcb_create_gc_checked (c, gc, window, mask, values_list);
- error = xcb_request_check (c, cookie_gc);
- if (error) {
- fprintf (stderr, "ERROR: can't create gc : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
- mask = XCB_CW_CURSOR;
- value_list = cursor;
- xcb_change_window_attributes (c, window, mask, &value_list);
+ xcb_void_cookie_t gcCookie = xcb_create_gc_checked (connection, gc, window, mask, values_list);
+ testCookie (gcCookie, connection, "can't create gc");
- xcb_free_cursor (c, cursor);
- cookie_font = xcb_close_font_checked (c, font);
- error = xcb_request_check (c, cookie_font);
- if (error) {
- fprintf (stderr, "ERROR: can't close font : %d\n", error->error_code);
- xcb_disconnect (c);
- exit (-1);
- }
+ 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");
}
/*
@@ -335,124 +274,124 @@ The following example displays a window with a button. When entering the window,
int
main ()
{
- xcb_screen_iterator_t screen_iter;
- xcb_connection_t *c;
- const xcb_setup_t *setup;
- xcb_screen_t *screen;
- xcb_generic_event_t *e;
- xcb_generic_error_t *error;
- xcb_void_cookie_t cookie_window;
- xcb_void_cookie_t cookie_map;
- xcb_window_t window;
- uint32_t mask;
- uint32_t values[2];
- int screen_number;
- uint8_t is_hand = 0;
-
- /* getting the connection */
- c = xcb_connect (NULL, &screen_number);
- if (!c) {
- fprintf (stderr, "ERROR: can't connect to an X server\n");
- return -1;
- }
+ /* get the connection */
- /* getting the current screen */
- setup = xcb_get_setup (c);
+ int screenNum;
+ xcb_connection_t *connection = xcb_connect (NULL, &screenNum);
+ if (!connection) {
+ fprintf (stderr, "ERROR: can't connect to an X server\n");
+ return -1;
+ }
- screen = NULL;
- screen_iter = xcb_setup_roots_iterator (setup);
- for (; screen_iter.rem != 0; --screen_number, xcb_screen_next (&screen_iter))
- if (screen_number == 0)
- {
- screen = screen_iter.data;
- break;
- }
- if (!screen) {
- fprintf (stderr, "ERROR: can't get the current screen\n");
- xcb_disconnect (c);
- return -1;
- }
- /* creating the window */
- window = xcb_generate_id (c);
- mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
+ /* get the current screen */
+
+ xcb_screen_iterator_t iter = xcb_setup_roots_iterator (xcb_get_setup (connection));
+
+ /* we want the screen at index screenNum of the iterator */
+ for (int i = 0; i < screenNum; ++i) {
+ xcb_screen_next (&iter);
+ }
+
+ xcb_screen_t *screen = iter.data;
+
+ if (!screen) {
+ fprintf (stderr, "ERROR: can't get the current screen\n");
+ 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;
- cookie_window = xcb_create_window_checked (c,
- screen->root_depth,
- window, screen->root,
- 20, 200, WIDTH, HEIGHT,
- 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
- screen->root_visual,
- mask, values);
- cookie_map = xcb_map_window_checked (c, window);
-
- /* error managing */
- error = xcb_request_check (c, cookie_window);
- if (error) {
- fprintf (stderr, "ERROR: can't create window : %d\n", error->error_code);
- xcb_disconnect (c);
- return -1;
- }
- error = xcb_request_check (c, cookie_map);
- if (error) {
- fprintf (stderr, "ERROR: can't map window : %d\n", error->error_code);
- xcb_disconnect (c);
- return -1;
- }
+ 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");
- cursor_set (c, screen, window, 68);
- xcb_flush(c);
+ setCursor (connection, screen, window, 68);
+ xcb_flush(connection);
+
+
+ /* event loop */
+
+ uint8_t isHand = 0;
+
while (1) {
- e = xcb_poll_for_event(c);
- if (e) {
- switch (e->response_type & ~0x80) {
+ xcb_generic_event_t *event = xcb_poll_for_event (connection);
+ if (event) {
+ switch (event->response_type & ~0x80) {
case XCB_EXPOSE: {
- char *text;
-
- text = "click here to change cursor";
- button_draw (c, screen, window,
- (WIDTH - 7 * strlen(text)) / 2,
- (HEIGHT - 16) / 2, text);
+ 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...";
- text_draw (c, screen, window, 10, HEIGHT - 10, text);
+ drawText (connection,
+ screen,
+ window,
+ 10,
+ HEIGHT - 10,
+ text );
break;
}
case XCB_BUTTON_PRESS: {
- xcb_button_press_event_t *ev;
- int length;
-
- ev = (xcb_button_press_event_t *)e;
- length = strlen ("click here to change cursor");
-
- if ((ev->event_x >= (WIDTH - 7 * length) / 2) &&
- (ev->event_x <= ((WIDTH - 7 * length) / 2 + 7 * length + 6)) &&
- (ev->event_y >= (HEIGHT - 16) / 2 - 19) &&
- (ev->event_y <= ((HEIGHT - 16) / 2)))
- is_hand = 1 - is_hand;
+ 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;
+ }
- is_hand ? cursor_set (c, screen, window, 58) : cursor_set (c, screen, window, 68);
+ if (isHand) {
+ cursor_set (connection, screen, window, 58)
+ }
+ else {
+ cursor_set (connection, screen, window, 68);
+ }
}
case XCB_KEY_RELEASE: {
- xcb_key_release_event_t *ev = (xcb_key_release_event_t *)e;
+ xcb_key_release_event_t *kr = (xcb_key_release_event_t *)event;
- switch (ev->detail) {
+ switch (kr->detail) {
/* ESC */
case 9:
- free (e);
- xcb_disconnect (c);
+ free (event);
+ xcb_disconnect (connection);
return 0;
}
}
}
- free (e);
+ free (event);
}
}
More information about the xcb-commit
mailing list