changeset 9022:10fa443c671a

(Fx_create_frame): Rename menuBarLines resource to menuBar. (x_figure_window_size): Decode (- N), (+ N) for position. (x_set_frame_parameters): Handle (+ N) and (- N). Preserve negative positions properly too. [USE_X_TOOLKIT] (x_window): Let xneg, yneg specify whether to negate left and top. (Fx_parse_geometry): Handle [XY]Negative with positive number or negative number without [XY]Negative.
author Richard M. Stallman <rms@gnu.org>
date Fri, 23 Sep 1994 18:20:31 +0000
parents e0709ca0418a
children 1f1081c31047
files src/xfns.c
diffstat 1 files changed, 105 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfns.c	Fri Sep 23 17:44:56 1994 +0000
+++ b/src/xfns.c	Fri Sep 23 18:20:31 1994 +0000
@@ -463,6 +463,7 @@
   Lisp_Object *parms;
   Lisp_Object *values;
   int i;
+  int left_no_change = 0, top_no_change = 0;
   
   i = 0;
   for (tail = alist; CONSP (tail); tail = Fcdr (tail))
@@ -519,9 +520,21 @@
 
   /* Don't die if just one of these was set.  */
   if (EQ (left, Qunbound))
-    XSET (left, Lisp_Int, f->display.x->left_pos);
+    {
+      left_no_change = 1;
+      if (f->display.x->left_pos < 0)
+	left = Fcons (Qplus, Fcons (make_number (f->display.x->left_pos), Qnil));
+      else
+	XSET (left, Lisp_Int, f->display.x->left_pos);
+    }
   if (EQ (top, Qunbound))
-    XSET (top, Lisp_Int, f->display.x->top_pos);
+    {
+      top_no_change = 1;
+      if (f->display.x->top_pos < 0)
+	top = Fcons (Qplus, Fcons (make_number (f->display.x->top_pos), Qnil));
+      else
+	XSET (top, Lisp_Int, f->display.x->top_pos);
+    }
 
   /* Don't die if just one of these was set.  */
   if (EQ (width, Qunbound))
@@ -549,22 +562,64 @@
       Fset_frame_size (frame, width, height);
 
     if ((!NILP (left) || !NILP (top))
+	&& ! (left_no_change && top_no_change)
 	&& ! (NUMBERP (left) && XINT (left) == f->display.x->left_pos
 	      && NUMBERP (top) && XINT (top) == f->display.x->top_pos))
       {
-	int leftpos = (NUMBERP (left) ? XINT (left) : 0);
-	int toppos = (NUMBERP (top) ? XINT (top) : 0);
+	int leftpos = 0;
+	int toppos = 0;
+
+	/* Record the signs.  */
+	f->display.x->size_hint_flags &= ~ (XNegative | YNegative);
+	if (EQ (left, Qminus))
+	  f->display.x->size_hint_flags |= XNegative;
+	else if (INTEGERP (left))
+	  {
+	    leftpos = XINT (left);
+	    if (leftpos < 0)
+	      f->display.x->size_hint_flags |= XNegative;
+	  }
+	else if (CONSP (left) && EQ (XCONS (left)->car, Qminus)
+		 && CONSP (XCONS (left)->cdr)
+		 && INTEGERP (XCONS (XCONS (left)->cdr)->car))
+	  {
+	    leftpos = - XINT (XCONS (XCONS (left)->cdr)->car);
+	    f->display.x->size_hint_flags |= XNegative;
+	  }
+	else if (CONSP (left) && EQ (XCONS (left)->car, Qplus)
+		 && CONSP (XCONS (left)->cdr)
+		 && INTEGERP (XCONS (XCONS (left)->cdr)->car))
+	  {
+	    leftpos = XINT (XCONS (XCONS (left)->cdr)->car);
+	  }
+
+	if (EQ (top, Qminus))
+	  f->display.x->size_hint_flags |= YNegative;
+	else if (INTEGERP (top))
+	  {
+	    toppos = XINT (top);
+	    if (toppos < 0)
+	      f->display.x->size_hint_flags |= YNegative;
+	  }
+	else if (CONSP (top) && EQ (XCONS (top)->car, Qminus)
+		 && CONSP (XCONS (top)->cdr)
+		 && INTEGERP (XCONS (XCONS (top)->cdr)->car))
+	  {
+	    toppos = - XINT (XCONS (XCONS (top)->cdr)->car);
+	    f->display.x->size_hint_flags |= YNegative;
+	  }
+	else if (CONSP (top) && EQ (XCONS (top)->car, Qplus)
+		 && CONSP (XCONS (top)->cdr)
+		 && INTEGERP (XCONS (XCONS (top)->cdr)->car))
+	  {
+	    toppos = XINT (XCONS (XCONS (top)->cdr)->car);
+	  }
+
 
 	/* Store the numeric value of the position.  */
 	f->display.x->top_pos = toppos;
 	f->display.x->left_pos = leftpos;
 
-	/* Record the signs.  */
-	f->display.x->size_hint_flags &= ~ (XNegative | YNegative);
-	if (EQ (left, Qminus) || (NUMBERP (left) && XINT (left) < 0))
-	  f->display.x->size_hint_flags |= XNegative;
-	if (EQ (top, Qminus) || (NUMBERP (top) && XINT (top) < 0))
-	  f->display.x->size_hint_flags |= YNegative;
 	f->display.x->win_gravity = NorthWestGravity;
 
 	/* Actually set that position, and convert to absolute.  */
@@ -1594,8 +1649,9 @@
        "Parse an X-style geometry string STRING.\n\
 Returns an alist of the form ((top . TOP), (left . LEFT) ... ).\n\
 The properties returned may include `top', `left', `height', and `width'.\n\
-The value of `left' or `top' may be an integer or `-'.\n\
-`-' means \"minus zero\".")
+The value of `left' or `top' may be an integer,\n\
+or a list (+ N) meaning N pixels relative to top/left corner,\n\
+or a list (- N) meaning -N pixels relative to bottom/right corner.")
      (string)
      Lisp_Object string;
 {
@@ -1618,8 +1674,10 @@
     {
       Lisp_Object element;
 
-      if (x == 0 && (geometry & XNegative))
-	element = Fcons (Qleft, Qminus);
+      if (x >= 0 && (geometry & XNegative))
+	element = Fcons (Qleft, Fcons (Qminus, Fcons (make_number (-x), Qnil)));
+      else if (x < 0 && ! (geometry & XNegative))
+	element = Fcons (Qleft, Fcons (Qplus, Fcons (make_number (x), Qnil)));
       else
 	element = Fcons (Qleft, make_number (x));
       result = Fcons (element, result);
@@ -1629,8 +1687,10 @@
     {
       Lisp_Object element;
 
-      if (y == 0 && (geometry & YNegative))
-	element = Fcons (Qtop, Qminus);
+      if (y >= 0 && (geometry & YNegative))
+	element = Fcons (Qtop, Fcons (Qminus, Fcons (make_number (-y), Qnil)));
+      else if (y < 0 && ! (geometry & YNegative))
+	element = Fcons (Qtop, Fcons (Qplus, Fcons (make_number (y), Qnil)));
       else
 	element = Fcons (Qtop, make_number (y));
       result = Fcons (element, result);
@@ -1710,6 +1770,19 @@
 	  f->display.x->top_pos = 0;
 	  window_prompting |= YNegative;
 	}
+      else if (CONSP (tem0) && EQ (XCONS (tem0)->car, Qminus)
+	       && CONSP (XCONS (tem0)->cdr)
+	       && INTEGERP (XCONS (XCONS (tem0)->cdr)->car))
+	{
+	  f->display.x->top_pos = - XINT (XCONS (XCONS (tem0)->cdr)->car);
+	  window_prompting |= YNegative;
+	}
+      else if (CONSP (tem0) && EQ (XCONS (tem0)->car, Qplus)
+	       && CONSP (XCONS (tem0)->cdr)
+	       && INTEGERP (XCONS (XCONS (tem0)->cdr)->car))
+	{
+	  f->display.x->top_pos = XINT (XCONS (XCONS (tem0)->cdr)->car);
+	}
       else if (EQ (tem0, Qunbound))
 	f->display.x->top_pos = 0;
       else
@@ -1725,6 +1798,19 @@
 	  f->display.x->left_pos = 0;
 	  window_prompting |= XNegative;
 	}
+      else if (CONSP (tem1) && EQ (XCONS (tem1)->car, Qminus)
+	       && CONSP (XCONS (tem1)->cdr)
+	       && INTEGERP (XCONS (XCONS (tem1)->cdr)->car))
+	{
+	  f->display.x->left_pos = - XINT (XCONS (XCONS (tem1)->cdr)->car);
+	  window_prompting |= XNegative;
+	}
+      else if (CONSP (tem1) && EQ (XCONS (tem1)->car, Qplus)
+	       && CONSP (XCONS (tem1)->cdr)
+	       && INTEGERP (XCONS (XCONS (tem1)->cdr)->car))
+	{
+	  f->display.x->left_pos = XINT (XCONS (XCONS (tem1)->cdr)->car);
+	}
       else if (EQ (tem1, Qunbound))
 	f->display.x->left_pos = 0;
       else
@@ -1907,9 +1993,9 @@
 	int xneg = window_prompting & XNegative;
 	int top = f->display.x->top_pos;
 	int yneg = window_prompting & YNegative;
-	if (left < 0)
+	if (xneg)
 	  left = -left;
-	if (top < 0)
+	if (yneg)
 	  top = -top;
 	sprintf (shell_position, "=%dx%d%c%d%c%d", PIXEL_WIDTH (f), 
 		 PIXEL_HEIGHT (f) + menubar_size,
@@ -2308,7 +2394,7 @@
 		       "borderColor", "BorderColor", string);
 
   x_default_parameter (f, parms, Qmenu_bar_lines, make_number (1),
-		       "menuBarLines", "MenuBarLines", number);
+		       "menuBar", "MenuBar", number);
   x_default_parameter (f, parms, Qscroll_bar_width, make_number (12),
 		       "scrollBarWidth", "ScrollBarWidth", number);