Parent document is top of "Motif FAQ (Part 3 of 9)"
Previous document is "68) Is there an ICCCM compliant way of setting window manager"
Next document is "70) How can I turn off the Motif window manager functions from the"
69) How can I put decorations on transient windows using olwm?
Answer: This code is from Jean-Philippe Martin-Flatin <syj@ecmwf.int>:
/**********************************************************************
** WindowDecorations.c
**
** Manages window decorations under the OpenLook window manager (OLWM).
**
** Adapted from a C++ program posted to comp.windows.x.motif by:
**
** +--------------------------------------------------------------+
** | Ron Edmark User Interface Group |
** | Tel: (408) 980-1500 x282 Integrated Systems, Inc. |
** | Internet: edmark@isi.com 3260 Jay St. |
** | Voice mail: (408) 980-1590 x282 Santa Clara, CA 95054 |
** +--------------------------------------------------------------+
***********************************************************************/
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Protocols.h>
#include <Xm/Xm.h>
#include <Xm/AtomMgr.h>
/*
** Decorations for OpenLook:
** The caller can OR different mask options to change the frame decoration.
*/
#define OLWM_Header (long)(1<<0)
#define OLWM_Resize (long)(1<<1)
#define OLWM_Close (long)(1<<2)
/*
** Prototypes
*/
static void InstallOLWMAtoms (Widget w);
static void AddOLWMDialogFrame(Widget widget, long decorationMask);
/*
** Global variables
*/
static Atom AtomWinAttr;
static Atom AtomWTOther;
static Atom AtomDecor;
static Atom AtomResize;
static Atom AtomHeader;
static Atom AtomClose;
static int not_installed_yet = TRUE;
static void InstallOLWMAtoms(Widget w)
{
AtomWinAttr = XInternAtom(XtDisplay(w), "_OL_WIN_ATTR" , FALSE);
AtomWTOther = XInternAtom(XtDisplay(w), "_OL_WT_OTHER", FALSE);
AtomDecor = XInternAtom(XtDisplay(w), "_OL_DECOR_ADD", FALSE);
AtomResize = XInternAtom(XtDisplay(w), "_OL_DECOR_RESIZE", FALSE);
AtomHeader = XInternAtom(XtDisplay(w), "_OL_DECOR_HEADER", FALSE);
AtomClose = XInternAtom(XtDisplay(w), "_OL_DECOR_CLOSE", FALSE);
not_installed_yet = FALSE;
}
static void AddOLWMDialogFrame(Widget widget, long decorationMask)
{
Atom winAttrs[2];
Atom winDecor[3];
Widget shell = widget;
Window win;
int numberOfDecorations = 0;
/*
** Make sure atoms for OpenLook are installed only once
*/
if (not_installed_yet) InstallOLWMAtoms(widget);
while (!XtIsShell(shell)) shell = XtParent(shell);
win = XtWindow(shell);
/*
** Tell Open Look that our window is not one of the standard OLWM window
** types. See OLIT Widget Set Programmer's Guide pp.70-73.
*/
winAttrs[0] = AtomWTOther;
XChangeProperty(XtDisplay(shell),
win,
AtomWinAttr,
XA_ATOM,
32,
PropModeReplace,
(unsigned char*)winAttrs,
1);
/*
** Tell Open Look to add some decorations to our window
*/
numberOfDecorations = 0;
if (decorationMask & OLWM_Header)
winDecor[numberOfDecorations++] = AtomHeader;
if (decorationMask & OLWM_Resize)
winDecor[numberOfDecorations++] = AtomResize;
if (decorationMask & OLWM_Close)
{
winDecor[numberOfDecorations++] = AtomClose;
/*
** If the close button is specified, the header must be
** specified. If the header bit is not set, set it.
*/
if (!(decorationMask & OLWM_Header))
winDecor[numberOfDecorations++] = AtomHeader;
}
XChangeProperty(XtDisplay(shell),
win,
AtomDecor,
XA_ATOM,
32,
PropModeReplace,
(unsigned char*)winDecor,
numberOfDecorations);
}
/*
** Example of use of AddOLWMDialogFrame, with a bit of extra stuff
*/
void register_dialog_to_WM(Widget shell, XtCallbackProc Cbk_func)
{
Atom atom;
/*
** Alias the "Close" item in system menu attached to dialog shell
** to the activate callback of "Exit" in the menubar
*/
if (Cbk_func)
{
atom = XmInternAtom(XtDisplay(shell),"WM_DELETE_WINDOW",TRUE);
XmAddWMProtocolCallback(shell,atom, Cbk_func,NULL);
}
/*
** If Motif is the window manager, skip OpenLook specific stuff
*/
if (XmIsMotifWMRunning(shell)) return;
/*
** Register dialog shell to OpenLook.
**
** WARNING: on some systems, adding the "Close" button allows the title
** to be properly centered in the title bar. On others, activating
** "Close" crashes OpenLook. The reason is not clear yet, but it seems
** the first case occurs with OpenWindows 2 while the second occurs with
** Openwindows 3. Thus, comment out one of the two following lines as
** suitable for your site, and send e-mail to syj@ecmwf.int if you
** find out what is going on !
*/
AddOLWMDialogFrame(shell,(OLWM_Header | OLWM_Resize));
/* AddOLWMDialogFrame(shell,(OLWM_Header | OLWM_Resize | OLWM_Close)); */
}
Parent document is top of "Motif FAQ (Part 3 of 9)"
Previous document is "68) Is there an ICCCM compliant way of setting window manager"
Next document is "70) How can I turn off the Motif window manager functions from the"