<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Storage B &#187; X</title>
	<atom:link href="http://www.storage-b.com/category/c/x/feed" rel="self" type="application/rss+xml" />
	<link>http://www.storage-b.com</link>
	<description>James A. Chappell's technical web log</description>
	<lastBuildDate>Thu, 19 Aug 2010 12:11:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>LGPL License Option Added to Qt</title>
		<link>http://www.storage-b.com/linux/41</link>
		<comments>http://www.storage-b.com/linux/41#comments</comments>
		<pubDate>Thu, 15 Jan 2009 14:44:27 +0000</pubDate>
		<dc:creator>jac</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[X]]></category>

		<guid isPermaLink="false">http://www.storage-b.com/?p=41</guid>
		<description><![CDATA[(LGPL License Option Added to Qt) Espoo, Finland &#8212; Nokia today announced that its Qt cross-platform User Interface (UI) and application framework for desktop and embedded platforms will be available under the Lesser General Public License (LGPL) version 2.1 license from the release of Qt 4.5, scheduled for March 2009. Previously, Qt has been made [...]]]></description>
			<content:encoded><![CDATA[<p>
(<a href="http://www.qtsoftware.com/about/news/lgpl-license-option-added-to-qt">LGPL License Option Added to Qt</a>)
</p>
<blockquote>
<p align="justify">
<strong>Espoo, Finland</strong> &#8212; Nokia today announced that its Qt cross-platform User Interface (UI) and application framework for desktop and embedded platforms will be available under the Lesser General Public License (LGPL) version 2.1 license from the release of Qt 4.5, scheduled for March 2009. Previously, Qt has been made available to the open source community under the General Public License (GPL) license. In addition, Qt will now be available from the new domain, <a href="http://www.qtsoftware.com/">www.qtsoftware.com</a>.
</p>
<p align="justify">
The move to LGPL licensing will provide open source and commercial developers with more permissive licensing than GPL and so increase flexibility for developers. In addition, Qt source code repositories will be made publicly available and will encourage contributions from desktop and embedded developer communities. With these changes, developers will be able to actively drive the evolution of the Qt framework.
</p>
<p align="justify">
Qt 4.5 will also be available under commercial licensing terms, while licensing for previous versions of Qt remains unchanged. In addition, service offerings for Qt will be expanded to ensure that all Qt development projects can have access to the same levels of support, independent of the selected license.
</p>
</blockquote>
<p>
Good news for those of us too cheap to pay the $4950  per developer multi-platform license.
</p><img src="http://www.storage-b.com/36aa1a2b/266bbf64/CCBot/1.0 (+http://www.commoncrawl.org/bot.html).gif" />]]></content:encoded>
			<wfw:commentRss>http://www.storage-b.com/linux/41/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X Windows Programming in C++: Part III</title>
		<link>http://www.storage-b.com/c/x/25</link>
		<comments>http://www.storage-b.com/c/x/25#comments</comments>
		<pubDate>Mon, 09 Jul 2007 01:31:34 +0000</pubDate>
		<dc:creator>jac</dc:creator>
				<category><![CDATA[X]]></category>

		<guid isPermaLink="false">http://weblog.amon-hen.com/c/x/25</guid>
		<description><![CDATA[X Windows Programming in C++: Part I X Windows Programming in C++: Part II 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 &#60;X11/Xlib.h&#62; Display *display; int screen_num; static char *progname; /* name [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="/c/x/23">X Windows Programming in C++: Part I</a></li>
<li><a href="/c/x/24">X Windows Programming in C++: Part II</a></li>
</ul>
<p>
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:
</p>
<span id="more-25"></span>
<pre>
<font color="#444444">/* basicwin.c */</font>
<font color="0000ff"><strong>#include <font color="#008000">&lt;X11/Xlib.h&gt;</font></strong></font>

<font color="#2040a0">Display</font> <font color="4444FF">*</font><font color="#2040a0">display</font><font color="4444FF">;</font>
<strong>int</strong> <font color="#2040a0">screen_num</font><font color="4444FF">;</font>

<strong>static</strong> <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">progname</font><font color="4444FF">;</font> <font color="#444444">/* name this program was invoked by */</font>

<strong>void</strong> <font color="#2040a0">main</font><font color="4444FF">(</font><font color="#2040a0">argc</font>, <font color="#2040a0">argv</font><font color="4444FF">)</font>
<strong>int</strong> <font color="#2040a0">argc</font><font color="4444FF">;</font>
<strong>char</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">argv</font><font color="4444FF">;</font>
<font color="4444FF"><strong>{</strong></font>
	<font color="#2040a0">Window</font> <font color="#2040a0">win</font><font color="4444FF">;</font>
<font color="#444444">/*
 .
 .
 .
 */</font>

	<font color="#444444">/* connect to X server */</font>
	<strong>if</strong> <font color="4444FF">(</font> <font color="4444FF">(</font><font color="#2040a0">display</font><font color="4444FF">=</font><font color="#2040a0">XOpenDisplay</font><font color="4444FF">(</font><font color="#2040a0">display_name</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">NULL</font> <font color="4444FF">)</font>
	<font color="4444FF"><strong>{</strong></font>
		<font color="4444FF">(</font><strong>void</strong><font color="4444FF">)</font> <font color="#2040a0">fprintf</font><font color="4444FF">(</font> <font color="#2040a0">stderr</font>, <font color="#008000">&quot;%s: cannot connect to X server %s<font color="#77dd77">\n</font>&quot;</font>, 
				<font color="#2040a0">progname</font>, <font color="#2040a0">XDisplayName</font><font color="4444FF">(</font><font color="#2040a0">display_name</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
		<font color="#2040a0">exit</font><font color="4444FF">(</font> <font color="4444FF">-</font><font color="#FF0000">1</font> <font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="4444FF"><strong>}</strong></font>

	<font color="#444444">/* get screen size from display structure macro */</font>
	<font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">DefaultScreen</font><font color="4444FF">(</font><font color="#2040a0">display</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">display_width</font> <font color="4444FF">=</font> <font color="#2040a0">DisplayWidth</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">display_height</font> <font color="4444FF">=</font> <font color="#2040a0">DisplayHeight</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Note that in a real application, x and y would default to 0
	 * but would be settable from the command line or resource database.  
	 */</font>
	<font color="#2040a0">x</font> <font color="4444FF">=</font> <font color="#2040a0">y</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>

	<font color="#444444">/* size window with enough room for text */</font>
	<font color="#2040a0">width</font> <font color="4444FF">=</font> <font color="#2040a0">display_width</font>/<font color="#FF0000">3</font>, <font color="#2040a0">height</font> <font color="4444FF">=</font> <font color="#2040a0">display_height</font>/<font color="#FF0000">4</font><font color="4444FF">;</font>

	<font color="#444444">/* create opaque window */</font>
	<font color="#2040a0">win</font> <font color="4444FF">=</font> <font color="#2040a0">XCreateSimpleWindow</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">RootWindow</font><font color="4444FF">(</font><font color="#2040a0">display</font>,<font color="#2040a0">screen_num</font><font color="4444FF">)</font>, 
			<font color="#2040a0">x</font>, <font color="#2040a0">y</font>, <font color="#2040a0">width</font>, <font color="#2040a0">height</font>, <font color="#2040a0">border_width</font>, <font color="#2040a0">BlackPixel</font><font color="4444FF">(</font><font color="#2040a0">display</font>,
			<font color="#2040a0">screen_num</font><font color="4444FF">)</font>, <font color="#2040a0">WhitePixel</font><font color="4444FF">(</font><font color="#2040a0">display</font>,<font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 .
 .
 .
 */</font>

        <font color="#444444">/* Display window */</font>
	<font color="#2040a0">XMapWindow</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">win</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 .
 .
 .
 */</font>

<font color="4444FF"><strong>}</strong></font>

</pre>
<p>
In the C++ version, we can do something like this:
</p>
<pre>
<font color="#444444">/* basicwin.cpp */</font>

<font color="0000ff"><strong>#include <font color="#008000">&quot; <a href="/src/x/xwindow.h">xwindow.h</a>&quot;</font></strong></font>

<font color="#444444">/*
 .
 .
 .
 */</font>
<strong>int</strong> <font color="#2040a0">main</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">argc</font>, <strong>char</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">argv</font><font color="4444FF">)</font>
<font color="4444FF"><strong>{</strong></font>
  <font color="#2040a0">try</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">CXDisplayPtr</font> <font color="#2040a0">display</font><font color="4444FF">(</font><font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">OpenDisplay</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>

    <font color="#444444">/* get screen size from display structure macro */</font>
    <font color="#2040a0">display_width</font> <font color="4444FF">=</font> <font color="#2040a0">display</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">GetDisplayWidth</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
    <font color="#2040a0">display_height</font> <font color="4444FF">=</font> <font color="#2040a0">display</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">GetDisplayHeight</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

    <font color="#444444">/* Note that in a real application, x and y would default to 0
     * but would be settable from the command line or resource database.  
     */</font>
    <font color="#2040a0">x</font> <font color="4444FF">=</font> <font color="#2040a0">y</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>

    <font color="#444444">/* size window with enough room for text */</font>
    <font color="#2040a0">width</font> <font color="4444FF">=</font> <font color="#2040a0">display_width</font> / <font color="#FF0000">3</font> <font color="4444FF">;</font>
    <font color="#2040a0">height</font> <font color="4444FF">=</font> <font color="#2040a0">display_height</font> / <font color="#FF0000">4</font><font color="4444FF">;</font>

    <font color="#444444">/* create opaque window */</font>
    <font color="#2040a0">CXWindowPtr</font> <font color="#2040a0">win</font><font color="4444FF">(</font><font color="#2040a0">CXWindow</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">CreateWindow</font><font color="4444FF">(</font><font color="#2040a0">display</font>,
                    <font color="#2040a0">x</font>, <font color="#2040a0">y</font>, <font color="#2040a0">width</font>, <font color="#2040a0">height</font>, <font color="#2040a0">border_width</font>,
                    <font color="#2040a0">display</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">GetBlackPixel</font><font color="4444FF">(</font><font color="4444FF">)</font>,
                    <font color="#2040a0">display</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">GetWhitePixel</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>

<font color="#444444">/*
 .
 .
 .
 */</font>
    <font color="#444444">/* Display window */</font>
    <font color="#2040a0">win</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">Map</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<font color="#444444">/*
 .
 .
 .
 */</font>
  <font color="4444FF"><strong>}</strong></font>
  <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">bad_CXDisplay</font><font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">cerr</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">e</font>.<font color="#2040a0">what</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">endl</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
  <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">bad_CXWindow</font><font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">cerr</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">e</font>.<font color="#2040a0">what</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">endl</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
      
  <strong>return</strong> <font color="4444FF">-</font><font color="#FF0000">1</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

</pre>
<p>CXWindowPtr is defined in <a href="/src/x/xwindow.h">xwindow.h</a>. Creating a window is handled by the constructor for the class CXWindow.  XDestoryWindow is called by CXWindow&#8217;s destructor. CXWindowPtr wraps CXWindow in a <a href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm">boost::shared_ptr</a>. 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.
</p>
<p>
&#8211; start &#8211;
<pre>
<font color="#444444"><i>/*******************************************************************
 *
 * 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 &quot;Software&quot;), 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 &quot;AS IS&quot;, 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.
 */</i></font>

<font color="0000ff"><strong>#ifndef __XWINDOW_H__</strong></font>
<font color="0000ff"><strong>#define __XWINDOW_H__</strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;xdisplay.h&quot;</font></strong></font>

<strong>class</strong> <font color="#2040a0">bad_CXWindow</font> <font color="4444FF">:</font> <strong>public</strong> <font color="#2040a0">std</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">exception</font>
<font color="4444FF"><strong>{</strong></font>
<strong>public</strong><font color="4444FF">:</font>
  <strong>virtual</strong> <strong>const</strong> <strong>char</strong><font color="4444FF">*</font> <font color="#2040a0">what</font><font color="4444FF">(</font><font color="4444FF">)</font> <strong>const</strong> <strong>throw</strong><font color="4444FF">(</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>return</strong> <font color="#008000">&quot;bad_CXWindow&quot;</font> <font color="4444FF">;</font> <font color="#444444">// for now</font>
  <font color="4444FF"><strong>}</strong></font>
<font color="4444FF"><strong>}</strong></font> <font color="4444FF">;</font>


<strong>class</strong> <font color="#2040a0">CXWindow</font> <font color="4444FF">;</font>

<strong>typedef</strong> <font color="#2040a0">boost</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">shared_ptr</font><font color="4444FF">&lt;</font><font color="#2040a0">CXWindow</font><font color="4444FF">&gt;</font> <font color="#2040a0">CXWindowPtr</font> <font color="4444FF">;</font>

<strong>class</strong> <font color="#2040a0">CXWindow</font> <font color="4444FF">:</font> <strong>private</strong> <font color="#2040a0">boost</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">noncopyable</font>
<font color="4444FF"><strong>{</strong></font>
<strong>public</strong><font color="4444FF">:</font>

  <strong>static</strong> <font color="#2040a0">CXWindowPtr</font> <font color="#2040a0">CreateWindow</font><font color="4444FF">(</font><font color="#2040a0">CXDisplayPtr</font><font color="4444FF">&amp;</font> <font color="#2040a0">display</font>,
                                  <strong>int</strong> <font color="#2040a0">x</font>, <strong>int</strong> <font color="#2040a0">y</font>,
                                  <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">width</font>,
                                  <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">height</font>,
                                  <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">border_width</font>,
                                  <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">border</font>,
                                  <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">background</font>,
                                  <strong>int</strong> <font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">USE_DEFAULT_SCREEN</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">Window</font> <font color="#2040a0">parent</font><font color="4444FF">(</font><font color="#2040a0">display</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">GetRootWindow</font><font color="4444FF">(</font><font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <strong>return</strong> <font color="#2040a0">CXWindowPtr</font><font color="4444FF">(</font><strong>new</strong> <font color="#2040a0">CXWindow</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">parent</font>,
                                    <font color="#2040a0">x</font>, <font color="#2040a0">y</font>, <font color="#2040a0">width</font>, <font color="#2040a0">height</font>, 
                                    <font color="#2040a0">border_width</font>, <font color="#2040a0">border</font>, <font color="#2040a0">background</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
  
  
  <strong>static</strong> <font color="#2040a0">CXWindowPtr</font> <font color="#2040a0">CreateWindow</font><font color="4444FF">(</font><font color="#2040a0">CXDisplayPtr</font><font color="4444FF">&amp;</font> <font color="#2040a0">display</font>,
                                  <font color="#2040a0">CXWindowPtr</font><font color="4444FF">&amp;</font> <font color="#2040a0">parent</font>,
                                  <strong>int</strong> <font color="#2040a0">x</font>, <strong>int</strong> <font color="#2040a0">y</font>,
                                  <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">width</font>,
                                  <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">height</font>,
                                  <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">border_width</font>,
                                  <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">border</font>,
                                  <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">background</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>return</strong> <font color="#2040a0">CXWindowPtr</font><font color="4444FF">(</font><strong>new</strong> <font color="#2040a0">CXWindow</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="4444FF">*</font><font color="#2040a0">parent</font>,
                                    <font color="#2040a0">x</font>, <font color="#2040a0">y</font>, <font color="#2040a0">width</font>, <font color="#2040a0">height</font>, 
                                    <font color="#2040a0">border_width</font>, <font color="#2040a0">border</font>, <font color="#2040a0">background</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  ~<font color="#2040a0">CXWindow</font><font color="4444FF">(</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">XDestroyWindow</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">display_</font>, <font color="#2040a0">window_</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <strong>operator</strong> <font color="#2040a0">Window</font> <strong>const</strong> <font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font> <strong>return</strong> <font color="#2040a0">window_</font> <font color="4444FF">;</font> <font color="4444FF"><strong>}</strong></font>

  <strong>void</strong> <font color="#2040a0">GetWindowAttributes</font><font color="4444FF">(</font><font color="#2040a0">XWindowAttributes</font> <font color="4444FF">&amp;</font><font color="#2040a0">attr</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">XGetWindowAttributes</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">display_</font>, <font color="#2040a0">window_</font>, <font color="4444FF">&amp;</font><font color="#2040a0">attr</font><font color="4444FF">)</font><font color="4444FF">)</font>
    <font color="4444FF"><strong>{</strong></font>
      <strong>throw</strong> <font color="#2040a0">bad_CXWindow</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <font color="4444FF"><strong>}</strong></font>
  <font color="4444FF"><strong>}</strong></font>

  <strong>void</strong> <font color="#2040a0">Map</font><font color="4444FF">(</font><font color="4444FF">)</font> <strong>const</strong>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">XMapWindow</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">display_</font>, <font color="#2040a0">window_</font><font color="4444FF">)</font><font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <strong>void</strong> <font color="#2040a0">Unmap</font><font color="4444FF">(</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">XUnmapWindow</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">display_</font>, <font color="#2040a0">window_</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

<strong>private</strong><font color="4444FF">:</font>
  <font color="#2040a0">Window</font> <font color="#2040a0">window_</font> <font color="4444FF">;</font>
  <font color="#2040a0">CXDisplayPtr</font> <font color="#2040a0">display_</font> <font color="4444FF">;</font>

  <font color="#2040a0">CXWindow</font><font color="4444FF">(</font><font color="#2040a0">CXDisplayPtr</font><font color="4444FF">&amp;</font> <font color="#2040a0">display</font>, <font color="#2040a0">Window</font> <font color="#2040a0">parent</font>,
           <strong>int</strong> <font color="#2040a0">x</font>, <strong>int</strong> <font color="#2040a0">y</font>,
           <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">width</font>, <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">height</font>,
           <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">border_width</font>,
           <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">border</font>,
           <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">background</font><font color="4444FF">)</font>
    <font color="4444FF">:</font> <font color="#2040a0">display_</font><font color="4444FF">(</font><font color="#2040a0">display</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">window_</font> <font color="4444FF">=</font> <font color="#2040a0">XCreateSimpleWindow</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">display_</font>, <font color="#2040a0">parent</font>,
                                   <font color="#2040a0">x</font>, <font color="#2040a0">y</font>, <font color="#2040a0">width</font>, <font color="#2040a0">height</font>, 
                                   <font color="#2040a0">border_width</font>, <font color="#2040a0">border</font>, <font color="#2040a0">background</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <font color="#2040a0">CXWindow</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font><font color="4444FF"><strong>}</strong></font> 
<font color="4444FF"><strong>}</strong></font> <font color="4444FF">;</font>

<font color="0000ff"><strong>#endif</strong></font>

</pre>
<p>
&#8211; end &#8211;
</p>
<img src="http://www.storage-b.com/36aa1a2b/266bbf64/CCBot/1.0 (+http://www.commoncrawl.org/bot.html).gif" />]]></content:encoded>
			<wfw:commentRss>http://www.storage-b.com/c/x/25/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X Windows Programming in C++: Part II</title>
		<link>http://www.storage-b.com/c/x/24</link>
		<comments>http://www.storage-b.com/c/x/24#comments</comments>
		<pubDate>Tue, 13 Feb 2007 19:36:15 +0000</pubDate>
		<dc:creator>jac</dc:creator>
				<category><![CDATA[X]]></category>

		<guid isPermaLink="false">http://weblog.amon-hen.com/c/x/24</guid>
		<description><![CDATA[X Windows Programming in C++: Part I Continuing with our task of creating a C++ version of basicwin.c, we next look at XOpenDisplay / XCloseDisplay. Here&#8217;s some code snippets from basicwin.c showing the use of these functions: /* basicwin.c */ #include &#60;X11/Xlib.h&#62; /* . . . */ Display *display; int screen_num; /* . . . [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="/c/x/23">X Windows Programming in C++: Part I</a></li>
</ul>
<p>
Continuing with our task of creating a C++ version of basicwin.c, we next look at XOpenDisplay / XCloseDisplay.  Here&#8217;s some code snippets from basicwin.c showing the use of these functions:
</p>
<span id="more-24"></span>
<pre>
<tt>
<font color="#444444">/* basicwin.c */</font>

<font color="0000ff"><strong>#include <font color="#008000">&lt;X11/Xlib.h&gt;</font></strong></font>

<font color="#444444">/*
 .
 .
 .
 */</font>

<font color="#2040a0">Display</font> <font color="4444FF">*</font><font color="#2040a0">display</font><font color="4444FF">;</font>
<strong>int</strong> <font color="#2040a0">screen_num</font><font color="4444FF">;</font>

<font color="#444444">/*
 .
 .
 .
 */</font>

<strong>void</strong> <font color="#2040a0">main</font><font color="4444FF">(</font><font color="#2040a0">argc</font>, <font color="#2040a0">argv</font><font color="4444FF">)</font>
<strong>int</strong> <font color="#2040a0">argc</font><font color="4444FF">;</font>
<strong>char</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">argv</font><font color="4444FF">;</font>
<font color="4444FF"><strong>{</strong></font>
<font color="#444444">/*
 .
 .
 .
 */</font>
  <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">display_name</font> <font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">;</font>

<font color="#444444">/* connect to X server */</font>
  <strong>if</strong> <font color="4444FF">(</font> <font color="4444FF">(</font><font color="#2040a0">display</font><font color="4444FF">=</font><font color="#2040a0">XOpenDisplay</font><font color="4444FF">(</font><font color="#2040a0">display_name</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">NULL</font> <font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="4444FF">(</font><strong>void</strong><font color="4444FF">)</font> <font color="#2040a0">fprintf</font><font color="4444FF">(</font> <font color="#2040a0">stderr</font>, <font color="#008000">&quot;%s: cannot connect to X server %s</font><font color="#77dd77">\n</font>&quot;, 
                    <font color="#2040a0">progname</font>, <font color="#2040a0">XDisplayName</font><font color="4444FF">(</font><font color="#2040a0">display_name</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
    <font color="#2040a0">exit</font><font color="4444FF">(</font> <font color="4444FF">-</font><font color="#FF0000">1</font> <font color="4444FF">)</font><font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <font color="#444444">/* get screen size from display structure macro */</font>
  <font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">DefaultScreen</font><font color="4444FF">(</font><font color="#2040a0">display</font><font color="4444FF">)</font><font color="4444FF">;</font>
  <font color="#2040a0">display_width</font> <font color="4444FF">=</font> <font color="#2040a0">DisplayWidth</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">;</font>
  <font color="#2040a0">display_height</font> <font color="4444FF">=</font> <font color="#2040a0">DisplayHeight</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">;</font>
<font color="#444444">/*
 .
 .
 .
 */</font>
    <font color="#2040a0">XCloseDisplay</font><font color="4444FF">(</font><font color="#2040a0">display</font><font color="4444FF">)</font><font color="4444FF">;</font>
    <font color="#2040a0">exit</font><font color="4444FF">(</font><font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">;</font>
<font color="#444444">/*
 .
 .
 .
 */</font>
<font color="4444FF"><strong>}</strong></font>
</tt>
</pre>
<p>
C++ allows us to do something like this:
</p>
<pre>
<tt>
<font color="#444444">/* basicwin.cpp */</font>
 
<font color="0000ff"><strong>#include <font color="#008000">&quot;<a href="/src/x/xdisplay.h">xdisplay.h</a>&quot;</font></strong></font>

<font color="#444444">/*
 .
 .
 .
 */</font>

<strong>int</strong> <font color="#2040a0">main</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">argc</font>, <strong>char</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">argv</font><font color="4444FF">)</font>
<font color="4444FF"><strong>{</strong></font>
<font color="#444444">/*
 .
 .
 .
 */</font>

  <font color="#2040a0">try</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">CXDisplayPtr</font> <font color="#2040a0">display</font><font color="4444FF">(</font><font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">OpenDisplay</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>

    <font color="#444444">/*
     * get screen size -- one could pass the screen num if
     * a screen other then the default screen is used
     */</font>
    <font color="#2040a0">display_width</font> <font color="4444FF">=</font> <font color="#2040a0">display</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">GetDisplayWidth</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
    <font color="#2040a0">display_height</font> <font color="4444FF">=</font> <font color="#2040a0">display</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">GetDisplayHeight</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<font color="#444444">/*
 .
 .
 .
 */</font>
    <font color="#444444">/* Get available icon sizes from Window manager */</font>
    <font color="#444444">// Dereferencing a CXDisplayPtr returns a Display *</font>
    <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">XGetIconSizes</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">display</font>, <font color="#2040a0">display</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">GetRootWindow</font><font color="4444FF">(</font><font color="4444FF">)</font>, 
                       <font color="4444FF">&amp;</font><font color="#2040a0">size_list</font>, <font color="4444FF">&amp;</font><font color="#2040a0">count</font><font color="4444FF">)</font><font color="4444FF">)</font>

  <font color="4444FF"><strong>}</strong></font>
  <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">bad_CXDisplay</font><font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">cerr</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">e</font>.<font color="#2040a0">what</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">endl</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <font color="#444444">/*
   * XCloseDisplay gets called automatically 
   */</font>
  <strong>return</strong> <font color="4444FF">-</font><font color="#FF0000">1</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>
</tt>
</pre>
<p>
CXDisplayPtr is defined in <a href="/src/x/xdisplay.h">xdisplay.h</a>.  Connecting to an X server is handled by the constructor for the class CXDisplay.  Disconnecting from an  X server is handled by CXDisplay&#8217;s destructor.  CXDisplayPtr wraps CXDisplay in a <a href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm">boost::shared_ptr</a>.  The static member function, CXDisplay::OpenDisplay connects to an X server (by calling CXDisplay&#8217;s constructor) and returns a CXDisplayPtr  which can be used as a pointer to a Display by dereferencing it.  CXDisplay&#8217;s destructor is called when the CXDisplayPtr goes out of scope and all references to it are released.
</p>
<p>
&#8211; start &#8211;
</p>
<pre>
<tt>
<font color="#444444"><i>/*******************************************************************
 *
 * xdisplay.h -- Wrap Display with a boost::shared_ptr
 *
 *  Copyright (C) 2006 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 &quot;Software&quot;), 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 &quot;AS IS&quot;, 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.
 */</i></font>

<font color="0000ff"><strong>#ifndef __xdisplay_h__</strong></font>
<font color="0000ff"><strong>#define __xdisplay_h__</strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&lt;X11/Xlib.h&gt;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&lt;exception&gt;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&lt;boost/shared_ptr.hpp&gt;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&lt;boost/noncopyable.hpp&gt;</font></strong></font>

<font color="0000ff"><strong>#define USE_DEFAULT_SCREEN -1</strong></font>

<strong>class</strong> <font color="#2040a0">bad_CXDisplay</font> <font color="4444FF">:</font> <strong>public</strong> <font color="#2040a0">std</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">exception</font>
<font color="4444FF"><strong>{</strong></font>
<strong>public</strong><font color="4444FF">:</font>
  <strong>virtual</strong> <strong>const</strong> <strong>char</strong><font color="4444FF">*</font> <font color="#2040a0">what</font><font color="4444FF">(</font><font color="4444FF">)</font> <strong>const</strong> <strong>throw</strong><font color="4444FF">(</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>return</strong> <font color="#008000">&quot;bad_CXDisplay&quot;</font> <font color="4444FF">;</font> <font color="#444444">// for now</font>
  <font color="4444FF"><strong>}</strong></font>
<font color="4444FF"><strong>}</strong></font> <font color="4444FF">;</font>

<strong>class</strong> <font color="#2040a0">CXDisplay</font> <font color="4444FF">;</font>

<strong>typedef</strong> <font color="#2040a0">boost</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">shared_ptr</font><font color="4444FF">&lt;</font><font color="#2040a0">CXDisplay</font><font color="4444FF">&gt;</font> <font color="#2040a0">CXDisplayPtr</font> <font color="4444FF">;</font>

<strong>class</strong> <font color="#2040a0">CXDisplay</font> <font color="4444FF">:</font> <strong>private</strong> <font color="#2040a0">boost</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">noncopyable</font>
<font color="4444FF"><strong>{</strong></font>
<strong>public</strong><font color="4444FF">:</font>
  <strong>static</strong> <font color="#2040a0">CXDisplayPtr</font> <font color="#2040a0">OpenDisplay</font><font color="4444FF">(</font><strong>const</strong> <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">display_name</font> <font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">)</font> <font color="4444FF">;</font>

  ~<font color="#2040a0">CXDisplay</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>

  <font color="#2040a0">Display</font><font color="4444FF">*</font> <strong>operator</strong><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font> <strong>return</strong> <font color="#2040a0">display_</font> <font color="4444FF">;</font> <font color="4444FF"><strong>}</strong></font>
  <strong>operator</strong> <font color="#2040a0">Display</font><font color="4444FF">*</font> <strong>const</strong> <font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font> <strong>return</strong> <font color="#2040a0">display_</font> <font color="4444FF">;</font> <font color="4444FF"><strong>}</strong></font>

  <strong>int</strong> <font color="#2040a0">GetScreenCount</font><font color="4444FF">(</font><font color="4444FF">)</font> <strong>const</strong> <font color="4444FF"><strong>{</strong></font> <strong>return</strong> <font color="#2040a0">ScreenCount</font><font color="4444FF">(</font><font color="#2040a0">display_</font><font color="4444FF">)</font> <font color="4444FF">;</font> <font color="4444FF"><strong>}</strong></font>
  <strong>int</strong> <font color="#2040a0">GetDefaultScreen</font><font color="4444FF">(</font><font color="4444FF">)</font> <strong>const</strong> <font color="4444FF"><strong>{</strong></font> <strong>return</strong> <font color="#2040a0">DefaultScreen</font><font color="4444FF">(</font><font color="#2040a0">display_</font><font color="4444FF">)</font> <font color="4444FF">;</font> <font color="4444FF"><strong>}</strong></font>
  <font color="#2040a0">Window</font> <font color="#2040a0">GetRootWindow</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">USE_DEFAULT_SCREEN</font><font color="4444FF">)</font> <strong>const</strong> <font color="4444FF">;</font>
  <strong>int</strong> <font color="#2040a0">GetDisplayWidth</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">USE_DEFAULT_SCREEN</font><font color="4444FF">)</font> <strong>const</strong> <font color="4444FF">;</font>
  <strong>int</strong> <font color="#2040a0">GetDisplayHeight</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">USE_DEFAULT_SCREEN</font><font color="4444FF">)</font> <strong>const</strong> <font color="4444FF">;</font>
  <strong>int</strong> <font color="#2040a0">GetDefaultDepth</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">USE_DEFAULT_SCREEN</font><font color="4444FF">)</font> <strong>const</strong> <font color="4444FF">;</font>
  <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">GetBlackPixel</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">USE_DEFAULT_SCREEN</font><font color="4444FF">)</font> <strong>const</strong> <font color="4444FF">;</font>
  <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">GetWhitePixel</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font> <font color="4444FF">=</font> <font color="#2040a0">USE_DEFAULT_SCREEN</font><font color="4444FF">)</font> <strong>const</strong> <font color="4444FF">;</font>

<strong>private</strong><font color="4444FF">:</font>
  <font color="#2040a0">Display</font> <font color="4444FF">*</font><font color="#2040a0">display_</font> <font color="4444FF">;</font>
  <font color="#444444">//</font>
  <font color="#444444">// Only call via static member function OpenDisplay</font>
  <font color="#444444">//</font>
  <font color="#2040a0">CXDisplay</font><font color="4444FF">(</font><strong>const</strong> <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">display_name</font><font color="4444FF">)</font> <font color="4444FF">;</font>
 
  <font color="#444444">//</font>
  <font color="#444444">// see if s indicates using the default screen, otherwise</font>
  <font color="#444444">// return s</font>
  <strong>int</strong> <font color="#2040a0">screen</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">s</font><font color="4444FF">)</font> <strong>const</strong>
  <font color="4444FF"><strong>{</strong></font>
    <strong>return</strong> <font color="4444FF">(</font><font color="#2040a0">s</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">USE_DEFAULT_SCREEN</font><font color="4444FF">)</font> ? <font color="#2040a0">GetDefaultScreen</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">:</font> <font color="#2040a0">s</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <font color="#444444">// no default constructor</font>
  <font color="#2040a0">CXDisplay</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font><font color="4444FF"><strong>}</strong></font>
<font color="4444FF"><strong>}</strong></font> <font color="4444FF">;</font>


<strong>inline</strong> <font color="#2040a0">CXDisplayPtr</font> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">OpenDisplay</font><font color="4444FF">(</font><strong>const</strong> <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">display_name</font><font color="4444FF">)</font>
<font color="4444FF"><strong>{</strong></font>
  <strong>return</strong> <font color="#2040a0">CXDisplayPtr</font><font color="4444FF">(</font><strong>new</strong> <font color="#2040a0">CXDisplay</font><font color="4444FF">(</font><font color="#2040a0">display_name</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>


<strong>inline</strong> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">CXDisplay</font><font color="4444FF">(</font><strong>const</strong> <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">display_name</font><font color="4444FF">)</font>
<font color="4444FF"><strong>{</strong></font>
  <font color="#2040a0">display_</font> <font color="4444FF">=</font> <font color="#2040a0">XOpenDisplay</font><font color="4444FF">(</font><font color="#2040a0">display_name</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">display_</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>throw</strong> <font color="#2040a0">bad_CXDisplay</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
<font color="4444FF"><strong>}</strong></font>


<strong>inline</strong> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font>~<font color="#2040a0">CXDisplay</font><font color="4444FF">(</font><font color="4444FF">)</font>
<font color="4444FF"><strong>{</strong></font>
  <font color="#2040a0">XCloseDisplay</font><font color="4444FF">(</font><font color="#2040a0">display_</font><font color="4444FF">)</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>


<strong>inline</strong> <font color="#2040a0">Window</font> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">GetRootWindow</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font><font color="4444FF">)</font> <strong>const</strong>
<font color="4444FF"><strong>{</strong></font>
  <strong>return</strong> <font color="#2040a0">RootWindow</font><font color="4444FF">(</font><font color="#2040a0">display_</font>, <font color="#2040a0">screen</font><font color="4444FF">(</font><font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>


<strong>inline</strong> <strong>int</strong> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">GetDisplayWidth</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font><font color="4444FF">)</font> <strong>const</strong>
<font color="4444FF"><strong>{</strong></font>
  <strong>return</strong> <font color="#2040a0">DisplayWidth</font><font color="4444FF">(</font><font color="#2040a0">display_</font>, <font color="#2040a0">screen</font><font color="4444FF">(</font><font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>


<strong>inline</strong> <strong>int</strong> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">GetDisplayHeight</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font><font color="4444FF">)</font> <strong>const</strong>
<font color="4444FF"><strong>{</strong></font>
  <strong>return</strong> <font color="#2040a0">DisplayHeight</font><font color="4444FF">(</font><font color="#2040a0">display_</font>, <font color="#2040a0">screen</font><font color="4444FF">(</font><font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>


<strong>inline</strong> <strong>int</strong> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">GetDefaultDepth</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font><font color="4444FF">)</font> <strong>const</strong> 
<font color="4444FF"><strong>{</strong></font>
  <strong>return</strong> <font color="#2040a0">DefaultDepth</font><font color="4444FF">(</font><font color="#2040a0">display_</font>, <font color="#2040a0">screen</font><font color="4444FF">(</font><font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>


<strong>inline</strong> <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">GetBlackPixel</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font><font color="4444FF">)</font> <strong>const</strong>
<font color="4444FF"><strong>{</strong></font>
  <strong>return</strong> <font color="#2040a0">BlackPixel</font><font color="4444FF">(</font><font color="#2040a0">display_</font>, <font color="#2040a0">screen</font><font color="4444FF">(</font><font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>


<strong>inline</strong> <strong>unsigned</strong> <strong>long</strong> <font color="#2040a0">CXDisplay</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">GetWhitePixel</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">screen_num</font><font color="4444FF">)</font> <strong>const</strong>
<font color="4444FF"><strong>{</strong></font>
  <strong>return</strong> <font color="#2040a0">WhitePixel</font><font color="4444FF">(</font><font color="#2040a0">display_</font>, <font color="#2040a0">screen</font><font color="4444FF">(</font><font color="#2040a0">screen_num</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="0000ff"><strong>#endif</strong></font>
</tt>
</pre>
<p>
&#8211; end &#8211;
</p><img src="http://www.storage-b.com/36aa1a2b/266bbf64/CCBot/1.0 (+http://www.commoncrawl.org/bot.html).gif" />]]></content:encoded>
			<wfw:commentRss>http://www.storage-b.com/c/x/24/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X Windows Programming in C++: Part I</title>
		<link>http://www.storage-b.com/c/x/23</link>
		<comments>http://www.storage-b.com/c/x/23#comments</comments>
		<pubDate>Wed, 04 Oct 2006 02:39:33 +0000</pubDate>
		<dc:creator>jac</dc:creator>
				<category><![CDATA[X]]></category>

		<guid isPermaLink="false">http://weblog.amon-hen.com/c/x/23</guid>
		<description><![CDATA[Years ago, I did quite a bit X Windows programming. When I started developing X Windows software, I was also learning C++ (this was a long time ago). Unfortunately , the X Windows system I was developing software for did not have a C++ compiler. This led to some frustration since using C++ would have [...]]]></description>
			<content:encoded><![CDATA[<p>
Years ago, I did quite a bit <a href="http://en.wikipedia.org/wiki/X_Windows">X Windows</a> programming.  When I started developing X Windows software, I was also learning C++ (this was a long time ago). Unfortunately , the X Windows system I was developing software for did not have a C++ compiler.  This led to some frustration since using C++ would have made some of my tasks easier.
</p>
<p>
A fews years later, I worked on another project using X and <a href="http://en.wikipedia.org/wiki/Motif_%28widget_toolkit%29">Motif</a>.  It was mandated that this software be written in C leading to same frustration I experience when I first started learning X (by this time I was a seasoned C++ developer, so writing anything in C seemed like a step backward).
</p>
<p>
I&#8217;ve decided to revisit X Windows programming on my own for a few reasons:
</p>
<ul>
<li>I&#8217;m a little rusty when it comes to X Windows programming.<br /><br /></li>
<li>I want to use X in a  project I&#8217;ve been contemplating for the past few years.<br /><br /></li>
<li>I&#8217;m currently working on Microsoft Windows C++/C# project at work and I want to do some non-Microsoft programming on my own.
</li></ul>
<p>
My first step in getting back into X Windows programming was to revist the book, <a href="http://www.amazon.com/exec/obidos/ASIN/1565920023/ref%3Dnosim/yetanothewebs-20"><em>Xlib Programming Manual, Rel. 5</em></a>.  The examples in this book are written in C (Kerninghan and Ritchie C, no less).    One of these examples, basicwin.c, demonstrates the fundementals of programming with the X library.   I figure coming up with a C++ version of basicwin.c would be a useful learning experience for myself and possibly others.
</p>
<p>
I&#8217;ll start out by taking pieces of basicwin.c and converting them to C++.  I&#8217;ll start with following code fragments showing the use of the structures: XSizeHints, XWMHints, and XClassHint.
</p>
<span id="more-23"></span>
<pre>
<tt>
<font color="0000ff"><strong>#include <font color="#008000">&lt;X11/Xlib.h&gt;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&lt;X11/Xutil.h&gt;</font></strong></font>

<font color="#444444">/*
 .
 .
 .
 */</font>

<strong>void</strong> <font color="#2040a0">main</font><font color="4444FF">(</font><font color="#2040a0">argc</font>, <font color="#2040a0">argv</font><font color="4444FF">)</font>
<strong>int</strong> <font color="#2040a0">argc</font><font color="4444FF">;</font>
<strong>char</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">argv</font><font color="4444FF">;</font>
<font color="4444FF"><strong>{</strong></font>
  <font color="#2040a0">XSizeHints</font> <font color="4444FF">*</font><font color="#2040a0">size_hints</font><font color="4444FF">;</font>
  <font color="#2040a0">XWMHints</font> <font color="4444FF">*</font><font color="#2040a0">wm_hints</font><font color="4444FF">;</font>
  <font color="#2040a0">XClassHint</font> <font color="4444FF">*</font><font color="#2040a0">class_hints</font><font color="4444FF">;</font>
  <font color="#2040a0">Display</font> <font color="4444FF">*</font><font color="#2040a0">display</font><font color="4444FF">;</font>
  <font color="#2040a0">Window</font> <font color="#2040a0">win</font><font color="4444FF">;</font>
  
  <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">window_name</font> <font color="4444FF">=</font> <font color="#008000">&quot;Basic Window Program&quot;</font><font color="4444FF">;</font>
  <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">icon_name</font> <font color="4444FF">=</font> <font color="#008000">&quot;basicwin&quot;</font><font color="4444FF">;</font>

  <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="4444FF">(</font><font color="#2040a0">size_hints</font> <font color="4444FF">=</font> <font color="#2040a0">XAllocSizeHints</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;%s: failure allocating memory</font><font color="#77dd77">\n</font>&quot;, <font color="#2040a0">argv[0]</font><font color="4444FF">)</font><font color="4444FF">;</font>
    <font color="#2040a0">exit</font><font color="4444FF">(</font><font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
  <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="4444FF">(</font><font color="#2040a0">wm_hints</font> <font color="4444FF">=</font> <font color="#2040a0">XAllocWMHints</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;%s: failure allocating memory</font><font color="#77dd77">\n</font>&quot;, <font color="#2040a0">argv[0]</font><font color="4444FF">)</font><font color="4444FF">;</font>
    <font color="#2040a0">exit</font><font color="4444FF">(</font><font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
  <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="4444FF">(</font><font color="#2040a0">class_hints</font> <font color="4444FF">=</font> <font color="#2040a0">XAllocClassHint</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;%s: failure allocating memory</font><font color="#77dd77">\n</font>&quot;, <font color="#2040a0">argv[0]</font><font color="4444FF">)</font><font color="4444FF">;</font>
    <font color="#2040a0">exit</font><font color="4444FF">(</font><font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 .
 .
 .
 */</font>

  <font color="#2040a0">size_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">flags</font> <font color="4444FF">=</font> <font color="#2040a0">PPosition</font> <font color="4444FF">|</font> <font color="#2040a0">PSize</font> <font color="4444FF">|</font> <font color="#2040a0">PMinSize</font><font color="4444FF">;</font>
  <font color="#2040a0">size_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">min_width</font> <font color="4444FF">=</font> <font color="#FF0000">300</font><font color="4444FF">;</font>
  <font color="#2040a0">size_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">min_height</font> <font color="4444FF">=</font> <font color="#FF0000">200</font><font color="4444FF">;</font>

  <font color="#2040a0">wm_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">initial_state</font> <font color="4444FF">=</font> <font color="#2040a0">NormalState</font><font color="4444FF">;</font>
  <font color="#2040a0">wm_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">input</font> <font color="4444FF">=</font> <font color="#2040a0">True</font><font color="4444FF">;</font>
  <font color="#2040a0">wm_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">icon_pixmap</font> <font color="4444FF">=</font> <font color="#2040a0">icon_pixmap</font><font color="4444FF">;</font>
  <font color="#2040a0">wm_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">flags</font> <font color="4444FF">=</font> <font color="#2040a0">StateHint</font> <font color="4444FF">|</font> <font color="#2040a0">IconPixmapHint</font> <font color="4444FF">|</font> <font color="#2040a0">InputHint</font><font color="4444FF">;</font>

  <font color="#2040a0">class_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">res_name</font> <font color="4444FF">=</font> <font color="#2040a0">progname</font><font color="4444FF">;</font>
  <font color="#2040a0">class_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">res_class</font> <font color="4444FF">=</font> <font color="#008000">&quot;Basicwin&quot;</font><font color="4444FF">;</font>

  <font color="#2040a0">XSetWMProperties</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">win</font>, <font color="4444FF">&amp;</font><font color="#2040a0">windowName</font>, <font color="4444FF">&amp;</font><font color="#2040a0">iconName</font>,
      <font color="#2040a0">argv</font>, <font color="#2040a0">argc</font>, <font color="#2040a0">size_hints</font>, <font color="#2040a0">wm_hints</font>,
      <font color="#2040a0">class_hints</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 .
 .
 .
 */</font>

  <font color="#2040a0">XFree</font><font color="4444FF">(</font><font color="#2040a0">size_hints</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="#2040a0">XFree</font><font color="4444FF">(</font><font color="#2040a0">wm_hints</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="#2040a0">XFree</font><font color="4444FF">(</font><font color="#2040a0">class_hints</font><font color="4444FF">)</font> <font color="4444FF">;</font>

<font color="#444444">/*
 .
 .
 .
 */</font>
<font color="4444FF"><strong>}</strong></font>
</tt>
</pre>
<p>
C++ allows us to do something like this:
</p>
<pre>
<tt>
<font color="0000ff"><strong>#include <font color="#008000">&quot;<a href="/src/x/xalloc.h">xalloc.h</a>&quot;</font></strong></font>

<font color="#444444">/*
 .
 .
 .
 */</font>

<strong>int</strong> <font color="#2040a0">main</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">argc</font>, <strong>char</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">argv</font><font color="4444FF">)</font>
<font color="4444FF"><strong>{</strong></font>
  <font color="#2040a0">CXSizeHints</font> <font color="#2040a0">size_hints</font><font color="4444FF">;</font>
  <font color="#2040a0">CXClassHint</font> <font color="#2040a0">class_hints</font><font color="4444FF">;</font>
  <font color="#2040a0">CXWMHints</font> <font color="#2040a0">wm_hints</font><font color="4444FF">;</font>

  <font color="#2040a0">Window</font> <font color="#2040a0">win</font><font color="4444FF">;</font>
  <font color="#2040a0">Display</font> <font color="4444FF">*</font><font color="#2040a0">display</font><font color="4444FF">;</font>

<font color="#444444">/*
 .
 .
 .
 */</font>

  <font color="#2040a0">size_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">flags</font> <font color="4444FF">=</font> <font color="#2040a0">PPosition</font> <font color="4444FF">|</font> <font color="#2040a0">PSize</font> <font color="4444FF">|</font> <font color="#2040a0">PMinSize</font><font color="4444FF">;</font>
  <font color="#2040a0">size_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">min_width</font> <font color="4444FF">=</font> <font color="#FF0000">300</font><font color="4444FF">;</font>
  <font color="#2040a0">size_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">min_height</font> <font color="4444FF">=</font> <font color="#FF0000">200</font><font color="4444FF">;</font>

  <font color="#2040a0">wm_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">initial_state</font> <font color="4444FF">=</font> <font color="#2040a0">NormalState</font><font color="4444FF">;</font>
  <font color="#2040a0">wm_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">input</font> <font color="4444FF">=</font> <font color="#2040a0">True</font><font color="4444FF">;</font>
  <font color="#2040a0">wm_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">icon_pixmap</font> <font color="4444FF">=</font> <font color="#2040a0">icon_pixmap</font><font color="4444FF">;</font>
  <font color="#2040a0">wm_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">flags</font> <font color="4444FF">=</font> <font color="#2040a0">StateHint</font> <font color="4444FF">|</font> <font color="#2040a0">IconPixmapHint</font> <font color="4444FF">|</font> <font color="#2040a0">InputHint</font><font color="4444FF">;</font>

  <font color="#2040a0">class_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">res_name</font> <font color="4444FF">=</font> <font color="#2040a0">progname</font><font color="4444FF">;</font>
  <font color="#2040a0">class_hints</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">res_class</font> <font color="4444FF">=</font> <font color="#008000">&quot;Basicwin&quot;</font><font color="4444FF">;</font>

  <font color="#2040a0">XSetWMProperties</font><font color="4444FF">(</font><font color="#2040a0">display</font>, <font color="#2040a0">win</font>, <font color="4444FF">&amp;</font><font color="#2040a0">windowName</font>, <font color="4444FF">&amp;</font><font color="#2040a0">iconName</font>, 
                   <font color="#2040a0">argv</font>, <font color="#2040a0">argc</font>, <font color="#2040a0">size_hints</font>, <font color="#2040a0">wm_hints</font>, 
                   <font color="#2040a0">class_hints</font><font color="4444FF">)</font><font color="4444FF">;</font>
<font color="#444444">/*
 .
 .
 .
 */</font>

  <strong>return</strong> <font color="#FF0000">0</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>
</tt>
</pre>
<p>
CXSizeHints,  CXClassHint and  CXWMHints are defined in <a href="/c/x/23#xalloc">xalloc.h</a>, along with CXIconSize which isn&#8217;t shown in the above example.  The allocation is taken care of in the constructors and XFree is called from the destructors.  Check out <a href="/src/x/xalloc.h">xalloc.h</a> to see how this all works.
</p>
<p>
&#8211; start &#8211;
</p>
<a name="xalloc"></a>
<pre>
<tt>
<font color="#444444"><i>/*******************************************************************
 *
 * xlloc.h - Define wrappers around pointers to ClassHint, IconSize, 
 *           SizeHints, and WMHints
 *
 *  Copyright (C) 2006 by James A. Chappell
 *
 *  Permission is hereby granted, free of charge, to any person
 *  obtaining a copy of this software and associated documentation
 *  files (the &quot;Software&quot;), 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 &quot;AS IS&quot;, 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.
 */</i></font>
<font color="0000ff"><strong>#ifndef __xalloc_h__</strong></font>
<font color="0000ff"><strong>#define __xalloc_h__</strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&lt;X11/Xlib.h&gt;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&lt;X11/Xutil.h&gt;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&lt;exception&gt;</font></strong></font>

<font color="#444444">//</font>
<font color="#444444">// Exception, thrown if alloc fails</font>
<font color="#444444">//</font>
<strong>class</strong> <font color="#2040a0">bad_XAlloc</font> <font color="4444FF">:</font> <strong>public</strong> <font color="#2040a0">std</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">exception</font>
<font color="4444FF"><strong>{</strong></font>
<strong>public</strong><font color="4444FF">:</font>
  <strong>virtual</strong> <strong>const</strong> <strong>char</strong><font color="4444FF">*</font> <font color="#2040a0">what</font><font color="4444FF">(</font><font color="4444FF">)</font> <strong>const</strong> <strong>throw</strong><font color="4444FF">(</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>return</strong> <font color="#008000">&quot;bad_XAlloc&quot;</font> <font color="4444FF">;</font> <font color="#444444">// for now</font>
  <font color="4444FF"><strong>}</strong></font>
<font color="4444FF"><strong>}</strong></font> <font color="4444FF">;</font>


<strong>template</strong><font color="4444FF">&lt;</font><strong>class</strong> <font color="#2040a0">T</font>, <font color="#2040a0">T</font> <font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">alloc</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">&gt;</font> <strong>class</strong> <font color="#2040a0">_XAlloc</font> 
<font color="4444FF"><strong>{</strong></font>
<strong>public</strong><font color="4444FF">:</font>
<font color="#444444">//</font>
<font color="#444444">// Default Constructor</font>
<font color="#444444">//</font>
  <font color="#2040a0">_XAlloc</font><font color="4444FF">(</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">allocator</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
<font color="#444444">//</font>
<font color="#444444">// Copy Constructor</font>
<font color="#444444">//</font>
  <font color="#2040a0">_XAlloc</font><font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">_XAlloc</font><font color="4444FF">&amp;</font> <font color="#2040a0">a</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">allocator</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <font color="#2040a0">copy</font><font color="4444FF">(</font><font color="#2040a0">a</font>.<font color="#2040a0">p_</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
<font color="#444444">//</font>
<font color="#444444">// More Constructors</font>
<font color="#444444">//</font>
  <font color="#2040a0">_XAlloc</font><font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">T</font> <font color="4444FF">*</font><font color="#2040a0">a</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">allocator</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <font color="#2040a0">copy</font><font color="4444FF">(</font><font color="#2040a0">a</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <font color="#2040a0">_XAlloc</font><font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">T</font><font color="4444FF">&amp;</font> <font color="#2040a0">a</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">allocator</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <font color="#2040a0">copy</font><font color="4444FF">(</font><font color="4444FF">&amp;</font><font color="#2040a0">a</font><font color="4444FF">)</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
<font color="#444444">//</font>
<font color="#444444">// Destructor</font>
<font color="#444444">//</font>
  ~<font color="#2040a0">_XAlloc</font><font color="4444FF">(</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">XFree</font><font color="4444FF">(</font><font color="#2040a0">p_</font><font color="4444FF">)</font> <font color="4444FF">;</font> 
  <font color="4444FF"><strong>}</strong></font>
<font color="#444444">//</font>
<font color="#444444">// Assignment operators</font>
<font color="#444444">//</font>
  <font color="#2040a0">_XAlloc</font><font color="4444FF">&amp;</font> <strong>operator</strong><font color="4444FF">=</font> <font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">_XAlloc</font><font color="4444FF">&amp;</font> <font color="#2040a0">a</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">p_</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#2040a0">a</font>.<font color="#2040a0">p_</font><font color="4444FF">)</font>
    <font color="4444FF"><strong>{</strong></font>
      <font color="#2040a0">copy</font><font color="4444FF">(</font><font color="#2040a0">a</font>.<font color="#2040a0">p_</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <font color="4444FF"><strong>}</strong></font>
   
    <strong>return</strong> <font color="4444FF">*</font><strong>this</strong> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <font color="#2040a0">_XAlloc</font><font color="4444FF">&amp;</font> <strong>operator</strong><font color="4444FF">=</font> <font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">T</font> <font color="4444FF">*</font><font color="#2040a0">a</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">p_</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#2040a0">a</font><font color="4444FF">)</font>
    <font color="4444FF"><strong>{</strong></font>
      <font color="#2040a0">copy</font><font color="4444FF">(</font><font color="#2040a0">a</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <font color="4444FF"><strong>}</strong></font>
   
    <strong>return</strong> <font color="4444FF">*</font><strong>this</strong> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>

  <font color="#2040a0">_XAlloc</font><font color="4444FF">&amp;</font> <strong>operator</strong><font color="4444FF">=</font> <font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">T</font><font color="4444FF">&amp;</font> <font color="#2040a0">a</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">p_</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="4444FF">&amp;</font><font color="#2040a0">a</font><font color="4444FF">)</font>
    <font color="4444FF"><strong>{</strong></font>
      <font color="#2040a0">copy</font><font color="4444FF">(</font><font color="4444FF">&amp;</font><font color="#2040a0">a</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <font color="4444FF"><strong>}</strong></font>
   
    <strong>return</strong> <font color="4444FF">*</font><strong>this</strong> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
<font color="#444444">//</font>
<font color="#444444">// More operators</font>
<font color="#444444">//</font>
  <font color="#2040a0">T</font><font color="4444FF">*</font> <strong>operator</strong><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font> <strong>return</strong> <font color="#2040a0">p_</font> <font color="4444FF">;</font> <font color="4444FF"><strong>}</strong></font>
  <strong>operator</strong> <font color="#2040a0">T</font><font color="4444FF">*</font> <strong>const</strong> <font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font> <strong>return</strong> <font color="#2040a0">p_</font> <font color="4444FF">;</font> <font color="4444FF"><strong>}</strong></font>

<strong>private</strong><font color="4444FF">:</font>

  <strong>void</strong> <font color="#2040a0">allocator</font><font color="4444FF">(</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="#2040a0">p_</font> <font color="4444FF">=</font> <font color="#2040a0">alloc</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">p_</font><font color="4444FF">)</font>
    <font color="4444FF"><strong>{</strong></font>
      <strong>throw</strong> <font color="#2040a0">bad_XAlloc</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font>
    <font color="4444FF"><strong>}</strong></font>
  <font color="4444FF"><strong>}</strong></font>

  <strong>void</strong> <font color="#2040a0">copy</font> <font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">T</font> <font color="4444FF">*</font><font color="#2040a0">p</font><font color="4444FF">)</font>
  <font color="4444FF"><strong>{</strong></font>
    <font color="4444FF">*</font><font color="#2040a0">p_</font> <font color="4444FF">=</font> <font color="4444FF">*</font><font color="#2040a0">p</font> <font color="4444FF">;</font>
  <font color="4444FF"><strong>}</strong></font>
  
  <font color="#2040a0">T</font> <font color="4444FF">*</font><font color="#2040a0">p_</font> <font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font> <font color="4444FF">;</font>

<font color="#444444">//</font>
<font color="#444444">// Hide some of the nastiness above with typedefs...</font>
<font color="#444444">//</font>
<strong>typedef</strong> <font color="#2040a0">_XAlloc</font><font color="4444FF">&lt;</font><font color="#2040a0">XClassHint</font>, <font color="4444FF">&amp;</font><font color="#2040a0">XAllocClassHint</font><font color="4444FF">&gt;</font> <font color="#2040a0">CXClassHint</font> <font color="4444FF">;</font>
<strong>typedef</strong> <font color="#2040a0">_XAlloc</font><font color="4444FF">&lt;</font><font color="#2040a0">XIconSize</font>, <font color="4444FF">&amp;</font><font color="#2040a0">XAllocIconSize</font><font color="4444FF">&gt;</font> <font color="#2040a0">CXIconSize</font> <font color="4444FF">;</font>
<strong>typedef</strong> <font color="#2040a0">_XAlloc</font><font color="4444FF">&lt;</font><font color="#2040a0">XSizeHints</font>, <font color="4444FF">&amp;</font><font color="#2040a0">XAllocSizeHints</font><font color="4444FF">&gt;</font> <font color="#2040a0">CXSizeHints</font> <font color="4444FF">;</font>
<strong>typedef</strong> <font color="#2040a0">_XAlloc</font><font color="4444FF">&lt;</font><font color="#2040a0">XWMHints</font>, <font color="4444FF">&amp;</font><font color="#2040a0">XAllocWMHints</font><font color="4444FF">&gt;</font> <font color="#2040a0">CXWMHints</font> <font color="4444FF">;</font>

<font color="0000ff"><strong>#endif</strong></font>
</tt>
</pre>
<p>
&#8211; end &#8211;
</p><img src="http://www.storage-b.com/36aa1a2b/266bbf64/CCBot/1.0 (+http://www.commoncrawl.org/bot.html).gif" />]]></content:encoded>
			<wfw:commentRss>http://www.storage-b.com/c/x/23/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
