Re: Need help with creating a GUI window on Linux using libxcb.so XCB API

new topic     » goto parent     » topic index » view thread      » older message » newer message
system_X said...

I'm trying to use the XCB API to create a Window on Peppermint Linux(based on Ubuntu 13.04) and not really sure how to do it. Many of us could learn quite a bit from seeing this program wrote in Euphoria if someone wants to show us how it's done?

Here is a small C program to create a window of size 150x150 pixels, positioned at the top-left corner of the screen. Source code located at XCB Tutorial :

Here's my (untested) port to Eu:

include std/dll.e 
atom libxcb 
libxcb = open_dll("libxcb.so") -- Must have a 32bit .so installed if on a 64bit machine. 
if libxcb = 0 then -- libxcb will be 0 if the library cannot be opened. 
   puts(1, "Could not open libxcb.so!\n) 
end if 
 
constant xcb_connect_ = define_c_func(libxcb, "xcb_connect", {C_POINTER, C_POINTER}, C_POINTER), 
xcb_get_setup_ = define_c_func(libxcb, "xcb_get_setup", {C_POINTER}, C_POINTER), 
-- C wrapper code 
--xcb_setup_roots_iterator_ = define_c_func(open_dll("libxcbeuwrapper.so"), "eu_xcb_setup_roots_iterator", {C_POINTER}, C_POINTER), 
-- no C wrapper code 
xcb_setup_roots_iterator_ = define_c_func(libxcb, "xcb_setup_roots_iterator", {C_POINTER}, C_POINTER), 
xcb_generate_id_ = define_c_func(libxcb, "xcb_generate_id", {C_POINTER}, C_UINT), 
xcb_create_window_ = define_c_proc(libxcb, "xcb_create_window", {C_POINTER, C_INT, C_UINT, C_UINT, C_INT, C_INT, C_INT, C_INT, C_INT, C_INT, C_UINT, C_INT, C_POINTER}), 
xcb_map_window_ = define_c_proc(libxcb, "xcb_map_window", {C_POINTER,C_UINT}), 
xcb_flush_ = define_c_proc(libxcb, "xcb_flush", {C_POINTER}), 
xcb_disconnect_ = define_c_proc(libxcb, "xcb_disconnect", {C_POINTER}), 
XCB_COPY_FROM_PARENT = 0, 
XCB_WINDOW_CLASS_INPUT_OUTPUT = 1 
 
public function xcb_connect(atom a1, atom a2) 
	return c_func(xcb_connect, {a1, a2}) 
end function 
 
public function xcb_get_setup(atom connection) 
	return c_func(xcb_get_setup_, {connection}) 
end function 
 
public function xcb_generate_id(atom connection) 
	return c_func(xcb_generate_id_, {connection}) 
end function 
 
public procedure xcb_create_window(atom connection, integer copy, atom window, 
	atom parentwindow, integer x, integer y, integer w, integer h, 
	integer border, integer class, atom visual, integer flags, atom notused) 
 
	c_proc(xcb_create_window_, {connection, copy, window, parentwindow, 
		x, y, w, h, border, class, visual, flags, notused}) 
end procedure 
 
public procedure xcb_map_window(atom connection, atom window) 
	c_proc(xcb_map_window_, {connection, window} 
end procedure 
 
public procedure xcb_flush(atom connection) 
	c_proc(xcb_flush_, {connection} 
end procedure 
 
public procedure xcb_disconnect(atom connection) 
	c_proc(xcb_disconnect_, {connection} 
end procedure 
 
procedure main() 
        -- Open the connection to the X server 
        atom connection = xcb_connect (0, 0) 
 
 
        -- Get the first screen 
        atom setup  = xcb_get_setup (connection) 
 
	-- this returns a raw struct, so there is no way to convert this to 
	-- euphoria without a C wrapper 
        --xcb_screen_iterator_t   iter   = xcb_setup_roots_iterator (setup); 
 
	-- C wrapper code 
        -- atom iter = xcb_setup_roots_iterator (setup) 
        -- atom screen = peek4u(iter, 0) -- data 
 
	-- no C wrapper code - take advantage of the fact that the only 
	-- element of the struct we really need is the first one 
        atom screen = xcb_setup_roots_iterator (setup) 
 
 
        -- Create the window 
        atom window = xcb_generate_id (connection) 
        xcb_create_window (connection,                    -- Connection          
                           XCB_COPY_FROM_PARENT,          -- depth(same as root) 
                           window,                        -- window Id           
                           peek4u(screen, 0), -- root     -- parent window       
                           0, 0,                          -- x, y                
                           150, 150,                      -- width, height       
                           10,                            -- border_width        
                           XCB_WINDOW_CLASS_INPUT_OUTPUT, -- class               
                           peek4u(screen, 8),--root_visual-- visual              
                           0, 0 )                     -- masks, not used yet 
 
 
        -- Map the window on the screen 
        xcb_map_window (connection, window) 
 
 
        -- Make sure commands are sent before we pause so that the window gets shown 
        xcb_flush (connection) 
 
 
        wait_key() -- pause ()    -- hold client until Ctrl-C 
 
        xcb_disconnect (connection) 
 
end procedure 
 
main() 
 

Here's a C wrapper, if you want/need to use that version of the code instead:

/* C wrapper for dealing with C functions that return structs */ 
#include <xcb/xcb.h> 
xcb_screen_iterator_t * eu_xcb_setup_roots_iterator(const xcb_setup_t * setup) 
{ 
	xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup); 
	return &iter; 
} 
new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu