home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / apps / cmapDoctor / cmapdoctor / DrcmapControlDerived.c++ < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  15.6 KB  |  639 lines

  1. /*
  2.  * Copyright (C) 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /////////////////////////////////////////////////////////////
  18. //
  19. // Source file for DrcmapControlDerived
  20. //
  21. //    This file generated by BuilderXcessory. 
  22. /////////////////////////////////////////////////////////////
  23.  
  24. #include "DrcmapControlDerived.h"
  25. #include <iostream.h>
  26. #include <Xm/List.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <unistd.h>
  30. #include "XLayerUtil.h"
  31. #include <Vk/VkApp.h>
  32. #include <Vk/VkIcon.h>
  33. #include <Vk/xpm.h>
  34. #include "drcmap.xpm"
  35. #include "bbl.xpm"
  36. #include "bbinvl.xpm"
  37. #include "bbr.xpm"
  38. #include "bbinvr.xpm"
  39. #include <X11/cursorfont.h>
  40. #include <X11/Xmu/WinUtil.h>
  41.  
  42. char *installNames[] = {
  43.     "No",
  44.     "Yes",
  45. };
  46.  
  47. char *vtypeNames[] = {
  48.     "Underlay",
  49.     "Normal",
  50.     "Overlay",
  51.     "Popup",
  52. };
  53.  
  54.  
  55. char *vclassNames[] = {
  56.     "StaticGray",
  57.     "GrayScale",
  58.     "StaticColor",
  59.     "PseudoColor",
  60.     "TrueColor",
  61.     "DirectColor",
  62. };
  63.  
  64. enum Vtype {underlay, normal, overlay, popup};
  65.  
  66. struct {
  67.     Colormap cmap;
  68.     int vclass;
  69.     enum Vtype vtype;
  70.     int depth;
  71.     int installed;
  72.     int numRefs;
  73.     int layer;
  74.     Visual *visual;
  75.     GC gc;
  76.     Window win;
  77.     int winIO;
  78.     char title[80];
  79. } allcmaps[1000];
  80.  
  81. int cmapCnt = 0;
  82. int cmapsInstalled = 0;
  83. int winCnt = 0;
  84. int winChoice;
  85. Widget list;
  86. Widget rgbDisp;
  87. Window drawArea;
  88. Window basewind;
  89. DrawwinDerived *drawwin;
  90. Pixmap drcmapPixmap;
  91. Pixmap drcmapShapemask;
  92. Pixmap bblPixmap;
  93. Pixmap bblShapemask;
  94. Pixmap bbinvlPixmap;
  95. Pixmap bbinvlShapemask;
  96. Pixmap bbrPixmap;
  97. Pixmap bbrShapemask;
  98. Pixmap bbinvrPixmap;
  99. Pixmap bbinvrShapemask;
  100.  
  101. extern "C" {
  102. Boolean buildList(XtPointer);
  103. void scanXTree(Display *, Window, Window, int);
  104. void walkTree(Display *, Window, Window, int, int);
  105. enum Vtype identifyVisual(Display *, Visual *);
  106. void buildWin(Display *, Window, int);
  107. void setWMColormaps(Display *, Window);
  108. void displayColormap(Display *);
  109. void updateWindowsAndList(Display *);
  110. Window Select_Window(Display *);
  111. void getWindowCmapInfo(Display *, Window, Window);
  112. };
  113.  
  114.  
  115. DrcmapControlDerived::DrcmapControlDerived(const char *name, Widget parent) : 
  116.                    DrcmapControl(name, parent) 
  117.     char *colors[] = {
  118.      "highlightColor1",
  119.       NULL
  120.     };
  121.  
  122.     XpmAttributes attr;
  123.     int status = 0;
  124.     Display *dpy;
  125.  
  126.     
  127.     winChoice = 0;
  128.     list = _list1;
  129.     rgbDisp = _rgbDisp;
  130.     drawwin = _drawwin;
  131.     XtAppContext app = XtWidgetToApplicationContext(_drawwin->baseWidget());
  132.     XtAppAddWorkProc(app, buildList, _drawwin);
  133.  
  134.     dpy = XtDisplay(theApplication->baseWidget());
  135.     basewind = XtWindow(theApplication->baseWidget());
  136. /*
  137.     colormap = XCreateColormap(dpy, basewind,
  138.                    DefaultVisual(dpy, DefaultScreen(dpy)),
  139.                    AllocNone);
  140.     attr.colormap = colormap;
  141.     attr.valuemask = XpmColormap | XpmCloseness;
  142. */
  143.     attr.valuemask = XpmCloseness;
  144.     attr.closeness = 40000;
  145.     
  146.        status = XpmCreatePixmapFromData(dpy, 
  147.                                        DefaultRootWindow(dpy), 
  148.                                        docbak, &drcmapPixmap, &drcmapShapemask, 
  149.                                        &attr);
  150.     if (status)
  151.          cout << "error creating pixmap" << endl;
  152.                        
  153.        XtVaSetValues(_baseWidget, 
  154.                    XmNbackgroundPixmap, drcmapPixmap,
  155.                    NULL); 
  156.  
  157.        status = XpmCreatePixmapFromData(dpy, 
  158.                                        basewind, 
  159.                                        bbl, &bblPixmap, &bblShapemask, 
  160.                                        &attr);
  161.     if (status)
  162.          cout << "error creating pixmap" << endl;
  163.                        
  164.        status = XpmCreatePixmapFromData(dpy, 
  165.                                        basewind, 
  166.                                        bbinvl, &bbinvlPixmap, &bbinvlShapemask, 
  167.                                        &attr);
  168.     if (status)
  169.          cout << "error creating pixmap" << endl;
  170.                        
  171.     status = XpmCreatePixmapFromData(dpy, 
  172.                                        basewind, 
  173.                                        bbr, &bbrPixmap, &bbrShapemask, 
  174.                                        &attr);
  175.     if (status)
  176.          cout << "error creating pixmap" << endl;
  177.                        
  178.        status = XpmCreatePixmapFromData(dpy, 
  179.                                        basewind, 
  180.                                        bbinvr, &bbinvrPixmap, &bbinvrShapemask, 
  181.                                        &attr);
  182.     if (status)
  183.          cout << "error creating pixmap" << endl;
  184.                        
  185.                       
  186.        XtVaSetValues(_prevCmap1, 
  187.                    XmNlabelPixmap, bblPixmap,
  188.                    NULL); 
  189.                        
  190.        XtVaSetValues(_nextCmap1, 
  191.                    XmNlabelPixmap, bbrPixmap,
  192.                    NULL); 
  193. }
  194.  
  195.  
  196. DrcmapControlDerived::~DrcmapControlDerived()
  197. {
  198.   // Empty
  199. }
  200.  
  201.  
  202. const char * DrcmapControlDerived::className() // classname
  203. {
  204.     return ("DrcmapControlDerived");
  205. }
  206.  
  207. void DrcmapControlDerived::pickCmap(Widget w, XtPointer calldata)
  208. {
  209.     XmListCallbackStruct *cbs = (XmListCallbackStruct *)calldata;
  210.     
  211.     if (cbs->reason == XmCR_BROWSE_SELECT) {
  212.         winChoice = cbs->item_position - 1;
  213.         updateWindowsAndList(XtDisplay(w));
  214.         displayColormap(XtDisplay(w));
  215.     }
  216.     else
  217.          cout << "other select" << endl;
  218. }
  219.  
  220. void DrcmapControlDerived::prevCmap(Widget w, XtPointer) 
  221. {    
  222.     if (cmapCnt == 1)
  223.         return;
  224.     winChoice--;
  225.     if (winChoice < 0)
  226.         winChoice = cmapCnt - 1;
  227.     updateWindowsAndList(XtDisplay(w));
  228.     displayColormap(XtDisplay(w));
  229. }
  230.  
  231.  
  232. void DrcmapControlDerived::nextCmap(Widget w, XtPointer) 
  233. {   
  234.     if (cmapCnt == 1)
  235.         return;
  236.     winChoice++;
  237.     winChoice = winChoice % cmapCnt;
  238.     updateWindowsAndList(XtDisplay(w));
  239.     displayColormap(XtDisplay(w));
  240. }
  241.  
  242.  
  243. void DrcmapControlDerived::pushedBtnl(Widget w, XtPointer) 
  244. {    
  245.        XtVaSetValues(w, 
  246.                    XmNlabelPixmap, bbinvlPixmap,
  247.                    NULL); 
  248. }
  249.  
  250. void DrcmapControlDerived::normalBtnl(Widget w, XtPointer) 
  251. {    
  252.        XtVaSetValues(w, 
  253.                    XmNlabelPixmap, bblPixmap,
  254.                    NULL); 
  255. }
  256.  
  257.  
  258. void DrcmapControlDerived::pushedBtnr(Widget w, XtPointer) 
  259. {    
  260.        XtVaSetValues(w, 
  261.                    XmNlabelPixmap, bbinvrPixmap,
  262.                    NULL); 
  263. }
  264.  
  265. void DrcmapControlDerived::normalBtnr(Widget w, XtPointer) 
  266. {    
  267.        XtVaSetValues(w, 
  268.                    XmNlabelPixmap, bbrPixmap,
  269.                    NULL); 
  270. }
  271.  
  272.  
  273. void DrcmapControlDerived::rootList(Widget w, XtPointer) 
  274. {
  275.     scanXTree(XtDisplay(w), 
  276.                 RootWindow(XtDisplay(w), DefaultScreen(XtDisplay(w))), 
  277.                 XtWindow(_drawwin->baseWidget()), 1);
  278. }
  279.  
  280.  
  281. void DrcmapControlDerived::pickList(Widget w, XtPointer) 
  282. {
  283.     scanXTree(XtDisplay(w), 
  284.                 Select_Window(XtDisplay(w)), 
  285.                 XtWindow(_drawwin->baseWidget()), 1);
  286. }
  287.  
  288.  
  289. void DrcmapControlDerived::setList(XmString *items, int itemCnt)
  290. {
  291.  
  292.     XmListAddItems(_list1, items, itemCnt, 0);
  293. }
  294.  
  295.  
  296. Boolean
  297. buildList(XtPointer widg) 
  298. {
  299.     DrawwinDerived *drawW = (DrawwinDerived *)widg;
  300.      Widget w = drawW->baseWidget();
  301.      static int first = 1;
  302.  
  303.      drawArea = XtWindow(w);
  304.      if (!drawW->isExposed())
  305.          return(False);
  306.          
  307.     if (first) {
  308.         first = 0;
  309.         scanXTree(XtDisplay(w), 
  310.                     RootWindow(XtDisplay(w), DefaultScreen(XtDisplay(w))), 
  311.                     XtWindow(w), 0);
  312.         setWMColormaps(XtDisplay(w), XtWindow(theApplication->baseWidget()));
  313.         updateWindowsAndList(XtDisplay(w));
  314.         displayColormap(XtDisplay(w));
  315.     }
  316.     return(True);
  317. }
  318.  
  319.  
  320.  
  321.  
  322. void
  323. scanXTree(Display *dpy, Window startWin, Window attachWin, int recurse)
  324. {
  325.     winCnt = 0;
  326.     XDestroySubwindows(dpy, attachWin);        
  327.     cmapCnt = 0;
  328.     XmListDeleteAllItems(list);
  329.     theApplication->busy();
  330.     getWindowCmapInfo(dpy, startWin, attachWin);
  331.     walkTree(dpy, startWin, attachWin, recurse, 0);
  332.     theApplication->notBusy();
  333. }
  334.  
  335.  
  336.  
  337. void
  338. walkTree(Display *dpy, Window startWin, Window attachWin, int recurse, int level)
  339. {
  340.   int i;
  341.   Window root_win, parent_win;
  342.   unsigned int num_children;
  343.   Window *child_list;
  344.     
  345.   if (!XQueryTree(dpy, startWin, &root_win, &parent_win, &child_list,
  346.           &num_children)) {
  347.     fprintf(stderr, "Can't query window tree.");
  348.     exit(-1);
  349.   }
  350.    
  351.   winCnt += num_children;
  352.   
  353.   getWindowCmapInfo(dpy, startWin, attachWin);
  354.  
  355.   for (i = (int)num_children - 1; i >= 0; i--) {    
  356.     if (recurse)
  357.         walkTree(dpy, child_list[i], attachWin, 1, level+1);
  358.   }
  359.   if (child_list) XFree((char *)child_list);
  360. }
  361.  
  362.  
  363. void
  364. getWindowCmapInfo(Display *dpy, Window startWin, Window attachWin)
  365. {
  366.   int j;
  367.   XWindowAttributes win_attributes;
  368.   XVisualInfo vistemplate;
  369.   XVisualInfo *vinfo;
  370.   int junk;
  371.   XmString item;
  372.   int newcmap;
  373.  
  374.  
  375.       if (!XGetWindowAttributes(dpy, startWin, &win_attributes)) {
  376.         fprintf(stderr, "Can't get window attributes.");
  377.         exit(-1);
  378.     }
  379.       vistemplate.visualid = XVisualIDFromVisual(win_attributes.visual);
  380.       vinfo = XGetVisualInfo(dpy, VisualIDMask, &vistemplate, &junk);
  381.  
  382.     newcmap = 1;
  383.     for (j = 0; j < cmapCnt; j++) 
  384.         if (win_attributes.colormap == allcmaps[j].cmap) {
  385.             allcmaps[j].numRefs++;
  386.             if (win_attributes.map_installed) 
  387.                 allcmaps[j].installed = True;
  388.             newcmap = 0;
  389.             break;
  390.         }
  391.         
  392.     if (newcmap && win_attributes.depth != 0) { /* if InputOnly, ignore */
  393.         allcmaps[cmapCnt].numRefs++;
  394.         allcmaps[cmapCnt].cmap = win_attributes.colormap;
  395.         allcmaps[cmapCnt].vclass = vinfo->c_class;
  396.         allcmaps[cmapCnt].visual = vinfo->visual;
  397.         allcmaps[cmapCnt].vtype = identifyVisual(dpy, vinfo->visual);
  398.         allcmaps[cmapCnt].depth = win_attributes.depth;
  399.         allcmaps[cmapCnt].winIO = win_attributes.c_class;
  400.         if (win_attributes.map_installed)
  401.             cmapsInstalled++;
  402.         else 
  403.             allcmaps[cmapCnt].installed = 0;
  404.         sprintf(allcmaps[cmapCnt].title, "%-8s %2d  %-11s  0x%-x",
  405.                 vtypeNames[allcmaps[cmapCnt].vtype],
  406.                 allcmaps[cmapCnt].depth,
  407.                 vclassNames[allcmaps[cmapCnt].vclass],
  408.                 allcmaps[cmapCnt].cmap);
  409.         item = XmStringCreateSimple(allcmaps[cmapCnt].title);
  410.         XmListAddItem(list, item, 0);
  411.         buildWin(dpy, attachWin, cmapCnt);
  412.         winChoice = cmapCnt;
  413.         cmapCnt++;
  414.         updateWindowsAndList(dpy);
  415.         displayColormap(dpy);
  416.     }
  417. }
  418.  
  419.  
  420.  
  421. enum Vtype
  422. identifyVisual(Display *dpy, Visual *vis)
  423. {
  424.   int nVisuals;
  425.   static int defLayer;
  426.   int tmpLayer;
  427.   XLayerVisualInfo tmpLayerInfo;
  428.   XLayerVisualInfo *defaultLayerInfo;
  429.   Visual *defaultVisual;
  430.   static int first = 1;
  431.   
  432.    if (first) { 
  433.      defaultVisual = DefaultVisual(dpy, DefaultScreen(dpy));
  434.         tmpLayerInfo.vinfo.visualid = defaultVisual->visualid;
  435.         defaultLayerInfo = XGetLayerVisualInfo(dpy, VisualIDMask, &tmpLayerInfo, &nVisuals);
  436.      defLayer = defaultLayerInfo->layer;
  437.      first = 0;
  438.    }
  439.    
  440.    tmpLayerInfo.vinfo.visualid = vis->visualid; 
  441.    defaultLayerInfo = XGetLayerVisualInfo(dpy, 
  442.                  VisualIDMask, &tmpLayerInfo, &nVisuals);
  443.    tmpLayer = defaultLayerInfo->layer;
  444.    
  445.    if (tmpLayer < defLayer && defaultLayerInfo->type != None)
  446.       return(underlay);
  447.    else if (tmpLayer == defLayer)
  448.       return(normal);
  449.    else if (tmpLayer == defLayer + 1 && defaultLayerInfo->type != None)
  450.       return(overlay);
  451.    else if (tmpLayer == defLayer + 2 && defaultLayerInfo->type != None)
  452.       return(popup);
  453.    else {
  454.       fprintf(stderr, "error determining layer\n");
  455.       exit(-1);
  456.       return(popup);
  457.    }
  458. }
  459.  
  460.  
  461. void
  462. buildWin(Display *dpy, Window win, int newWin)
  463. {
  464.   XSetWindowAttributes winattr;
  465.   
  466.     winattr.event_mask = ExposureMask;
  467.     winattr.background_pixel = None;
  468.     winattr.colormap = allcmaps[newWin].cmap;
  469.     winattr.border_pixel = None;
  470.           
  471.     allcmaps[newWin].win = XCreateWindow(dpy, win,
  472.         1, 1, 256, 256,
  473.         0, allcmaps[newWin].depth, allcmaps[newWin].winIO, 
  474.         allcmaps[newWin].visual,
  475.         CWEventMask | CWBackPixel | CWBorderPixel | CWColormap, &winattr);
  476.  
  477.     allcmaps[newWin].gc = XCreateGC(dpy, allcmaps[newWin].win, NULL, NULL);
  478. }
  479.  
  480.  
  481. void
  482. setWMColormaps(Display *dpy, Window win)
  483. {
  484.   int i;
  485.   Window tmpwins[100];
  486.   
  487.   for (i = 0; i < cmapCnt; i++) 
  488.       tmpwins[i] = allcmaps[i].win;
  489.   XSetWMColormapWindows(dpy, win, tmpwins, cmapCnt);
  490. }
  491.  
  492.  
  493. void
  494. updateWindowsAndList(Display *dpy)
  495. {
  496.   static int lastChoice = 0;
  497.   int top, visible;
  498.   
  499.     XmListSelectPos(list, winChoice + 1, False);
  500.     XtVaGetValues(list,
  501.                   XmNtopItemPosition, &top,
  502.                   XmNvisibleItemCount, &visible,
  503.                   NULL);
  504.     if (winChoice + 1 < top)
  505.         XmListSetPos(list, winChoice + 1);
  506.     else if (winChoice + 1 >= top + visible)
  507.         XmListSetBottomPos(list, winChoice + 1);
  508.     
  509. //    XClearWindow(dpy, drawArea);
  510. //    XUnmapWindow(dpy, allcmaps[lastChoice].win);
  511.     XUnmapSubwindows(dpy, drawArea);
  512.     XClearWindow(dpy, allcmaps[winChoice].win);
  513.     XMapWindow(dpy, allcmaps[winChoice].win);
  514.     lastChoice = winChoice;
  515. }
  516.  
  517.  
  518. void
  519. displayColormap(Display *dpy)
  520. {
  521.   int i;
  522.   int sqw = 16;
  523.   int sqh = 16;
  524.   int cells;
  525.   int cellx;  
  526.   div_t loc;
  527.   int locx, locy, loccell;
  528.   XColor color;
  529.   char colorStr[80];
  530.   XmString item;
  531.   
  532.     if (cmapCnt == 0)  // buildList (of cmaps) has not be run yet
  533.         return;
  534.             
  535.     cells = allcmaps[winChoice].visual->map_entries;
  536.     if (cells > 256)
  537.         cells = 256;
  538.     cellx = 16;
  539.  
  540.     loc = div(drawwin->selectx, sqw);
  541.     locx = loc.quot;
  542.  
  543.     loc = div(drawwin->selecty, sqh);
  544.     locy = loc.quot;
  545.     
  546.     loccell = locy * cellx + locx;
  547.  
  548.     if (loccell > cells)
  549.         loccell = cells;
  550.         
  551.     for (i = 0; i < cells; i++) {
  552.         XSetForeground(dpy, allcmaps[winChoice].gc, i);
  553.         if (cells <= 256) {
  554.             XFillRectangle(dpy, allcmaps[winChoice].win, allcmaps[winChoice].gc,
  555.                   (i % cellx) * sqw, (i / cellx) * sqh, sqw, sqh);
  556.             if (i == loccell) {
  557.                 XSetFunction(dpy, allcmaps[winChoice].gc, GXxor);
  558.                 XSetLineAttributes(dpy, allcmaps[winChoice].gc, 2, 0, 0, 0);
  559.                 XDrawRectangle(dpy, allcmaps[winChoice].win, allcmaps[winChoice].gc,
  560.                   (i % cellx) * sqw, (i / cellx) * sqh, sqw - 1, sqh - 1);
  561.                 XSetLineAttributes(dpy, allcmaps[winChoice].gc, 1, 0, 0, 0);
  562.                 XSetFunction(dpy, allcmaps[winChoice].gc, GXcopy);
  563.                 color.pixel = i;
  564.                 XQueryColor(dpy, allcmaps[winChoice].cmap, &color);
  565.                 sprintf(colorStr, "%d R:%d G:%d B:%d", i,
  566.                             color.red >> 8, 
  567.                             color.green >> 8,
  568.                             color.blue >> 8);
  569.                 item = XmStringCreateSimple(colorStr);
  570.                    XtVaSetValues(rgbDisp, 
  571.                                    XmNlabelString, item,
  572.                                    NULL); 
  573.             }
  574.         }
  575.         else
  576.             XDrawPoint(dpy, allcmaps[winChoice].win, allcmaps[winChoice].gc,
  577.                         (i % cellx), (i / cellx));
  578.     }
  579. }
  580.  
  581.  
  582.  
  583.  
  584. /*
  585.  * Routine to let user select a window using the mouse
  586.  */
  587.  
  588. Window Select_Window(Display *dpy)
  589. {
  590.   int status;
  591.   Cursor cursor;
  592.   XEvent event;
  593.   Window target_win = None, root = RootWindow(dpy,DefaultScreen(dpy));
  594.   int buttons = 0;
  595.   int dummyi;
  596.   unsigned int dummy;
  597.  
  598.   /* Make the target cursor */
  599.   cursor = XCreateFontCursor(dpy, XC_crosshair);
  600.  
  601.   /* Grab the pointer using target cursor, letting it room all over */
  602.   status = XGrabPointer(dpy, root, False,
  603.             (unsigned long)ButtonPressMask|ButtonReleaseMask, GrabModeSync,
  604.             GrabModeAsync, root, cursor, CurrentTime);
  605.   if (status != GrabSuccess) printf("Can't grab the mouse.");
  606.  
  607.   /* Let the user select a window... */
  608.   while ((target_win == None) || (buttons != 0)) {
  609.     /* allow one more event */
  610.     XAllowEvents(dpy, SyncPointer, CurrentTime);
  611.     XWindowEvent(dpy, root, ButtonPressMask|ButtonReleaseMask, &event);
  612.     switch (event.type) {
  613.     case ButtonPress:
  614.       if (target_win == None) {
  615.     target_win = event.xbutton.subwindow; /* window selected */
  616.     if (target_win == None) target_win = root;
  617.       }
  618.       buttons++;
  619.       break;
  620.     case ButtonRelease:
  621.       if (buttons > 0) /* there may have been some down before we started */
  622.     buttons--;
  623.        break;
  624.     }
  625.   } 
  626.  
  627.   XUngrabPointer(dpy, CurrentTime);      /* Done with pointer */
  628.  
  629.   if (XGetGeometry (dpy, target_win, &root, &dummyi, &dummyi,
  630.                     &dummy, &dummy, &dummy, &dummy) &&
  631.                       target_win != root)
  632.       target_win = XmuClientWindow (dpy, target_win);
  633.  
  634.   return(target_win);
  635. }
  636.  
  637.  
  638.