mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-23 20:01:11 +00:00
NSHost'ing fixes
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@12079 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
65de9f1abd
commit
3aa806681b
3 changed files with 220 additions and 65 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2002-01-10 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
* Source/NSPasteboard.m: Improve handling of -NSHost user default
|
||||
so we don't try to start a local pasteboard server when what we
|
||||
actually want is to connect to a remote one.
|
||||
* Source/NSWorkspace.m: Use -NSHost default to control connection
|
||||
to a remote workspace application.
|
||||
Should we use the remote application to launch new apps if possible?
|
||||
For now, try to launch the apps locally but have them display on
|
||||
the remote host by passing the -NSHost default to them.
|
||||
|
||||
2002-01-09 Adam Fedor <fedor@gnu.org>
|
||||
|
||||
* Source/NSApplication.m (_NSAppKitUncaughtExceptionHandler):
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <AppKit/NSFileWrapper.h>
|
||||
#include <Foundation/NSArray.h>
|
||||
#include <Foundation/NSData.h>
|
||||
#include <Foundation/NSHost.h>
|
||||
#include <Foundation/NSDictionary.h>
|
||||
#include <Foundation/NSConnection.h>
|
||||
#include <Foundation/NSDistantObject.h>
|
||||
|
@ -97,7 +98,7 @@ static NSMapTable *mimeMap = NULL;
|
|||
removeObserver: self
|
||||
name: NSConnectionDidDieNotification
|
||||
object: [notification object]];
|
||||
[obj release];
|
||||
RELEASE(obj);
|
||||
return self;
|
||||
}
|
||||
|
||||
|
@ -105,17 +106,33 @@ static NSMapTable *mimeMap = NULL;
|
|||
{
|
||||
if (the_server == nil)
|
||||
{
|
||||
NSString* host;
|
||||
NSString *host;
|
||||
|
||||
host = [[NSUserDefaults standardUserDefaults] stringForKey: @"NSHost"];
|
||||
if (host == nil)
|
||||
{
|
||||
host = [[NSProcessInfo processInfo] hostName];
|
||||
host = @"";
|
||||
}
|
||||
else
|
||||
{
|
||||
NSHost *h;
|
||||
|
||||
/*
|
||||
* If we have a host specified, but it is the current host,
|
||||
* we do not need to ask for a host by name (nameserver lookup
|
||||
* can be faster) and the empty host name can be used to
|
||||
* indicate that we may start a pasteboard server locally.
|
||||
*/
|
||||
h = [NSHost hostWithName: host];
|
||||
if ([h isEqual: [NSHost currentHost]] == YES)
|
||||
{
|
||||
host = @"";
|
||||
}
|
||||
}
|
||||
the_server = (id<GSPasteboardSvr>)[NSConnection
|
||||
rootProxyForConnectionWithRegisteredName: PBSNAME
|
||||
host: host];
|
||||
if ([(id)the_server retain])
|
||||
if (RETAIN((id)the_server) != nil)
|
||||
{
|
||||
NSConnection* conn = [(id)the_server connectionForProxy];
|
||||
|
||||
|
@ -125,14 +142,14 @@ static NSMapTable *mimeMap = NULL;
|
|||
name: NSConnectionDidDieNotification
|
||||
object: conn];
|
||||
}
|
||||
else
|
||||
else if ([host isEqual: @""] == YES)
|
||||
{
|
||||
static BOOL recursion = NO;
|
||||
|
||||
if (recursion)
|
||||
{
|
||||
NSLog(@"Unable to contact pasteboard server - "
|
||||
@"please ensure that gpbs is running.\n");
|
||||
@"please ensure that gpbs is running.");
|
||||
return nil;
|
||||
}
|
||||
else
|
||||
|
@ -162,6 +179,12 @@ static NSMapTable *mimeMap = NULL;
|
|||
recursion = NO;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"Unable to contact pasteboard server on %@ - "
|
||||
@"please ensure that gpbs is running.", host);
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
return the_server;
|
||||
}
|
||||
|
@ -190,8 +213,8 @@ static NSMapTable *mimeMap = NULL;
|
|||
*/
|
||||
if (p->target != (id)aTarget)
|
||||
{
|
||||
[p->target autorelease];
|
||||
p->target = [(id)aTarget retain];
|
||||
AUTORELEASE(p->target);
|
||||
p->target = RETAIN((id)aTarget);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -203,15 +226,15 @@ static NSMapTable *mimeMap = NULL;
|
|||
p = [NSPasteboard alloc];
|
||||
if (p)
|
||||
{
|
||||
p->target = [(id)aTarget retain];
|
||||
p->name = [aName retain];
|
||||
p->target = RETAIN((id)aTarget);
|
||||
p->name = RETAIN(aName);
|
||||
[pasteboards setObject: p forKey: aName];
|
||||
[p autorelease];
|
||||
AUTORELEASE(p);
|
||||
}
|
||||
/*
|
||||
* The [-autorelease] message ensures that the NSPasteboard object we are
|
||||
* The AUTORELEASE ensures that the NSPasteboard object we are
|
||||
* returning will be released once our caller has finished with it.
|
||||
* This is necessary so that our [-release] method will be called to
|
||||
* This is necessary so that our RELEASE method will be called to
|
||||
* remove the NSPasteboard from the 'pasteboards' array when it is not
|
||||
* needed any more.
|
||||
*/
|
||||
|
@ -425,8 +448,8 @@ static NSMapTable *mimeMap = NULL;
|
|||
|
||||
- (void) dealloc
|
||||
{
|
||||
[target release];
|
||||
[name release];
|
||||
RELEASE(target);
|
||||
RELEASE(name);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
@ -502,12 +525,12 @@ static NSMapTable *mimeMap = NULL;
|
|||
if ([self retainCount] == 2)
|
||||
{
|
||||
[dictionary_lock lock];
|
||||
[super retain];
|
||||
RETAIN(super);
|
||||
[pasteboards removeObjectForKey: name];
|
||||
[super release];
|
||||
RELEASE(super);
|
||||
[dictionary_lock unlock];
|
||||
}
|
||||
[super release];
|
||||
RELEASE(super);
|
||||
}
|
||||
|
||||
- (BOOL) setData: (NSData*)data
|
||||
|
@ -937,7 +960,7 @@ NSGetFileTypes(NSArray *pboardTypes)
|
|||
}
|
||||
if ([a count] > 0)
|
||||
{
|
||||
return [[a copy] autorelease];
|
||||
return AUTORELEASE([a copy]);
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <gnustep/gui/config.h>
|
||||
#include <Foundation/NSBundle.h>
|
||||
#include <Foundation/NSDictionary.h>
|
||||
#include <Foundation/NSHost.h>
|
||||
#include <Foundation/NSLock.h>
|
||||
#include <Foundation/NSPathUtilities.h>
|
||||
#include <Foundation/NSUserDefaults.h>
|
||||
|
@ -78,17 +79,26 @@ static NSString *GSWorkspaceNotification = @"GSWorkspaceNotification";
|
|||
{
|
||||
remote = RETAIN([NSDistributedNotificationCenter defaultCenter]);
|
||||
NS_DURING
|
||||
[remote addObserver: self
|
||||
selector: @selector(_handleRemoteNotification:)
|
||||
name: nil
|
||||
object: GSWorkspaceNotification];
|
||||
{
|
||||
[remote addObserver: self
|
||||
selector: @selector(_handleRemoteNotification:)
|
||||
name: nil
|
||||
object: GSWorkspaceNotification];
|
||||
}
|
||||
NS_HANDLER
|
||||
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
|
||||
if ([defs boolForKey: @"GSLogWorkspaceTimeout"])
|
||||
NSLog(@"NSWorkspace caught exception %@: %@",
|
||||
{
|
||||
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
|
||||
|
||||
if ([defs boolForKey: @"GSLogWorkspaceTimeout"])
|
||||
{
|
||||
NSLog(@"NSWorkspace caught exception %@: %@",
|
||||
[localException name], [localException reason]);
|
||||
else
|
||||
[localException raise];
|
||||
}
|
||||
else
|
||||
{
|
||||
[localException raise];
|
||||
}
|
||||
}
|
||||
NS_ENDHANDLER
|
||||
}
|
||||
return self;
|
||||
|
@ -107,14 +117,23 @@ static NSString *GSWorkspaceNotification = @"GSWorkspaceNotification";
|
|||
object: GSWorkspaceNotification
|
||||
userInfo: [aNotification userInfo]];
|
||||
NS_DURING
|
||||
[remote postNotification: rem];
|
||||
{
|
||||
[remote postNotification: rem];
|
||||
}
|
||||
NS_HANDLER
|
||||
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
|
||||
if ([defs boolForKey: @"GSLogWorkspaceTimeout"])
|
||||
NSLog(@"NSWorkspace caught exception %@: %@",
|
||||
{
|
||||
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
|
||||
|
||||
if ([defs boolForKey: @"GSLogWorkspaceTimeout"])
|
||||
{
|
||||
NSLog(@"NSWorkspace caught exception %@: %@",
|
||||
[localException name], [localException reason]);
|
||||
else
|
||||
[localException raise];
|
||||
}
|
||||
else
|
||||
{
|
||||
[localException raise];
|
||||
}
|
||||
}
|
||||
NS_ENDHANDLER
|
||||
}
|
||||
|
||||
|
@ -374,10 +393,10 @@ static NSString *_rootPath = @"/";
|
|||
}
|
||||
NS_ENDHANDLER
|
||||
}
|
||||
|
||||
if (flag)
|
||||
[NSApp deactivate];
|
||||
|
||||
{
|
||||
[NSApp deactivate];
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
@ -1498,38 +1517,108 @@ inFileViewerRootedAtPath: (NSString *)rootFullpath
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Launch an application ... if there is a workspace application, ask it
|
||||
* to perform the launch for us. Otherwise we try to launch the app
|
||||
* ourself as long as it is on the same host as we are.
|
||||
*/
|
||||
- (BOOL) _launchApplication: (NSString *)appName
|
||||
arguments: (NSArray *)args
|
||||
{
|
||||
NSString *path;
|
||||
NSDictionary *userinfo;
|
||||
id app = nil;
|
||||
|
||||
path = [self locateApplicationBinary: appName];
|
||||
if (path == nil)
|
||||
return NO;
|
||||
// app = [self _workspaceApplication];
|
||||
if (app != nil)
|
||||
{
|
||||
return [app _launchApplication: appName arguments: args];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSString *path;
|
||||
NSDictionary *userinfo;
|
||||
NSString *host;
|
||||
|
||||
// App being launched, send NSWorkspaceWillLaunchApplicationNotification
|
||||
userinfo = [NSDictionary dictionaryWithObject:
|
||||
[[appName lastPathComponent] stringByDeletingPathExtension]
|
||||
forKey: @"NSApplicationName"];
|
||||
[_workspaceCenter
|
||||
postNotificationName: NSWorkspaceWillLaunchApplicationNotification
|
||||
object: self
|
||||
userInfo: userinfo];
|
||||
path = [self locateApplicationBinary: appName];
|
||||
if (path == nil)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
if ([NSTask launchedTaskWithLaunchPath: path arguments: args] == nil)
|
||||
return NO;
|
||||
/*
|
||||
* Try to ensure that apps we launch display in this workspace
|
||||
* ie they have the same -NSHost specification.
|
||||
*/
|
||||
host = [[NSUserDefaults standardUserDefaults] stringForKey: @"NSHost"];
|
||||
if (host != nil)
|
||||
{
|
||||
NSHost *h;
|
||||
|
||||
// The NSWorkspaceDidLaunchApplicationNotification will be send by the
|
||||
// started application itself.
|
||||
return YES;
|
||||
h = [NSHost hostWithName: host];
|
||||
if ([h isEqual: [NSHost currentHost]] == NO)
|
||||
{
|
||||
if ([args containsObject: @"-NSHost"] == NO)
|
||||
{
|
||||
NSMutableArray *a;
|
||||
|
||||
if (args == nil)
|
||||
{
|
||||
a = [NSMutableArray arrayWithCapacity: 2];
|
||||
}
|
||||
else
|
||||
{
|
||||
a = AUTORELEASE([args mutableCopy]);
|
||||
}
|
||||
[a insertObject: @"-NSHost" atIndex: 0];
|
||||
[a insertObject: host atIndex: 1];
|
||||
args = a;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* App being launched, send
|
||||
* NSWorkspaceWillLaunchApplicationNotification
|
||||
*/
|
||||
userinfo = [NSDictionary dictionaryWithObject:
|
||||
[[appName lastPathComponent] stringByDeletingPathExtension]
|
||||
forKey: @"NSApplicationName"];
|
||||
[_workspaceCenter
|
||||
postNotificationName: NSWorkspaceWillLaunchApplicationNotification
|
||||
object: self
|
||||
userInfo: userinfo];
|
||||
|
||||
if ([NSTask launchedTaskWithLaunchPath: path arguments: args] == nil)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
/*
|
||||
* The NSWorkspaceDidLaunchApplicationNotification will be
|
||||
* sent by the started application itself.
|
||||
*/
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (id) _connectApplication: (NSString *)appName
|
||||
{
|
||||
NSString *port;
|
||||
id app = nil;
|
||||
NSString *host;
|
||||
NSString *port;
|
||||
id app = nil;
|
||||
|
||||
host = [[NSUserDefaults standardUserDefaults] stringForKey: @"NSHost"];
|
||||
if (host == nil)
|
||||
{
|
||||
host = @"";
|
||||
}
|
||||
else
|
||||
{
|
||||
NSHost *h;
|
||||
|
||||
h = [NSHost hostWithName: host];
|
||||
if ([h isEqual: [NSHost currentHost]] == YES)
|
||||
{
|
||||
host = @"";
|
||||
}
|
||||
}
|
||||
port = [appName stringByDeletingPathExtension];
|
||||
/*
|
||||
* Try to contact a running application.
|
||||
|
@ -1537,7 +1626,7 @@ inFileViewerRootedAtPath: (NSString *)rootFullpath
|
|||
NS_DURING
|
||||
{
|
||||
app = [NSConnection rootProxyForConnectionWithRegisteredName: port
|
||||
host: @""];
|
||||
host: host];
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
|
@ -1551,21 +1640,53 @@ inFileViewerRootedAtPath: (NSString *)rootFullpath
|
|||
|
||||
- (id) _workspaceApplication
|
||||
{
|
||||
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
|
||||
NSString *appName;
|
||||
id app;
|
||||
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
|
||||
NSString *appName;
|
||||
id app;
|
||||
|
||||
/* What Workspace application? */
|
||||
appName = [defs stringForKey: @"GSWorkspaceApplication"];
|
||||
if (appName == nil)
|
||||
appName = @"GSWorkspace";
|
||||
{
|
||||
appName = @"GSWorkspace";
|
||||
}
|
||||
|
||||
app = [self _connectApplication: appName];
|
||||
if (app == nil)
|
||||
{
|
||||
if (![self _launchApplication: appName arguments: nil])
|
||||
return nil;
|
||||
app = [self _connectApplication: appName];
|
||||
NSString *host;
|
||||
|
||||
/**
|
||||
* We don't use -_launchApplication:arguents: here as that method
|
||||
* calls -_workspaceApplication, and would cause recursion.
|
||||
*/
|
||||
host = [[NSUserDefaults standardUserDefaults] stringForKey: @"NSHost"];
|
||||
if (host == nil)
|
||||
{
|
||||
host = @"";
|
||||
}
|
||||
else
|
||||
{
|
||||
NSHost *h;
|
||||
|
||||
h = [NSHost hostWithName: host];
|
||||
if ([h isEqual: [NSHost currentHost]] == YES)
|
||||
{
|
||||
host = @"";
|
||||
}
|
||||
}
|
||||
/**
|
||||
* We can only launch a workspace app if we are displaying to the
|
||||
* local host (since if we are displaying on another host we want
|
||||
* to to talk to the workspace app on that host too).
|
||||
*/
|
||||
if ([host isEqual: @""] == YES)
|
||||
{
|
||||
if ([self _launchApplication: appName arguments: nil] == YES)
|
||||
{
|
||||
app = [self _connectApplication: appName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return app;
|
||||
|
|
Loading…
Reference in a new issue