More robust parsing of display

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@13924 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Adam Fedor 2002-06-21 14:27:14 +00:00
parent e39c513fec
commit edb4bc930e
2 changed files with 83 additions and 62 deletions

View file

@ -1,3 +1,8 @@
2002-06-20 Adam Fedor <fedor@gnu.org>
* Source/x11/XGServer.m (_parse_display_name): New.
([XGServer -_initXContext]): Use it.
2002-06-15 Alexander Malmberg <alexander@malmberg.org> 2002-06-15 Alexander Malmberg <alexander@malmberg.org>
* configure.ac, configure: Use libart2-config and freetype-config * configure.ac, configure: Use libart2-config and freetype-config

View file

@ -54,6 +54,54 @@
extern int XGErrorHandler(Display *display, XErrorEvent *err); extern int XGErrorHandler(Display *display, XErrorEvent *err);
static NSString *
_parse_display_name(NSString *name, int *dn, int *sn)
{
int d, s;
NSString *host;
NSArray *a;
host = @"";
d = s = 0;
a = [name componentsSeparatedByString: @":"];
if (name == nil)
{
NSLog(@"X DISPLAY environment variable not set,"
@" assuming local X server (DISPLAY=:0.0)");
}
else if ([name hasPrefix: @":"] == YES)
{
int bnum;
bnum = sscanf([name cString], ":%d.%d", &d, &s);
if (bnum == 1)
s = 0;
if (bnum < 1)
d = 0;
}
else if ([a count] != 2)
{
NSLog(@"X DISPLAY environment variable has bad format,"
@" assuming local X server (DISPLAY=:0.0)");
}
else
{
int bnum;
NSString *dnum;
host = [a objectAtIndex: 0];
dnum = [a lastObject];
bnum = sscanf([dnum cString], "%d.%d", &d, &s);
if (bnum == 1)
s = 0;
if (bnum < 1)
d = 0;
}
if (dn)
*dn = d;
if (sn)
*sn = s;
return host;
}
@interface XGServer (Window) @interface XGServer (Window)
- (void) _setupRootWindow; - (void) _setupRootWindow;
@end @end
@ -241,11 +289,11 @@ extern int XGErrorHandler(Display *display, XErrorEvent *err);
- _initXContext - _initXContext
{ {
int screen_number; int screen_number, display_number;
NSString *display_name; NSString *display_name, *host;
NSRange disnum;
XGScreenContext *screen; XGScreenContext *screen;
host = [[NSUserDefaults standardUserDefaults] stringForKey: @"NSHost"];
display_name = [server_info objectForKey: GSDisplayName]; display_name = [server_info objectForKey: GSDisplayName];
if (display_name == nil) if (display_name == nil)
{ {
@ -257,74 +305,45 @@ extern int XGErrorHandler(Display *display, XErrorEvent *err);
dn = @"0"; dn = @"0";
if (sn == NULL) if (sn == NULL)
sn = @"0"; sn = @"0";
display_name = [NSString stringWithFormat: @":%@.%@", dn, sn]; if (host == nil)
host = @"";
display_name = [NSString stringWithFormat: @"%@:%@.%@", host, dn,sn];
} }
} }
if (display_name == nil) if (display_name == nil)
{ {
NSString *host;
NSString *dnum = @"0.0";
host = [[NSUserDefaults standardUserDefaults] stringForKey: @"NSHost"];
if (host == nil) if (host == nil)
{ {
NSString *d = [[[NSProcessInfo processInfo] environment] NSString *d = [[[NSProcessInfo processInfo] environment]
objectForKey: @"DISPLAY"]; objectForKey: @"DISPLAY"];
if (d == nil) host = _parse_display_name(d, &display_number, &screen_number);
if (display_number != 0)
{ {
host = @""; NSLog(@"NOTE: Only one display per host fully supported.");
} }
else if ([host isEqual: @""] == NO)
{ {
if ([d hasPrefix: @":"] == YES) /**
{ * If we are using the DISPLAY environment variable to
host = @""; // local host * determine where to display, set the NSHost default
} * so that other parts of the system know where we are
else * displaying.
{ */
NSArray *a = [d componentsSeparatedByString: @":"]; [[NSUserDefaults standardUserDefaults] registerDefaults:
[NSDictionary dictionaryWithObject: host
if ([a count] != 2) forKey: @"NSHost"]];
{
NSLog(@"X DISPLAY environment variable has bad format"
@" assuming local X server (DISPLAY=:0.0)");
host = @"";
}
else
{
host = [a objectAtIndex: 0];
dnum = [a lastObject];
if ([dnum isEqual: @"0"] == NO
&& [dnum hasPrefix: @"0."] == NO)
{
NSLog(@"Only one display per host fully supported.");
}
}
}
if ([host isEqual: @""] == NO)
{
/**
* If we are using the DISPLAY environment variable to
* determine where to display, set the NSHost default
* so that other parts of the system know where we are
* displaying.
*/
[[NSUserDefaults standardUserDefaults] registerDefaults:
[NSDictionary dictionaryWithObject: host
forKey: @"NSHost"]];
}
} }
} }
if ([host isEqual: @""] == NO) else if ([host isEqual: @""] == NO)
{ {
/** /**
* If the NSHost default told us to display somewhere, we need * If the NSHost default told us to display somewhere, we need
* to generate a display name for X from the host name and the * to generate a display name for X from the host name and the
* default display and screen numbers (zero). * default display and screen numbers (zero).
*/ */
display_name = [NSString stringWithFormat: @"%@:%@", host, dnum]; display_name = [NSString stringWithFormat: @"%@:0.0", host];
} }
} }
@ -338,25 +357,22 @@ extern int XGErrorHandler(Display *display, XErrorEvent *err);
display_name = [NSString stringWithCString: XDisplayName(NULL)]; display_name = [NSString stringWithCString: XDisplayName(NULL)];
} }
/* Use the fact that the screen number is specified like an extension
e.g. hostname:0.1 */
screen_number = [[display_name pathExtension] intValue];
if (dpy == NULL) if (dpy == NULL)
{ {
char *dname = XDisplayName([display_name cString]); char *dname = XDisplayName([display_name cString]);
[NSException raise: NSWindowServerCommunicationException [NSException raise: NSWindowServerCommunicationException
format: @"Unable to connect to X Server `%s'", dname]; format: @"Unable to connect to X Server `%s'", dname];
} }
else
NSDebugLog(@"Opened display %@", display_name);
/* Parse display information */
_parse_display_name(display_name, &display_number, &screen_number);
NSDebugLog(@"Opened display %@, display %d screen %d",
display_name, display_number, screen_number);
[server_info setObject: display_name forKey: GSDisplayName]; [server_info setObject: display_name forKey: GSDisplayName];
disnum = [display_name rangeOfString: @":"]; [server_info setObject: [NSNumber numberWithInt: display_number]
if (disnum.location >= 0) forKey: GSDisplayNumber];
[server_info setObject: [display_name substringFromIndex: disnum.location] [server_info setObject: [NSNumber numberWithInt: screen_number]
forKey: GSDisplayNumber]; forKey: GSScreenNumber];
[server_info setObject: [display_name pathExtension] forKey: GSScreenNumber];
/* Setup screen*/ /* Setup screen*/
if (screenList == NULL) if (screenList == NULL)