From e543ae9174064c2820a4b9fe5ce30c9963afeb0b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Wed, 19 Sep 2012 08:47:01 +0200 Subject: [PATCH] * lisp/startup.el (command-line-ns-option-alist): Add -g and --geometry. * src/frame.c (read_integer, XParseGeometry): Moved from w32xfns.c. (Fx_parse_geometry): If there is a space in string, call Qns_parse_geometry, otherwise do as on other terms. * src/w32xfns.c (read_integer, XParseGeometry): Move to frame.c. * src/nsfns.m (XParseGeometry): Remove. (Fx_create_frame): Call x_set_offset to correctly interpret top_pos in geometry. Fixes: debbugs:12368 --- lisp/ChangeLog | 4 ++ lisp/startup.el | 4 +- src/ChangeLog | 12 ++++ src/frame.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++-- src/nsfns.m | 13 +---- src/w32xfns.c | 132 -------------------------------------------- 6 files changed, 159 insertions(+), 148 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 8036e819d4d..da45cadba46 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2012-09-19 Jan Djärv + + * startup.el (command-line-ns-option-alist): Add -g and --geometry. + 2012-09-18 Juri Linkov * dired-aux.el (dired-diff): Restore original functionality of diff --git a/lisp/startup.el b/lisp/startup.el index db5efb89eed..243c9621752 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -216,8 +216,8 @@ and VALUE is the value which is given to that frame parameter ("-fn" 1 x-handle-switch font) ("-font" 1 x-handle-switch font) ("-ib" 1 x-handle-numeric-switch internal-border-width) - ;;("-g" . x-handle-geometry) - ;;("-geometry" . x-handle-geometry) + ("-g" 1 x-handle-geometry) + ("-geometry" 1 x-handle-geometry) ("-fg" 1 x-handle-switch foreground-color) ("-foreground" 1 x-handle-switch foreground-color) ("-bg" 1 x-handle-switch background-color) diff --git a/src/ChangeLog b/src/ChangeLog index 6c3041105f5..8c3af794ab1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2012-09-19 Jan Djärv + + * w32xfns.c (read_integer, XParseGeometry): Move to frame.c. + + * nsfns.m (XParseGeometry): Remove. + (Fx_create_frame): Call x_set_offset to correctly interpret + top_pos in geometry. + + * frame.c (read_integer, XParseGeometry): Moved from w32xfns.c. + (Fx_parse_geometry): If there is a space in string, call + Qns_parse_geometry, otherwise do as on other terms (Bug#12368). + 2012-09-17 Eli Zaretskii * search.c (scan_buffer): Use character positions in calls to diff --git a/src/frame.c b/src/frame.c index 6930dac3ce8..28571310032 100644 --- a/src/frame.c +++ b/src/frame.c @@ -3897,6 +3897,140 @@ x_default_parameter (struct frame *f, Lisp_Object alist, Lisp_Object prop, } +#if !defined (HAVE_X_WINDOWS) && defined (NoValue) + +/* + * XParseGeometry parses strings of the form + * "=x{+-}{+-}", where + * width, height, xoffset, and yoffset are unsigned integers. + * Example: "=80x24+300-49" + * The equal sign is optional. + * It returns a bitmask that indicates which of the four values + * were actually found in the string. For each value found, + * the corresponding argument is updated; for each value + * not found, the corresponding argument is left unchanged. + */ + +static int +read_integer (register char *string, char **NextString) +{ + register int Result = 0; + int Sign = 1; + + if (*string == '+') + string++; + else if (*string == '-') + { + string++; + Sign = -1; + } + for (; (*string >= '0') && (*string <= '9'); string++) + { + Result = (Result * 10) + (*string - '0'); + } + *NextString = string; + if (Sign >= 0) + return (Result); + else + return (-Result); +} + +int +XParseGeometry (char *string, + int *x, int *y, + unsigned int *width, unsigned int *height) +{ + int mask = NoValue; + register char *strind; + unsigned int tempWidth, tempHeight; + int tempX, tempY; + char *nextCharacter; + + if ((string == NULL) || (*string == '\0')) return (mask); + if (*string == '=') + string++; /* ignore possible '=' at beg of geometry spec */ + + strind = (char *)string; + if (*strind != '+' && *strind != '-' && *strind != 'x') + { + tempWidth = read_integer (strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= WidthValue; + } + + if (*strind == 'x' || *strind == 'X') + { + strind++; + tempHeight = read_integer (strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= HeightValue; + } + + if ((*strind == '+') || (*strind == '-')) + { + if (*strind == '-') + { + strind++; + tempX = -read_integer (strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= XNegative; + + } + else + { + strind++; + tempX = read_integer (strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + } + mask |= XValue; + if ((*strind == '+') || (*strind == '-')) + { + if (*strind == '-') + { + strind++; + tempY = -read_integer (strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= YNegative; + } + else + { + strind++; + tempY = read_integer (strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + } + mask |= YValue; + } + } + + /* If strind isn't at the end of the string then it's an invalid + geometry specification. */ + + if (*strind != '\0') return (0); + + if (mask & XValue) + *x = tempX; + if (mask & YValue) + *y = tempY; + if (mask & WidthValue) + *width = tempWidth; + if (mask & HeightValue) + *height = tempHeight; + return (mask); +} + +#endif /* !defined (HAVE_X_WINDOWS) && defined (NoValue) */ /* NS used to define x-parse-geometry in ns-win.el, but that confused @@ -3917,15 +4051,16 @@ or a list (- N) meaning -N pixels relative to bottom/right corner. On Nextstep, this just calls `ns-parse-geometry'. */) (Lisp_Object string) { -#ifdef HAVE_NS - return call1 (Qns_parse_geometry, string); -#else int geometry, x, y; unsigned int width, height; Lisp_Object result; CHECK_STRING (string); +#ifdef HAVE_NS + if (strchr (SSDATA (string), ' ') != NULL) + return call1 (Qns_parse_geometry, string); +#endif geometry = XParseGeometry (SSDATA (string), &x, &y, &width, &height); result = Qnil; @@ -3961,7 +4096,6 @@ On Nextstep, this just calls `ns-parse-geometry'. */) result = Fcons (Fcons (Qheight, make_number (height)), result); return result; -#endif /* HAVE_NS */ } diff --git a/src/nsfns.m b/src/nsfns.m index 072005d2d3d..e2c8c3722c0 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -870,16 +870,6 @@ x_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval) } -/* Xism; we stub out (we do implement this in ns-win.el) */ -int -XParseGeometry (char *string, int *x, int *y, - unsigned int *width, unsigned int *height) -{ - message1 ("Warning: XParseGeometry not supported under NS.\n"); - return 0; -} - - /* TODO: move to nsterm? */ int ns_lisp_to_cursor_type (Lisp_Object arg) @@ -1399,6 +1389,9 @@ This function is an internal primitive--use `make-frame' instead. */) UNGCPRO; + if (window_prompting & USPosition) + x_set_offset (f, f->left_pos, f->top_pos, 1); + /* Make sure windows on this frame appear in calls to next-window and similar functions. */ Vwindow_list = Qnil; diff --git a/src/w32xfns.c b/src/w32xfns.c index 33f40fc7c01..018dd14cb80 100644 --- a/src/w32xfns.c +++ b/src/w32xfns.c @@ -303,138 +303,6 @@ drain_message_queue (void) } } - -/* - * XParseGeometry parses strings of the form - * "=x{+-}{+-}", where - * width, height, xoffset, and yoffset are unsigned integers. - * Example: "=80x24+300-49" - * The equal sign is optional. - * It returns a bitmask that indicates which of the four values - * were actually found in the string. For each value found, - * the corresponding argument is updated; for each value - * not found, the corresponding argument is left unchanged. - */ - -static int -read_integer (register char *string, char **NextString) -{ - register int Result = 0; - int Sign = 1; - - if (*string == '+') - string++; - else if (*string == '-') - { - string++; - Sign = -1; - } - for (; (*string >= '0') && (*string <= '9'); string++) - { - Result = (Result * 10) + (*string - '0'); - } - *NextString = string; - if (Sign >= 0) - return (Result); - else - return (-Result); -} - -int -XParseGeometry (char *string, - int *x, int *y, - unsigned int *width, unsigned int *height) -{ - int mask = NoValue; - register char *strind; - unsigned int tempWidth, tempHeight; - int tempX, tempY; - char *nextCharacter; - - if ((string == NULL) || (*string == '\0')) return (mask); - if (*string == '=') - string++; /* ignore possible '=' at beg of geometry spec */ - - strind = (char *)string; - if (*strind != '+' && *strind != '-' && *strind != 'x') - { - tempWidth = read_integer (strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - mask |= WidthValue; - } - - if (*strind == 'x' || *strind == 'X') - { - strind++; - tempHeight = read_integer (strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - mask |= HeightValue; - } - - if ((*strind == '+') || (*strind == '-')) - { - if (*strind == '-') - { - strind++; - tempX = -read_integer (strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - mask |= XNegative; - - } - else - { - strind++; - tempX = read_integer (strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - } - mask |= XValue; - if ((*strind == '+') || (*strind == '-')) - { - if (*strind == '-') - { - strind++; - tempY = -read_integer (strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - mask |= YNegative; - } - else - { - strind++; - tempY = read_integer (strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - } - mask |= YValue; - } - } - - /* If strind isn't at the end of the string then it's an invalid - geometry specification. */ - - if (*strind != '\0') return (0); - - if (mask & XValue) - *x = tempX; - if (mask & YValue) - *y = tempY; - if (mask & WidthValue) - *width = tempWidth; - if (mask & HeightValue) - *height = tempHeight; - return (mask); -} - /* x_sync is a no-op on W32. */ void x_sync (struct frame *f) -- 2.39.2