<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>