home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / wm.C < prev    next >
C/C++ Source or Header  |  1998-04-29  |  5KB  |  200 lines

  1. // $Id: wm.C,v 1.20 1998/04/29 17:44:53 zeller Exp $ -*- C++ -*-
  2. // DDD window manager functions
  3.  
  4. // Copyright (C) 1996 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char wm_rcsid[] = 
  30.     "$Id: wm.C,v 1.20 1998/04/29 17:44:53 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "wm.h"
  37.  
  38. #include "Command.h"
  39. #include "ddd.h"
  40. #include "string-fun.h"
  41. #include "findParent.h"
  42.  
  43. #include <Xm/Xm.h>
  44. #include <Xm/DialogS.h>
  45. #include <X11/Xutil.h>
  46.  
  47. // ANSI C++ doesn't like the XtIsRealized() macro
  48. #ifdef XtIsRealized
  49. #undef XtIsRealized
  50. #endif
  51.  
  52. //-----------------------------------------------------------------------------
  53. // Window Manager Functions
  54. //-----------------------------------------------------------------------------
  55.     
  56. void wm_set_icon(Display *display, Window shell, Pixmap icon, Pixmap mask)
  57. {
  58.     XWMHints *wm_hints = XAllocWMHints();
  59.  
  60.     wm_hints->flags       = IconPixmapHint | IconMaskHint;
  61.     wm_hints->icon_pixmap = icon;
  62.     wm_hints->icon_mask   = mask;
  63.  
  64.     XSetWMHints(display, shell, wm_hints);
  65.  
  66.     XFree((void *)wm_hints);
  67. }
  68.  
  69. void wm_set_icon(Widget shell, Pixmap icon, Pixmap mask)
  70. {
  71.     if (XtIsWMShell(shell))
  72.     {
  73.     XtVaSetValues(shell,
  74.               XmNiconPixmap, icon,
  75.               XmNiconMask, mask,
  76.               NULL);
  77.     }
  78.  
  79. #if 0                // This should be done by the shell.
  80.     wm_set_icon(XtDisplay(shell), XtWindow(shell), icon, mask);
  81. #endif
  82. }
  83.  
  84. void wm_set_name(Display *display, Window shell_window,
  85.          string title, string icon)
  86. {
  87.     strip_space(title);
  88.     strip_space(icon);
  89.  
  90.     if (title != "")
  91.     XStoreName(display, shell_window, (String)title);
  92.     if (icon != "")
  93.     XSetIconName(display, shell_window, (String)icon);
  94. }
  95.  
  96. void wm_set_name(Widget shell, string title, string icon)
  97. {
  98.     strip_space(title);
  99.     strip_space(icon);
  100.  
  101.     XtVaSetValues(shell,
  102.           XmNiconName, (char *)icon,
  103.           XmNtitle,    (char *)title,
  104.           NULL);
  105.     
  106. #if 0                // This should be done by the shell.
  107.     wm_set_name(XtDisplay(shell), XtWindow(shell), title, icon);
  108. #endif
  109. }
  110.  
  111. // Wait until W is mapped
  112. void wait_until_mapped(Widget w, Widget shell)
  113. {
  114.     XSync(XtDisplay(w), false);
  115.     XmUpdateDisplay(w);
  116.  
  117.     if (shell == 0)
  118.     shell = find_shell(w);
  119.  
  120.     if (XtIsRealized(w) && XtIsRealized(shell))
  121.     {
  122.       XWindowAttributes attr;
  123.     while (XGetWindowAttributes(XtDisplay(w), XtWindow(w), &attr)
  124.            && attr.map_state != IsViewable)
  125.     {
  126.         if (XGetWindowAttributes(XtDisplay(shell), XtWindow(shell), &attr)
  127.         && attr.map_state != IsViewable)
  128.         break;        // Shell is withdrawn or iconic
  129.  
  130.         // Wait for exposure event
  131.         XEvent event;
  132.         XtAppNextEvent(XtWidgetToApplicationContext(w), &event);
  133.         XtDispatchEvent(&event);
  134.     }
  135.     }
  136.  
  137.     XSync(XtDisplay(w), false);
  138.     XmUpdateDisplay(w);
  139. }
  140.  
  141. void raise_shell(Widget w)
  142. {
  143.     if (w == 0 || !XtIsRealized(w))
  144.     return;
  145.  
  146.     // Place current shell on top
  147.     Widget shell = findShellParent(w);
  148.     if (shell != 0 && XtIsRealized(shell))
  149.     {
  150.     XRaiseWindow(XtDisplay(w), XtWindow(shell));
  151.  
  152. #if 0
  153.     wait_until_mapped(w);
  154.  
  155.     // Get focus
  156.     XSetInputFocus(XtDisplay(w), XtWindow(w), RevertToParent, 
  157.                XtLastTimestampProcessed(XtDisplay(w)));
  158. #endif
  159.  
  160.     // Try this one
  161.     XmProcessTraversal(w, XmTRAVERSE_CURRENT);
  162.     }
  163. }
  164.  
  165. void manage_and_raise(Widget w)
  166. {
  167.     if (w != 0)
  168.     {
  169.     // If top-level shell is withdrawn or iconic, realize dialog as icon
  170.     bool iconic = false;
  171.     Widget shell = find_shell(w);
  172.     if (shell != 0)
  173.     {
  174.         XWindowAttributes attr;
  175.         iconic = (!XtIsRealized(shell)
  176.               || XGetWindowAttributes(XtDisplay(shell), 
  177.                           XtWindow(shell), &attr)
  178.               && attr.map_state != IsViewable);
  179.  
  180.         if (iconic)
  181.         XtVaSetValues(w, XmNinitialState, IconicState, NULL);
  182.     }
  183.  
  184.     XtManageChild(w);
  185.  
  186.     shell = w;
  187.     while (shell != 0 && !XtIsShell(shell))
  188.         shell = XtParent(shell);
  189.  
  190.     if (shell != 0 && !XmIsDialogShell(shell))
  191.     {
  192.         if (!XtIsRealized(shell))
  193.         XtRealizeWidget(shell);
  194.         XtPopup(shell, XtGrabNone);
  195.     }
  196.  
  197.     raise_shell(w);
  198.     }
  199. }
  200.