home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume15 / olvwm-3.0 / part13 < prev    next >
Text File  |  1992-02-03  |  57KB  |  1,781 lines

  1. Newsgroups: comp.sources.x
  2. Path: uunet!usc!elroy.jpl.nasa.gov!ames!pasteur!nntp
  3. From: scott.oaks@East.Sun.COM (Scott Oaks)
  4. Subject: v15i159: OpenLook Virtual Window Mgr (3.0), Part13/21
  5. Message-ID: <1992Feb4.135833.7767@pasteur.Berkeley.EDU>
  6. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  7. Nntp-Posting-Host: postgres.berkeley.edu
  8. Organization: University of California, at Berkeley
  9. References: <csx-15i147-olvwm-3.0@uunet.UU.NET>
  10. Date: Tue, 4 Feb 1992 13:58:33 GMT
  11. Approved: dcmartin@msi.com
  12.  
  13. Submitted-by: scott.oaks@East.Sun.COM (Scott Oaks)
  14. Posting-number: Volume 15, Issue 159
  15. Archive-name: olvwm-3.0/part13
  16.  
  17. # This is a shell archive.  Remove anything before this line, then feed it
  18. # into a shell via "sh file" or similar.  To overwrite existing files,
  19. # type "sh file -c".
  20. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  21. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  22. # If this archive is complete, you will see the following message at the end:
  23. #        "End of archive 13 (of 21)."
  24. # Contents:  ollocale.h olvwm.man wincolor.c
  25. # Wrapped by dcmartin@fascet on Tue Jan 14 05:54:45 1992
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'ollocale.h' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'ollocale.h'\"
  29. else
  30. echo shar: Extracting \"'ollocale.h'\" \(1230 characters\)
  31. sed "s/^X//" >'ollocale.h' <<'END_OF_FILE'
  32. X/*
  33. X *      (c) Copyright 1989, 1990 Sun Microsystems, Inc. Sun design patents
  34. X *      pending in the U.S. and foreign countries. See LEGAL_NOTICE
  35. X *      file for terms of the license.
  36. X */
  37. X
  38. X#ident    "@(#)ollocale.h    1.6    91/09/14 SMI"
  39. X
  40. X#ifndef _OLLOCALE_H
  41. X#define _OLLOCALE_H
  42. X
  43. X
  44. X#ifdef OW_I18N_L3
  45. X
  46. X#include <locale.h>
  47. X/*
  48. X * OPEN LOOK Locale Categories.  Basic Locale must be first item
  49. X * (least number).
  50. X */
  51. X#define    OLLC_LC_BASIC_LOCALE    0
  52. X#define    OLLC_LC_DISPLAY_LANG    1
  53. X#define    OLLC_LC_INPUT_LANG    2
  54. X#define    OLLC_LC_NUMERIC        3
  55. X#define    OLLC_LC_DATE_FORMAT    4
  56. X#define    OLLC_LC_MAX        5
  57. X
  58. X/*
  59. X * OPEN LOOK Locale priority (small number has higher priority).
  60. X * Could not use enum data type, since we will do the comparison among
  61. X * this numbers.
  62. X */
  63. X#define    OLLC_SRC_PROGRAM    0
  64. X#define    OLLC_SRC_COMMAND_LINE    1
  65. X#define    OLLC_SRC_RESOURCE    2
  66. X#define    OLLC_SRC_POSIX        3
  67. X
  68. Xtypedef struct _OLLCItem {
  69. X    char    *locale;
  70. X    int    priority;
  71. X    int    posix_category;        /* Will initialize in InitGRVLV() */
  72. X} OLLCItem;
  73. X
  74. X/*
  75. X * This struct sometimes access as array.  Watch out!
  76. X */
  77. Xtypedef struct _OLLC {
  78. X    OLLCItem    BasicLocale;
  79. X    OLLCItem    DisplayLang;
  80. X    OLLCItem    InputLang;
  81. X    OLLCItem    Numeric;
  82. X    OLLCItem    DateFormat;
  83. X} OLLC;
  84. X
  85. X#endif /* OW_I18N_L3 */
  86. X
  87. X#endif /* _OLLOCALE_H */
  88. END_OF_FILE
  89. if test 1230 -ne `wc -c <'ollocale.h'`; then
  90.     echo shar: \"'ollocale.h'\" unpacked with wrong size!
  91. fi
  92. # end of 'ollocale.h'
  93. fi
  94. if test -f 'olvwm.man' -a "${1}" != "-c" ; then 
  95.   echo shar: Will not clobber existing file \"'olvwm.man'\"
  96. else
  97. echo shar: Extracting \"'olvwm.man'\" \(29718 characters\)
  98. sed "s/^X//" >'olvwm.man' <<'END_OF_FILE'
  99. X.\" @(#)olvwm.man    1.1 olvwm version 1/3/92
  100. X.TH OLVWM 1 "15 November 1991"
  101. X.SH NAME
  102. Xolvwm \- OPEN LOOK virtual window manager for OpenWindows
  103. X.SH SYNOPSIS
  104. X.B olvwm
  105. X[
  106. X.I options
  107. X]
  108. X.\" ========================================================================
  109. X.SH DESCRIPTION
  110. X.LP
  111. X.B olvwm
  112. Xis a virtual window manager for the X Window System that implements
  113. Xparts of the OPEN LOOK graphical user interface.
  114. X.B olvwm
  115. Xdiffers from 
  116. X.B olwm
  117. Xin that olvwm manages a virtual desktop which is larger than the actual
  118. Xscreen.  However, 
  119. X.B olvwm
  120. Xis equivalent in all other respects to, and supports all the features of
  121. X.B olwm.
  122. XThis manual page discusses only the changes between 
  123. X.B olvwm
  124. Xand
  125. X.B olwm,
  126. Xmost
  127. Xof which deal specifically with the virtual desktop.  For details on
  128. Xhow
  129. X.B olwm
  130. Xoperates, including its host of options, see
  131. X.B olwm(1).
  132. X.\" ========================================================================
  133. X.SH OPTIONS
  134. X.LP
  135. XThere are no new options to
  136. X.B olvwm.
  137. X.\" ========================================================================
  138. X.SH TERMINOLOGY
  139. XThroughout this manual, the following terms are used:
  140. X.IP \fBScreen\fP:
  141. XThis refers to a specific monitor; essentially, there is
  142. Xone screen for every monitor run by your workstation.  Each monitor has a
  143. Xview into a particular desktop.  In X terminology, this is the screen
  144. Xcomponent of a particular display.
  145. X.IP \fBDesktop\fP:
  146. XThis refers to the entire area in which windows can reside on a given screen.
  147. XIn non-virtual window managers, a desktop and a screen are the same size.
  148. XIn a virtual window manager, though, a desktop is larger than the screen.
  149. X.IP \fBVDM\fP
  150. Xor \fBVirtual Desktop Manager\fP is the window which represents visually the
  151. Xentire desktop:  it provides a scaled-down version of the entire desktop.
  152. X.IP \fBLogical\ Screen\fP:
  153. XIf the desktop is running in default mode, it will display a grid, each
  154. Xsquare of which maps to the size of the monitor.  Each square is termed
  155. Xa logical screen.
  156. X.IP \fBCurrent\ View\fP:
  157. Xis that part of the desktop which is currently displayed on the screen;
  158. Xthis will usually (but need not always) correspond to a logical screen.
  159. X.IP \fBVirtual\ Window\fP:
  160. Xis a small rectangle displayed in the VDM; every window on the desktop has
  161. Xa corresponding Virtual Window in the VDM.
  162. X.\" ========================================================================
  163. X.SH VIRTUAL DESKTOP MANAGER
  164. X.LP
  165. XWhen it is started,
  166. X.B olvwm
  167. Xdisplays a virtual desktop manager window.
  168. XThe VDM is a reduced display of all windows active on the desktop at any
  169. Xtime.  The current view is outlined in the virtual desktop manager.
  170. XThe VDM always appears on the monitor.
  171. X.LP
  172. XBy default, the VDM (and hence the desktop) is divided into a grid; each
  173. Xsquare of the grid represents a screen size.  The dividing lines between
  174. Xeach logical screen are represented by dashed lines in the VDM.  This
  175. Xdivision into logical screens is purely informational:  if you like,
  176. Xwindows can straddle these boundaries, the current view into the desktop
  177. Xcan straddle
  178. Xthese boundaries, and window can be moved at will between these boundaries.
  179. XHowever, by default, most actions in the VDM will keep the current view
  180. Xalong these boundary lines.
  181. X.\" ========================================================================
  182. X.SH EVENTS IN THE VDM
  183. X.LP
  184. XThe processing of events within the VDM depends on whether the mouse is
  185. Xpointing to the background area of the VDM or to a particular virtual window
  186. Xwithin the VDM.
  187. X.SH EVENTS ON VIRTUAL WINDOWS
  188. X.LP
  189. XEvents which occur in a particular virtual window behave just as if they
  190. Xwere delivered to the corresponding application's frame.  Thus, pressing
  191. Xthe MENU button over a virtual window will bring up the frame menu and
  192. Xallow the real (and virtual) windows to be opened, closed, resized, etc.
  193. XPressing
  194. Xthe SELECT button will select that real (and virtual) window; pressing the
  195. XADJUST button will add (or subtract) that window from the selection list.
  196. XPressing the FRONT or OPEN keys will raise/lower or open/close the real
  197. X(and virtual) window.
  198. X.LP
  199. XSELECTing and dragging one or more virtual windows will move the real and
  200. Xvirtual windows (just as in 
  201. X.B olwm
  202. X).  Note that if you drag the mouse outside of the VDM, the window can be
  203. Xmoved onto to the screen.  Conversely, when dragging
  204. Xa window on the screen, if the mouse moves into the VDM, the window will then
  205. Xbe moved to the location on the displayed within the VDM.
  206. XHowever, if part of the VDM is
  207. Xobscured, you cannot move a window into that part of the VDM.
  208. X.LP
  209. XNote that events are delivered ONLY to the real application's frame.  Thus,
  210. Xtyping characters or the COPY/CUT/PASTE keys has no effect.
  211. X.LP
  212. XIt is possible to drop something onto a virtual window as if it were dropped
  213. Xonto the corresponding application; this allows you to, for example, drag
  214. Xa file from the mailtool on the screen to a file manager on another part of the
  215. Xdesktop.
  216. X.SH EVENTS ON THE VDM BACKGROUND
  217. X.LP
  218. XEvents on the VDM background all work to change the current view, bringing
  219. Xwindows which were formerly outside of the viewing area onto the screen (and
  220. Xmoving windows which were on the screen outside of the viewing area).
  221. XKeyboard events are described given the default Sun-4 keyboard mappings,
  222. Xbut you can use xmodmap to set up your particular keyboard.
  223. X.IP \fBKeyboard\ Events:\fP
  224. XThe arrow keys (and other keys) can be used to shift the logical screen in
  225. Xthe direction specified.  See the section on ADDITIONAL KEY BINDINGS
  226. Xbelow.  Keyboard events are also active if they occur on the root window
  227. Xin addition to the VDM background.
  228. X.IP \fBSELECT\fP
  229. Xmouse events:
  230. XSELECTing on the VDM background allows you to drag the current view within
  231. Xthe VDM.  If the VirtualGrid resource is set to Visible or Invisible, movement
  232. Xof the visible region will be constrained to logical screen boundaries
  233. Xunless the CTRL button is pressed before and held while dragging the mouse.
  234. XIf the VirtualGrid resource is set to None, movement of the visible region
  235. Xwill be unconstrained unless the CTRL button is pressed before and held while
  236. Xdragging the mouse.
  237. X.IP \fBDOUBLE\ CLICK\fP
  238. XSELECT events: 
  239. XDouble clicking the SELECT button on an area in the VDM background will move
  240. Xthe current view
  241. Xto the logical screen containing the point where the mouse was double-clicked.
  242. X.IP \fBMENU\fP
  243. Xmouse events:
  244. XThe MENU button brings up a (pinnable) menu which will allow movement based
  245. Xon full screen sizes in the direction indicated.
  246. X.\" ========================================================================
  247. X.SH RESIZING THE VIRTUAL DESKTOP
  248. X.LP
  249. XYou can use the resize corners on the VDM to resize
  250. Xthe virtual desktop at will.  If you make the virtual desktop smaller,
  251. Xwindows which might be off the new virtual desktop will NOT be moved
  252. X(though they will not be lost, either, and you can get them back by
  253. Xresizing the desktop again). Space added or subtracted is always done so
  254. Xfrom the right and bottom of the desktop (regardless of
  255. Xwhich resize corner you used).
  256. X.\" ========================================================================
  257. X.SH STICKY WINDOWS
  258. X.LP
  259. XYou'll notice that the virtual desktop manager never moves on your
  260. Xscreen if you change views into the desktop.  That's because the VDM is
  261. Xpermanently "sticky."
  262. X.LP
  263. XWindows which are "sticky" never move position on the screen when you
  264. Xchange your view into the desktop.  To set a particular window as
  265. Xsticky, simply select "Stick" in its frame menu. You may similarly
  266. Xunstick the window via its menu.
  267. X.LP
  268. X[Note:  Only
  269. Xbase frames--those which can be iconified, as opposed to those which have
  270. Xa pushpin--are eligible to become sticky; other frames inherit the stickyness
  271. Xof their base frames.  Thus, for most applications, either
  272. Xall windows are sticky or none of them are.  The exception to this is
  273. Xapplications which create two or more base frames; all base frames will
  274. Xbe originally created as "unsticky" (but see the VirtualSticky resource below).]
  275. X.\" ========================================================================
  276. X.SH CHANGES TO THE WINDOW MENU
  277. X.LP
  278. XThe window menu of all windows has all the tools defined in
  279. X.B olwm.
  280. XIn addition, the menu of base windows has the following command
  281. X.TP
  282. X.B Stick/Unstick
  283. XAffect the stickyness of the particular window.  Windows which are sticky
  284. Xwill always appear in the same place on the screen no matter which part
  285. Xof the virtual desktop you're looking at.  Windows which are not sticky
  286. X(by default, all windows except the VDM) will move when you change the
  287. Xview on the virtual desktop.
  288. X.\" ========================================================================
  289. X.SH CHANGES TO ROOT MENU
  290. X.LP
  291. XThe following additional keywords can be used in the command field of a
  292. Xroot menu menu item:
  293. X.IP COLUMNS
  294. XThis specifies the number of columns you'd like the menu to have.  Each column
  295. Xwithin a menu will be filled in order of the items in the menu.  The menu
  296. Xname must appear before this keyword, but the keyword itself must appear
  297. Xbefore the end of the menu.
  298. X.IP STICK_UNSTICK_SELN
  299. XThis specifies that the sticky state of the selected windows should
  300. Xbe toggled.
  301. X.IP WINMENU
  302. Xbrings up a pull-right menu containing the name of every window on the
  303. Xvirtual desktop.  Windows which are iconified are preceded with a graphic
  304. Xsymbol.  Selecting one of these windows causes the view into the desktop
  305. Xto shift so that the selected window is visible; the selected window will
  306. Xbe opened if iconic and raised to the top of the stacking order.  This
  307. Xbehavior can be altered; see the 
  308. X.I olvwmrc(5)
  309. Xfor more details.  You may specify that the number of columns in the pull-right
  310. Xmenu by using a number after the WINMENU keyword.
  311. X.IP DIRMENU
  312. Xbrings up a pull-right menu containing the name of every file given in the
  313. Xnamed directory.  This allow syou to use a local programs directory for a
  314. Xtool repository; whenever tools are added to the directory, users will see
  315. Xthe new choices.
  316. X.IP X11\ Bitmaps
  317. Xcan be specified in the menu by specifying a filename enclosed in <> brackets.
  318. XThe filename specified must be in X11 bitmap form.  You can mix bitmap and
  319. Xstring entries within a menu, though perhaps menus look better if you do not.
  320. X.LP
  321. XHere is a version of the example 
  322. X.I olwm
  323. Xroot menu specification:  the programs menu will have 2 columns; there will
  324. Xbe a way to find particular windows off the "Find" submenu (and that menu will
  325. Xhave 3 columns); whatever local tools are available can be found in /usr/local;
  326. Xand the cmdtool option will be displayed as an icon:
  327. X.nf
  328. X
  329. X
  330. X"My Custom Menu" TITLE
  331. X.sp
  332. XPrograms                 MENU
  333. XPrograms        COLUMNS 2
  334. X        <usr/openwin/include/X11/bitmaps/terminal>  DEFAULT cmdtool
  335. X        "Text Editor"           textedit
  336. X        Mail                    mailtool
  337. X        "File Manager"          filemgr
  338. X        Other                   MENU
  339. X                "Other Tools"           TITLE
  340. X                "Shell Tool"            shelltool
  341. X                "Icon Editor"           iconedit
  342. X                Clock                   clock
  343. X                "Perf Meter"            DEFAULT perfmeter
  344. X        Other                   END
  345. X    "Local Tools"        DIRMENU    /usr/local
  346. XPrograms                END PIN
  347. X.sp
  348. X"Repaint Screen"        REFRESH
  349. X.sp
  350. X"Properties ..."        PROPERTIES
  351. X.sp
  352. X"Find"        WINMENU    3
  353. X.sp
  354. XExit            EXIT
  355. X.fi
  356. X.\" ========================================================================
  357. X.SH RESOURCES TO CONTROL THE VIRTUAL DESKTOP
  358. XSee the man page for
  359. X.B olwm
  360. Xfor a complete description of resources.  All resources of class OpenWindows
  361. Xand olwm described there are supported by
  362. X.B olvwm.
  363. XIn addition, for
  364. X.B olvwm
  365. Xonly, resources of instance "olvwm" are also read.
  366. XYou can thus name the following resources as olvwm.<resource>, olwm.<resource>,
  367. Xor as OpenWindows.<resource> depending on your naming preference.
  368. X.LP
  369. XResources marked with an * may be specified on a screen-by-screen basis;
  370. Xe.g. olvwm.screen0.resource and olvwm.screen1.resource, following the pattern
  371. Xin
  372. X.B olwm.
  373. X.TP
  374. X.BI VirtualDesktop " (string)" *
  375. XSpecifies the size of the virtual desktop.  You can specify this in
  376. Xterms of screen sizes, so that a virtual desktop of 3 screens across
  377. Xand 2 screens high would appear as the string 3x2.  You may also
  378. Xspecify this in terms of absolute pixel sizes, e.g. 3800x1800 as
  379. Xlong as the pixel size is greater than the size of your framebuffer.
  380. X.I
  381. XDefault value: 3x2
  382. X.P
  383. X.TP
  384. X.BI PannerScale " (int)" *
  385. XSets the scale in which the virtual desktop manager will be drawn.
  386. X.I
  387. XDefault value: 15.
  388. X.P
  389. X.TP
  390. X.BI VirtualGeometry " (string)" *
  391. XSpecifies the geometry string of the desktop manager in standard X11
  392. Xformat (wxh+x+y).  The width and height, if specified, are ignored,
  393. Xbut the x and y can be used to specify the initial location of the
  394. Xdesktop manager.
  395. X.I
  396. XDefault value: +0+0
  397. X.TP
  398. X.BI VirtualIconGeometry " (string)" *
  399. XSpeficied the geometry string of the desktop manager icon in standard X11
  400. Xformat (wxh+x+y).  The width and height are ignored, but the x and y can
  401. Xbe used to specify the initial location of the desktop manager icon.
  402. X.I
  403. XDefault value: +0+0
  404. X.P
  405. X.TP
  406. X.BI VirtualIconic " (Boolean)"
  407. XIf true, the virtual desk manager will come up iconic.
  408. X.I
  409. XDefault value:  False
  410. X.P
  411. X.TP
  412. X.BI AllowMoveIntoDesktop " (Boolean)"
  413. XIf true, allows windows to be moved from the screen into the VDM
  414. Xand vice versa.  Otherwise, moving a window on the screen will
  415. Xonly allow it to be placed in the visible screen; and moving a
  416. Xwindow in the desktop manager will not let it be dragged onto the screen.
  417. X.I
  418. XDefault value:  True
  419. X.P
  420. X.TP
  421. X.BI ArrowInRoot " (Boolean)"
  422. XIf true, then key events in the root window will affect the VDM and
  423. Xthus move the view into the desktop (if the appropriate key is pressed).
  424. XOtherwise, only key events when the VDM has the input event focus will
  425. Xhave an effect.
  426. X.I
  427. XDefault value:  True
  428. X.P
  429. X.TP
  430. X.BI VirtualFont " (string)" *
  431. XThe font name used to display title of windows within the virtual desktop
  432. Xmanager.
  433. X.I
  434. XDefault value:  5x8
  435. X.P
  436. X.TP
  437. X.BI VirtualFontColor " (color specification)" *
  438. XThe color of the title within the virtual windows of the virtual desktop
  439. Xmanager.
  440. X.I
  441. XDefault value:  Black
  442. X.P
  443. X.TP
  444. X.BI VirtualBackgroundColor " (color specification)" *
  445. XThe color of the background of the virtual desktop manager.
  446. X.I
  447. XDefault value:  Based on the frame color of your desktop.
  448. X.P
  449. X.TP
  450. X.BI VirtualForegroundColor " (color specification)" *
  451. XThe color of the virtual windows in the virtual desktop manager.
  452. X.I
  453. XDefault value:  The frame color of your desktop.
  454. X.P
  455. X.TP
  456. X.BI VirtualBackgroundMap " (Pixmap filename)" *
  457. XThe name of a file containing a pixmap to use as the background of the
  458. Xvirtual desktop manager.  This will be drawn with the VirtualBackgroundColor
  459. Xas its background color and the VirtualPixmapColor as its foreground color.
  460. X.I
  461. XDefault value:  unused
  462. X.P
  463. X.TP
  464. X.BI VirtualPixmapColor " (color specification)" *
  465. XSee above.
  466. X.I
  467. XDefault value:  white
  468. X.P
  469. X.TP
  470. X.BI VirtualSticky " (list of strings)"
  471. XThe list of windows which should be sticky by default.  Like the olwm
  472. XMinimalDecor, this should be the list windows which should be sticky when
  473. Xthey are created.  The matching of these strings is done by the first word
  474. Xof the window's WM_NAME (string in it's title bar), or by its WM_CLASS
  475. Xclass/instance variables.
  476. X.I
  477. XDefault value:  Null
  478. X.P
  479. X.TP
  480. X.BI RelativePosition " (Boolean)"
  481. XIf true, then user-specified window co-ordinates are assumed to be relative
  482. Xto the current view into the desktop; otherwise they are absolute with
  483. Xrespect to the desktop.  Setting to true will not allow you to bring up
  484. Xwindows outside your current view (unless you specify very large or negative
  485. Xnumbers), and setting to false will break some
  486. Xprograms which save window states in an odd manner.  You can defeat this
  487. Xvariable on startup of applications by specifying which screen they should
  488. Xstart on; see
  489. X.I olvwmrc(5).
  490. X.I
  491. XDefault value:    True
  492. X.P
  493. X.TP
  494. X.BI VirtualGrid " (Visible, Invisible, or None)" *
  495. XThis controls two aspects of the VDM:  If it's visible or invisible, the
  496. Xgrid is on (but it's only drawn if it's visible).  If it's None, the grid
  497. Xis off.  If the grid is on, the VDM may only be resized in logical screen-sized
  498. Xincrements.  Otherwise, it may resized to arbitrary sizes.  If the grid
  499. Xis on, SELECT/dragging the mouse within the VDM will constrain the move to
  500. Xlogical screens (unless the CTRL button is held down); if the grid is off,
  501. Xmoving the visible screen region with SELECT/drag will be unconstrained
  502. X(unless the CTRL button is held down).
  503. X.I
  504. XDefault value:    Visible
  505. X.TP
  506. X.BI VirtualGridColor " (color specification)"
  507. XIf the VirtualGrid is Visible, it will be drawn in this color.
  508. X.I
  509. XDefault value:  Same as VirtualFontColor
  510. X.P
  511. X.TP
  512. X.BI VirtualRaiseVDM " (Boolean)"
  513. XIf this is true, the VDM will always appear on top of the stacking order,
  514. Xnever to be obscured by other windows.
  515. X.I
  516. XDefault value:  False
  517. X.P
  518. X.TP
  519. X.BI VirtualMoveGroups " (Boolean)"
  520. XIf true, then whenever a window is moved to a different logical screen,
  521. Xthen all followers of that window will also be moved a similar
  522. Xamount:  this affects the window's icon and popups.  In this way, icons
  523. Xand popups will always appear on the same logical screen as their
  524. Xcorresponding base frame.  Otherwise, only the
  525. Xselected windows will move when you move them, and related windows could
  526. Xpossibly appear on different logical screens in the desktop.  The trigger
  527. Xfor changing between logical screens is the window's upper-left-hand corner;
  528. Xsee VirtualGroupThreshold below.
  529. X.I
  530. XDefault value:    True
  531. X.P
  532. X.TP
  533. X.BI VirtualGroupThreshold " (Integer)"
  534. XIf VirtualMoveGroups, this is the amount by which the upper-left-hand
  535. Xcorner of a window must be moved off the monitor for
  536. X.I olvwm
  537. Xto consider the window to have switched logical screens.  Setting this to
  538. Xa positive value allows the left edge of windows to appear off the
  539. Xmonitor without moving the window's popups.
  540. X.I
  541. XDefault value:  0
  542. X.P
  543. X.TP
  544. X.BI UseImages " (UseNone, UseVDM, or UseAll)"
  545. XIf set to UseNone, then window frame menus and the VDM motion menu
  546. Xwill be text-based.
  547. XIf set to UseVDM, the window frame menus will be text-based, but the VDM
  548. Xmotion menu will be a graphic menu.  If set to UseAll, the window frame
  549. Xmenus will be text- and image-based, and the VDM motion menu will be
  550. Ximage-based.
  551. X.I
  552. XDefault value:    UseVDM
  553. X.P
  554. X.\" ========================================================================
  555. X.SH ADDITIONAL MISCELLANEOUS RESOURCES
  556. X.LP
  557. XThese resources are not related specifically to the VDM, but are included
  558. Xas new features within
  559. X.B olvwm.
  560. X.TP
  561. X.BI InputFocusColor " (color specification)" *
  562. XSpecifying this attribute means that the frame of the window which currently
  563. Xhas the input focus should be drawn in the color specified instead of in
  564. Xthe normal frame color.  The appearance of the title bar (with lines or
  565. Xindentation, depending on your input focus mode) will remain unchanged.
  566. X.I
  567. XDefault value:  None (Use standard frame color)
  568. X.P
  569. X.TP
  570. X.BI RaiseOnMove " (Boolean)"
  571. XIf this is True, then whenever a window is moved, it is also raised to the
  572. Xtop of the stacking order.
  573. X.I
  574. XDefault value:  False
  575. X.TP
  576. X.BI AutoShowRootMenu " (Boolean)"
  577. XIf true, the root menu will come up pinned at start up.
  578. X.I
  579. XDefault value:  False
  580. X.P
  581. X.TP
  582. X.BI AutoRootMenuX " (int)"
  583. XIf AutoShowRootMenu is true, this is the X location where the menu will
  584. Xcome up.
  585. X.I
  586. XDefault value: 0
  587. X.P
  588. X.TP
  589. X.BI AutoRootMenuY " (int)"
  590. XIf AutoShowRootMenu is true, this is the Y location where the menu will
  591. Xcome up.
  592. X.I
  593. XDefault value: 0
  594. X.P
  595. X.TP
  596. X.BI FullSizeZoomX " (Boolean)"
  597. XIf this is set to True, then selecting Full Size from the window menu
  598. Xwill zoom the window horizontally as well as vertically.
  599. X.I
  600. XDefault value:  False
  601. X.P
  602. X.TP
  603. X.BI NoDecor " (list of strings)"
  604. XLike Minimal Decor, this attribute takes a list of windows on which to
  605. Xoperate; these windows should not be decorated at all.  There is a slight
  606. Xdifference between this attribute and setting the override_redirect flag
  607. Xon a window:  the latter causes 
  608. X.I olvwm
  609. Xto ignore completely the window, while this attribute does not adorn the
  610. Xwindow or give it a menu, but still allows it to be manipulated via the
  611. XWINMENU and Hot Key actions.
  612. X.P
  613. X.TP
  614. X.BI ResizeMoveGeometry " (X geometry string or the word center)"
  615. XThis resource only has an effect if ShowMoveGeometry and/or ShowResizeGeometry
  616. Xis set to True.  This string specifies the location of the geometry box
  617. Xwhen it is displayed; it should be given as an X geometry string (wxh+x+y)
  618. Xalthough the width and height are ignored if specified.  If you want the
  619. Xbox to be centered regardless of your monitor resolution, use the string
  620. Xcenter instead of a geometry string.
  621. X.I
  622. XDefault value:    +0+0
  623. X.P
  624. X.\" ========================================================================
  625. X.SH ADDITIONAL KEY BINDINGS
  626. X.LP
  627. XLike
  628. X.I olwm, olvwm
  629. Xuses key bindings for certain actions:  all actions specified in
  630. X.I olwm
  631. Xas well as an additional set of actions to control the view into the desktop.
  632. XIn the following list, the key mentioned in parentheses is the default binding
  633. Xfor the given action; items marked with a plus sign '+' are items which
  634. Xexist in
  635. X.I olwm;
  636. Xthey are included here to describe what action they have when they occur
  637. Xon the root window or within the VDM.  All other bindings are specific to
  638. X.I olvwm;
  639. Xthose items marked  with an asterisk '*' involve keyboard grabs.  Bindings
  640. Xwhich involve a keyboard grab (those with an asterisk) are always active,
  641. Xno matter where the input focus is;
  642. Xotherwise the action occurs only if the root window or the VDM has
  643. Xthe input focus.
  644. X.LP
  645. XIt's possible to change each of these bindings, see the
  646. X.B olwm
  647. Xman page for more details.
  648. X.TP
  649. XUp  \fI(up-arrow)\fP +
  650. XMove the view up one screen.
  651. X.TP
  652. XJumpUp \fI(up-arrow+Ctrl)\fP +
  653. XMove the view up ten screens.
  654. X.TP
  655. XHalfUp \fI(up-arrow+Shift)\fP
  656. XMove the view up one-half screen.
  657. X.TP
  658. XVirtualUp  \fI(up-arrow+Meta)\fP *
  659. XMove the view up one screen.
  660. X.TP
  661. XVirtualJumpUp \fI(up-arrow+Ctrl+Meta)\fP *
  662. XMove the view up ten screens.
  663. X.TP
  664. XVirtualHalfUp \fI(up-arrow+Shift+Meta)\fP *
  665. XMove the view up one-half screen.
  666. X
  667. X.TP
  668. XDown \fI(down-arrow)\fP +
  669. XMove the view down one screen.
  670. X.TP
  671. XJumpDown \fI(down-arrow+Ctrl)\fP +
  672. XMove the view down ten screens.
  673. X.TP
  674. XHalfDown \fI(down-arrow+Shift)\fP
  675. XMove the view down one-half screen.
  676. X.TP
  677. XVirtualDown  \fI(down-arrow+Meta)\fP *
  678. XMove the view down one screen.
  679. X.TP
  680. XVirtualJumpDown \fI(down-arrow+Ctrl+Meta)\fP *
  681. XMove the view down ten screens.
  682. X.TP
  683. XVirtualHalfDown \fI(down-arrow+Shift+Meta)\fP *
  684. XMove the view down one-half screen.
  685. X
  686. X.TP
  687. XLeft \fI(left-arrow)\fP +
  688. XMove the view left one screen.
  689. X.TP
  690. XJumpLeft \fI(left-arrow+Ctrl)\fP +
  691. XMove the view left ten screens.
  692. X.TP
  693. XHalfLeft \fI(left-arrow+Shift)\fP
  694. XMove the view left one-half screen.
  695. X.TP
  696. XVirtualLeft  \fI(left-arrow+Meta)\fP *
  697. XMove the view left one screen.
  698. X.TP
  699. XVirtualJumpLeft \fI(left-arrow+Ctrl+Meta)\fP *
  700. XMove the view left ten screens.
  701. X.TP
  702. XVirtualHalfLeft \fI(left-arrow+Shift+Meta)\fP *
  703. XMove the view left one-half screen.
  704. X
  705. X.TP
  706. XRight \fI(right-arrow)\fP +
  707. XMove the view right one screen.
  708. X.TP
  709. XJumpRight \fI(right-arrow+ctrl)\fP +
  710. XMove the view right ten screens.
  711. X.TP
  712. XHalfRight \fI(right-arrow+Shift)\fP
  713. XMove the view right one-half screen.
  714. X.TP
  715. XVirtualRight  \fI(right-arrow+Meta)\fP *
  716. XMove the view right one screen.
  717. X.TP
  718. XVirtualJumpRight \fI(right-arrow+ctrl+Meta)\fP *
  719. XMove the view right ten screens.
  720. X.TP
  721. XVirtualHalfRight \fI(right-arrow+Shift+Meta)\fP *
  722. XMove the view right one-half screen.
  723. X
  724. X.TP
  725. XGoHome \fI(R11)\fP
  726. XMove the view to the upper left corner.
  727. X.TP
  728. XVirtualHome \fI(R11+Meta)\fP *
  729. XMove the view to the upper left corner.
  730. X
  731. X.TP
  732. XRowStart \fI(Home, R7)\fP +
  733. XMove the view NorthWest one screen.
  734. X.TP
  735. XJumpUpLeft \fI(R7+Ctrl)\fP +
  736. XMove the view NorthWest ten screens.
  737. X.TP
  738. XHalfUpLeft \fI(R7+Shift)\fP
  739. XMove the view NorthWest one-half screen.
  740. X.TP
  741. XVirtualUpLeft \fI(R7+Meta)\fP *
  742. XMove the view NorthWest one screen.
  743. X.TP
  744. XVirtualJumpUpLeft \fI(R7+Ctrl+Meta)\fP *
  745. XMove the view NorthWest ten screens.
  746. X.TP
  747. XVirtualHalfUpLeft \fI(R7+Shift+Meta)\fP *
  748. XMove the view NorthWest one-half screen.
  749. X
  750. X.TP
  751. XRowEnd \fI(End, R13)\fP +
  752. XMove the view SouthWest one screen.
  753. X.TP
  754. XJumpDownLeft \fI(R13+Ctrl)\fP +
  755. XMove the view SouthWest ten screens.
  756. X.TP
  757. XHalfDownLeft \fI(R13+Shift)\fP
  758. XMove the view SouthWest one-half screen.
  759. X.TP
  760. XVirtualDownLeft \fI(R13+Meta)\fP *
  761. XMove the view SouthWest one screen.
  762. X.TP
  763. XVirtualJumpDownLeft \fI(R13+Ctrl+Meta)\fP *
  764. XMove the view SouthWest ten screens.
  765. X.TP
  766. XVirtualHalfDownLeft \fI(R13+Shift+Meta)\fP *
  767. XMove the view SouthWest one-half screen.
  768. X
  769. X.TP
  770. XUpRight \fI(R9)\fP
  771. XMove the view NorthEast one screen.
  772. X.TP
  773. XJumpUpRight \fI(R9+Ctrl)\fP +
  774. XMove the view NorthEast ten screens.
  775. X.TP
  776. XHalfUpRight \fI(R9+Shift)\fP
  777. XMove the view NorthEast one-half screen.
  778. X.TP
  779. XVirtualUpRight \fI(R9+Meta)\fP *
  780. XMove the view NorthEast one screen.
  781. X.TP
  782. XVirtualJumpUpRight \fI(R9+Ctrl+Meta)\fP *
  783. XMove the view NorthEast ten screens.
  784. X.TP
  785. XVirtualHalfUpRight \fI(R9+Shift+Meta)\fP *
  786. XMove the view NorthEast one-half screen.
  787. X
  788. X.TP
  789. XDownRight \fI(R15, PgDn)\fP
  790. XMove the view SouthEast one screen.
  791. X.TP
  792. XJumpDownRight \fI(R15+Ctrl)\fP +
  793. XMove the view SouthEast ten screens.
  794. X.TP
  795. XHalfDownRight \fI(R15+Shift)\fP
  796. XMove the view SouthEast one-half screen.
  797. X.TP
  798. XVirtualDownRight \fI(R15+Meta)\fP *
  799. XMove the view SouthEast one screen.
  800. X.TP
  801. XVirtualJumpDownRight \fI(R15+Ctrl+Meta)\fP *
  802. XMove the view SouthEast ten screens.
  803. X.TP
  804. XVirtualHalfDownRight \fI(R15+Shift+Meta)\fP *
  805. XMove the view SouthEast one-half screen.
  806. X
  807. X.TP
  808. XScreen1    \fI(F1)\fP
  809. XMove to the first logical screen in the desktop.
  810. X.TP
  811. XVirtualScreen1    \fI(F1+Meta)\fP *
  812. XMove to the first logical screen in the desktop.
  813. X.TP
  814. XScreen2    \fI(F2)\fP
  815. XMove to the second logical screen in the desktop.
  816. X.TP
  817. XVirtualScreen2    \fI(F2+Meta)\fP *
  818. XMove to the second logical screen in the desktop.
  819. X.TP
  820. XScreen3    \fI(F3)\fP
  821. XMove to the third logical screen in the desktop.
  822. X.TP
  823. XVirtualScreen3    \fI(F3+Meta)\fP *
  824. XMove to the third logical screen in the desktop.
  825. X.TP
  826. XScreen4    \fI(F4)\fP
  827. XMove to the fourth logical screen in the desktop.
  828. X.TP
  829. XVirtualScreen4    \fI(F4+Meta)\fP *
  830. XMove to the fourth logical screen in the desktop.
  831. X.TP
  832. XScreen5    \fI(F5)\fP
  833. XMove to the fifth logical screen in the desktop.
  834. X.TP
  835. XVirtualScreen5    \fI(F5+Meta)\fP *
  836. XMove to the fifth logical screen in the desktop.
  837. X.TP
  838. XScreen6    \fI(F6)\fP
  839. XMove to the sixth logical screen in the desktop.
  840. X.TP
  841. XVirtualScreen6    \fI(F6+Meta)\fP *
  842. XMove to the sixth logical screen in the desktop.
  843. X.TP
  844. XScreen7    \fI(F7)\fP
  845. XMove to the seventh logical screen in the desktop.
  846. X.TP
  847. XVirtualScreen7    \fI(F7+Meta)\fP *
  848. XMove to the seventh logical screen in the desktop.
  849. X.TP
  850. XScreen8    \fI(F8)\fP
  851. XMove to the eighth logical screen in the desktop.
  852. X.TP
  853. XVirtualScreen8    \fI(F8+Meta)\fP *
  854. XMove to the eighth logical screen in the desktop.
  855. X.TP
  856. XScreen9    \fI(F9)\fP
  857. XMove to the ninth logical screen in the desktop.
  858. X.TP
  859. XVirtualScreen9    \fI(F9+Meta)\fP *
  860. XMove to the ninth logical screen in the desktop.
  861. X.TP
  862. XScreen10 \fI(F10)\fP
  863. XMove to the tenth logical screen in the desktop.
  864. X.TP
  865. XVirtualScreen10    \fI(F10+Meta)\fP *
  866. XMove to the tenth logical screen in the desktop.
  867. X.\" ========================================================================
  868. X.SH ADVANCED USAGE
  869. X.I olvwm
  870. Xwill read a resource file ($HOME/.olvwmrc) for special customizations.
  871. XThese customizations allow the following:
  872. X.IP HOT\ KEYS
  873. XYou can specify that when a certain key (or, more likely, key in combination
  874. Xwith modifiers) is pressed that certain actions are performed:  you can
  875. Xwarp to a particular application, open, raise, or close applications, execute
  876. Xapplications, and quit applications.
  877. X.IP SCREEN\ BINDINGS
  878. XYou can specify that certain applications will always start on a particular
  879. Xlogical screen.
  880. X.IP MENU\ OPTIONS
  881. XYou can alter the behaviour of WINMENU selections on a particular window.
  882. X.LP
  883. XPlease see
  884. X.I olvwmrc(5)
  885. Xfor details of these options.
  886. X.\" ========================================================================
  887. X.SH COPYRIGHTS
  888. X.LP
  889. XThe X Window system is a trademark of the Massachusetts Institute of
  890. XTechnology.
  891. X.br
  892. XOPEN LOOK is a trademark of AT&T.
  893. X.br
  894. XOpenWindows is a trademark of Sun Microsystems, Inc.
  895. X.br
  896. XPortions (c) Copyright 1989-1991 Sun Microsystems, Inc. Sun design patents
  897. Xpending in the U.S. and foreign countries. OPEN LOOK is a
  898. Xtrademark of AT&T. Used by written permission of the owners.
  899. X.br
  900. XPortions (c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered
  901. Xtrademark of Bigelow & Holmes. Permission to use the Lucida
  902. Xtrademark is hereby granted only in association with the images
  903. Xand fonts described in this file.
  904. X.br
  905. XPortions may be (c) 1990 Solbourne Computers.
  906. X.br
  907. XPortions not covered under the above copyrights are (c) 1991 Scott Oaks.
  908. X.br
  909. XPlease see the LEGAL_NOTICES file for full disclosure of copyright
  910. Xinformation.
  911. X.\" =======================================================================
  912. X.SH CREDITS
  913. X.LP
  914. XMost of the code in this application comes from release 3.0 of olwm,
  915. Xauthored at Sun Microsystems and distributed in the contrib section
  916. Xof MIT's X11R5.  [Note that nothing in xview3 or release 3.0 requires
  917. XR5; they will happily run on R4 and exist in R5 simply because that's
  918. Xwhen they were released.]
  919. X.br
  920. XThe virtual desktop section was authored by Scott Oaks,
  921. Xwho is responsible for its maintenance.  Please direct any comments to 
  922. Xscott.oaks@sun.com.  This code is not supported by Sun Microsystems in
  923. Xany way.
  924. X.br
  925. XNotwithstanding the above, the staff at Sun Microsystems, and especially
  926. XStuart Marks, deserve credit as original author of olwm for most of the
  927. Xwork contained in this application.
  928. X.br
  929. XAddition fixes and enhancements have been provided by Rich Berlin,
  930. XDavid Chase and David Plotkin at Sun, Ken West at Protocol Systems,
  931. XRussel Kegley at General Dynamics, Chuck Musciano at Harris Systems,
  932. XAlexander Dupuy at Columbia, David Boyd at Sterling Software and Duane
  933. XGibson at Unify.
  934. XIn addition, several people from the net are not mentioned here but
  935. Xcontributed duplicate fixes.
  936. END_OF_FILE
  937. if test 29718 -ne `wc -c <'olvwm.man'`; then
  938.     echo shar: \"'olvwm.man'\" unpacked with wrong size!
  939. fi
  940. # end of 'olvwm.man'
  941. fi
  942. if test -f 'wincolor.c' -a "${1}" != "-c" ; then 
  943.   echo shar: Will not clobber existing file \"'wincolor.c'\"
  944. else
  945. echo shar: Extracting \"'wincolor.c'\" \(21460 characters\)
  946. sed "s/^X//" >'wincolor.c' <<'END_OF_FILE'
  947. X/*
  948. X *      (c) Copyright 1989, 1990 Sun Microsystems, Inc. Sun design patents
  949. X *      pending in the U.S. and foreign countries. See LEGAL_NOTICE
  950. X *      file for terms of the license.
  951. X */
  952. X
  953. X#ident    "@(#)wincolor.c    26.19    91/10/04 SMI"
  954. X
  955. X#include <errno.h>
  956. X#include <stdio.h>
  957. X#include <X11/Xos.h>
  958. X#include <X11/Xlib.h>
  959. X#include <X11/Xutil.h>
  960. X#include <X11/Xatom.h>
  961. X#include <olgx/olgx.h>
  962. X
  963. X#include "i18n.h"
  964. X#include "ollocale.h"
  965. X#include "mem.h"
  966. X#include "olwm.h"
  967. X#include "win.h"
  968. X#include "globals.h"
  969. X
  970. X/***************************************************************************
  971. X* global data
  972. X***************************************************************************/
  973. X
  974. Xextern Atom AtomColorMapWindows;
  975. X
  976. X/*
  977. X * ColorFocusLocked indicates the color focus mode.  If it is false, we are in
  978. X * "color-follows-mouse" mode.  In this mode, colormaps are installed based on
  979. X * the location of the mouse.  The WM_COLORMAP_WINDOWS property determines the
  980. X * list of windows that are eligible to have their colormaps installed, but
  981. X * changes to this property do not necessarily cause colormap installation.
  982. X * If ColorFocusLocked is true, we are in "color-locked" mode.  In this mode,
  983. X * a particular colormap is locked into the hardware, and colormaps do not
  984. X * track the pointer location.  If a particular client has the focus, this
  985. X * client will be named by ColorFocusClient, and changes to its
  986. X * WM_COLORMAP_WINDOWS property will cause colormap changes.  If no client has
  987. X * the focus (e.g. the colormap window is the root) then only user action can
  988. X * cause the colormap to change.  In this case the colorFocusClient will be
  989. X * NULL.
  990. X */
  991. X
  992. X/*
  993. X * colorFocusWindow indicates the window that currently has the color focus.  
  994. X * This is updated regardless of the color focus mode.
  995. X */
  996. X
  997. Xextern void WinAddColorClient();
  998. Xextern void WinRemoveColorClient();
  999. Xextern Bool PropGetWMColormapWindows();
  1000. X
  1001. Xvoid    InstallDefaultColormap();
  1002. Xvoid    ColormapChange();
  1003. X
  1004. X/***************************************************************************
  1005. X* private data
  1006. X***************************************************************************/
  1007. X
  1008. Xstatic ClassColormap classColormap;
  1009. X
  1010. X/***************************************************************************
  1011. X* private functions
  1012. X***************************************************************************/
  1013. X
  1014. X/* 
  1015. X * eventDestroy - handle destroy events on the colormap window 
  1016. X */
  1017. Xstatic int
  1018. XeventDestroy(dpy, event, winInfo)
  1019. XDisplay    *dpy;
  1020. XXEvent    *event;
  1021. XWinColormap *winInfo;
  1022. X{
  1023. X    Client *cli;
  1024. X    List *cli_list = winInfo->core.colormapClients;
  1025. X    List **win_list;
  1026. X    WinGeneric *newfocuswin;
  1027. X
  1028. X    /*
  1029. X     * For every client in this window's client list, search that client's 
  1030. X     * window list and remove this window from it.
  1031. X     */
  1032. X    for (cli = ListEnum(&cli_list); cli != NULL; cli = ListEnum(&cli_list)) {
  1033. X    win_list = &(cli->colormapWins);
  1034. X    while (*win_list != NULL) {
  1035. X        if ((*win_list)->value == winInfo) {
  1036. X        ListDestroyCell(win_list);
  1037. X        break;
  1038. X        }
  1039. X        win_list = &((*win_list)->next);
  1040. X    }
  1041. X    if (ColorFocusLocked(winInfo) && 
  1042. X        ColorFocusWindow(winInfo) == winInfo &&
  1043. X        ColorFocusClient(winInfo) == cli) {
  1044. X        if (cli->colormapWins)
  1045. X        newfocuswin = cli->colormapWins->value;
  1046. X        else
  1047. X        newfocuswin = (WinGeneric *) PANEOFCLIENT(cli);
  1048. X        InstallColormap(dpy, newfocuswin);
  1049. X    }
  1050. X    }
  1051. X
  1052. X    ListDestroy(winInfo->core.colormapClients);
  1053. X    winInfo->core.colormapClients = NULL_LIST;
  1054. X    (WinFunc(winInfo,core.destroyfunc))(dpy, winInfo);
  1055. X}
  1056. X
  1057. X
  1058. X/* 
  1059. X * eventEnterLeaveNotify - handle enter/leave notify events on the colormap window 
  1060. X */
  1061. Xstatic int
  1062. XeventEnterLeaveNotify(dpy, event, winInfo)
  1063. XDisplay    *dpy;
  1064. XXEvent    *event;
  1065. XWinColormap *winInfo;
  1066. X{
  1067. X    if (event->xany.type == EnterNotify)
  1068. X    ColorWindowCrossing(dpy, event, winInfo);
  1069. X}
  1070. X
  1071. X
  1072. X/*
  1073. X * eventUnmapNotify - handle the unmapping of a colormap window
  1074. X */
  1075. Xstatic int
  1076. XeventUnmapNotify(dpy, event, winInfo)
  1077. XDisplay    *dpy;
  1078. XXEvent    *event;
  1079. XWinColormap *winInfo;
  1080. X{
  1081. X    /*
  1082. X     * If this is the window with the color focus, and the color focus is not 
  1083. X     * locked, then we must install the colormap of the window that is now 
  1084. X     * under the pointer.  REMIND: there's a race condition here, because 
  1085. X     * calling InstallPointerColormap with an arg of None ends up calling 
  1086. X     * QueryPointer to find the pointer's location.
  1087. X     */
  1088. X    if (ColorFocusWindow(winInfo) == (WinGeneric *)winInfo &&
  1089. X    !ColorFocusLocked(winInfo) ) {
  1090. X    InstallPointerColormap(dpy, None, 0, 0, False);
  1091. X    }
  1092. X}
  1093. X
  1094. X
  1095. X/*
  1096. X * eventColormapNotify
  1097. X *
  1098. X * Handle changes to this window's colormap attribute.  If this window had the 
  1099. X * colormap focus, install the new colormap.
  1100. X */
  1101. Xstatic int
  1102. XeventColormapNotify(dpy, event, winInfo)
  1103. X    Display *dpy;
  1104. X    XEvent *event;
  1105. X    WinColormap *winInfo;
  1106. X{
  1107. X    ColormapChange(dpy, event, (WinGeneric *)winInfo);
  1108. X}
  1109. X        
  1110. X
  1111. X/*
  1112. X * destroyColormap -- destroy the colormap window resources and 
  1113. X *                  free any allocated data.
  1114. X */
  1115. Xstatic int
  1116. XdestroyColormap(dpy, winInfo)
  1117. XDisplay    *dpy;
  1118. XWinGeneric *winInfo;
  1119. X{
  1120. X#ifdef DEBUG
  1121. X    if (winInfo->core.colormapClients != NULL_LIST)
  1122. X        puts("warning: destroying cmap window with non-null client list");
  1123. X#endif /* DEBUG */
  1124. X
  1125. X    /* free our data and throw away window */
  1126. X    /* REMIND this test is here to avoid problems with changing
  1127. X     * a colourmap window into a pane
  1128. X     */
  1129. X    if (WIGetInfo(winInfo->core.self) == winInfo)
  1130. X        WIUninstallInfo(winInfo->core.self);
  1131. X    MemFree(winInfo);
  1132. X}
  1133. X
  1134. X
  1135. X/***************************************************************************
  1136. X* global functions
  1137. X***************************************************************************/
  1138. X
  1139. X
  1140. X/*
  1141. X * Colormap Installation Inhibition.
  1142. X *
  1143. X * When colormap installation is inhibited, information about colormap 
  1144. X * installation is stored in the ColormapInhibitRecord structure.  If multiple 
  1145. X * installations are requested while installation is inhibited, information 
  1146. X * only from the last request is stored.  When installation is uninhibited, 
  1147. X * this information is used to install the colormap for real.  Inhibiting 
  1148. X * colormap installation prevents unnecessary colormap installation, thereby 
  1149. X * reducing flashing.
  1150. X */
  1151. X
  1152. Xstatic struct ColormapInhibitRecord {
  1153. X    Bool inhibited;
  1154. X    WinGeneric *winInfo;
  1155. X} cir;
  1156. X
  1157. X
  1158. X/*
  1159. X * ColormapInhibit -- inhibit or uninhibit colormap installation.
  1160. X */
  1161. Xvoid
  1162. XColormapInhibit(inhibit)
  1163. X    Bool inhibit;
  1164. X{
  1165. X    if (inhibit) {
  1166. X    cir.inhibited = True;
  1167. X    cir.winInfo = NULL;
  1168. X    } else {
  1169. X    cir.inhibited = False;
  1170. X    if (cir.winInfo != NULL) {
  1171. X        InstallColormap(cir.winInfo->core.client->dpy, cir.winInfo);
  1172. X    }
  1173. X    cir.winInfo = NULL;
  1174. X    }
  1175. X}
  1176. X
  1177. X
  1178. X/*
  1179. X * InstallColormap
  1180. X *
  1181. X * Install the colormap for the given window.  If the window's colormap 
  1182. X * attribute is None, install the default screen colormap instead.  
  1183. X * This can occur if a client creates a window, sets its colormap 
  1184. X * attribute to a particular colormap, and then destroys that colormap.
  1185. X */
  1186. Xvoid
  1187. XInstallColormap(dpy, winInfo)
  1188. X    Display         *dpy;
  1189. X    WinGeneric        *winInfo;
  1190. X{
  1191. X    Colormap     cmap = winInfo->core.colormap;
  1192. X
  1193. X    if (cmap == None) {
  1194. X        cmap = winInfo->core.client->scrInfo->colormap;
  1195. X    }
  1196. X
  1197. X    if (cir.inhibited) {
  1198. X    cir.winInfo = winInfo;
  1199. X    } else {
  1200. X    XInstallColormap(dpy, cmap);
  1201. X    ColorFocusWindow(winInfo) = winInfo;
  1202. X    }
  1203. X}
  1204. X
  1205. X
  1206. X/*
  1207. X * InstallDefaultColormap
  1208. X *
  1209. X * Install the default colormap for the screen on which this window resides.  
  1210. X * If `lock' is true, lock it in place as well as installing it.
  1211. X */
  1212. Xvoid
  1213. XInstallDefaultColormap(dpy,winInfo,lock)
  1214. X    Display    *dpy;
  1215. X    WinGeneric  *winInfo;
  1216. X    Bool    lock;
  1217. X{
  1218. X    WinRoot *rootwin = winInfo->core.client->scrInfo->rootwin;
  1219. X
  1220. X    InstallColormap(dpy, rootwin);
  1221. X    if (lock) {
  1222. X    ColorFocusClient(rootwin) = rootwin->core.client;
  1223. X    ColorFocusLocked(rootwin) = True;
  1224. X    }
  1225. X}
  1226. X
  1227. X
  1228. X/*
  1229. X * Give this client the colormap focus, and lock the colormap of winInfo into 
  1230. X * the hardware.  Doesn't actually check if winInfo is one of cli's colormap 
  1231. X * windows.  Note: cli can be NULL.
  1232. X */
  1233. Xvoid
  1234. XLockColormap(dpy, cli, winInfo)
  1235. X    Display    *dpy;
  1236. X    Client    *cli;
  1237. X    WinGeneric    *winInfo;
  1238. X{
  1239. X    InstallColormap(dpy, winInfo);
  1240. X    ColorFocusClient(winInfo) = cli;
  1241. X    ColorFocusLocked(winInfo) = True;
  1242. X}
  1243. X
  1244. X
  1245. X/*
  1246. X * InstallPointerColormap
  1247. X *
  1248. X * Install the colormap for the leafmost window that we know about that 
  1249. X * encloses the pointer.  The boolean setfocusclient indicates whether to set 
  1250. X * the colormap focus client to this window's client.  
  1251. X *
  1252. X * If root is None, we do a QueryPointer to find out where the pointer is
  1253. X * instead of using the rootx and rooty values.
  1254. X */
  1255. Xvoid
  1256. XInstallPointerColormap(dpy, root, rootx, rooty, setfocusclient)
  1257. X    Display *dpy;
  1258. X    Window root;
  1259. X    int rootx, rooty;
  1260. X    Bool setfocusclient;
  1261. X{
  1262. X    Window src;
  1263. X    Window dest;
  1264. X    Window child;
  1265. X    int srcx;
  1266. X    int srcy;
  1267. X    int destx, desty;
  1268. X    WinGeneric *wi = NULL;
  1269. X    WinGeneric *t;
  1270. X    Client *cli;
  1271. X
  1272. X    if (root == None) {
  1273. X    Window wjunk;
  1274. X    int junk;
  1275. X    unsigned int uijunk;
  1276. X
  1277. X    /* We want only the root, rootx, and rooty; we throw the rest away */
  1278. X    (void) XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &wjunk,
  1279. X                 &rootx, &rooty, &junk, &junk, &uijunk);
  1280. X    }
  1281. X
  1282. X    src  = root;
  1283. X    dest = root;
  1284. X    srcx = rootx;
  1285. X    srcy = rooty;
  1286. X
  1287. X    while (1) {
  1288. X    (void) XTranslateCoordinates(dpy, src, dest, srcx, srcy,
  1289. X                     &destx, &desty, &child);
  1290. X    t = WIGetInfo(dest);
  1291. X    if (t != NULL)
  1292. X        wi = t;
  1293. X    if (child == None)
  1294. X        break;
  1295. X    src = dest;
  1296. X    dest = child;
  1297. X    srcx = destx;
  1298. X    srcy = desty;
  1299. X    }
  1300. X    /*
  1301. X     * At this point, dest contains the leafmost window that encloses the 
  1302. X     * pointer, and wi points to the window structure of the leafmost known 
  1303. X     * window that encloses the pointer.
  1304. X     */
  1305. X
  1306. X    /* if we didn't find a window we know about, use the root instead */
  1307. X
  1308. X    if (wi == NULL) {
  1309. X    wi = WIGetInfo(root);
  1310. X    if (wi == NULL)
  1311. X        return;
  1312. X    }
  1313. X
  1314. X    /*
  1315. X     * If we are over a frame, its window button, or its resize corners,
  1316. X     * use the head of the pane's colormap window list, or the pane itself if 
  1317. X     * it has no list.
  1318. X     */
  1319. X    switch (wi->core.kind) {
  1320. X    case WIN_FRAME:
  1321. X    case WIN_RESIZE:
  1322. X    case WIN_PUSHPIN:
  1323. X    case WIN_WINBUTTON:
  1324. X    if (wi->core.client->colormapWins)
  1325. X        wi = wi->core.client->colormapWins->value;
  1326. X    else
  1327. X        wi = (WinGeneric *) PANEOFCLIENT(wi->core.client);
  1328. X    break;
  1329. X    default:
  1330. X    break;
  1331. X    }
  1332. X
  1333. X    if (setfocusclient) {
  1334. X    if (wi->core.colormapClients)
  1335. X        cli = (Client *) wi->core.colormapClients->value;
  1336. X    else if (wi->core.client)
  1337. X        cli = wi->core.client;
  1338. X    else
  1339. X        cli = NULL;
  1340. X    LockColormap(dpy, cli, wi);
  1341. X    } else {
  1342. X    InstallColormap(dpy, wi);
  1343. X    }
  1344. X}
  1345. X
  1346. X
  1347. X/*
  1348. X * UnlockColormap
  1349. X *
  1350. X * Turn off colormap-locked mode.
  1351. X */
  1352. Xvoid
  1353. XUnlockColormap(dpy, root, rootx, rooty)
  1354. X    Display *dpy;
  1355. X{
  1356. X    WinGeneric *rootinfo = WIGetInfo(root);
  1357. X
  1358. X    /* REMIND: assert rootinfo != NULL */
  1359. X
  1360. X    ColorFocusClient(rootinfo) = NULL;
  1361. X    ColorFocusLocked(rootinfo) = False;
  1362. X    InstallPointerColormap(dpy, root, rootx, rooty, False);
  1363. X}
  1364. X
  1365. X
  1366. X/*
  1367. X * ColormapChange
  1368. X *
  1369. X * Handle a change to a window's colormap attribute.
  1370. X */
  1371. Xvoid
  1372. XColormapChange(dpy, event, winInfo)
  1373. X    Display *dpy;
  1374. X    XEvent *event;
  1375. X    WinGeneric *winInfo;
  1376. X{
  1377. X    if (event->xcolormap.new) {
  1378. X    winInfo->core.colormap = event->xcolormap.colormap;
  1379. X    if (winInfo == ColorFocusWindow(winInfo))
  1380. X        InstallColormap(dpy, winInfo);
  1381. X    }
  1382. X}
  1383. X
  1384. X
  1385. X/*
  1386. X * ColorWindowCrossing
  1387. X *
  1388. X * Handle colormap installation on crossing events.  If we are not in
  1389. X * colormap-locked mode, install the window's colormap.
  1390. X */
  1391. Xvoid
  1392. XColorWindowCrossing(dpy, event, winInfo)
  1393. X    Display *dpy;
  1394. X    XEvent  *event;
  1395. X    WinGeneric *winInfo;
  1396. X{
  1397. X    if (!ColorFocusLocked(winInfo))
  1398. X    InstallColormap(dpy, winInfo);
  1399. X}
  1400. X
  1401. X
  1402. X/* values for tag field */
  1403. X#define TAG_NEITHER 0
  1404. X#define TAG_OLDLIST 1
  1405. X#define TAG_NEWLIST 2
  1406. X
  1407. X/*
  1408. X * TrackSubwindows      -- check for the WM_COLORMAP_WINDOWS prop
  1409. X *                      on a pane, if it exists, track the subwindows.
  1410. X */
  1411. Xvoid
  1412. XTrackSubwindows(cli)
  1413. X    Client *cli;
  1414. X{
  1415. X    Display        *dpy = cli->dpy;
  1416. X    Window        pane = PANEWINOFCLIENT(cli);
  1417. X    unsigned long   nItems, remain;
  1418. X    Window        *cmapwindata;
  1419. X    List        **last;
  1420. X    List        *oldlist;
  1421. X    List        *l;
  1422. X    WinGeneric        *cmwi;
  1423. X    int            i;
  1424. X    WinGenericPane  *paneinfo = PANEOFCLIENT(cli);
  1425. X
  1426. X    if (!PropGetWMColormapWindows(dpy,pane,&cmapwindata,&nItems))
  1427. X       return;
  1428. X
  1429. X    /*
  1430. X     * Register all the windows on the new list, taking care to not touch any 
  1431. X     * window that was on the old list, while getting rid of windows not on 
  1432. X     * the new list, and ensuring that the new list has no duplicates.  This
  1433. X     * is a five-step process.  (Note: the tag field is initialized to TAG_
  1434. X     * NEITHER during window creation.)
  1435. X     *
  1436. X     * (1) Mark all windows on the old list as TAG_OLDLIST.
  1437. X     *
  1438. X     * (2) Run through the WM_COLORMAP_WINDOWS property.  For each window ID 
  1439. X     * in this property, there are four cases: (a) we've never seen this 
  1440. X     * window ID before; (b) we've seen this ID before but it is on neither 
  1441. X     * list; (c) this ID is on the old list; (d) this ID already on the new 
  1442. X     * list.  For case (a), a record for the window is created and this case 
  1443. X     * is subsumed by case (b).
  1444. X     *
  1445. X     * Cases (a) and (b) correspond to TAG_NEITHER.  Add this window to the
  1446. X     * new list, add this client to the window's client list, and mark the
  1447. X     * window as TAG_NEWLIST.  Case (c) corresponds to TAG_OLDLIST.  Add this
  1448. X     * window to the new list and mark it as TAG_NEWLIST.  This client is
  1449. X     * already on the window's client list.  Case (d) corresponds to
  1450. X     * TAG_NEWLIST.  This window is already on the new list, so nothing more
  1451. X     * need be done.
  1452. X     *
  1453. X     * (3) If we haven't encountered the pane window in the new property, add
  1454. X     * it to the front of the list and mark it as TAG_NEWLIST (per ICCCM
  1455. X     * section 4.1.8).
  1456. X     *
  1457. X     * (4) Run through the old list.  Each window marked TAG_OLDLIST is no 
  1458. X     * longer on the new list, so remove this client from the window's client 
  1459. X     * list.  Windows marked TAG_NEWLIST are already on the new list, so 
  1460. X     * nothing need be done.  Reclaim the old list.
  1461. X     *
  1462. X     * (5) Reset tags of all windows on the new list to TAG_NEITHER.
  1463. X     */
  1464. X
  1465. X    oldlist = cli->colormapWins;
  1466. X    cli->colormapWins = NULL_LIST;
  1467. X
  1468. X    /* step (1) */
  1469. X
  1470. X    l = oldlist;
  1471. X    for (cmwi = ListEnum(&l); cmwi != NULL; cmwi = ListEnum(&l))
  1472. X    cmwi->core.tag = TAG_OLDLIST;
  1473. X    
  1474. X    /* step (2) */
  1475. X
  1476. X    last = &cli->colormapWins;
  1477. X    for (i=0; i<nItems; ++i) {
  1478. X    cmwi = WIGetInfo(cmapwindata[i]);
  1479. X
  1480. X    /* Check for case (a), convert to case (b). */
  1481. X    if (cmwi == NULL) {
  1482. X        cmwi = MakeColormap(cli, cmapwindata[i]);
  1483. X        if (cmwi == NULL)
  1484. X        continue;
  1485. X    }
  1486. X
  1487. X    switch (cmwi->core.tag) {
  1488. X    case TAG_NEITHER:                /* case (b) */
  1489. X        WinAddColorClient(cmwi, cli);
  1490. X        /* FALL THRU */
  1491. X    case TAG_OLDLIST:                /* case (c) */
  1492. X        (*last) = ListCons(cmwi, NULL_LIST);
  1493. X        last = &((*last)->next);
  1494. X        cmwi->core.tag = TAG_NEWLIST;
  1495. X        break;
  1496. X    case TAG_NEWLIST:                /* case (d) */
  1497. X        break;
  1498. X    }
  1499. X    }
  1500. X    XFree((char *)cmapwindata);
  1501. X
  1502. X    /* step (3) */
  1503. X
  1504. X    switch (paneinfo->core.tag) {
  1505. X    case TAG_NEITHER:
  1506. X    WinAddColorClient(paneinfo, cli);
  1507. X    /* FALL THRU */
  1508. X    case TAG_OLDLIST:
  1509. X    cli->colormapWins = ListCons(paneinfo, cli->colormapWins);
  1510. X    paneinfo->core.tag = TAG_NEWLIST;
  1511. X    break;
  1512. X    case TAG_NEWLIST:
  1513. X    /* it's on the new list, do nothing */
  1514. X    break;
  1515. X    }
  1516. X
  1517. X    /* step (4) */
  1518. X
  1519. X    l = oldlist;
  1520. X    for (cmwi = ListEnum(&l); cmwi != NULL; cmwi = ListEnum(&l)) {
  1521. X    if (cmwi->core.tag == TAG_OLDLIST)
  1522. X        WinRemoveColorClient(dpy, cmwi, cli);
  1523. X    cmwi->core.tag = TAG_NEITHER;
  1524. X    }
  1525. X    ListDestroy(oldlist);
  1526. X
  1527. X    /* step (5) */
  1528. X
  1529. X    l = cli->colormapWins;
  1530. X    for (cmwi = ListEnum(&l); cmwi != NULL; cmwi = ListEnum(&l))
  1531. X    cmwi->core.tag = TAG_NEITHER;
  1532. X
  1533. X    /* install colormaps as necessary */
  1534. X
  1535. X    if (!ColorFocusLocked(paneinfo)) {
  1536. X    InstallPointerColormap(dpy, None, 0, 0, False);
  1537. X    } else if (ColorFocusClient(paneinfo) == cli) {
  1538. X    if (cli->colormapWins)
  1539. X        InstallColormap(dpy, (WinGeneric *)cli->colormapWins->value);
  1540. X    else
  1541. X        InstallColormap(dpy, paneinfo);
  1542. X    }
  1543. X}
  1544. X
  1545. X
  1546. X/*
  1547. X * UnTrackSubwindows -- stop tracking all subwindows.  The Bool destroyed 
  1548. X * indicates that this client is being destroyed.  If so, this client loses 
  1549. X * the colormap focus.  If not, the color focus window is transferred to this
  1550. X * client's pane.
  1551. X */
  1552. Xvoid
  1553. XUnTrackSubwindows(cli, destroyed)
  1554. X    Client *cli;
  1555. X    Bool destroyed;
  1556. X{
  1557. X    WinGeneric    *wi;
  1558. X    List    *l;
  1559. X    WinGenericPane  *paneinfo = PANEOFCLIENT(cli);
  1560. X
  1561. X    l = cli->colormapWins;
  1562. X    for (wi = ListEnum(&l); wi != NULL; wi = ListEnum(&l))
  1563. X    WinRemoveColorClient(cli->dpy, wi, cli);
  1564. X    ListDestroy(cli->colormapWins);
  1565. X    cli->colormapWins = NULL_LIST;
  1566. X
  1567. X    if (ColorFocusClient(paneinfo) == cli) {
  1568. X    if (destroyed) {
  1569. X        ColorFocusClient(paneinfo) = NULL;
  1570. X        if (GRV.ColorLocked) {
  1571. X        /* lock in the root's colormap */
  1572. X        InstallColormap(cli->dpy,cli->scrInfo->rootwin);
  1573. X        } else {
  1574. X        /* revert to follow-mouse */
  1575. X        ColorFocusLocked(paneinfo) = False;
  1576. X        InstallPointerColormap(cli->dpy, None, 0, 0, False);
  1577. X        }
  1578. X    } else {
  1579. X        InstallColormap(cli->dpy,paneinfo);
  1580. X    }
  1581. X    }
  1582. X}
  1583. X
  1584. X/*
  1585. X * ColorUpdateColorMapWindows - handle the PropertyNotify on WM_COLORMAP_WINDOWS
  1586. X */
  1587. Xvoid
  1588. XColorUpdateColorMapWindows(cli,event)
  1589. X    Client        *cli;
  1590. X    XPropertyEvent    *event;
  1591. X{
  1592. X    if (event->state == PropertyNewValue) {
  1593. X        TrackSubwindows(cli);
  1594. X    } else {
  1595. X        UnTrackSubwindows(cli,False);
  1596. X    }
  1597. X}
  1598. X
  1599. X
  1600. X/*
  1601. X * MakeColormap  -- create the colormap window. Return a WinGeneric structure.
  1602. X */
  1603. XWinColormap *
  1604. XMakeColormap(cli,win)
  1605. XClient *cli;
  1606. XWindow win;
  1607. X{
  1608. X    WinColormap *w;
  1609. X        XWindowAttributes winAttr;
  1610. X
  1611. X    /*
  1612. X     * Select input before getting window attributes in order to avoid 
  1613. X     * race conditions with destruction and colormap changes.
  1614. X     */
  1615. X
  1616. X        XSelectInput(cli->dpy, win,
  1617. X             EnterWindowMask | ColormapChangeMask |
  1618. X             StructureNotifyMask);
  1619. X
  1620. X        if (XGetWindowAttributes(cli->dpy, win, &winAttr) == 0)
  1621. X        return NULL;
  1622. X
  1623. X    /* create the associated structure */
  1624. X    w = MemNew(WinColormap);
  1625. X    w->class = &classColormap;
  1626. X    w->core.self = win;
  1627. X    w->core.kind = WIN_COLORMAP;
  1628. X    w->core.client = cli;
  1629. X        w->core.colormap = winAttr.colormap;
  1630. X    w->core.colormapClients = NULL_LIST;
  1631. X    w->core.helpstring = (char *)NULL;  /* no help for colormaps */
  1632. X
  1633. X    /* register the window */
  1634. X    WIInstallInfo(w);
  1635. X
  1636. X    return w;
  1637. X}
  1638. X
  1639. X
  1640. Xvoid
  1641. XColormapInit(dpy)
  1642. XDisplay *dpy;
  1643. X{
  1644. X        classColormap.core.kind = WIN_COLORMAP;
  1645. X        classColormap.core.xevents[DestroyNotify] = eventDestroy;
  1646. X        classColormap.core.xevents[EnterNotify] = eventEnterLeaveNotify;
  1647. X        classColormap.core.xevents[LeaveNotify] = eventEnterLeaveNotify;
  1648. X    classColormap.core.xevents[UnmapNotify] = eventUnmapNotify;
  1649. X    classColormap.core.xevents[ColormapNotify] = eventColormapNotify;
  1650. X        classColormap.core.focusfunc = NULL;
  1651. X        classColormap.core.drawfunc = NULL;
  1652. X        classColormap.core.destroyfunc = destroyColormap;
  1653. X        classColormap.core.selectfunc = NULL;
  1654. X        classColormap.core.newconfigfunc = NULL;
  1655. X        classColormap.core.newposfunc = NULL;
  1656. X        classColormap.core.setconfigfunc = NULL;
  1657. X        classColormap.core.createcallback = NULL;
  1658. X        classColormap.core.heightfunc = NULL;
  1659. X        classColormap.core.widthfunc = NULL;
  1660. X}
  1661. X
  1662. X
  1663. Xvoid
  1664. XColorFocusInit(dpy, root)
  1665. X    Display *dpy;
  1666. X    WinGeneric *root;
  1667. X{
  1668. X    InstallColormap(dpy, root);
  1669. X    ColorFocusClient(root) = (Client *)NULL;
  1670. X    ColorFocusLocked(root) = GRV.ColorLocked;
  1671. X}
  1672. X
  1673. X/* The following two functions are used when a pane is being mapped, to
  1674. X * handle the possibility that a pane has already been named as a
  1675. X * colourmap window before it was mapped.
  1676. X */
  1677. X
  1678. X/* ColormapUnhook -- Given a window, if exists as a colourmap 
  1679. X *    window, remove it from the event dispatching lookup table
  1680. X *     and return a pointer to the window structure.
  1681. X */
  1682. XWinColormap *
  1683. XColormapUnhook(w)
  1684. XWindow w;
  1685. X{
  1686. X    WinColormap *win;
  1687. X
  1688. X    win = WIGetInfo(w);
  1689. X    if (win != NULL)
  1690. X    {
  1691. X        if (win->core.kind == WIN_COLORMAP)
  1692. X        {
  1693. X            WIUninstallInfo(w);
  1694. X        }
  1695. X        else
  1696. X        {
  1697. X        win = NULL;
  1698. X        }
  1699. X    }
  1700. X    return win;
  1701. X}
  1702. X
  1703. X/* ColormapTransmogrify -- Take a previously-saved colourmap window
  1704. X *    structure, which has been superceded by a pane window structure,
  1705. X *    and patch up client-to-window references to point to the
  1706. X *    pane window structure.  When done, destroy the colourmap
  1707. X *    window structure.
  1708. X */
  1709. Xvoid
  1710. XColormapTransmogrify(winc, winp)
  1711. XWinColormap *winc;
  1712. XWinPane *winp;
  1713. X{
  1714. X    Client *cli;
  1715. X    List *cli_list;
  1716. X    List *win_list;
  1717. X
  1718. X    if (winc == NULL)
  1719. X    return;
  1720. X
  1721. X    /*
  1722. X     * For every client in the colourmap window's client list, search that 
  1723. X     * client's window list and change the reference.
  1724. X     */
  1725. X    cli_list = winc->core.colormapClients;
  1726. X    for (cli = ListEnum(&cli_list); cli != NULL; cli = ListEnum(&cli_list)) {
  1727. X    win_list = cli->colormapWins;
  1728. X    while (win_list != NULL) {
  1729. X        if (win_list->value == winc) {
  1730. X        win_list->value = winp;
  1731. X        break;
  1732. X        }
  1733. X        win_list = win_list->next;
  1734. X    }
  1735. X    }
  1736. X
  1737. X    /* patch up other pointers */
  1738. X    if (ColorFocusWindow(winc) == winc)
  1739. X    ColorFocusWindow(winc) = (WinGeneric *)winp;
  1740. X#ifdef NOTDEF
  1741. X    /* REMIND check that this next statement is correct */
  1742. X    if (ColorFocusClient(winc) == winc->core.client)
  1743. X    ColorFocusClient(winc) = winp->core.client;
  1744. X#endif
  1745. X
  1746. X    winp->core.colormapClients = winc->core.colormapClients;
  1747. X    winc->core.colormapClients = NULL_LIST;
  1748. X
  1749. X    /* the colourmap window can now be destroyed since all references
  1750. X     * to it have been removed.
  1751. X     */
  1752. X    (WinFunc(winc,core.destroyfunc))(winc->core.client->dpy, winc);
  1753. X}
  1754. END_OF_FILE
  1755. if test 21460 -ne `wc -c <'wincolor.c'`; then
  1756.     echo shar: \"'wincolor.c'\" unpacked with wrong size!
  1757. fi
  1758. # end of 'wincolor.c'
  1759. fi
  1760. echo shar: End of archive 13 \(of 21\).
  1761. cp /dev/null ark13isdone
  1762. MISSING=""
  1763. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ; do
  1764.     if test ! -f ark${I}isdone ; then
  1765.     MISSING="${MISSING} ${I}"
  1766.     fi
  1767. done
  1768. if test "${MISSING}" = "" ; then
  1769.     echo You have unpacked all 21 archives.
  1770.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1771. else
  1772.     echo You still need to unpack the following archives:
  1773.     echo "        " ${MISSING}
  1774. fi
  1775. ##  End of shell archive.
  1776. exit 0
  1777. --
  1778. Molecular Simulations, Inc.             mail: dcmartin@postgres.berkeley.edu
  1779. 796 N. Pastoria Avenue                  uucp: uwvax!ucbvax!dcmartin
  1780. Sunnyvale, California 94086             at&t: 408/522-9236
  1781.