Continuing with our task of creating a C++ version of basicwin.c, we next look at XCreateSimpleWindow. Here’s some code snippets from basicwin.c showing the use of XCreateSimpleWindow:
/* basicwin.c */
#include <X11/Xlib.h>
Display *display;
int screen_num;
static char *progname; /* name this program was invoked by */
void main(argc, argv)
int argc;
char **argv;
{
Window win;
/*
.
.
.
*/
/* connect to X server */
if ( (display=XOpenDisplay(display_name)) == NULL )
{
(void) fprintf( stderr, "%s: cannot connect to X server %s\n",
progname, XDisplayName(display_name));
exit( -1 );
}
/* get screen size from display structure macro */
screen_num = DefaultScreen(display);
display_width = DisplayWidth(display, screen_num);
display_height = DisplayHeight(display, screen_num);
/* Note that in a real application, x and y would default to 0
* but would be settable from the command line or resource database.
*/
x = y = 0;
/* size window with enough room for text */
width = display_width/3, height = display_height/4;
/* create opaque window */
win = XCreateSimpleWindow(display, RootWindow(display,screen_num),
x, y, width, height, border_width, BlackPixel(display,
screen_num), WhitePixel(display,screen_num));
/*
.
.
.
*/
/* Display window */
XMapWindow(display, win);
/*
.
.
.
*/
}
In the C++ version, we can do something like this:
/* basicwin.cpp */ #include " xwindow.h" /* . . . */ int main(int argc, char **argv) { try { CXDisplayPtr display(CXDisplay::OpenDisplay()) ; /* get screen size from display structure macro */ display_width = display->GetDisplayWidth(); display_height = display->GetDisplayHeight(); /* Note that in a real application, x and y would default to 0 * but would be settable from the command line or resource database. */ x = y = 0; /* size window with enough room for text */ width = display_width / 3 ; height = display_height / 4; /* create opaque window */ CXWindowPtr win(CXWindow::CreateWindow(display, x, y, width, height, border_width, display->GetBlackPixel(), display->GetWhitePixel())) ; /* . . . */ /* Display window */ win->Map(); /* . . . */ } catch(bad_CXDisplay& e) { cerr << e.what() << endl ; } catch(bad_CXWindow& e) { cerr << e.what() << endl ; } return -1 ; }
CXWindowPtr is defined in xwindow.h. Creating a window is handled by the constructor for the class CXWindow. XDestoryWindow is called by CXWindow’s destructor. CXWindowPtr wraps CXWindow in a boost::shared_ptr. The static member function, CXWindow::CreateWindow creates a window by calling XCreateSimpleWindow (future versions will likely also support XCreateWindow). CXWindow::CreateWindow creates a window and returns a CXWindowPtr which can be used as a pointer to a Window by dereferencing it. CXWindow’s destructor is called when the CXWindowPtr goes out of scope and all references to it are released.
— start —
/*******************************************************************
*
* xdisplay.h -- Wrap Window with a boost::shared_ptr
*
* Copyright (C) 2007 by James A. Chappell (rlrrlrll@gmail.com)
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* condition:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef __XWINDOW_H__
#define __XWINDOW_H__
#include "xdisplay.h"
class bad_CXWindow : public std::exception
{
public:
virtual const char* what() const throw()
{
return "bad_CXWindow" ; // for now
}
} ;
class CXWindow ;
typedef boost::shared_ptr<CXWindow> CXWindowPtr ;
class CXWindow : private boost::noncopyable
{
public:
static CXWindowPtr CreateWindow(CXDisplayPtr& display,
int x, int y,
unsigned int width,
unsigned int height,
unsigned int border_width,
unsigned long border,
unsigned long background,
int screen_num = USE_DEFAULT_SCREEN)
{
Window parent(display->GetRootWindow(screen_num)) ;
return CXWindowPtr(new CXWindow(display, parent,
x, y, width, height,
border_width, border, background)) ;
}
static CXWindowPtr CreateWindow(CXDisplayPtr& display,
CXWindowPtr& parent,
int x, int y,
unsigned int width,
unsigned int height,
unsigned int border_width,
unsigned long border,
unsigned long background)
{
return CXWindowPtr(new CXWindow(display, *parent,
x, y, width, height,
border_width, border, background)) ;
}
~CXWindow()
{
XDestroyWindow(*display_, window_) ;
}
operator Window const () { return window_ ; }
void GetWindowAttributes(XWindowAttributes &attr)
{
if (!XGetWindowAttributes(*display_, window_, &attr))
{
throw bad_CXWindow() ;
}
}
void Map() const
{
XMapWindow(*display_, window_);
}
void Unmap()
{
XUnmapWindow(*display_, window_) ;
}
private:
Window window_ ;
CXDisplayPtr display_ ;
CXWindow(CXDisplayPtr& display, Window parent,
int x, int y,
unsigned int width, unsigned int height,
unsigned int border_width,
unsigned long border,
unsigned long background)
: display_(display)
{
window_ = XCreateSimpleWindow(*display_, parent,
x, y, width, height,
border_width, border, background) ;
}
CXWindow() {}
} ;
#endif
— end —
Thanks for the examples! I havejust bought the Xlib rel 5 programming book second hand and was thinking about how to do the same things in C++ Being new to C++ its nice to see compact examples that give a launching point to work with.
Cheers.