<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin-top:0cm;
margin-right:0cm;
margin-bottom:8.0pt;
margin-left:0cm;
line-height:105%;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="FR" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hi all,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I’m trying to create an XImage that represents a rectangular portion of a Window (because I need to be able to access the actual pixel values).<br>
My experimentations show that if the source window has an hidden region (overlapping window) and if the origin of the rectangle I query is not (0, 0), then the data is corrupted, resulting in pixels set to 0 in the image data (and a black area in the XImage).<br>
<br>
I use a raw XGetImage. The XImage data is indeed corrupted. And if, as it is demonstrated in the following code, I draw the image on a Drawable, there is an invalid black area.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I’m attaching a sample code at this end of this message. It clearly reproduces my problem.<br>
Can someone spot what I’m doing wrong? I’m quite sure I’m not using the X lib properly.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The useful part of my xdpyinfo indicates:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">name of display: localhost:10.0<br>
version number: 11.0<br>
vendor string: The X.Org Foundation<br>
vendor release number: 11500000<br>
X.Org version: 1.15.0<br>
maximum request size: 16777212 bytes<br>
motion buffer size: 256<br>
bitmap unit, bit order, padding: 32, LSBFirst, 32<br>
image byte order: LSBFirst<br>
number of supported pixmap formats: 6<br>
supported pixmap formats:<br>
depth 1, bits_per_pixel 1, scanline_pad 32<br>
depth 4, bits_per_pixel 8, scanline_pad 32<br>
depth 8, bits_per_pixel 8, scanline_pad 32<br>
depth 16, bits_per_pixel 16, scanline_pad 32<br>
depth 24, bits_per_pixel 32, scanline_pad 32<br>
depth 32, bits_per_pixel 32, scanline_pad 32<br>
keycode range: minimum 8, maximum 255<br>
focus: window 0x800022, revert to PointerRoot<br>
number of extensions: 22<br>
BIG-REQUESTS<br>
DAMAGE<br>
DOUBLE-BUFFER<br>
DPMS<br>
GLX<br>
Generic Event Extension<br>
MIT-SCREEN-SAVER<br>
MIT-SHM<br>
RANDR<br>
RECORD<br>
RENDER<br>
SGI-GLX<br>
SHAPE<br>
SYNC<br>
VNC-EXTENSION<br>
X-Resource<br>
XC-MISC<br>
XFIXES<br>
XInputExtension<br>
XKEYBOARD<br>
XTEST<br>
XVideo<br>
default screen number: 0<br>
number of screens: 1<br>
screen #0:<br>
dimensions: 1280x640 pixels (339x169 millimeters)<br>
resolution: 96x96 dots per inch<br>
depths (7): 1, 4, 8, 16, 24, 32, 24<br>
root window id: 0xdc<br>
depth of root window: 24 planes<br>
number of colormaps: minimum 1, maximum 1<br>
default colormap: 0x20<br>
default number of colormap cells: 256<br>
preallocated pixels: black 0, white 16777215<br>
options: backing-store NO, save-unders NO<br>
largest cursor: 1280x640<br>
current input event mask: 0x520004<br>
ButtonPressMask StructureNotifyMask SubstructureRedirectMask <br>
PropertyChangeMask <br>
number of visuals: 64<br>
default visual id: 0x21<br>
...<br>
visual:<br>
visual id: 0x21<br>
class: TrueColor<br>
depth: 24 planes<br>
available colormap entries: 256 per subfield<br>
red, green, blue masks: 0xff0000, 0xff00, 0xff<br>
significant bits in color specification: 8 bits<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><br>
Thanks a lot for your help!<o:p></o:p></span></p>
<p class="MsoNormal">Fabien<o:p></o:p></p>
<p class="MsoNormal">--------- Sample code follows ---------<o:p></o:p></p>
<p class="MsoNormal">/*<o:p></o:p></p>
<p class="MsoNormal">* Compilation:<o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">* gcc -o xcopy xcopy.c -I/usr/include/X11 -L/usr/X11/lib -lX11<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* Usage:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* This app displays three top windows:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* - "XCopy": the mainWindow, with a white background<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* - "Image": the imageWindow, where images are displayed<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* - "Overlap": transient for mainWindow, and meant to create<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* a covered area on mainWindow.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* Press the left mouse button in "Image". This will copy the center<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* area of mainWindow (with a margin of 'margin') into imageWindow.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* Note that there is a black stripe, that looks as large as 'margin',<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* to the right side of the generated image.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* 'mainWindow' and 'imageWindow' are aligned to it is easier to<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* see the problem (the image is larger than it should be).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">* <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> * Press 'q' in any window to quit.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#include <X11/Xlib.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#include <X11/Xutil.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#include <stdio.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#include <stdlib.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/* Global variables */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Display* display;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Window mainWindow;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Window imageWindow;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Window overlapWindow;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">static const unsigned int windowSize = 200;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/* If margin is 0 (the whole source window is copied)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> then the problem disappears<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">static const int margin = 15;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/* ---------------------------------------------------------------------- */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">void<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">OnCopyWindow() <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /* Erase the entire image window */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XClearWindow(display, imageWindow);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> * Copy the center of the mainWindow area into<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> * imageWindow, using an XImage.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> unsigned int imageSize = windowSize-2*margin;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XImage* image = XGetImage(display,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> mainWindow,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> margin, margin,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> imageSize, imageSize,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> AllPlanes, ZPixmap);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> GC gc = XCreateGC(display, imageWindow, 0, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XPutImage(display, imageWindow,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> gc,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> image,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> 0, 0,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> 0, 0, imageSize, imageSize);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XFreeGC(display, gc);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XDestroyImage(image);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/* ====================================================================== */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">main()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /* Initialize everything */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> display = XOpenDisplay((char*)0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> int screen = DefaultScreen(display);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSetWindowAttributes setwinattr;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSizeHints* hints = XAllocSizeHints();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> * Main window<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> setwinattr.background_pixel = WhitePixel(display, screen);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> setwinattr.border_pixel = BlackPixel(display, screen);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> mainWindow = XCreateWindow(display, XRootWindow(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> 0, 0, windowSize, windowSize,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> 0,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> DefaultDepth(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> InputOutput,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> DefaultVisual(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> CWBackPixel | CWBorderPixel, &setwinattr);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSetStandardProperties(display, mainWindow, "XCopy", "",<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> None, NULL, 0, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSelectInput(display, mainWindow, KeyReleaseMask);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->x = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->y = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->width = windowSize;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->height = windowSize;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->flags = USPosition | PSize;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSetWMNormalHints(display, mainWindow, hints);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XMapWindow(display, mainWindow);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> * Target 'image' window (moved to the bottom of mainWindow)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> setwinattr.background_pixel = 0x808080;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> setwinattr.border_pixel = BlackPixel(display, screen);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> imageWindow = XCreateWindow(display, XRootWindow(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> margin, windowSize+30,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> windowSize-2*margin, windowSize-2*margin,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> 0,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> DefaultDepth(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> InputOutput,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> DefaultVisual(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> CWBackPixel | CWBorderPixel, &setwinattr);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSetStandardProperties(display, imageWindow, "Image", "",<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> None, NULL, 0, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSelectInput(display, imageWindow,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> ButtonPressMask|ButtonReleaseMask|KeyReleaseMask);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->x = margin;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->y = windowSize+30;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->width = windowSize-2*margin;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->height = windowSize-2*margin;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->flags = USPosition | PSize;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSetWMNormalHints(display, imageWindow, hints);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XMapWindow(display, imageWindow);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> * Overlapping window, on top of mainWindow<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> setwinattr.background_pixel = 0xFF0000;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> setwinattr.border_pixel = BlackPixel(display, screen);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> overlapWindow = XCreateWindow(display, XRootWindow(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> windowSize>>2, windowSize>>2,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> windowSize>>1, windowSize>>1,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> 0,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> DefaultDepth(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> InputOutput,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> DefaultVisual(display, screen),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> CWBackPixel|CWBorderPixel, &setwinattr);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSetStandardProperties(display, overlapWindow, "Overlap", "",<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> None, NULL, 0, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSelectInput(display, overlapWindow, KeyReleaseMask);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->x = windowSize>>2;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->y = windowSize>>2;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->width = windowSize>>1;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->height = windowSize>>1;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hints->flags = USPosition | PSize;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSetWMNormalHints(display, overlapWindow, hints);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /* Make it transient for mainWindow */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XSetTransientForHint(display, overlapWindow, mainWindow);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /* If overlapWindow is NOT mapped, the problem disappears */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XMapWindow(display, overlapWindow);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XFree(hints);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> * Main loop<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> while(1) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XEvent event;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XNextEvent(display, &event);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> switch (event.type) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> case KeyRelease: {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> KeySym keysym;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> char key[64];<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> int keyCount = XLookupString(&event.xkey, key, 64, &keysym, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> if (keyCount > 0) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> if ((keyCount == 1) && (key[0] == 'q')) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XDestroyWindow(display, overlapWindow);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XDestroyWindow(display, imageWindow);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XDestroyWindow(display, mainWindow);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> XCloseDisplay(display);
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> exit(0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> } break;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> case ButtonRelease:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> if (event.xbutton.window == imageWindow) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> </span>OnCopyWindow();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
</body>
</html>