home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume15 / olvwm-3.0 / part17 < prev    next >
Internet Message Format  |  1992-02-03  |  57KB

  1. Path: uunet!sun-barr!ames!pasteur!nntp
  2. From: scott.oaks@East.Sun.COM (Scott Oaks)
  3. Newsgroups: comp.sources.x
  4. Subject: v15i163: OpenLook Virtual Window Mgr (3.0), Part17/21
  5. Message-ID: <1992Feb4.135956.8094@pasteur.Berkeley.EDU>
  6. Date: 4 Feb 92 13:59:56 GMT
  7. References: <csx-15i147-olvwm-3.0@uunet.UU.NET>
  8. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  9. Organization: University of California, at Berkeley
  10. Lines: 1936
  11. Approved: dcmartin@msi.com
  12. Nntp-Posting-Host: postgres.berkeley.edu
  13.  
  14. Submitted-by: scott.oaks@East.Sun.COM (Scott Oaks)
  15. Posting-number: Volume 15, Issue 163
  16. Archive-name: olvwm-3.0/part17
  17.  
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  22. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  23. # If this archive is complete, you will see the following message at the end:
  24. #        "End of archive 17 (of 21)."
  25. # Contents:  CHANGES environ.c win.c win.h winbutton.c
  26. # Wrapped by dcmartin@fascet on Tue Jan 14 05:54:47 1992
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'CHANGES' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'CHANGES'\"
  30. else
  31. echo shar: Extracting \"'CHANGES'\" \(10406 characters\)
  32. sed "s/^X//" >'CHANGES' <<'END_OF_FILE'
  33. Xolvwm 3.0 notes:
  34. X
  35. XINCOMPATIBILITIES WITH VERSION 2:
  36. X1)  The Shift-Arrow and Control-Arrow methods of moving in the desktop have
  37. X    had their functionality reversed:  shift-arrow now moves by half-desktops
  38. X    and control arrow now moves by many desktops.  This is for consistency
  39. X    with the new mouseless commands which interpret ctrl-arrow as move ten
  40. X    items.
  41. X
  42. X2)  Double clicking anywhere within the VDM now moves to that location rather
  43. X    than zooming a window which may have been clicked on.  This is either
  44. X    a bug fix or a new feature, depending on your perspective.
  45. X
  46. X3) Pinned Root menus are by default no longer sticky; they must be stuck
  47. X    via the sticky list in .Xdefaults
  48. X
  49. XNEW FEATURES IN VERSION 3:
  50. X
  51. XMost of the changes in this version of olvwm are inherited from changes
  52. Xmade to the 3.0 olwm and are not listed here.  See the olwm man page for
  53. Xdetails.
  54. X
  55. X    MENU CHANGES:
  56. X
  57. X    1)  There is a new menu token WINMENU.  Specifying this token
  58. X        creates an entry in your root menu containing a pull-right
  59. X        menu; the pull-right menu is a menu containing the titles of all
  60. X        active windows on the desktop (windows which are iconic will be
  61. X        listed with a preceeding graphic symbol).  Selecting a window
  62. X        from this list will cause a user-specifiable action.  These
  63. X        actions may be specified in the .olvwmrc file (see below); in
  64. X        the absence of any specifications, the default action will be to
  65. X        warp to the location on the desktop where the selected window is
  66. X        located, to open that window if it is iconic, and to raise that
  67. X        window to the top of the stacking order.
  68. X    
  69. X    2)  There is a new menu token DIRMENU.  Specifying this token
  70. X        creates an entry containing a pull-right menu; the pull-right
  71. X        menu is a menu containing every file in the given directory.
  72. X        Selecting an entry off this menu (attempts to) execute the
  73. X        given file.
  74. X
  75. X    3)  There is a new menu token STICK_UNSTICK_SELN which works to
  76. X        toggle the stickyness of the selected clients.
  77. X
  78. X    4)  There is a new menu token COLUMNS which specifies how many columns
  79. X        a menu should have.  It must appear after the start but before the
  80. X        end of a menu, e.g.
  81. X
  82. X"Shells" MENU
  83. X"Shells" COLUMNS    2
  84. X    "Shelltool..."    exec shelltool
  85. X    ...
  86. X"Shells" END
  87. X
  88. X    5)  You can now specify an X bitmap file instead of a name for a menu
  89. X            item; enclose the bitmap file in <>:
  90. X
  91. X</usr/openwin/include/X11/bitmaps/xfd_icon>    exec xfd -fn lucidasans
  92. X
  93. X    NEW RESOURCES:
  94. X
  95. X    1)  ResizeMoveGeometry:  controls the placement of the olwm 3.0
  96. X        moveresize feedback box.  It's a standard X Geometry string,
  97. X        but you may specify the string center if you want it centered
  98. X        regardless of display resolution.
  99. X
  100. X    2)  UseImages:  If UseImages is set to UseNone, you'll get what you
  101. X        always got.  If it's set to UseVDM, you'll get a bitmap-based
  102. X            VDM menu (this is the default).  If it's set to UseAll you'll get
  103. X            bitmap-based window menus.
  104. X
  105. X    3)  FullSizeZoomX: When this attribute is set to True, selecting
  106. X        "Full Size" from the window menu will cause the window to zoom
  107. X        horizontally as well as vertically.
  108. X
  109. X    4)  InputFocusColor: When this attribute is set to a color
  110. X        specification, then the frame which has the Input Focus will be
  111. X        drawn in that color, as will the virtual window representing that
  112. X        frame.
  113. X
  114. X    5)  NoDecor: This is a list attribute, similar to MinimalDecor.
  115. X        Windows whose Name, Instance, or Class match an entry in this list
  116. X        will be ignored by the window manager; though they will have a
  117. X        corresponding virtual window drawn in the VDM, they will be sticky
  118. X        or non-sticky depending on the appropriate entry in the
  119. X        VirtualSticky list, and they will be affected by the new Window
  120. X        Menu and Warp options described below.  This is unlike windows
  121. X        which have the override_redirect flag set, for which absolutely
  122. X        no window manager actions have any effect.
  123. X    
  124. X    6)  VirtualMoveGroups:  If this is True (default), then whenever you
  125. X        move a window from one logical screen to another, all of the
  126. X        window's followers (popups, menus, and icon) will follow it.
  127. X        Setting this to false gives the olvwm 2.0 behaviour where only
  128. X        the selected window moved.
  129. X    
  130. X    7)  RaiseOnMove:  If this is True, then whenever a window is moved
  131. X        it will be raised to the top of the stacking order.  This helps
  132. X        to avoid windows getting lost when dragging them out of the VDM
  133. X        (but the default is false).
  134. X    
  135. X    8)  VirtualRaiseVDM:  If this is True, the VDM will always appear on
  136. X        the top of the stacking order.
  137. X
  138. X    NEW RC FILE CHANGES:
  139. X    olvwm now reads an rc file to control usage in three areas:  hot keys
  140. X    (desktop actions when a certain key is pressed), screen bindings
  141. X    (always map certain applications to specified logical screens), and
  142. X    WINMENU actions.  See the olvwmrc.man page for details.
  143. X
  144. X    MISC FUNCTIONAL CHANGES:
  145. X
  146. X    1)  Popups will always appear on the same screen as their leader, even
  147. X        if that screen isn't visible.
  148. X
  149. X    2)  You can now drop something into a virtual window.
  150. X
  151. X    3)  The keymappings for the VDM can all be set via resources; see the
  152. X        man page for details.
  153. X
  154. X    4)  There is a new VDM icon.
  155. X
  156. XBUGS FIXED IN VERSION 3
  157. X
  158. X1)  Switching between screens will correctly set the arrow-key input focus.
  159. X
  160. X2)  Menus which are taller than the screen are now split into columns; menu
  161. X    titles are centered
  162. X
  163. X3)  Sticky windows now always map to the current screen.
  164. X
  165. X4)  Several off-by-one grid errors have been fixed.
  166. X
  167. X5)  Changes to a tool's title are now reflected immediately in the VDM.
  168. X
  169. X6)  Override_redirect windows can no longer be affected by the L keys.
  170. X
  171. X7)  Exiting olvwm and starting another wm now correctly positions the windows
  172. X
  173. X8)  Miscellaneous fixes in the documentation
  174. X
  175. X---Changes in Version 2.2----------------------------------------
  176. XFUNCTIONAL CHANGES:
  177. X
  178. X1)  New ways to move the desktop, including:
  179. X    A)  If a motion key is shifted, motion amount is doubled
  180. X    B)  If a motion key is pressed with the CTRL key, motion amount is halved
  181. X    C)  If a motion key is pressed with SHIFT/CTRL, motion amount is multiplied
  182. X    by 20, which should take it to the nearest edge
  183. X    D)  The function keys 1-10 can be used to move to a specific screen:
  184. X    screens are number across and then down from 1 to 10.
  185. X    E)  If a motion key is pressed with the META key, then it will work no
  186. X    matter where the keyboard focus is.
  187. X    F)  The MENU button within the VDM brings up a (pinnable) menu allowing
  188. X    motions.
  189. X
  190. X2)  Virtual Windows now react to mouse events and Front/Open keystrokes like
  191. X    any other window; they can be grouped, their frame menu displayed, etc.
  192. X
  193. X3)  New RelativePosition attribute added
  194. X
  195. X    In past versions, by default, when the user specified a window
  196. X    placement, that position was used in absolute co-ordinates, and
  197. X    when a program specified a window placement, that position was
  198. X    used in relative co-ordinates.
  199. X
  200. X    Some programs (frame and mailtool, for example) save some window
  201. X    states somewhere (frame does it in the document, mailtool in
  202. X    the .mailtool-init file) and then brings up these windows with
  203. X    user-specified co-ordinates.  This means that if you start these
  204. X    programs in another part of the Virtual Desktop, some frames will
  205. X    come up in the wrong area of the screen -- they will come up
  206. X    where they last were rather than where you are now.
  207. X
  208. X    Setting the RelativePosition attribute to True (its default) will
  209. X    make all window placement strings be relative to the current
  210. X    screen.
  211. X
  212. X    The only time this setting should be a problem is if you are
  213. X    any place other than the upper-left corner and you want to bring
  214. X    up a window in absolute co-ordinates.  But since absolute
  215. X    co-ordinates are normally only useful for things brought up in
  216. X    your .xinitrc/.openwin-init file, that shouldn't normally be
  217. X    a problem.
  218. X    
  219. X4)  You can now specify sticky applications by the first word in their
  220. X    WM_NAME attribute as well as their WM_CLASS/WM_INSTANCE attribute.
  221. X    For some tools (eg Mailtool), the WM_NAME is multi-word:
  222. X    Mail Tool - /var/spool/mail/sdo for example; use only the first
  223. X    word (Mail) in the list as xrdb is incapable of imbedding spaces
  224. X    in the list.
  225. X
  226. X    This allows (most) XView applications and pinned menus to be sticky.
  227. X    Note that the XView clock has by default no WM_NAME either; but
  228. X    it (and all XView applications) can set their name on the command
  229. X    line with -Wl <name>.
  230. X
  231. X5)  The VDM now displays a grid (by default, but it can be turned off by
  232. X    setting VirtualGrid to None) for screen sizes.  When the grid
  233. X    is on, dragging the mouse to move the desktop is constrained to move
  234. X    between whole screen regions (unless the CTRL button is pressed
  235. X    while dragging the mouse, in which case arbitrary positioning of
  236. X    the desktop is enabled).  If the grid is off, you can move the desktop
  237. X    by arbitrary amounts unless the CTRL button is pressed, in which case
  238. X    movement will be constrained to full screens.
  239. X
  240. XBUG FIXES
  241. X
  242. X6)  Windows which don't register with the Window manager and are raised
  243. X    by the "Front" key no longer core dump.
  244. X
  245. X7) The Save Workspace command now correctly saves non-Xview applications.
  246. X
  247. X8) When olvwm is in MinimalDecor, it will resize correctly.
  248. X
  249. X9) Clients like xterm can now receive input focus if click-to-type is in
  250. X    effect and the inside of the window is clicked.
  251. X
  252. X10) Icons can now be moved into the VDM when SnapToGrid is in effect.
  253. X
  254. X11) Applications which start sticky can be unstuck.
  255. X
  256. X12)  Moving multiple windows into the VDM no longer collapses the windows
  257. X    onto each other.
  258. X
  259. X13)  The root now correctly inherits keyboard events when shells exit.
  260. X
  261. X14) Menus can now have embedded environmental variables
  262. X
  263. X15)  Sub-frames now inherit the stickyness of their parent.  Note that in
  264. X    the OPEN LOOK paradigm, this means that command frames and pinned
  265. X    menus will inherit the stickyness of their parent but any other
  266. X    base frames (e.g. the compose window from mailtool) will not.
  267. X
  268. X16)  olvwm now avoids the OW2.0 server bug for small windows on CG3 displays
  269. X    which used to cause the server to crash.
  270. X
  271. X17)  Windows can no longer be dropped into obscured portions of the VDM
  272. X
  273. XSOURCE FIXES
  274. X
  275. X18)  Imakefile now lists resources1.o
  276. X    [Okay, I said I was no Imake user . . .]
  277. X
  278. X19)  Imakefile no longer tries to install openwin-menu
  279. X
  280. X20)  Imakefile correctly installs man page
  281. X
  282. X21)  New Imakefile for those without MIT XView but with OpenWindows
  283. END_OF_FILE
  284. if test 10406 -ne `wc -c <'CHANGES'`; then
  285.     echo shar: \"'CHANGES'\" unpacked with wrong size!
  286. fi
  287. # end of 'CHANGES'
  288. fi
  289. if test -f 'environ.c' -a "${1}" != "-c" ; then 
  290.   echo shar: Will not clobber existing file \"'environ.c'\"
  291. else
  292. echo shar: Extracting \"'environ.c'\" \(4582 characters\)
  293. sed "s/^X//" >'environ.c' <<'END_OF_FILE'
  294. X/*
  295. X *      (c) Copyright 1989, 1990 Sun Microsystems, Inc. Sun design patents
  296. X *      pending in the U.S. and foreign countries. See LEGAL_NOTICE
  297. X *      file for terms of the license.
  298. X */
  299. X
  300. X#ident    "@(#)environ.c    1.6    91/09/14 SMI"
  301. X
  302. X#include <stdio.h>
  303. X#ifdef SYSV
  304. X#include <string.h>
  305. X#else
  306. X#include <strings.h>
  307. Xextern char *strrchr();
  308. Xextern char *strchr();
  309. X#endif
  310. X#include <X11/Xos.h>
  311. X#include <X11/Xlib.h>
  312. X#include <X11/Xatom.h>
  313. X#include "mem.h"
  314. X
  315. Xextern    char **environ;
  316. X
  317. X/* -----------------------------------------------------------------------
  318. X *    Local Data Structures
  319. X * -----------------------------------------------------------------------*/
  320. X
  321. X/*
  322. X *     Env - environment object
  323. X */
  324. Xtypedef struct _env {
  325. X    char    **environ;    /* array of environment strings */
  326. X    int    length;        /* length of environ array */
  327. X    int    used;        /* number of entries actually used */
  328. X} Env;
  329. X
  330. X/* -----------------------------------------------------------------------
  331. X *    Local Functions
  332. X * -----------------------------------------------------------------------*/
  333. X
  334. X/*
  335. X *    createEnv - Creates a new environment array that is the length of
  336. X *            of the current environment plus the number of additions.
  337. X */
  338. Xstatic void
  339. XcreateEnv(env,nadditions)
  340. X    Env    *env;
  341. X    int    nadditions;
  342. X{
  343. X    int    i = 0;
  344. X
  345. X    /* find the number of items in the current environ */
  346. X    while (environ[i] != (char *)NULL) {
  347. X        i++;
  348. X    }
  349. X
  350. X    /* create space for the environ strings */
  351. X    env->used = i;
  352. X    env->length = env->used + nadditions + 1;
  353. X    env->environ = MemAlloc(env->length*sizeof(char *));
  354. X
  355. X    /* copy the current environ into the new one */
  356. X    for (i=0; i<env->used; i++) {
  357. X        env->environ[i] = MemNewString(environ[i]);
  358. X    }
  359. X    env->environ[i] = (char *)NULL;
  360. X}
  361. X
  362. X/*
  363. X *    putEnv - Puts the name,value pair into the specified environment
  364. X *             replacing any existing values.
  365. X *         Assumes there is space for the new setting.
  366. X */
  367. Xstatic void
  368. XputEnv(env,name,value)
  369. X    Env    *env;
  370. X    char    *name;
  371. X    char    *value;
  372. X{
  373. X    int    nameLen = strlen(name);
  374. X    char    *envVar;
  375. X    int    count;
  376. X
  377. X    /* create new env string with space for '=' and null */
  378. X    envVar = (char *)MemAlloc(nameLen + strlen(value) +2);
  379. X
  380. X    (void)sprintf(envVar,"%s=%s",name,value);
  381. X
  382. X    /* search through, checking for variable in question */
  383. X    for (count=0 ; count<env->used; count++) {
  384. X        if (!strncmp(env->environ[count],name,nameLen))
  385. X            break;
  386. X    }
  387. X    
  388. X
  389. X    if (count == env->used)        /* finished loop without match */
  390. X        env->used++;        /* added 1 more var to the env */
  391. X    else
  392. X        MemFree(env->environ[count]);    /* don't need */
  393. X
  394. X    env->environ[count] = envVar;
  395. X
  396. X    /* make sure the last entry in the vector is NULL */
  397. X    env->environ[env->used] = (char *)NULL;
  398. X
  399. X}
  400. X
  401. X/*
  402. X *    putDisplayEnv - sets the DISPLAY env to the appropriate screen
  403. X */
  404. Xstatic void
  405. XputDisplayEnv(env,dpy,screen)
  406. X    Env    *env;
  407. X    Display    *dpy;
  408. X    int    screen;
  409. X{
  410. X    char    *display = DisplayString(dpy);
  411. X    char    *colon,*dot;
  412. X    char    value[128];
  413. X    int    len;
  414. X
  415. X    if ((colon = strrchr(display,':')) == (char *)NULL) {
  416. X        return;
  417. X    }
  418. X    if ((dot = strchr(colon,'.')) != (char *)NULL) {
  419. X        len = dot - display;
  420. X    } else {
  421. X        len = colon - display;
  422. X    }
  423. X
  424. X    (void)sprintf(value,"%.*s.%d",len,display,screen);
  425. X
  426. X    putEnv(env,"DISPLAY",value);
  427. X}
  428. X
  429. X#ifndef NOSVENV
  430. X/*
  431. X *    putSunViewEnv - sets the various SV environment variables
  432. X */
  433. Xstatic void
  434. XputSunViewEnv(env,dpy,screen)
  435. X    Env    *env;
  436. X    Display *dpy;
  437. X    int    screen;
  438. X{
  439. X    static char    *svEnv[] = { "WINDOW_PARENT", 
  440. X                     "WMGR_ENV_PLACEHOLDER", 
  441. X                     "WINDOW_TTYPARMS" };
  442. X    int        i, svEnvLen = sizeof(svEnv)/sizeof(char *);
  443. X    char        *result,*curpos;
  444. X    unsigned long    nitems,remainder;
  445. X    extern void    *GetWindowProperty();
  446. X    extern Atom    AtomSunViewEnv;
  447. X
  448. X    result = (char *)GetWindowProperty(dpy,RootWindow(dpy,screen),
  449. X            AtomSunViewEnv,0L,100000L,
  450. X            XA_STRING,8,&nitems,&remainder);
  451. X
  452. X    if (result == NULL)
  453. X        return;
  454. X
  455. X    curpos = result;
  456. X    for (i=0; i<svEnvLen; i++) {
  457. X        putEnv(env,svEnv[i],curpos);
  458. X        curpos += strlen(curpos) + 1;
  459. X    }
  460. X
  461. X}
  462. X#endif /* NOSVENV */
  463. X
  464. X/* -----------------------------------------------------------------------
  465. X *    Global Functions
  466. X * -----------------------------------------------------------------------*/
  467. X
  468. X/*
  469. X *    MakeEnviron - returns a new environment array that contains the
  470. X *              current environ plus a modified DISPLAY and
  471. X *              SunView environment variables.
  472. X */
  473. Xchar **
  474. XMakeEnviron(dpy,screen)
  475. X    Display    *dpy;
  476. X    int    screen;
  477. X{
  478. X    Env    newEnv;
  479. X    int    nadditions;
  480. X
  481. X    nadditions = 1;        /* for DISPLAY */
  482. X
  483. X#ifndef NOSVENV
  484. X    nadditions += 3;    /* for SV environment */
  485. X#endif /* NOSVENV */
  486. X
  487. X    createEnv(&newEnv,nadditions);
  488. X
  489. X    putDisplayEnv(&newEnv,dpy,screen);
  490. X
  491. X#ifndef NOSVENV
  492. X    putSunViewEnv(&newEnv,dpy,screen);
  493. X#endif /* NOSVENV */
  494. X
  495. X    return newEnv.environ;
  496. X}
  497. END_OF_FILE
  498. if test 4582 -ne `wc -c <'environ.c'`; then
  499.     echo shar: \"'environ.c'\" unpacked with wrong size!
  500. fi
  501. # end of 'environ.c'
  502. fi
  503. if test -f 'win.c' -a "${1}" != "-c" ; then 
  504.   echo shar: Will not clobber existing file \"'win.c'\"
  505. else
  506. echo shar: Extracting \"'win.c'\" \(10853 characters\)
  507. sed "s/^X//" >'win.c' <<'END_OF_FILE'
  508. X/*
  509. X *      (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
  510. X *      pending in the U.S. and foreign countries. See LEGAL_NOTICE
  511. X *      file for terms of the license.
  512. X */
  513. X
  514. X#ident    "@(#)win.c    1.1 olvwm version 1/3/92"
  515. X
  516. X/*
  517. X * Based on
  518. X#ident    "@(#)win.c    26.12    91/09/14 SMI"
  519. X *
  520. X */
  521. X
  522. X#include <stdio.h>
  523. X#include <memory.h>
  524. X#include <X11/Xos.h>
  525. X#include <X11/Xlib.h>
  526. X#include <X11/Xutil.h>
  527. X#include <X11/Xatom.h>
  528. X
  529. X#include "i18n.h"
  530. X#include "olwm.h"
  531. X#include "win.h"
  532. X#include "mem.h"
  533. X#include "st.h"
  534. X#include "notice.h"
  535. X
  536. X/***************************************************************************
  537. X* local functions
  538. X***************************************************************************/
  539. X
  540. X/*ARGSUSED*/
  541. Xstatic enum st_retval
  542. XdoRedrawOneWindow(w,win,c)
  543. XWindow w;
  544. XWinGeneric *win;
  545. Xvoid *c;
  546. X{
  547. X    if ((WinFunc(win,core.drawfunc) != NULL) && (win->core.client != NULL))
  548. X    (WinFunc(win,core.drawfunc))(win->core.client->dpy,win);
  549. X    return ST_CONTINUE;
  550. X}
  551. X
  552. Xstatic void
  553. XcallSelectTree(dpy,win,sel)
  554. XDisplay *dpy;
  555. XWinGeneric *win;
  556. XBool sel;
  557. X{
  558. X    List *l = win->core.children;
  559. X
  560. X    if (WinFunc(win,core.selectfunc) != NULL) {
  561. X        (*(WinFunc(win,core.selectfunc)))(dpy,win,sel);
  562. X        VirtualSelect(win, sel);
  563. X    }
  564. X    for (win = ListEnum(&l); win != NULL; win = ListEnum(&l))
  565. X        callSelectTree(dpy, win, sel);
  566. X}
  567. X
  568. X/* Destroying a window tree:  walk the trees associated with a client, 
  569. X * invoking the destroyfuncs on each.  The order that the windows are
  570. X * destroyed is significant; it works from the root upwards.  The
  571. X * client structure is not affected; it is assumed that this function
  572. X * is only called from routines which take responsibility for removing
  573. X * the client structure as well.
  574. X */
  575. Xstatic void
  576. XcallDestroyTree(dpy,win)
  577. XDisplay *dpy;
  578. XWinGeneric *win;
  579. X{
  580. X    List *l;
  581. X    WinGeneric *cwin;
  582. X
  583. X    if (win == NULL)
  584. X        return;
  585. X    l = win->core.children;
  586. X    for (cwin = ListEnum(&l); cwin != NULL; cwin = ListEnum(&l))
  587. X        callDestroyTree(dpy, cwin);
  588. X    if (WinFunc(win,core.destroyfunc) != NULL)
  589. X        (*(WinFunc(win,core.destroyfunc)))(dpy,win);
  590. X}
  591. X
  592. Xstatic void
  593. XsetTreeConfig(dpy,win)
  594. XDisplay *dpy;
  595. XWinGeneric *win;
  596. X{
  597. X    List *l = win->core.children;
  598. X    WinGeneric *wc;
  599. X
  600. X    (*(WinFunc(win,core.setconfigfunc)))(dpy,win);
  601. X    for (wc = ListEnum(&l); wc != NULL; wc = ListEnum(&l))
  602. X    {
  603. X        setTreeConfig(dpy,wc);
  604. X    }
  605. X}
  606. X
  607. Xstatic void
  608. XcallFocusTree(win, focus)
  609. XWinGeneric *win;
  610. XBool focus;
  611. X{
  612. X    List *l;
  613. X    WinGeneric *cwin;
  614. X
  615. X    if (win == NULL)
  616. X        return;
  617. X    if (WinFunc(win,core.focusfunc) != NULL) {
  618. X        (WinFunc(win,core.focusfunc))(win->core.client->dpy,win,focus);
  619. X    }
  620. X    l = win->core.children;
  621. X    for (cwin = ListEnum(&l); cwin != NULL; cwin = ListEnum(&l))
  622. X        callFocusTree(cwin, focus);
  623. X}
  624. X
  625. X
  626. Xstatic void
  627. XcallDrawTree(win)
  628. X    WinGeneric *win;
  629. X{
  630. X    List *l;
  631. X    WinGeneric *cwin;
  632. X
  633. X    if (WinFunc(win,core.drawfunc) != NULL)
  634. X    (WinFunc(win,core.drawfunc))(win->core.client->dpy,win);
  635. X
  636. X    l = win->core.children;
  637. X    for (cwin = ListEnum(&l); cwin != NULL; cwin = ListEnum(&l))
  638. X    callDrawTree(cwin);
  639. X}
  640. X
  641. X
  642. X/***************************************************************************
  643. X* global functions
  644. X***************************************************************************/
  645. X
  646. X/* WinCallSelect - call a client's select functions for either the icon or
  647. X *   frame trees, depending on which is visible.  Passes along sel,
  648. X *   which is True iff the client is being selected.
  649. X */
  650. Xvoid
  651. XWinCallSelect(cli, sel)
  652. XClient *cli;
  653. XBool sel;
  654. X{
  655. X    if (cli->wmState == NormalState)
  656. X        callSelectTree(cli->dpy, cli->framewin, sel);
  657. X    else if (cli->wmState == IconicState)
  658. X        callSelectTree(cli->dpy, cli->iconwin, sel);
  659. X}
  660. X
  661. X/* WinCallFocus - call a client's focus functions for the frame tree.
  662. X *   Passes along focus, which is True iff the client is gaining focus
  663. X */
  664. Xvoid
  665. XWinCallFocus(win,focus)
  666. XWinGeneric *win;
  667. XBool focus;
  668. X{
  669. X    if (win == NULL)
  670. X        return;
  671. X    win->core.client->isFocus = focus;
  672. X    callFocusTree(win, focus);
  673. X    VirtualChangeFocus(win, focus);
  674. X}
  675. X    
  676. X/* WinCallDestroy - call a client's destroy functions for both the icon and
  677. X *   frame trees
  678. X */
  679. Xvoid
  680. XWinCallDestroy(cli)
  681. XClient *cli;
  682. X{
  683. X    Display *dpy = cli->dpy;
  684. X    WinPaneFrame *framewin = cli->framewin;
  685. X    WinIconFrame *iconwin = cli->iconwin;
  686. X
  687. X    callDestroyTree(dpy, framewin);
  688. X    callDestroyTree(dpy, iconwin);
  689. X}
  690. X
  691. X/* WinCallConfig - initiate a configuration change, starting at some
  692. X *    particular window.
  693. X *    Configuration change works as follows:  a window is the initiator
  694. X *    of the change.  If the children of this window need to be sized,
  695. X *    then they are called to do so; then the window sizes itself and
  696. X *    sets the position of each of its children.  This process is
  697. X *    repeated on the parent of the initiating window, and so on up
  698. X *    to the top window in the hierarchy (presumably a frame).
  699. X *    A second pass then occurs, doing a depth-first preorder 
  700. X *    traversal of the window tree, performing the window's set
  701. X *    configuration function to make the computed change.
  702. X *    In the first pass, any window which changes its configuration 
  703. X *    should return this fact to be propagated back to this routine;
  704. X *    if no window has changed configuration then the second pass
  705. X *    won't be performed.
  706. X *    The initiator window is passed (in some cases) the configure
  707. X *    request event which cause the action to begin.
  708. X */
  709. Xvoid
  710. XWinCallConfig(dpy,win,pxcre)
  711. XDisplay *dpy;
  712. XWinGeneric *win;
  713. XXConfigureRequestEvent *pxcre;
  714. X{
  715. X    Bool fDirty = False;
  716. X    WinGeneric *w;
  717. X    
  718. X    do
  719. X    {
  720. X        fDirty = (WinFunc(win,core.newconfigfunc))(win,pxcre) || fDirty;
  721. X        pxcre = NULL;
  722. X        w = win;
  723. X    }
  724. X    while ((win = win->core.parent) != NULL);
  725. X    if (fDirty)
  726. X    {
  727. X        setTreeConfig(dpy,w);
  728. X    }
  729. X}
  730. X
  731. X/*
  732. X * WinCallDraw
  733. X * Call all child windows' draw functions.
  734. X */
  735. Xvoid
  736. XWinCallDraw(win)
  737. X    WinGeneric *win;
  738. X{
  739. X    callDrawTree(win);
  740. X}
  741. X
  742. X
  743. X/* WinAddChild -- add a child to a parent's list of children
  744. X */
  745. Xvoid
  746. XWinAddChild(parent,child)
  747. XWinGeneric *parent;
  748. XWinGeneric *child;
  749. X{
  750. X    parent->core.children = ListCons(child,parent->core.children);
  751. X    child->core.parent = parent;
  752. X}
  753. X
  754. X/* WinRemoveChild -- remove a child from a parent's list of children
  755. X */
  756. Xvoid
  757. XWinRemoveChild(parent,child)
  758. XWinGeneric *parent;
  759. XWinGeneric *child;
  760. X{
  761. X    List **l;
  762. X
  763. X    for (l = &(parent->core.children); *l != NULL; l = &((*l)->next))
  764. X    {
  765. X        if ((WinGeneric *)((*l)->value) == child)
  766. X        {
  767. X        ListDestroyCell(l);
  768. X        return;
  769. X        }
  770. X    }
  771. X#ifdef DEBUG
  772. X    printf("Warning:  tried to remove child %x from parent %x, but it wasn't there\n",child,parent);
  773. X#endif
  774. X}
  775. X
  776. X/* WinRootPos -- figure the root coordinates of a window's position
  777. X */
  778. Xvoid
  779. XWinRootPos(win,px,py)
  780. XWinGeneric *win;
  781. Xint *px, *py;
  782. X{
  783. X    *px = 0;
  784. X    *py = 0;
  785. X    for ( ; win != NULL; win = win->core.parent)
  786. X    {
  787. X        *px += win->core.x;
  788. X        *py += win->core.y;
  789. X    }
  790. X}
  791. X
  792. X
  793. X/* WinRedrawAllWindows -- call every window's draw function (if provided)
  794. X */
  795. Xvoid
  796. XWinRedrawAllWindows()
  797. X{
  798. X    WIApply(doRedrawOneWindow, NULL);
  799. X}
  800. X
  801. X/* WinShowHelp -- show help for that window if available
  802. X */
  803. XBool
  804. XWinShowHelp(dpy,win,mousex,mousey)
  805. XDisplay        *dpy;
  806. XWinGeneric    *win;
  807. Xint        mousex,mousey;
  808. X{
  809. X    int    screen;
  810. X    char    *buttons[1];
  811. X    char    *msg;
  812. X    NoticeBox noticeBox;
  813. X
  814. X    if (win->core.helpstring) {
  815. X        if (win->core.client)
  816. X            screen = win->core.client->screen;
  817. X        else
  818. X            screen = DefaultScreen(dpy);
  819. X
  820. X        if (!ShowHelpWindow(screen,mousex,mousey,
  821. X                win->core.helpstring)) {
  822. X
  823. X            buttons[0] = gettext("Ok");
  824. X            msg = 
  825. X    gettext("Couldn't write to olwmslave\nNo Help Available for olwm");
  826. X
  827. X            noticeBox.numButtons = NOTICE_BUTTON_COUNT(buttons);
  828. X            noticeBox.defaultButton = 0;
  829. X            noticeBox.buttonText = buttons;
  830. X            noticeBox.msgText = msg;
  831. X            noticeBox.boxX = -1;    /* centered */
  832. X            noticeBox.boxY = -1;
  833. X            (void)UseNoticeBox(dpy,screen,¬iceBox);
  834. X            return False;
  835. X        }
  836. X        return True;
  837. X    }
  838. X    return False;
  839. X}
  840. X
  841. X/***************************************************************************
  842. X* general event/class functions
  843. X***************************************************************************/
  844. X
  845. Xint
  846. XWinDrawFunc(win)
  847. XWinGeneric *win;
  848. X{
  849. X    if ((WinFunc(win,core.drawfunc) != NULL) && (win->core.client != NULL))
  850. X        (WinFunc(win,core.drawfunc))(win->core.client->dpy,win);
  851. X}
  852. X
  853. Xint
  854. XWinEventExpose(dpy, event, win)
  855. XDisplay *dpy;
  856. XXEvent *event;
  857. XWinGeneric *win;
  858. X{
  859. X    if (event->xexpose.count == 0)
  860. X        (WinFunc(win,core.drawfunc))(dpy, win);
  861. X}
  862. X
  863. X
  864. Xint 
  865. XWinNewPosFunc(win,x,y)
  866. XWinGeneric *win;
  867. Xint x,y;
  868. X{
  869. X    if (x != win->core.x)
  870. X    {
  871. X    win->core.x = x;
  872. X    win->core.dirtyconfig |= CWX;
  873. X    }
  874. X
  875. X    if (y != win->core.y)
  876. X    {
  877. X    win->core.y = y;
  878. X    win->core.dirtyconfig |= CWY;
  879. X    }
  880. X
  881. X    return win->core.dirtyconfig;
  882. X}
  883. X
  884. X
  885. Xint
  886. XWinNewConfigFunc(win, pxcre)
  887. XWinGeneric *win;
  888. XXConfigureRequestEvent *pxcre;
  889. X{
  890. X    int neww = WinFunc(win,core.widthfunc)(win, pxcre);
  891. X    int newh = WinFunc(win,core.heightfunc)(win, pxcre);
  892. X
  893. X    if (neww != win->core.width)
  894. X    {
  895. X        win->core.width = neww;
  896. X        win->core.dirtyconfig |= CWWidth;
  897. X    }
  898. X    if (newh != win->core.height)
  899. X    {
  900. X        win->core.height = newh;
  901. X        win->core.dirtyconfig |= CWHeight;
  902. X    }
  903. X    return win->core.dirtyconfig;
  904. X}
  905. X
  906. X
  907. Xint
  908. XWinSetConfigFunc(dpy, win)
  909. XDisplay *dpy;
  910. XWinGeneric *win;
  911. X{
  912. X    XWindowChanges xwc;
  913. X    int    dw = DisplayWidth(win->core.client->dpy,
  914. X                  win->core.client->screen);
  915. X    int    dh = DisplayHeight(win->core.client->dpy,
  916. X                   win->core.client->screen);
  917. X
  918. X    if (win->core.dirtyconfig)
  919. X    {
  920. X        if (win->core.client->sticky) {
  921. X        if (win->core.x + win->core.width < 0) {
  922. X            win->core.x = dw + (win->core.x % dw);
  923. X            win->core.dirtyconfig |= CWX;
  924. X        }
  925. X        else if (win->core.x >= dw) {
  926. X            win->core.x = win->core.x % dw;
  927. X            win->core.dirtyconfig |= CWX;
  928. X        }
  929. X        if (win->core.y + (int) win->core.height < 0) {
  930. X            win->core.y = dh + (win->core.y % dh);
  931. X            win->core.dirtyconfig |= CWY;
  932. X        }
  933. X        else if (win->core.y >= dh) {
  934. X            win->core.y = win->core.y % dh;
  935. X            win->core.dirtyconfig |= CWY;
  936. X        }
  937. X        }
  938. X        xwc.x = win->core.x;
  939. X        xwc.y = win->core.y;
  940. X        xwc.width = win->core.width;
  941. X        xwc.height = win->core.height;
  942. X        /* generic windows never change border or stacking */
  943. X        ConfigureWindow(dpy,win,win->core.dirtyconfig,&xwc);
  944. X    }
  945. X    win->core.dirtyconfig &= ~(CWX|CWY|CWWidth|CWHeight);
  946. X}
  947. X
  948. X
  949. X/*
  950. X * WinAddColorClient
  951. X *
  952. X * Add cli to this win's list of colormap clients.  Assumes that cli isn't 
  953. X * already in the list.
  954. X */
  955. Xvoid
  956. XWinAddColorClient(win, cli)
  957. X    WinGeneric *win;
  958. X    Client *cli;
  959. X{
  960. X    win->core.colormapClients = ListCons(cli, win->core.colormapClients);
  961. X}
  962. X
  963. X
  964. X/*
  965. X * WinRemoveColorClient
  966. X *
  967. X * Remove cli from this win's list of colormap clients.  If there are no more
  968. X * clients, and this window is a WIN_COLORMAP, destroy the window.  Assumes
  969. X * that cli appears in win's list zero or one times.
  970. X */
  971. Xvoid
  972. XWinRemoveColorClient(dpy, win, cli)
  973. X    Display *dpy;
  974. X    WinGeneric *win;
  975. X    Client *cli;
  976. X{
  977. X    List **l;
  978. X
  979. X    l = &win->core.colormapClients;
  980. X    while (*l != NULL) {
  981. X    if ((*l)->value == cli) {
  982. X        ListDestroyCell(l);
  983. X        break;
  984. X    }
  985. X    l = &((*l)->next);
  986. X    }
  987. X    if (win->core.colormapClients == NULL_LIST
  988. X    && win->core.kind == WIN_COLORMAP)
  989. X    (WinFunc(win, core.destroyfunc))(dpy, win);
  990. X}
  991. END_OF_FILE
  992. if test 10853 -ne `wc -c <'win.c'`; then
  993.     echo shar: \"'win.c'\" unpacked with wrong size!
  994. fi
  995. # end of 'win.c'
  996. fi
  997. if test -f 'win.h' -a "${1}" != "-c" ; then 
  998.   echo shar: Will not clobber existing file \"'win.h'\"
  999. else
  1000. echo shar: Extracting \"'win.h'\" \(15691 characters\)
  1001. sed "s/^X//" >'win.h' <<'END_OF_FILE'
  1002. X/*
  1003. X *      (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
  1004. X *      pending in the U.S. and foreign countries. See LEGAL_NOTICE
  1005. X *      file for terms of the license.
  1006. X */
  1007. X
  1008. X#ifndef _OLWM_WIN_H
  1009. X#define _OLWM_WIN_H
  1010. X
  1011. X#ident  "@(#)win.h    1.1 olvwm version 1/3/92"
  1012. X
  1013. X/*
  1014. X * Based on
  1015. X#ident    "@(#)win.h    26.34    91/09/14 SMI"
  1016. X *
  1017. X */
  1018. X
  1019. X#include "list.h"
  1020. X#include "events.h"
  1021. X
  1022. X/* Need this in screen.h */
  1023. Xtypedef enum {
  1024. X    MENU_FULL,     /* Close, Zoom, Props, Scale, Back, Refresh, Quit */
  1025. X    MENU_LIMITED,  /* Dismiss, Scale, Refresh */
  1026. X    MENU_NONE,
  1027. X    MENU_ROOT,       /* used only by usermenu.c */
  1028. X    MENU_VDM,       /* used in virtual.c */
  1029. X    NUM_MENUS
  1030. X} MenuIndex;
  1031. X
  1032. X#include "screen.h"
  1033. X
  1034. X#ifdef SHAPE
  1035. X#include <X11/extensions/shape.h>
  1036. X#endif
  1037. X
  1038. X/***************************************************************************
  1039. X* Client state structures
  1040. X***************************************************************************/
  1041. X
  1042. X/* a type for the four possible focus modes */
  1043. Xtypedef enum { Passive, NoInput, LocallyActive, GloballyActive } FocusMode;
  1044. X
  1045. Xtypedef struct {
  1046. X        long flags;
  1047. X    MenuIndex menu_type;
  1048. X    int def_item;            /* default menu item */
  1049. X        int pushpin_initial_state;
  1050. X    int cancel;            /* 1 means Cancel instead of Dismiss */
  1051. X    /* numbers assigned as per OLXCI 3/20/89 */
  1052. X} WMDecorations;
  1053. X
  1054. X/* pin states numbers, as per OLXCI 3/20/89 */
  1055. X#define PIN_OUT 0
  1056. X#define PIN_IN 1
  1057. X
  1058. X/* value for flags */
  1059. X#define WMDecorationHeader      (1L<<0)
  1060. X#define WMDecorationFooter      (1L<<1)
  1061. X#define WMDecorationPushPin     (1L<<2)
  1062. X#define WMDecorationCloseButton (1L<<3)
  1063. X#define WMDecorationHeaderDeco (WMDecorationPushPin | WMDecorationCloseButton)
  1064. X#define WMDecorationResizeable  (1L<<4)
  1065. X#define WMDecorationIconName    (1L<<5)
  1066. X#define WMDecorationWarpToPin    (1L<<6)
  1067. X#define WMNoDecor        (1L<<7)
  1068. X
  1069. Xtypedef int WMState;    /* use state codes in Xutil.h */
  1070. X
  1071. Xtypedef struct {    /* pointer warp state data */
  1072. X    int        warpToX, warpToY;    /* where to pointer goes on warp */
  1073. X    int        dflButtonX, dflButtonY;    /* location of default button */
  1074. X    int        dflButtonW, dflButtonH;    /* size of default button */
  1075. X    struct _client    *warpBackClient;    /* where to return focus */
  1076. X    int        warpBackX, warpBackY;    /* where to put it back */
  1077. X} WarpInfo;
  1078. X
  1079. X/*
  1080. X *    Semantic window state
  1081. X */
  1082. Xtypedef struct _windowstate {
  1083. X    unsigned long    flags;
  1084. X    unsigned long    state;
  1085. X} OLWindowState;
  1086. X
  1087. X/* value for OLWindowState flags */
  1088. X#define WSSemanticState        (1L<<0)
  1089. X
  1090. X/* value for OLWindowState state */
  1091. X#define WSSemanticCompose    (1L<<0)
  1092. X#define WSSemanticCapsLock    (1L<<1)
  1093. X#define WSSemanticNumLock    (1L<<2)
  1094. X#define WSSemanticScrollLock    (1L<<3)
  1095. X
  1096. X/* client flags */
  1097. X#define CLOlwmOwned        (1L<<0)
  1098. X#define CLMoved            (1L<<1)
  1099. X
  1100. X/***************************************************************************
  1101. X* Client structures
  1102. X***************************************************************************/
  1103. X
  1104. X/* a top-level client window */
  1105. X
  1106. Xtypedef struct _client
  1107. X{
  1108. X    int        flags;
  1109. X    WMDecorations    *wmDecors;
  1110. X    WMState        wmState;
  1111. X    XSizeHints    *normHints;    /* WM_NORMAL_HINTS */
  1112. X    XWMHints    *wmHints;    /* WM_HINTS */
  1113. X    char        *wmInstance;    /* WM_CLASS instance name */
  1114. X    char        *wmClass;    /* WM_CLASS class name */
  1115. X    int         protocols;
  1116. X    FocusMode    focusMode;
  1117. X    Bool        isFocus;
  1118. X    Bool        isSelected;
  1119. X    Bool        isBusy;
  1120. X    Display        *dpy;
  1121. X    int        screen;
  1122. X    struct _winpaneframe *framewin;    
  1123. X    struct _winiconframe *iconwin;
  1124. X    WarpInfo    warpInfo;
  1125. X    Window        groupid;    /* Actually GroupID */
  1126. X    unsigned int    groupmask;    /* role that client is playing in group */
  1127. X    long        busyState;
  1128. X    List        *colormapWins;
  1129. X    struct _screeninfo *scrInfo;
  1130. X    OLWindowState    *windowState;
  1131. X    Window        transientFor;
  1132. X#ifdef SHAPE
  1133. X    Bool        isShaped;
  1134. X#endif
  1135. X/*
  1136. X * Fields for the virtual window manager
  1137. X */
  1138. X    int        sticky;
  1139. X} Client;
  1140. X
  1141. X#define ClientIsPinnable(cli) ((cli)->wmDecors->flags & WMDecorationPushPin)
  1142. X
  1143. X/***************************************************************************
  1144. X* Window class structures
  1145. X***************************************************************************/
  1146. X
  1147. X/* classes of window which we can deal with */
  1148. Xtypedef enum { WIN_FRAME, WIN_ICON, WIN_RESIZE, WIN_PUSHPIN, WIN_WINBUTTON,
  1149. X    WIN_PANE, WIN_ICONPANE, WIN_COLORMAP, WIN_MENU, WIN_PINMENU, 
  1150. X    WIN_NOFOCUS, WIN_ROOT, WIN_BUSY, WIN_VIRTUAL } WinKind;
  1151. X
  1152. Xtypedef int (*EvFunc)();
  1153. Xtypedef int (*IntFunc)();
  1154. Xtypedef struct _genericclasscore {
  1155. X    WinKind kind;
  1156. X    EvFunc xevents[LASTEvent];    /* function for each X event */
  1157. X    EvFunc extEventHdlr;    /* handler for extension events */
  1158. X    EvFunc focusfunc;    /* focus state has changed */
  1159. X    EvFunc drawfunc;    /* draw window */
  1160. X    EvFunc destroyfunc;    /* destroy window and structures */
  1161. X    EvFunc selectfunc;    /* selecte state has changed */
  1162. X    EvFunc newconfigfunc;      /* compute configuration */
  1163. X    EvFunc newposfunc;         /* set position */
  1164. X    EvFunc setconfigfunc;      /* set configuration */
  1165. X    EvFunc createcallback;     /* used in menu creation */
  1166. X    IntFunc heightfunc;    /* compute correct height */
  1167. X    IntFunc widthfunc;    /* compute correct width */
  1168. X} GenericClassCore;
  1169. X
  1170. Xtypedef struct _classgeneric {
  1171. X    GenericClassCore core;
  1172. X} ClassGeneric;
  1173. X
  1174. Xtypedef struct _genericframeclasscore {
  1175. X    IntFunc heighttop, heightbottom, widthleft, widthright;
  1176. X    IntFunc menuPress;
  1177. X    IntFunc adjustPress, adjustClick;
  1178. X    IntFunc selectPress, selectClick, selectDoubleClick, selectDrag;
  1179. X    IntFunc fullrestoreToggle;
  1180. X} GenericFrameClassCore;
  1181. X
  1182. Xtypedef struct _classgenericframe {
  1183. X    GenericClassCore core;
  1184. X    GenericFrameClassCore fcore;
  1185. X} ClassGenericFrame;
  1186. X
  1187. Xtypedef struct _genericpaneclasscore {
  1188. X    EvFunc setsizefunc;
  1189. X} GenericPaneClassCore;
  1190. X
  1191. Xtypedef struct _classpane {
  1192. X    GenericClassCore core;
  1193. X    GenericPaneClassCore pcore;
  1194. X} ClassGenericPane;
  1195. X
  1196. Xtypedef struct _classvirtual {
  1197. X    GenericClassCore core;
  1198. X    GenericPaneClassCore    pcore;
  1199. X} ClassVirtualPane;
  1200. X
  1201. Xtypedef ClassGenericFrame ClassPaneFrame;
  1202. Xtypedef ClassGenericFrame ClassIconFrame;
  1203. Xtypedef ClassGeneric ClassPushPin;
  1204. Xtypedef ClassGenericPane ClassPane;
  1205. Xtypedef ClassGeneric ClassMenu;
  1206. Xtypedef ClassGenericPane ClassPinMenu;
  1207. Xtypedef ClassGeneric ClassResize;
  1208. Xtypedef ClassGeneric ClassButton;
  1209. Xtypedef ClassGeneric ClassBusy;
  1210. Xtypedef ClassGenericPane ClassIconPane;
  1211. Xtypedef ClassGeneric ClassRoot;
  1212. Xtypedef ClassGeneric ClassNoFocus;
  1213. Xtypedef ClassGeneric ClassColormap;
  1214. X
  1215. X/* Core functions:
  1216. X *
  1217. X * destroyfunc - int (*destroyfunc)(Display *dpy, WinGeneric *win)
  1218. X *   Called when the window is being destroyed; should destroy any private
  1219. X *   resources associated with the window (including possibly destroying
  1220. X *   the X window) and destroy the window information structure.
  1221. X *
  1222. X * selectfunc - int (*selectfunc)(Display *dpy, WinGeneric *win, Bool selected)
  1223. X *   Called whenever the window is selected/deselected.  The window should
  1224. X *   update its private state -- most particularly, its screen appearance --
  1225. X *   to match the new state.  This function is only called when the selection
  1226. X *   state has changed.
  1227. X *
  1228. X * focusfunc - int (*focusfunc)(Display *dpy, WinGeneric *win, Bool focus)
  1229. X *   Called whenever the window gains/loses focus.  The window should update
  1230. X *   its private state -- most particularly, its screen appearance --
  1231. X *   to match the new state.  The window does _not_ need to take focus if
  1232. X *   it is active; this has already been taken care of.  This function is
  1233. X *   only called when the focus has changed.
  1234. X *
  1235. X * newconfigfunc - int (*newconfigfunc)(WinGeneric *win, 
  1236. X *            XConfigureRequestEvent *xcre)
  1237. X *   Called when the configuration of a window should be recomputed.  It
  1238. X *   can be assumed that all child windows will have already computed their
  1239. X *   sizes.  This function should compute the size of this window, and call
  1240. X *   the newposfunc of each child that needs to be moved.  If the configuration
  1241. X *   of the window is changed by this function, the dirtyconfig flag should be
  1242. X *   set.  The xcre parameter will be be set to a configure request event
  1243. X *   structure only if a configure request was received for this
  1244. X *   particular window; otherwise the parameter will be null.
  1245. X *   Returns True if any dirtyconfig flag has been set.
  1246. X *
  1247. X * newposfunc - int (*newposfunc)(WinGeneric *win, int x, y)
  1248. X *   Instructs a child window to move to a position (x,y).  If this position
  1249. X *   is different from the old position, then the dirtyconfig flag
  1250. X *   should be set.  Returns True if any dirtyconfig flag has been set.
  1251. X *
  1252. X * setconfigfunc - int (*setconfigfunc)(Display *dpy, WinGeneric *win)
  1253. X *   The window's configuration may have changed; if so, call XConfigureWindow
  1254. X *   to make the changes.  Clear the dirtyconfig bits in the process.
  1255. X *   The pane window will need to send a synthetic configure notify for
  1256. X *   any configuration call.
  1257. X *
  1258. X * createcallback - int (*createcallback)(WinGeneric *self, Client *cli, 
  1259. X *            WinGeneric *parent)
  1260. X *   For internally-created panes, the client and parent are filled out
  1261. X *   when the StateNew process would normally create a pane.
  1262. X *
  1263. X * heightfunc - int (*heightfunc)(WinGeneric *self, XConfigureRequestEvent *pxcre)
  1264. X *   should return the window's correct height, given a configure request
  1265. X *   event and the current environment.  Used to see if a window needs to 
  1266. X *   be resized.
  1267. X * 
  1268. X * widthfunc - same as heightfunc, except that it returns correct width
  1269. X */
  1270. X
  1271. X/***************************************************************************
  1272. X* Window instance structures
  1273. X***************************************************************************/
  1274. X
  1275. X/*
  1276. X * The wincore structure contains common information about each window.
  1277. X *
  1278. X * stack_mode, stack_sib, and dirtyconfig contain information pending window 
  1279. X * configuration changes that have not yet been sent to the server.
  1280. X *
  1281. X * exposures is a list of exposed rectangles that have not yet been repainted.
  1282. X *
  1283. X * colormapClients is a list of clients that have this window in their 
  1284. X * colormapWins list.  tag is used only while processing changes to a client's 
  1285. X * colormapWins list.
  1286. X */
  1287. Xtypedef struct _wincore {
  1288. X    Window            self;
  1289. X    WinKind            kind;
  1290. X    struct _wingeneric     *parent;
  1291. X    List            *children;
  1292. X    Client            *client;
  1293. X    int            x, y;
  1294. X    unsigned int        width, height;
  1295. X    int            stack_mode;
  1296. X    Window            stack_sib;
  1297. X    unsigned int        dirtyconfig;
  1298. X    Colormap        colormap;
  1299. X    List            *exposures;
  1300. X    List            *colormapClients;
  1301. X    Bool            tag;
  1302. X    char            *helpstring;
  1303. X/*
  1304. X * For the virtual window manager
  1305. X */
  1306. X    Window            virtual;
  1307. X} WinCore;
  1308. X/* REMIND maybe add: cursor */
  1309. X
  1310. X/* macros associated with a window core */
  1311. X#define WinIsKind(w,k)     ((w)->core.kind == (k))
  1312. X#define WinClass(w)     ((w)->class)
  1313. X#define WinFunc(w,f)     ((w)->class->f)
  1314. X#define    WinScreen(w)    ((w)->core.client->screen);
  1315. X#define WinRootID(w)    ((w)->core.client->scrInfo->rootid)
  1316. X#define WinDepth(w)    ((w)->core.client->scrInfo->depth)
  1317. X#define WinVisual(w)    ((w)->core.client->scrInfo->visual)
  1318. X#define WinGI(w,idx)    ((w)->core.client->scrInfo->gi[(idx)])
  1319. X#define WinGC(w,idx)    ((w)->core.client->scrInfo->gc[(idx)])
  1320. X#define Win3D(w)    ((w)->core.client->scrInfo->use3D)
  1321. X
  1322. X/*
  1323. X * These macros access the fields of the ColorMapFocus struct inside
  1324. X * the ScreenInfo struct of a Client.
  1325. X */
  1326. X#define ColorFocusWindow(win) ((win)->core.client->scrInfo->cmapfocus.window)
  1327. X#define ColorFocusClient(win) ((win)->core.client->scrInfo->cmapfocus.client)
  1328. X#define    ColorFocusLocked(win) ((win)->core.client->scrInfo->cmapfocus.locked)
  1329. X
  1330. X
  1331. X/* FrameCore defines fields common to all types of frame */
  1332. Xtypedef struct _winframecore {
  1333. X    struct _wingenericpane *panewin;/* pane inside frame */
  1334. X    char     *name;            /* name to be displayed on frame */
  1335. X    Bool    fullsize;        /* if frame is full size */
  1336. X} WinFrameCore;
  1337. X
  1338. X/* PaneCore defines fields common to all types of panes */
  1339. Xtypedef struct _winpanecore {
  1340. X    int        oldBorderWidth;
  1341. X    int        oldSaveUnder;
  1342. X    int        pendingUnmaps;
  1343. X} WinPaneCore;
  1344. X
  1345. X/* Specific window types */
  1346. X
  1347. Xtypedef struct _wingeneric {
  1348. X    ClassGeneric    *class;
  1349. X    WinCore        core;
  1350. X} WinGeneric;
  1351. X
  1352. Xtypedef struct _winroot {
  1353. X    ClassGeneric    *class;
  1354. X    WinCore        core;
  1355. X    SemanticAction    currentAction;
  1356. X    XEvent        buttonPressEvent;
  1357. X} WinRoot;
  1358. X
  1359. Xtypedef struct _wingenericframe {
  1360. X    ClassGenericFrame *class;
  1361. X    WinCore     core;
  1362. X    WinFrameCore    fcore;
  1363. X} WinGenericFrame;
  1364. X
  1365. X/* macros for generic frames */
  1366. X#define FrameHeightTop(w) (WinFunc((w),fcore.heighttop))((w))
  1367. X#define FrameHeightBottom(w) (WinFunc((w),fcore.heightbottom))((w))
  1368. X#define FrameWidthLeft(w) (WinFunc((w),fcore.widthleft))((w))
  1369. X#define FrameWidthRight(w) (WinFunc((w),fcore.widthright))((w))
  1370. X
  1371. X
  1372. Xtypedef struct _wingenericpane {
  1373. X    ClassGenericPane *class;
  1374. X    WinCore core;
  1375. X    WinPaneCore pcore;
  1376. X} WinGenericPane;
  1377. X
  1378. Xtypedef struct {
  1379. X    char            *string;
  1380. X    int            length,width;
  1381. X} Footer;
  1382. X
  1383. Xtypedef struct _winpaneframe {
  1384. X    ClassPaneFrame         *class;
  1385. X    WinCore            core;
  1386. X    WinFrameCore        fcore;
  1387. X
  1388. X    /* resize corners */
  1389. X    struct _winresize    *resizeCorner[4];
  1390. X
  1391. X    /* footers */
  1392. X    Footer            leftFooter;
  1393. X    Footer            rightFooter;
  1394. X
  1395. X    /* title fields */
  1396. X    int            titleOff;    /* x offset of title area in pix */
  1397. X    int            nameLength;    /* length of name in chars */
  1398. X    int            nameWidth;    /* width of name in pix */
  1399. X    int            titlex, titley;    /* title position */
  1400. X
  1401. X    /* pointer warp status */
  1402. X    Bool            pointerIsWarped;
  1403. X
  1404. X    /* sizing functions */
  1405. X    void     (*normfullsizefunc)();    /* normal/full size function */
  1406. X    Bool     restoreSet;        /* True => restore values valid */
  1407. X    int    restoreX, restoreY, 
  1408. X        restoreWidth, restoreHeight;
  1409. X                    /* context for full/norm size 
  1410. X                     * note that x/y is frame; w/h are pane
  1411. X                     */
  1412. X
  1413. X    /* other decorations */
  1414. X    WinGeneric *winDeco;    /* window button or pushpin */
  1415. X    struct _winbusy *winBusy; /* special window when busy */
  1416. X} WinPaneFrame;
  1417. X
  1418. Xtypedef struct _winiconframe {
  1419. X    ClassIconFrame *class;
  1420. X    WinCore        core;
  1421. X    WinFrameCore    fcore;
  1422. X    struct _iconSlot *iconslot;
  1423. X    Bool        fManuallyPositioned;
  1424. X    int        nameX, nameY;        /* name of icon */
  1425. X    int        nameWidth;
  1426. X    int        nameLength;
  1427. X} WinIconFrame;
  1428. X
  1429. Xtypedef struct _winiconpane {
  1430. X    ClassIconPane     *class;
  1431. X    WinCore     core;
  1432. X    WinPaneCore     pcore;
  1433. X    Bool        iconClientWindow;    /* true iff client owns pane */
  1434. X    Pixmap        iconPixmap;        /* None if icon has client window */
  1435. X    Pixmap        iconMask;
  1436. X} WinIconPane;
  1437. X
  1438. X/* icon border sizes, in pixels */
  1439. X#define ICON_HORZBORDER 3
  1440. X#define ICON_VERTBORDER 3
  1441. X
  1442. Xtypedef struct _winpushpin {
  1443. X    ClassPushPin *class;
  1444. X    WinCore        core;
  1445. X    Bool        pushpinin;
  1446. X} WinPushPin;
  1447. X
  1448. Xtypedef struct _winpane {
  1449. X    ClassPane *class;
  1450. X    WinCore     core;
  1451. X    WinPaneCore    pcore;
  1452. X} WinPane;
  1453. X
  1454. Xtypedef struct _winmenu {
  1455. X    ClassMenu    *class;
  1456. X    WinCore        core;
  1457. X    struct _menuInfo *menuInfo;
  1458. X    Bool        ignoreNextExpose;
  1459. X} WinMenu;
  1460. X
  1461. Xtypedef struct _winpinmenu {    /* pinned menus are a subclass of panes */
  1462. X    ClassPinMenu     *class;
  1463. X    WinCore        core;
  1464. X    WinPaneCore    pcore;
  1465. X    struct _menuInfo *menuInfo;
  1466. X} WinPinMenu;
  1467. X
  1468. Xtypedef struct _winvirtual {
  1469. X    ClassVirtualPane   *class;
  1470. X    WinCore            core;
  1471. X} WinVirtual;
  1472. X
  1473. Xtypedef enum {upleft, upright, lowleft, lowright, keyevent} WhichResize;
  1474. X
  1475. Xtypedef struct _winresize {
  1476. X    ClassResize *class;
  1477. X    WinCore        core;
  1478. X    WhichResize    which;
  1479. X    Bool        depressed;
  1480. X} WinResize;
  1481. X
  1482. Xtypedef struct _winbutton {
  1483. X    ClassButton *class;
  1484. X    WinCore        core;
  1485. X} WinButton;
  1486. X
  1487. Xtypedef struct _winbusy {
  1488. X    ClassBusy *class;
  1489. X    WinCore core;
  1490. X    Bool isFocus;
  1491. X} WinBusy;
  1492. X
  1493. Xtypedef WinGeneric WinNoFocus;
  1494. X
  1495. X/* colormap windows aren't linked into the ordinary window tree since they
  1496. X * are presumed under client control.  We create info structures for them 
  1497. X * only so appropriate events can be dispatched on them.  Colormap windows
  1498. X * are in a list on the client structure.
  1499. X */
  1500. Xtypedef WinGeneric WinColormap;
  1501. X
  1502. X/* functions mapping windows to infos */
  1503. X
  1504. Xextern void WIInstallInfo();
  1505. Xextern Bool WIUninstallInfo();
  1506. Xextern WinGeneric *WIGetInfo();
  1507. Xextern WinGeneric *VGetInfo();
  1508. Xextern void WIApply();
  1509. X
  1510. X/* window functions */
  1511. Xextern void WinAddChild();
  1512. Xextern void WinRemoveChild();
  1513. X
  1514. X/* Useful client macros */
  1515. X#define PANEOFCLIENT(cli) ((cli)->framewin->fcore.panewin)
  1516. X#define PANEWINOFCLIENT(cli) (PANEOFCLIENT(cli)->core.self)
  1517. X
  1518. X/* globals */
  1519. X#ifdef SHAPE
  1520. Xextern Bool ShapeSupported;
  1521. Xextern int  ShapeEventBase;
  1522. Xextern int  ShapeErrorBase;
  1523. X#endif
  1524. X
  1525. X#endif /* _OLWM_WIN_H */
  1526. END_OF_FILE
  1527. if test 15691 -ne `wc -c <'win.h'`; then
  1528.     echo shar: \"'win.h'\" unpacked with wrong size!
  1529. fi
  1530. # end of 'win.h'
  1531. fi
  1532. if test -f 'winbutton.c' -a "${1}" != "-c" ; then 
  1533.   echo shar: Will not clobber existing file \"'winbutton.c'\"
  1534. else
  1535. echo shar: Extracting \"'winbutton.c'\" \(10312 characters\)
  1536. sed "s/^X//" >'winbutton.c' <<'END_OF_FILE'
  1537. X/*
  1538. X *      (c) Copyright 1989, 1990 Sun Microsystems, Inc. Sun design patents
  1539. X *      pending in the U.S. and foreign countries. See LEGAL_NOTICE
  1540. X *      file for terms of the license.
  1541. X */
  1542. X
  1543. X#ident    "@(#)winbutton.c    1.1 olvwm version 1/3/92"
  1544. X
  1545. X/*
  1546. X * Based on
  1547. X#ident    "@(#)winbutton.c    26.22    91/09/14 SMI"
  1548. X *
  1549. X */
  1550. X
  1551. X#include <errno.h>
  1552. X#include <stdio.h>
  1553. X#include <X11/Xos.h>
  1554. X#include <X11/Xlib.h>
  1555. X#include <X11/Xutil.h>
  1556. X#include <X11/Xatom.h>
  1557. X#include <olgx/olgx.h>
  1558. X
  1559. X#include "i18n.h"
  1560. X#include "ollocale.h"
  1561. X#include "mem.h"
  1562. X#include "olwm.h"
  1563. X#include "win.h"
  1564. X#include "globals.h"
  1565. X#include "menu.h"
  1566. X#include "events.h"
  1567. X
  1568. Xextern void FrameAllowEvents();
  1569. Xextern Bool DoDefaultMenuAction();
  1570. X
  1571. X/***************************************************************************
  1572. X* private data
  1573. X***************************************************************************/
  1574. X
  1575. X#define in_windowmark(win,x,y) \
  1576. X    ( (x) >= 0 && (y) >= 0 && \
  1577. X      (x) <= Abbrev_MenuButton_Width(WinGI((win),NORMAL_GINFO)) && \
  1578. X      (y) <= Abbrev_MenuButton_Height(WinGI((win),NORMAL_GINFO)) \
  1579. X    )
  1580. Xstatic Bool buttonActive = False;
  1581. Xstatic ClassButton classButton;
  1582. Xstatic SemanticAction currentAction = ACTION_NONE;
  1583. X
  1584. X/***************************************************************************
  1585. X* private functions
  1586. X***************************************************************************/
  1587. X
  1588. Xstatic int drawButton();
  1589. X
  1590. Xstatic void 
  1591. XdoUnhilite(act, mode, winInfo)
  1592. X    int act;
  1593. X    MenuTrackMode mode;
  1594. X    WinButton *winInfo;
  1595. X{
  1596. X    Graphics_info    *gisNormal = WinGI(winInfo, NORMAL_GINFO);
  1597. X    long flags;
  1598. X
  1599. X    if (act != SYNC_CHANGECLICK)
  1600. X    flags = OLGX_NORMAL | OLGX_ERASE;
  1601. X    else if (mode == MODE_CLICK)
  1602. X    flags = OLGX_BUSY | OLGX_ERASE | OLGX_NORMAL;
  1603. X    else {
  1604. X    /* don't do this; it's unsettling to press it in when you drag again */
  1605. X    return;
  1606. X    }
  1607. X
  1608. X    olgx_draw_abbrev_button(gisNormal, winInfo->core.self, 0, 0, flags);
  1609. X}
  1610. X
  1611. X/* 
  1612. X * eventButtonPress - handle button press events on the close button window.  
  1613. X */
  1614. Xstatic int
  1615. XeventButtonPress(dpy, event, winInfo)
  1616. XDisplay    *dpy;
  1617. XXEvent    *event;
  1618. XWinButton    *winInfo;
  1619. X{
  1620. X    Client *cli = winInfo->core.client;
  1621. X    WinPaneFrame *winFrame = cli->framewin;
  1622. X    SemanticAction a;
  1623. X    Graphics_info    *gis;
  1624. X    
  1625. X    if (cli->isFocus)
  1626. X        gis = WinGI(winInfo, INPUTFOCUS_GINFO);
  1627. X    else gis = WinGI(winInfo,NORMAL_GINFO);
  1628. X
  1629. X    a = ResolveMouseBinding(dpy, event, ModMaskMap[MOD_CONSTRAIN]);
  1630. X
  1631. X        switch (a) {
  1632. X    case ACTION_SELECT:
  1633. X        olgx_draw_abbrev_button(gis, winInfo->core.self, 
  1634. X                    0, 0, OLGX_INVOKED);
  1635. X        /*
  1636. X         * REMIND: bad style.  This is grabbing the pointer after
  1637. X         * the fact.  We should set up a passive grab instead.
  1638. X         */
  1639. X        XGrabPointer(dpy, winInfo->core.self, False,
  1640. X         (ButtonReleaseMask | ButtonPressMask | PointerMotionMask),
  1641. X         GrabModeAsync, GrabModeAsync, None,
  1642. X         GRV.MovePointer, CurrentTime);
  1643. X        buttonActive = True;
  1644. X        currentAction = a;
  1645. X        break;
  1646. X
  1647. X        case ACTION_MENU:
  1648. X        olgx_draw_abbrev_button(gis, winInfo->core.self, 
  1649. X                    0, 0, OLGX_INVOKED);
  1650. X        if (winFrame->core.client->wmDecors->menu_type != MENU_NONE)
  1651. X        ShowStandardMenuSync(winFrame, event, True, doUnhilite, winInfo);
  1652. X        return;
  1653. X
  1654. X    default:
  1655. X        FrameAllowEvents(cli, event->xbutton.time);
  1656. X        return;
  1657. X        }
  1658. X}
  1659. X
  1660. X/* 
  1661. X * eventButtonRelease - handle button release events on the close button window.  
  1662. X */
  1663. Xstatic int
  1664. XeventButtonRelease(dpy, event, winInfo)
  1665. XDisplay    *dpy;
  1666. XXEvent    *event;
  1667. XWinButton    *winInfo;
  1668. X{
  1669. X    Client *cli = winInfo->core.client;
  1670. X    int x,y;
  1671. X
  1672. X    FrameAllowEvents(cli, event->xbutton.time);
  1673. X
  1674. X    if (!AllButtonsUp(event))
  1675. X        return;
  1676. X
  1677. X        XUngrabPointer(dpy, CurrentTime);
  1678. X
  1679. X        x = event->xbutton.x;
  1680. X        y = event->xbutton.y;
  1681. X
  1682. X    if (buttonActive) {
  1683. X        drawButton(dpy, winInfo);
  1684. X        buttonActive = False;
  1685. X    }
  1686. X
  1687. X        if (!in_windowmark(winInfo,x,y) || currentAction != ACTION_SELECT) {
  1688. X        return;
  1689. X        }
  1690. X
  1691. X    if (!DoDefaultMenuAction(winInfo)) {
  1692. X        StateNormIcon(cli);
  1693. X    }
  1694. X
  1695. X    currentAction = ACTION_NONE;
  1696. X}
  1697. X
  1698. X/* 
  1699. X * eventMotionNotify - handle motion notify events on the close button window.  
  1700. X */
  1701. Xstatic int
  1702. XeventMotionNotify(dpy, event, winInfo)
  1703. XDisplay    *dpy;
  1704. XXEvent    *event;
  1705. XWinButton    *winInfo;
  1706. X{
  1707. X    int     x,y;
  1708. X    Client *cli = winInfo->core.client;
  1709. X    Graphics_info    *gis;
  1710. X
  1711. X    if (cli->isFocus)
  1712. X        gis = WinGI(winInfo, INPUTFOCUS_GINFO);
  1713. X    else gis == WinGI(winInfo,NORMAL_GINFO);
  1714. X
  1715. X    if (!event->xmotion.same_screen || currentAction != ACTION_SELECT)
  1716. X        return;
  1717. X
  1718. X        x = event->xmotion.x;
  1719. X        y = event->xmotion.y;
  1720. X        if ( buttonActive && !in_windowmark(winInfo,x,y) ) {
  1721. X        drawButton(dpy, winInfo);
  1722. X            buttonActive = False;
  1723. X        } else if ( !buttonActive && in_windowmark(winInfo,x,y) ) {
  1724. X            olgx_draw_abbrev_button(gis, winInfo->core.self,
  1725. X            0, 0, OLGX_INVOKED);
  1726. X            buttonActive = True;
  1727. X        }
  1728. X}
  1729. X
  1730. X/*
  1731. X * drawButton -- draw the window button
  1732. X */
  1733. X/*ARGSUSED*/
  1734. Xstatic int
  1735. XdrawButton(dpy, winInfo)
  1736. XDisplay    *dpy;
  1737. XWinButton *winInfo;
  1738. X{
  1739. X    Client        *cli = winInfo->core.client;
  1740. X    GC             windowGC = WinGC(winInfo,WINDOW_GC);
  1741. X    XGCValues        gcv;
  1742. X    int            focusLines = (GRV.FocusFollowsMouse ? 1 : 0) ^
  1743. X                     (GRV.InvertFocusHighlighting ? 1 : 0);
  1744. X    Graphics_info    *gis;
  1745. X
  1746. X    if (cli->isFocus)
  1747. X    gis = WinGI(winInfo, INPUTFOCUS_GINFO);
  1748. X    else gis = WinGI(winInfo,NORMAL_GINFO);
  1749. X
  1750. X    /*
  1751. X     * Erase the background first.  Unfortunately, we can't depend on
  1752. X     * OLGX_ERASE to do the right thing, because it (a) erases only in BG1,
  1753. X     * and (b) erases only in 2D mode.  We need to erase a background color
  1754. X     * that depends on the state of the frame.  If we're in click-focus and we
  1755. X     * have the focus, draw in BG2; otherwise, draw in BG1.
  1756. X     */
  1757. X
  1758. X    /* Temporarily set background to BG2 if click-to-type */
  1759. X    if (!focusLines && winInfo->core.client->isFocus && Win3D(winInfo)) {
  1760. X    XGetGCValues(dpy,windowGC,GCBackground,&gcv);
  1761. X    XSetBackground(dpy,windowGC,cli->scrInfo->colorInfo.bg2Color);
  1762. X    }
  1763. X
  1764. X    XFillRectangle(dpy, winInfo->core.self, windowGC, 0, 0,
  1765. X           Abbrev_MenuButton_Width(gis),
  1766. X           Abbrev_MenuButton_Height(gis));
  1767. X
  1768. X    /* Restore background back to BG1 */
  1769. X    if (!focusLines && winInfo->core.client->isFocus && Win3D(winInfo)) {
  1770. X    XSetBackground(dpy,windowGC,gcv.background);
  1771. X    }
  1772. X
  1773. X    olgx_draw_abbrev_button(gis, winInfo->core.self,
  1774. X                0, 0, OLGX_NORMAL | OLGX_ERASE);
  1775. X
  1776. X    /*
  1777. X     * REMIND: hack for working around OLGX deficiency.  OLGX erases the
  1778. X     * "ears" at each corner of the window button to the background color.  
  1779. X     * They should really be filled in with the foreground color.
  1780. X     */
  1781. X    if (!focusLines && winInfo->core.client->isFocus && !Win3D(winInfo)) {
  1782. X    XDrawRectangle(dpy, winInfo->core.self, WinGC(winInfo,FOREGROUND_GC),
  1783. X               0, 0,
  1784. X               Abbrev_MenuButton_Width(gis)-1,
  1785. X               Abbrev_MenuButton_Height(gis)-1);
  1786. X    XDrawPoint(dpy, winInfo->core.self, WinGC(winInfo,FOREGROUND_GC),
  1787. X           Abbrev_MenuButton_Width(gis)-1,
  1788. X           Abbrev_MenuButton_Height(gis)-1);
  1789. X    }
  1790. X
  1791. X}
  1792. X
  1793. X
  1794. X/*
  1795. X * DestroyButton -- destroy the close button window resources and free any allocated
  1796. X *    data.
  1797. X */
  1798. Xstatic int
  1799. XdestroyButton(dpy, winInfo)
  1800. XDisplay    *dpy;
  1801. XWinButton *winInfo;
  1802. X{
  1803. X    /* free our data and throw away window */
  1804. X    DestroyWindow(winInfo);
  1805. X    MemFree(winInfo);
  1806. X}
  1807. X
  1808. X/* 
  1809. X * focusButton - the focus or selection state has changed
  1810. X */
  1811. Xstatic int
  1812. XfocusButton(dpy, winInfo, selected)
  1813. XDisplay *dpy;
  1814. XWinButton *winInfo;
  1815. XBool selected;
  1816. X{
  1817. X        (WinFunc(winInfo,core.drawfunc))(dpy, winInfo);
  1818. X}
  1819. X
  1820. X/*
  1821. X * heightfuncButton - recomputes the height of the close button window
  1822. X */
  1823. Xstatic int 
  1824. XheightfuncButton(win, pxcre)
  1825. XWinButton *win;
  1826. XXConfigureRequestEvent *pxcre;
  1827. X{
  1828. X    return Abbrev_MenuButton_Width(WinGI(win,NORMAL_GINFO));
  1829. X}
  1830. X
  1831. X/*
  1832. X * widthfuncButton - recomputes the width of the close button window
  1833. X */
  1834. Xstatic int 
  1835. XwidthfuncButton(win, pxcre)
  1836. XWinButton *win;
  1837. XXConfigureRequestEvent *pxcre;
  1838. X{
  1839. X    return Abbrev_MenuButton_Height(WinGI(win,NORMAL_GINFO));
  1840. X}
  1841. X
  1842. X
  1843. X/***************************************************************************
  1844. X* global functions
  1845. X***************************************************************************/
  1846. X
  1847. X/*
  1848. X * MakeButton  -- create the close button window. Return a WinGeneric structure.
  1849. X */
  1850. XWinButton *
  1851. XMakeButton(dpy, par, x, y)
  1852. XDisplay    *dpy;
  1853. XWinGeneric *par;
  1854. Xint x,y;
  1855. X{
  1856. X    WinButton *w;
  1857. X    Window win;
  1858. X        unsigned long valuemask;
  1859. X        XSetWindowAttributes attributes;
  1860. X        Graphics_info    *gisNormal = WinGI(par,NORMAL_GINFO);
  1861. X
  1862. X        attributes.event_mask =
  1863. X        ButtonReleaseMask | ButtonPressMask | ExposureMask;
  1864. X    attributes.cursor = GRV.IconPointer;
  1865. X        valuemask = CWEventMask | CWCursor;
  1866. X
  1867. X        win = XCreateWindow(dpy, par->core.self,
  1868. X                        x, y,
  1869. X            Abbrev_MenuButton_Width(gisNormal), 
  1870. X            Abbrev_MenuButton_Height(gisNormal),
  1871. X                        0,
  1872. X                        CopyFromParent,
  1873. X                        CopyFromParent,
  1874. X                        CopyFromParent,
  1875. X                        valuemask,
  1876. X                        &attributes);
  1877. X
  1878. X    /* create the associated structure */
  1879. X    w = MemNew(WinButton);
  1880. X    w->core.self = win;
  1881. X    w->class = &classButton;
  1882. X    w->core.kind = WIN_WINBUTTON;
  1883. X    WinAddChild(par,w);
  1884. X    w->core.children = NULL;
  1885. X    w->core.client = par->core.client;
  1886. X    w->core.x = x;    
  1887. X    w->core.y = y;
  1888. X    w->core.width = Abbrev_MenuButton_Width(gisNormal);
  1889. X    w->core.height = Abbrev_MenuButton_Height(gisNormal);
  1890. X    w->core.dirtyconfig = 0;
  1891. X    w->core.exposures = NULL;
  1892. X    w->core.helpstring = "olwm:CloseButton";
  1893. X
  1894. X    /* register the window */
  1895. X    WIInstallInfo(w);
  1896. X
  1897. X        MapWindow(w);
  1898. X
  1899. X    return w;
  1900. X}
  1901. X
  1902. Xvoid
  1903. XButtonInit(dpy)
  1904. XDisplay *dpy;
  1905. X{
  1906. X        classButton.core.kind = WIN_WINBUTTON;
  1907. X        classButton.core.xevents[ButtonPress] = eventButtonPress;
  1908. X        classButton.core.xevents[ButtonRelease] = eventButtonRelease;
  1909. X        classButton.core.xevents[MotionNotify] = eventMotionNotify;
  1910. X        classButton.core.xevents[Expose] = WinEventExpose;
  1911. X        classButton.core.focusfunc = focusButton;
  1912. X        classButton.core.drawfunc = drawButton;
  1913. X        classButton.core.destroyfunc = destroyButton;
  1914. X        classButton.core.selectfunc = NULL;
  1915. X        classButton.core.newconfigfunc = WinNewConfigFunc;
  1916. X        classButton.core.newposfunc = WinNewPosFunc;
  1917. X        classButton.core.setconfigfunc = WinSetConfigFunc;
  1918. X        classButton.core.createcallback = NULL;
  1919. X        classButton.core.heightfunc = heightfuncButton;
  1920. X        classButton.core.widthfunc = widthfuncButton;
  1921. X}
  1922. X
  1923. END_OF_FILE
  1924. if test 10312 -ne `wc -c <'winbutton.c'`; then
  1925.     echo shar: \"'winbutton.c'\" unpacked with wrong size!
  1926. fi
  1927. # end of 'winbutton.c'
  1928. fi
  1929. echo shar: End of archive 17 \(of 21\).
  1930. cp /dev/null ark17isdone
  1931. MISSING=""
  1932. 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
  1933.     if test ! -f ark${I}isdone ; then
  1934.     MISSING="${MISSING} ${I}"
  1935.     fi
  1936. done
  1937. if test "${MISSING}" = "" ; then
  1938.     echo You have unpacked all 21 archives.
  1939.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1940. else
  1941.     echo You still need to unpack the following archives:
  1942.     echo "        " ${MISSING}
  1943. fi
  1944. ##  End of shell archive.
  1945. exit 0
  1946. --
  1947. Molecular Simulations, Inc.             mail: dcmartin@postgres.berkeley.edu
  1948. 796 N. Pastoria Avenue                  uucp: uwvax!ucbvax!dcmartin
  1949. Sunnyvale, California 94086             at&t: 408/522-9236
  1950.