mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-05-31 22:10:47 +00:00
New stuff for moving and sizing windows.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@4517 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
091a243983
commit
a79eeb8a2d
4 changed files with 176 additions and 17 deletions
|
@ -139,6 +139,11 @@ NSGraphicsContext *GSCurrentContext();
|
||||||
- (BOOL) _removeDragTypes: (NSArray*)types fromWindow: (int)winNum;
|
- (BOOL) _removeDragTypes: (NSArray*)types fromWindow: (int)winNum;
|
||||||
- (NSCountedSet*) _dragTypesForWindow: (int)winNum;
|
- (NSCountedSet*) _dragTypesForWindow: (int)winNum;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Misc window management support.
|
||||||
|
*/
|
||||||
|
- (BOOL) _setFrame: (NSRect)frameRect forWindow: (int)winNum;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,7 @@ extern NSSize NSTokenSize;
|
||||||
NSSize minimum_size;
|
NSSize minimum_size;
|
||||||
NSSize maximum_size;
|
NSSize maximum_size;
|
||||||
NSSize increments;
|
NSSize increments;
|
||||||
|
NSString *autosave_name;
|
||||||
id content_view;
|
id content_view;
|
||||||
id first_responder;
|
id first_responder;
|
||||||
id original_responder;
|
id original_responder;
|
||||||
|
@ -458,6 +459,7 @@ extern NSSize NSTokenSize;
|
||||||
+ (NSWindow*) _windowWithTag: (int)windowNumber;
|
+ (NSWindow*) _windowWithTag: (int)windowNumber;
|
||||||
|
|
||||||
- (void) setWindowNumber: (int)windowNum;
|
- (void) setWindowNumber: (int)windowNum;
|
||||||
|
- (void) _setFrame: (NSRect)newFrame;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mouse capture/release
|
* Mouse capture/release
|
||||||
|
|
|
@ -252,7 +252,7 @@ NSGraphicsContext *GSCurrentContext()
|
||||||
*/
|
*/
|
||||||
- (BOOL) _addDragTypes: (NSArray*)types toWindow: (int)winNum
|
- (BOOL) _addDragTypes: (NSArray*)types toWindow: (int)winNum
|
||||||
{
|
{
|
||||||
NSCountedSet *old = (NSCountedSet*)NSMapGet(drag_types, winNum);
|
NSCountedSet *old = (NSCountedSet*)NSMapGet(drag_types, (void*)winNum);
|
||||||
unsigned originalCount;
|
unsigned originalCount;
|
||||||
unsigned i = [types count];
|
unsigned i = [types count];
|
||||||
|
|
||||||
|
@ -288,7 +288,7 @@ NSGraphicsContext *GSCurrentContext()
|
||||||
*/
|
*/
|
||||||
- (BOOL) _removeDragTypes: (NSArray*)types fromWindow: (int)winNum
|
- (BOOL) _removeDragTypes: (NSArray*)types fromWindow: (int)winNum
|
||||||
{
|
{
|
||||||
NSCountedSet *old = (NSCountedSet*)NSMapGet(drag_types, winNum);
|
NSCountedSet *old = (NSCountedSet*)NSMapGet(drag_types, (void*)winNum);
|
||||||
|
|
||||||
if (types == nil)
|
if (types == nil)
|
||||||
{
|
{
|
||||||
|
@ -320,7 +320,16 @@ NSGraphicsContext *GSCurrentContext()
|
||||||
|
|
||||||
- (NSCountedSet*) _dragTypesForWindow: (int)winNum
|
- (NSCountedSet*) _dragTypesForWindow: (int)winNum
|
||||||
{
|
{
|
||||||
return (NSCountedSet*)NSMapGet(drag_types, winNum);
|
return (NSCountedSet*)NSMapGet(drag_types, (void*)winNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Misc window management support.
|
||||||
|
*/
|
||||||
|
- (BOOL) _setFrame: (NSRect)frameRect forWindow: (int)winNum
|
||||||
|
{
|
||||||
|
[self subclassResponsibility: _cmd];
|
||||||
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -38,6 +38,9 @@
|
||||||
#include <Foundation/NSNotification.h>
|
#include <Foundation/NSNotification.h>
|
||||||
#include <Foundation/NSValue.h>
|
#include <Foundation/NSValue.h>
|
||||||
#include <Foundation/NSException.h>
|
#include <Foundation/NSException.h>
|
||||||
|
#include <Foundation/NSSet.h>
|
||||||
|
#include <Foundation/NSLock.h>
|
||||||
|
#include <Foundation/NSUserDefaults.h>
|
||||||
|
|
||||||
#include <AppKit/NSWindow.h>
|
#include <AppKit/NSWindow.h>
|
||||||
#include <AppKit/NSApplication.h>
|
#include <AppKit/NSApplication.h>
|
||||||
|
@ -104,6 +107,8 @@ static SEL ctSel = @selector(_checkTrackingRectangles:forEvent:);
|
||||||
static IMP ccImp;
|
static IMP ccImp;
|
||||||
static IMP ctImp;
|
static IMP ctImp;
|
||||||
static Class responderClass;
|
static Class responderClass;
|
||||||
|
static NSMutableSet *autosaveNames;
|
||||||
|
static NSRecursiveLock *windowsLock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class methods
|
* Class methods
|
||||||
|
@ -117,11 +122,22 @@ static Class responderClass;
|
||||||
ccImp = [self instanceMethodForSelector: ccSel];
|
ccImp = [self instanceMethodForSelector: ccSel];
|
||||||
ctImp = [self instanceMethodForSelector: ctSel];
|
ctImp = [self instanceMethodForSelector: ctSel];
|
||||||
responderClass = [NSResponder class];
|
responderClass = [NSResponder class];
|
||||||
|
autosaveNames = [NSMutableSet new];
|
||||||
|
windowsLock = [NSRecursiveLock new];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (void) removeFrameUsingName: (NSString *)name
|
+ (void) removeFrameUsingName: (NSString*)name
|
||||||
{
|
{
|
||||||
|
if (name != nil)
|
||||||
|
{
|
||||||
|
NSString *key;
|
||||||
|
|
||||||
|
key = [NSString stringWithFormat: @"NSWindow frame %@", name];
|
||||||
|
[windowsLock lock];
|
||||||
|
[[NSUserDefaults standardUserDefaults] removeObjectForKey: key];
|
||||||
|
[windowsLock unlock];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSRect) contentRectForFrameRect: (NSRect)aRect
|
+ (NSRect) contentRectForFrameRect: (NSRect)aRect
|
||||||
|
@ -270,7 +286,10 @@ static Class responderClass;
|
||||||
/* If window view has not been created, create it */
|
/* If window view has not been created, create it */
|
||||||
if ((!content_view) || ([content_view superview] == nil))
|
if ((!content_view) || ([content_view superview] == nil))
|
||||||
{
|
{
|
||||||
wv = [[GSWindowView allocWithZone: [self zone]] initWithFrame: frame];
|
NSRect rect = frame;
|
||||||
|
|
||||||
|
rect.origin = NSZeroPoint;
|
||||||
|
wv = [[GSWindowView allocWithZone: [self zone]] initWithFrame: rect];
|
||||||
[wv viewWillMoveToWindow: self];
|
[wv viewWillMoveToWindow: self];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -613,26 +632,105 @@ static Class responderClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setContentSize: (NSSize)aSize
|
- (void) setContentSize: (NSSize)aSize
|
||||||
{}
|
{
|
||||||
|
NSRect r = frame;
|
||||||
|
|
||||||
|
r.size = aSize;
|
||||||
|
[self setFrame: r display: YES];
|
||||||
|
}
|
||||||
|
|
||||||
- (void) setFrame: (NSRect)frameRect display: (BOOL)flag
|
- (void) setFrame: (NSRect)frameRect display: (BOOL)flag
|
||||||
{
|
{
|
||||||
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
|
||||||
frame = frameRect;
|
if (maximum_size.width > 0 && frameRect.size.width > maximum_size.width)
|
||||||
[nc postNotificationName: NSWindowDidResizeNotification object: self];
|
{
|
||||||
|
frameRect.size.width = maximum_size.width;
|
||||||
|
}
|
||||||
|
if (maximum_size.height > 0 && frameRect.size.height > maximum_size.height)
|
||||||
|
{
|
||||||
|
frameRect.size.height = maximum_size.height;
|
||||||
|
}
|
||||||
|
if (minimum_size.width > 0 && frameRect.size.width < minimum_size.width)
|
||||||
|
{
|
||||||
|
frameRect.size.width = minimum_size.width;
|
||||||
|
}
|
||||||
|
if (minimum_size.height > 0 && frameRect.size.height < minimum_size.height)
|
||||||
|
{
|
||||||
|
frameRect.size.height = minimum_size.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NSEqualSizes(frameRect.size, frame.size) == NO)
|
||||||
|
{
|
||||||
|
if ([delegate respondsToSelector: @selector(windowWillResize:toSize:)])
|
||||||
|
{
|
||||||
|
frameRect.size = [delegate windowWillResize: self
|
||||||
|
toSize: frameRect.size];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NSEqualPoints(frame.origin, frameRect.origin) == NO)
|
||||||
|
[nc postNotificationName: NSWindowWillMoveNotification object: self];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now we can tell the graphics context to do the actual resizing.
|
||||||
|
*/
|
||||||
|
[GSCurrentContext() _setFrame: frameRect forWindow: [self windowNumber]];
|
||||||
|
|
||||||
if (flag)
|
if (flag)
|
||||||
[self display];
|
[self display];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setFrameTopLeftPoint: (NSPoint)aPoint
|
/*
|
||||||
|
* Method called by graphics engine to notify window of a change to
|
||||||
|
* it's real frame.
|
||||||
|
*/
|
||||||
|
- (void) _setFrame: (NSRect)newFrame
|
||||||
{
|
{
|
||||||
|
if (NSEqualRects(frame, newFrame) == NO)
|
||||||
|
{
|
||||||
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
NSRect old = frame;
|
||||||
|
|
||||||
|
if (autosave_name != nil)
|
||||||
|
{
|
||||||
|
[self saveFrameUsingName: autosave_name];
|
||||||
|
}
|
||||||
|
frame = newFrame;
|
||||||
|
if (NSEqualSizes(old.size, frame.size) == NO)
|
||||||
|
{
|
||||||
|
if (content_view)
|
||||||
|
{
|
||||||
|
NSView *wv = [content_view superview];
|
||||||
|
NSRect rect = [self frame];
|
||||||
|
|
||||||
|
rect.origin = NSZeroPoint;
|
||||||
|
[wv setFrame: rect];
|
||||||
|
[wv setNeedsDisplay: YES];
|
||||||
|
}
|
||||||
|
[nc postNotificationName: NSWindowDidResizeNotification object: self];
|
||||||
|
}
|
||||||
|
if (NSEqualPoints(old.origin, frame.origin) == NO)
|
||||||
|
{
|
||||||
|
[nc postNotificationName: NSWindowDidMoveNotification object: self];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setFrameOrigin: (NSPoint)aPoint
|
- (void) setFrameOrigin: (NSPoint)aPoint
|
||||||
{
|
{
|
||||||
frame.origin = aPoint;
|
NSRect r = frame;
|
||||||
|
|
||||||
|
r.origin = aPoint;
|
||||||
|
[self setFrame: r display: YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setFrameTopLeftPoint: (NSPoint)aPoint
|
||||||
|
{
|
||||||
|
NSRect r = frame;
|
||||||
|
|
||||||
|
r.origin.y = aPoint.y + frame.size.height;
|
||||||
|
[self setFrame: r display: YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setMinSize: (NSSize)aSize
|
- (void) setMinSize: (NSSize)aSize
|
||||||
|
@ -1507,8 +1605,8 @@ static Class responderClass;
|
||||||
menu_exclude = flag;
|
menu_exclude = flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
- validRequestorForSendType: (NSString *)sendType
|
- (id) validRequestorForSendType: (NSString *)sendType
|
||||||
returnType: (NSString *)returnType
|
returnType: (NSString *)returnType
|
||||||
{
|
{
|
||||||
id result = nil;
|
id result = nil;
|
||||||
|
|
||||||
|
@ -1527,30 +1625,75 @@ static Class responderClass;
|
||||||
*/
|
*/
|
||||||
- (NSString *) frameAutosaveName
|
- (NSString *) frameAutosaveName
|
||||||
{
|
{
|
||||||
return nil;
|
return autosave_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) saveFrameUsingName: (NSString *)name
|
- (void) saveFrameUsingName: (NSString *)name
|
||||||
{
|
{
|
||||||
|
NSString *key;
|
||||||
|
NSString *obj;
|
||||||
|
|
||||||
|
key = [NSString stringWithFormat: @"NSWindow frame %@", name];
|
||||||
|
obj = [self stringWithSavedFrame];
|
||||||
|
[windowsLock lock];
|
||||||
|
[[NSUserDefaults standardUserDefaults] setObject: obj forKey: key];
|
||||||
|
[windowsLock unlock];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) setFrameAutosaveName: (NSString *)name
|
- (BOOL) setFrameAutosaveName: (NSString *)name
|
||||||
{
|
{
|
||||||
return NO;
|
if ([name isEqual: autosave_name])
|
||||||
|
{
|
||||||
|
return YES; /* That's our name already. */
|
||||||
|
}
|
||||||
|
|
||||||
|
[windowsLock lock];
|
||||||
|
if ([autosaveNames member: name] != nil)
|
||||||
|
{
|
||||||
|
[windowsLock unlock];
|
||||||
|
return NO; /* Name in use elsewhere. */
|
||||||
|
}
|
||||||
|
if (autosave_name != nil)
|
||||||
|
{
|
||||||
|
[autosaveNames removeObject: autosave_name];
|
||||||
|
autosave_name = nil;
|
||||||
|
}
|
||||||
|
if (name != nil && [name isEqual: @""] == NO)
|
||||||
|
{
|
||||||
|
name = [name copy];
|
||||||
|
[autosaveNames addObject: name];
|
||||||
|
autosave_name = name;
|
||||||
|
[name release];
|
||||||
|
}
|
||||||
|
[windowsLock unlock];
|
||||||
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setFrameFromString: (NSString *)string
|
- (void) setFrameFromString: (NSString *)string
|
||||||
{
|
{
|
||||||
|
NSRect rect = NSRectFromString(string);
|
||||||
|
|
||||||
|
[self setFrame: rect display: YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) setFrameUsingName: (NSString *)name
|
- (BOOL) setFrameUsingName: (NSString *)name
|
||||||
{
|
{
|
||||||
return NO;
|
NSString *key;
|
||||||
|
NSString *obj;
|
||||||
|
|
||||||
|
key = [NSString stringWithFormat: @"NSWindow frame %@", name];
|
||||||
|
[windowsLock lock];
|
||||||
|
obj = [[NSUserDefaults standardUserDefaults] objectForKey: key];
|
||||||
|
[windowsLock unlock];
|
||||||
|
if (obj == nil)
|
||||||
|
return NO;
|
||||||
|
[self setFrameFromString: obj];
|
||||||
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *) stringWithSavedFrame
|
- (NSString *) stringWithSavedFrame
|
||||||
{
|
{
|
||||||
return nil;
|
return NSStringFromRect(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue