[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