This is xmWindow.m in view mode; [Download] [Up]
/* Widget set category implementation of Window class
*
* Copyright (C) 1994 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*
* Authors: Scott Francis, Paul Kunz, Tom Pavel,
* Imran Qureshi, and Libing Wang
* Mike Kienenberger (Alaska)
*
* This file is part of an Objective-C class library for X/Motif
*
* xmWindow.m,v 1.36 1995/12/13 22:33:32 fedor Exp
*/
#include "Window.h"
#include "xtResponder.h"
/* Required for implementation: */
#include "Motif.h"
#include "Application.h"
#include "Menu.h"
#ifdef RESIZE_DEBUG
#include <Xm/Xm.h> /* Position, Dimension type declarations */
#endif /* RESIZE_DEBUG */
#include <Xm/MainW.h>
#include <Xm/DialogS.h>
#ifdef HAVE_EDITRES
#include <X11/Xmu/Editres.h>
#endif
#define String X11String
#ifdef MOTIF12 /* MOTIF 1.2 */
#include <Xm/Protocols.h>
#else /* MOTIF 1.1 */
#include <Xm/VendorE.h> /* for XmIsMotifWMRunning() */
#include <X11/Protocols.h> /* for mwm DELETE WINDOW protocol */
#include <Xm/AtomMgr.h> /* for XmInternAtom() */
#endif
#undef String
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <stdlib.h> /* for free() */
#include "Scroller.h"
#include "dpsclient/dpsclient.h" /* for backing types */
#include "dpsclient/xwfriends.h"
#include "appkit/stdmacros.h"
#include "objc/typedstream2.h"
#include <objc/List.h>
char *WindowInstanceName( void )
{
return "Window";
}
/**************** comment out for now, until we use it *******************
static void
_window_will_resize_callback(Widget w, XtPointer client_data,
XmAnyCallbackStruct *cb)
{
XConfigureEvent *config_event = (XConfigureEvent *) cb;
Window *windowid = (Window *) client_data;
NXRect aRect;
if (config_event->type != ConfigureNotify) return;
aRect.size.height = config_event->height;
aRect.size.width = config_event->width;
aRect.origin.x = config_event->x;
aRect.origin.y = config_event->y;
[windowid _resizeWindow:&aRect];
return;
}
***************************************************************************/
static void
_window_will_close_callback(Widget w, XtPointer client_data,
XmAnyCallbackStruct *cb)
{
Window *windowid = (Window *) client_data;
if (nil == [windowid performClose:windowid]) return;
/* else check to see if this is the last window -- if so exit()
* since the application may be "lost" under X-windows otherwise
*/
if (0 == [[NXApp windowList] count]) [NXApp terminate:windowid];
return;
}
@interface View(WidgetSet)
- _flushView;
@end
@implementation Window(WidgetSet)
/* private methods not declared in interface file. */
- _setTitle
{
if ( _shell ) {
XtVaSetValues(_shell,
XtNiconName, title,
XtNtitle, title,
NULL);
}
return self;
}
- _initFrame
{
#ifdef RESIZE_DEBUG
Position x,y;
Dimension w,h;
#endif /* RESIZE_DEBUG */
Widget wid;
Atom WM_DELETE_WINDOW;
_shell = XtAppCreateShell( title, "App",
applicationShellWidgetClass,
[NXApp _X_display], NULL, 0 );
#ifdef HAVE_EDITRES
/* Register the Editres protocol: */
XtAddEventHandler( _shell, (EventMask) 0, True,
_XEditResCheckMessages, NULL);
#endif
/* The frame includes space for the title bar and resize bar, but
since the X window managers takes care of this, we subtract it out
and ignore it */
NX_X(&frame) += 1;
NX_Y(&frame) += 9;
NX_WIDTH(&frame) -= 2;
NX_HEIGHT(&frame) -= (9 + 23);
NX_X(&_contentViewFrameRect) -= 1;
NX_Y(&_contentViewFrameRect) -= 9;
[contentView setFrame:&_contentViewFrameRect];
XtVaSetValues(_shell, XmNallowShellResize, False, NULL);
widgetid = XmCreateMainWindow(_shell, "window1", NULL, 0);
PSaddwindow(widgetid, NX_X(&frame), NX_Y(&frame), NX_WIDTH(&frame),
NX_HEIGHT(&frame), wFlags.backing, &windowNum);
XtManageChild(widgetid);
XtVaSetValues(widgetid, XmNwidth, NX_WIDTH(&frame),
XmNheight, NX_HEIGHT(&frame), NULL);
if (!wFlags.visible)
XtSetMappedWhenManaged((Widget)_shell, NO);
#ifdef RESIZE_DEBUG
XtVaGetValues(widgetid, XmNx, &x, NULL);
XtVaGetValues(widgetid, XmNy, &y, NULL);
XtVaGetValues(widgetid, XmNwidth, &w, NULL);
XtVaGetValues(widgetid, XmNheight, &h, NULL);
fprintf(stderr, "_initContent: widget size was (%d, %d), (%d, %d)\n",
(int)x, (int)y, (int)w, (int)h);
#endif /* RESIZE_DEBUG */
#ifndef ALWAYS_MWM
/* Might not require mwm at all
handle window close button -- currently requires Motif WM */
if (True == XmIsMotifWMRunning(_shell))
#endif /* ALWAYS_MWM */
{
/* first, disable mwm's default action for close buttons */
XtVaSetValues(_shell, XmNdeleteResponse, XmDO_NOTHING, NULL);
/* register WM_DELETE_WINDOW to call _window_will_close_callback */
WM_DELETE_WINDOW = XmInternAtom([NXApp _X_display], "WM_DELETE_WINDOW",
False);
wid = widgetid;
XmAddWMProtocolCallback(XtParent(wid), WM_DELETE_WINDOW,
(XtCallbackProc)_window_will_close_callback, (XtPointer)self);
}
// XtAddEventHandler(_shell, StructureNotifyMask, False,
// _window_will_resize_callback, (XtPointer)self);
[self _setTitle];
return self;
}
- _setWindowAreas
{
#ifdef RESIZE_DEBUG
Position x,y;
Dimension w,h;
#endif /* RESIZE_DEBUG */
if (hasMenu) {
if (!menu ) {
menu = [NXApp mainMenu];
[menu _managedBy:self];
}
} else {
menu = nil;
}
[contentView _managedBy:self];
XmMainWindowSetAreas(widgetid,
[menu _widget], /* Menubar */
NULL, /* Command window */
NULL, /* Horizontal Scroller*/
NULL, /* Vertical */
[contentView _widget]); /* Contents */
#ifdef RESIZE_DEBUG
XtVaGetValues(widgetid, XmNx, &x, NULL);
XtVaGetValues(widgetid, XmNy, &y, NULL);
XtVaGetValues(widgetid, XmNwidth, &w, NULL);
XtVaGetValues(widgetid, XmNheight, &h, NULL);
fprintf(stderr, "_setWindowAreas: widget size was (%d, %d), (%d, %d)\n",
(int)x, (int)y, (int)w, (int)h);
fprintf(stderr,
"_setWindowAreas: contentView size was (%d, %d), (%d, %d)\n",
_contentViewFrameRect.origin.x, _contentViewFrameRect.origin.y,
_contentViewFrameRect.size.width,
_contentViewFrameRect.size.height);
XtVaGetValues([contentView _widget], XmNx, &x, NULL);
XtVaGetValues([contentView _widget], XmNy, &y, NULL);
XtVaGetValues([contentView _widget], XmNwidth, &w, NULL);
XtVaGetValues([contentView _widget], XmNheight, &h, NULL);
fprintf(stderr, "_setWindowAreas: widget size was (%d, %d), (%d, %d)\n",
(int)x, (int)y, (int)w, (int)h);
#endif /* RESIZE_DEBUG */
return self;
}
- _windowExposed:(NXEvent *)theEvent;
{
/* We got an expose event for a buffered window, so we
* try to handle it by copying the backing pixmap to the window.
* Since not all subviews draw to the backing store, only the
* views can handle it. -- Paul and Adam
*/
if (windowNum == 0)
return self;
[contentView _flushView];
return self;
}
/* Public methods */
/*- closeWindow
{
if (_holder) {
XtDestroyWidget([self topLevel]);
printf("%d\n", [self topLevel]);
}
} */
- _realize
{
#ifdef RESIZE_DEBUG
Position x,y;
Dimension w,h;
#endif /* RESIZE_DEBUG */
XWContext context;
if (XtIsRealized((Widget)_shell))
return self;
if ( !wFlags.visible)
return self;
if (_shell) {
XtRealizeWidget( (Widget)_shell);
}
// Change various window attributes
context = (XWContext)[NXApp context];
if (context->map && context->map->colormap) {
XSetWindowColormap(context->display,
XtWindow((Widget)_shell),
context->map->colormap);
}
/* FIXME: why don't exposure events get generated? The man pages suggest
event handles need to be added after the widget is realized, but it
still doesn't seem to work here.
*/
[contentView display];
hasRealized = YES;
#ifdef RESIZE_DEBUG
XtVaGetValues(widgetid, XmNx, &x, NULL);
XtVaGetValues(widgetid, XmNy, &y, NULL);
XtVaGetValues(widgetid, XmNwidth, &w, NULL);
XtVaGetValues(widgetid, XmNheight, &h, NULL);
fprintf(stderr, "_realize: widget size was (%d, %d), (%d, %d)\n",
(int)x, (int)y, (int)w, (int)h);
fprintf(stderr,
"_realize: contentView size was (%d, %d), (%d, %d)\n",
_contentViewFrameRect.origin.x, _contentViewFrameRect.origin.y,
_contentViewFrameRect.size.width,
_contentViewFrameRect.size.height);
XtVaGetValues([contentView _widget], XmNx, &x, NULL);
XtVaGetValues([contentView _widget], XmNy, &y, NULL);
XtVaGetValues([contentView _widget], XmNwidth, &w, NULL);
XtVaGetValues([contentView _widget], XmNheight, &h, NULL);
fprintf(stderr, "_realize: widget size was (%d, %d), (%d, %d)\n",
(int)x, (int)y, (int)w, (int)h);
#endif /* RESIZE_DEBUG */
return self;
}
- (BOOL) _hasRealized
{
return hasRealized;
}
- _unrealize
{
if ( wFlags.visible)
return self;
if (_shell) {
if (nil != contentView) [contentView free];
XtUnrealizeWidget( (Widget)_shell );
_shell = 0;
}
hasRealized = NO;
return self;
}
- _orderOut
{
if (_shell) XtUnmapWidget( (Widget)_shell);
return self;
}
- _orderFront
{
if (_shell) XtMapWidget( (Widget)_shell);
return self;
}
- (void *)_widget
{
return widgetid;
}
- (void *)_shell
{
return _shell;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.