mirror of
https://github.com/gnustep/libs-back.git
synced 2025-05-30 08:51:03 +00:00
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:
parent
e39c513fec
commit
edb4bc930e
2 changed files with 83 additions and 62 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue