This is PXKWindow.m in view mode; [Download] [Up]
/*
PXKWindow.m
NSWindow for GNUstep GUI X/DPS Backend.
Copyright (C) 1996 Free Software Foundation, Inc.
Author: Pascal Forget <pascal@wsc.com>
Date: February 1996
This file is part of the GNUstep GUI X/DPS Backend.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
If you are interested in a warranty or support for this source code,
contact Scott Christley <scottc@net-community.com> for more information.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gnustep/xdps/PXKWindow.h>
#include <gnustep/xdps/PXKView.h>
//
// Backend structure for PXKWindow
//
typedef struct _PXKWindow_struct
{
Window xWindow;
} PXKWindow_struct;
#define XWINDOW (((PXKWindow_struct *)be_wind_reserved)->xWindow)
@implementation PXKWindow
- (void)close;
{
if (window_num > -1 ) {
#if 0
if ((delegate == nil) ||
(((BOOL)[delegate respondsToSelector:
@selector(windowWillClose:)]) &&
((BOOL)[(id)delegate windowWillClose:self])))
{
closeWindow(window_num);
}
#else
closeWindow(window_num);
#endif
}
visible = NO;
}
- (id)initWithContentRect:(NSRect)contentRect
styleMask:(unsigned int)aStyle
backing:(NSBackingStoreType)bufferingType
defer:(BOOL)flag
screen:aScreen;
{
// Allocate the back-end structure
be_wind_reserved = malloc(sizeof(PXKWindow_struct));
XWINDOW = 0;
[super initWithContentRect:contentRect styleMask:aStyle
backing:bufferingType defer:flag screen:aScreen];
NSLog(@"PXKWindow default initializer\n");
XWINDOW = createXWindow(contentRect);
frame_view = [[NSView alloc] initWithFrame:contentRect];
[frame_view addSubview:content_view];
#ifdef TRANSPARENCY
[content_view setOpaque:YES];
#endif
[frame_view viewWillMoveToWindow:self];
NSLog(@"PXKWindow end of default initializer\n");
return self;
}
- (void)dealloc;
{
// Destroy the X Window
if (XWINDOW)
{
XDestroyWindow(pxkDisplay, XWINDOW);
XWINDOW = 0;
}
// Release the back-end structure
free(be_wind_reserved);
[super dealloc];
}
- (void)setTitle:(NSString *)aString
{
XTextProperty windowName;
char *newTitle;
[super setTitle: aString];
if ((window_title) && (XWINDOW))
{
newTitle = (char *)malloc([window_title length] + 1);
strcpy(newTitle, [window_title cString]);
XStringListToTextProperty(&newTitle, 1, &windowName);
XSetWMName(pxkDisplay, XWINDOW, &windowName);
XSetWMIconName(pxkDisplay, XWINDOW, &windowName);
free(newTitle);
}
}
- (void)display;
{
#if 0
pxkDebugMsg("displayXWindow");
#endif
XFlush(pxkDisplay);
XMapWindow(pxkDisplay, XWINDOW);
#if 0
XClearWindow(pxkDisplay, XWINDOW);
#endif
XMapSubwindows(pxkDisplay, XWINDOW); /* I'm not sure that's necessary */
XFlush(pxkDisplay);
XMapWindow(pxkDisplay, XWINDOW);
#if 0
XClearWindow(pxkDisplay, XWINDOW);
#endif
XMapSubwindows(pxkDisplay, XWINDOW); /* I'm not sure that's necessary */
XFlush(pxkDisplay);
visible = YES;
}
- (void)mouseDown:(NSEvent *)theEvent;
{
NSView *hit = [content_view hitTest:[theEvent locationInWindow]];
if (hit == nil) {
[self noResponderFor:@selector(mouseDown:)];
return;
} else {
if (([self isKeyWindow] == YES) ||
([hit acceptsFirstMouse:theEvent] == YES))
{
[hit mouseDown:theEvent];
}
}
}
- (void)rightMouseDown:(NSEvent *)theEvent;
{
NSView *hit = [content_view hitTest:[theEvent locationInWindow]];
if (hit == nil) {
[self noResponderFor:@selector(rightMouseDown:)];
return;
} else {
if (([self isKeyWindow] == YES) ||
([hit acceptsFirstMouse:theEvent] == YES))
{
[hit rightMouseDown:theEvent];
}
}
}
- (void)setContentSize:(NSSize)aSize;
{
#if 0
_contentRect.size = aSize;
if (content_view == nil) {
content_view = [[NSView alloc] initWithFrame:_contentRect];
}
[content_view setFrameSize:aSize];
#endif
}
- (void)setFrame:(NSRect)frameRect display:(BOOL)flag;
{
NSSize aSize;
frame = frameRect;
setWindowFrame(window_num, frame);
aSize = frameRect.size;
aSize.height -= 21.0; /* Title bar is always there in this release */
[self setContentSize:aSize];
if (flag == YES) {
[self display];
}
}
- (void)setFrameOrigin:(NSPoint)aPoint;
{
frame.origin = aPoint;
setWindowFrameOrigin(window_num, aPoint);
}
- (void)setFrameTopLeftPoint:(NSPoint)aPoint;
{
frame.origin.x = aPoint.x;
frame.origin.y = aPoint.y - frame.size.height;
setWindowFrameOrigin(window_num, aPoint);
}
- (void)sendEvent:(NSEvent *)theEvent
{
NSLog(@"PXKWindow -sendEvent:\n");
NSLog(@"Window frame %f %f %f %f\n", frame.origin.x, frame.origin.y,
frame.size.width, frame.size.height);
[super sendEvent: theEvent];
}
//
// GNUstep backend methods
//
- (void)captureMouse:sender
{
int ret = XGrabPointer(pxkDisplay, [self xWindow], True,
PointerMotionMask,
GrabModeAsync, GrabModeAsync,
None, None, CurrentTime);
if (ret != GrabSuccess)
NSLog(@"Failed to grab pointer\n");
else
NSLog(@"Grabbed pointer\n");
}
- (void)releaseMouse:sender
{
XUngrabPointer(pxkDisplay, CurrentTime);
}
@end
//
// Methods for XWindows implementation
//
@implementation PXKWindow (GNUstepXDPS)
- (Window)xWindow
{
return XWINDOW;
}
- (void)setFrameFromXFrame:(NSRect)rect
{
NSRect bounds;
frame = rect;
// Determine the size of our content rect
bounds.origin = NSZeroPoint;
bounds.size = frame.size;
// Inform our content view
[content_view setFrame:bounds];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.