]> code.delx.au - gnu-emacs/blobdiff - src/xfns.c
(change_frame_size): Handle FRAME_MENU_BAR_LINES.
[gnu-emacs] / src / xfns.c
index cb5aaca7af7c12da423cbef82601f099b26409a8..307aa35f0b09bb266b0cd5ee412de79de7531a18 100644 (file)
@@ -37,6 +37,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #ifdef HAVE_X_WINDOWS
 extern void abort ();
 
+#include <X11/bitmaps/gray>
+
 #define min(a,b) ((a) < (b) ? (a) : (b))
 #define max(a,b) ((a) > (b) ? (a) : (b))
 
@@ -58,9 +60,6 @@ Lisp_Object Vx_pointer_shape, Vx_nontext_pointer_shape, Vx_mode_pointer_shape;
 /* Color of chars displayed in cursor box. */
 Lisp_Object Vx_cursor_fore_pixel;
 
-/* If non-nil, use vertical bar cursor. */
-Lisp_Object Vbar_cursor;
-
 /* The X Visual we are using for X windows (the default) */
 Visual *screen_visual;
 
@@ -115,7 +114,6 @@ static char *x_visual_strings[] =
 Lisp_Object Vmouse_depressed;
 
 extern unsigned int x_mouse_x, x_mouse_y, x_mouse_grabbed;
-extern Lisp_Object unread_command_event;
 
 /* Atom for indicating window state to the window manager. */
 Atom Xatom_wm_change_state;
@@ -123,9 +121,6 @@ Atom Xatom_wm_change_state;
 /* When emacs became the selection owner. */
 extern Time x_begin_selection_own;
 
-/* The value of the current emacs selection. */
-extern Lisp_Object Vx_selection_value;
-
 /* Emacs' selection property identifier. */
 extern Atom Xatom_emacs_selection;
 
@@ -228,9 +223,12 @@ Time mouse_timestamp;
 Lisp_Object Qauto_raise;
 Lisp_Object Qauto_lower;
 Lisp_Object Qbackground_color;
+Lisp_Object Qbar;
 Lisp_Object Qborder_color;
 Lisp_Object Qborder_width;
+Lisp_Object Qbox;
 Lisp_Object Qcursor_color;
+Lisp_Object Qcursor_type;
 Lisp_Object Qfont;
 Lisp_Object Qforeground_color;
 Lisp_Object Qgeometry;
@@ -241,17 +239,18 @@ Lisp_Object Qiconic_startup;
 Lisp_Object Qinternal_border_width;
 Lisp_Object Qleft;
 Lisp_Object Qmouse_color;
+Lisp_Object Qnone;
 Lisp_Object Qparent_id;
 Lisp_Object Qsuppress_icon;
 Lisp_Object Qsuppress_initial_map;
 Lisp_Object Qtop;
 Lisp_Object Qundefined_color;
-Lisp_Object Qvertical_scrollbars;
+Lisp_Object Qvertical_scroll_bars;
 Lisp_Object Qwindow_id;
 Lisp_Object Qx_frame_parameter;
 
 /* The below are defined in frame.c. */
-extern Lisp_Object Qheight, Qminibuffer, Qname, Qnone, Qonly, Qwidth;
+extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
 extern Lisp_Object Qunsplittable;
 
 extern Lisp_Object Vwindow_system_version;
@@ -261,14 +260,6 @@ extern Lisp_Object Vglobal_mouse_map;
 
 /* Points to table of defined typefaces.  */
 struct face *x_face_table[MAX_FACES_AND_GLYPHS];
-
-static char gray_bits[] =
- {
-   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
-   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
-   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
-   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa
- };
 \f
 /* Return the Emacs frame-object corresponding to an X window.
    It could be the frame's main window or an icon window.  */
@@ -315,7 +306,7 @@ enum x_frame_parm
   X_PARM_NAME,
   X_PARM_AUTORAISE,
   X_PARM_AUTOLOWER,
-  X_PARM_VERT_SCROLLBAR,
+  X_PARM_VERT_SCROLL_BAR,
 };
 
 
@@ -330,6 +321,7 @@ void x_set_background_color ();
 void x_set_mouse_color ();
 void x_set_cursor_color ();
 void x_set_border_color ();
+void x_set_cursor_type ();
 void x_set_icon_type ();
 void x_set_font ();
 void x_set_border_width ();
@@ -337,7 +329,7 @@ void x_set_internal_border_width ();
 void x_explicitly_set_name ();
 void x_set_autoraise ();
 void x_set_autolower ();
-void x_set_vertical_scrollbars ();
+void x_set_vertical_scroll_bars ();
 
 static struct x_frame_parm_table x_frame_parms[] =
 {
@@ -346,14 +338,15 @@ static struct x_frame_parm_table x_frame_parms[] =
   "mouse-color", x_set_mouse_color,
   "cursor-color", x_set_cursor_color,
   "border-color", x_set_border_color,
+  "cursor-type", x_set_cursor_type,
   "icon-type", x_set_icon_type,
   "font", x_set_font,
   "border-width", x_set_border_width,
   "internal-border-width", x_set_internal_border_width,
   "name", x_explicitly_set_name,
-  "autoraise", x_set_autoraise,
-  "autolower", x_set_autolower,
-  "vertical-scrollbars", x_set_vertical_scrollbars,
+  "auto-raise", x_set_autoraise,
+  "auto-lower", x_set_autolower,
+  "vertical-scroll-bars", x_set_vertical_scroll_bars,
 };
 
 /* Attach the `x-frame-parameter' properties to
@@ -808,7 +801,8 @@ x_set_border_pixel (f, pix)
                         pix);
 #else
       if (pix < 0)
-        temp = XMakePixmap ((Bitmap) XStoreBitmap (16, 16, gray_bits),
+        temp = XMakePixmap ((Bitmap) XStoreBitmap (gray_width, gray_height,
+                                                  gray_bits),
                             BLACK_PIX_DEFAULT, WHITE_PIX_DEFAULT);
       else
         temp = XMakeTile (pix);
@@ -822,6 +816,24 @@ x_set_border_pixel (f, pix)
     }
 }
 
+void
+x_set_cursor_type (f, arg, oldval)
+     FRAME_PTR f;
+     Lisp_Object arg, oldval;
+{
+  if (EQ (arg, Qbar))
+    FRAME_DESIRED_CURSOR (f) = bar_cursor;
+  else if (EQ (arg, Qbox))
+    FRAME_DESIRED_CURSOR (f) = filled_box_cursor;
+  else
+    error
+      ("the `cursor-type' frame parameter should be either `bar' or `box'");
+
+  /* Make sure the cursor gets redrawn.  This is overkill, but how
+     often do people change cursor types?  */
+  update_mode_lines++;
+}
+
 void
 x_set_icon_type (f, arg, oldval)
      struct frame *f;
@@ -837,7 +849,7 @@ x_set_icon_type (f, arg, oldval)
   if (NILP (arg))
     result = x_text_icon (f, 0);
   else
-    result = x_bitmap_icon (f, 0);
+    result = x_bitmap_icon (f);
 
   if (result)
     {
@@ -918,12 +930,6 @@ x_set_internal_border_width (f, arg, oldval)
     }
 }
 
-void x_user_set_name (f, arg, oldval)
-     struct frame *f;
-     Lisp_Object arg, oldval;
-{
-}
-
 /* Change the name of frame F to ARG.  If ARG is nil, set F's name to
        x_id_name.
 
@@ -1031,13 +1037,13 @@ x_set_autolower (f, arg, oldval)
 }
 
 void
-x_set_vertical_scrollbars (f, arg, oldval)
+x_set_vertical_scroll_bars (f, arg, oldval)
      struct frame *f;
      Lisp_Object arg, oldval;
 {
-  if (NILP (arg) != ! FRAME_HAS_VERTICAL_SCROLLBARS (f))
+  if (NILP (arg) != ! FRAME_HAS_VERTICAL_SCROLL_BARS (f))
     {
-      FRAME_HAS_VERTICAL_SCROLLBARS (f) = ! NILP (arg);
+      FRAME_HAS_VERTICAL_SCROLL_BARS (f) = ! NILP (arg);
 
       /* We set this parameter before creating the X window for the
         frame, so we can get the geometry right from the start.
@@ -1582,9 +1588,9 @@ x_figure_window_size (f, parms)
   else if (! EQ (tem0, Qunbound) || ! EQ (tem1, Qunbound))
     error ("Must specify *both* height and width");
 
-  f->display.x->vertical_scrollbar_extra =
-    (FRAME_HAS_VERTICAL_SCROLLBARS (f)
-     ? VERTICAL_SCROLLBAR_PIXEL_WIDTH (f)
+  f->display.x->vertical_scroll_bar_extra =
+    (FRAME_HAS_VERTICAL_SCROLL_BARS (f)
+     ? VERTICAL_SCROLL_BAR_PIXEL_WIDTH (f)
      : 0);
   f->display.x->pixel_width = CHAR_TO_PIXEL_WIDTH (f, f->width);
   f->display.x->pixel_height = CHAR_TO_PIXEL_HEIGHT (f, f->height);
@@ -1796,31 +1802,12 @@ x_make_gc (f)
      the frame.  Since this depends on the frame's pixel values,
      this must be done on a per-frame basis. */
   f->display.x->border_tile =
-    XCreatePixmap (x_current_display, ROOT_WINDOW, 16, 16,
-                  DefaultDepth (x_current_display,
-                                XDefaultScreen (x_current_display)));
-  gc_values.foreground = f->display.x->foreground_pixel;
-  gc_values.background = f->display.x->background_pixel;
-  temp_gc = XCreateGC (x_current_display,
-                      (Drawable) f->display.x->border_tile,
-                      GCForeground | GCBackground, &gc_values);
-
-  /* These are things that should be determined by the server, in
-     Fx_open_connection */
-  tileimage.height = 16;
-  tileimage.width = 16;
-  tileimage.xoffset = 0;
-  tileimage.format = XYBitmap;
-  tileimage.data = gray_bits;
-  tileimage.byte_order = LSBFirst;
-  tileimage.bitmap_unit = 8;
-  tileimage.bitmap_bit_order = LSBFirst;
-  tileimage.bitmap_pad = 8;
-  tileimage.bytes_per_line = (16 + 7) >> 3;
-  tileimage.depth = 1;
-  XPutImage (x_current_display, f->display.x->border_tile, temp_gc,
-            &tileimage, 0, 0, 0, 0, 16, 16);
-  XFreeGC (x_current_display, temp_gc);
+    XCreatePixmapFromBitmapData
+      (x_current_display, ROOT_WINDOW, 
+       gray_bits, gray_width, gray_height,
+       f->display.x->foreground_pixel,
+       f->display.x->background_pixel,
+       DefaultDepth (x_current_display, XDefaultScreen (x_current_display)));
 }
 #endif /* HAVE_X11 */
 
@@ -1866,8 +1853,8 @@ be shared by the new frame.")
   else
     f = make_frame (1);
 
-  /* Note that X Windows does support scrollbars.  */
-  FRAME_CAN_HAVE_SCROLLBARS (f) = 1;
+  /* Note that X Windows does support scroll bars.  */
+  FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
 
   /* Set the name; the functions to which we pass f expect the name to
      be set.  */
@@ -1899,8 +1886,8 @@ be shared by the new frame.")
   /* This defaults to 2 in order to match xterm.  */
   x_default_parameter (f, parms, Qinternal_border_width, make_number (2),
                       "internalBorderWidth", "BorderWidth", number);
-  x_default_parameter (f, parms, Qvertical_scrollbars, Qt,
-                      "verticalScrollbars", "Scrollbars", boolean);
+  x_default_parameter (f, parms, Qvertical_scroll_bars, Qt,
+                      "verticalScrollBars", "ScrollBars", boolean);
 
   /* Also do the stuff which must be set before the window exists. */
   x_default_parameter (f, parms, Qforeground_color, build_string ("black"),
@@ -1930,6 +1917,8 @@ be shared by the new frame.")
                       "autoRaise", "AutoRaiseLower", boolean);
   x_default_parameter (f, parms, Qauto_lower, Qnil,
                       "autoLower", "AutoRaiseLower", boolean);
+  x_default_parameter (f, parms, Qcursor_type, Qbox,
+                      "cursorType", "CursorType", symbol);
 
   /* Dimensions, especially f->height, must be done via change_frame_size.
      Change will not be effected unless different from the current
@@ -2293,18 +2282,6 @@ x_rubber_band (f, x, y, width, height, geo, str, hscroll, vscroll)
 }
 #endif /* not HAVE_X11 */
 \f
-x_pixel_width (f)
-     register struct frame *f;
-{
-  return PIXEL_WIDTH (f);
-}
-
-x_pixel_height (f)
-     register struct frame *f;
-{
-  return PIXEL_HEIGHT (f);
-}
-\f
 DEFUN ("x-defined-color", Fx_defined_color, Sx_defined_color, 1, 1, 0,
   "Return t if the current X display supports the color named COLOR.")
   (color)
@@ -2340,22 +2317,28 @@ DEFUN ("x-color-display-p", Fx_color_display_p, Sx_color_display_p, 0, 0, 0,
     }
 }
 
-DEFUN ("x-pixel-width", Fx_pixel_width, Sx_pixel_width, 1, 1, 0,
-  "Return the width in pixels of FRAME.")
-  (frame)
-     Lisp_Object frame;
+x_pixel_width (f)
+     register struct frame *f;
 {
-  CHECK_LIVE_FRAME (frame, 0);
-  return make_number (XFRAME (frame)->display.x->pixel_width);
+  return PIXEL_WIDTH (f);
 }
 
-DEFUN ("x-pixel-height", Fx_pixel_height, Sx_pixel_height, 1, 1, 0,
-  "Return the height in pixels of FRAME.")
-  (frame)
-     Lisp_Object frame;
+x_pixel_height (f)
+     register struct frame *f;
 {
-  CHECK_LIVE_FRAME (frame, 0);
-  return make_number (XFRAME (frame)->display.x->pixel_height);
+  return PIXEL_HEIGHT (f);
+}
+
+x_char_width (f)
+     register struct frame *f;
+{
+  return FONT_WIDTH (f->display.x->font);
+}
+
+x_char_height (f)
+     register struct frame *f;
+{
+  return FONT_HEIGHT (f->display.x->font);
 }
 \f
 #if 0  /* These no longer seem like the right way to do things.  */
@@ -3108,7 +3091,7 @@ DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 1, 1, "e",
       BLOCK_INPUT;
     }
   while (XTYPE (obj) == Lisp_Cons                 /* Mouse event */
-        && EQ (Fcar (Fcdr (Fcdr (obj))), Qnil)    /* Not scrollbar */
+        && EQ (Fcar (Fcdr (Fcdr (obj))), Qnil)    /* Not scroll bar */
         && EQ (Vmouse_depressed, Qnil)              /* Only motion events */
         && EQ (Vmouse_window, selected_window)    /* In this window */
         && x_mouse_frame);
@@ -3212,14 +3195,14 @@ otherwise, wait for an event.  Returns a four-part list:\n\
 Normally X-POS and Y-POS are the position of the click on the frame\n\
  (measured in characters and lines), and WINDOW is the window clicked in.\n\
 KEYSEQ is a string, the key sequence to be looked up in the mouse maps.\n\
-If FRAME-PART is non-nil, the event was on a scrollbar;\n\
-then Y-POS is really the total length of the scrollbar, while X-POS is\n\
-the relative position of the scrollbar's value within that total length,\n\
+If FRAME-PART is non-nil, the event was on a scroll bar;\n\
+then Y-POS is really the total length of the scroll bar, while X-POS is\n\
+the relative position of the scroll bar's value within that total length,\n\
 and a third element OFFSET appears in that list: the height of the thumb-up\n\
 area at the top of the scroll bar.\n\
 FRAME-PART is one of the following symbols:\n\
- `vertical-scrollbar', `vertical-thumbup', `vertical-thumbdown',\n\
- `horizontal-scrollbar', `horizontal-thumbleft', `horizontal-thumbright'.\n\
+ `vertical-scroll-bar', `vertical-thumbup', `vertical-thumbdown',\n\
+ `horizontal-scroll-bar', `horizontal-thumbleft', `horizontal-thumbright'.\n\
 TIMESTAMP is the lower 23 bits of the X-server's timestamp for\n\
 the mouse event.")
   (arg)
@@ -3280,7 +3263,7 @@ the mouse event.")
                                                  Fcons (timestamp, Qnil)))));
                  return Vmouse_event;
                }
-             else if ((f = x_window_to_scrollbar (xrep.MouseWindow, &part, &prefix)) != 0)
+             else if ((f = x_window_to_scroll_bar (xrep.MouseWindow, &part, &prefix)) != 0)
                {
                  int pos, len;
                  Lisp_Object keyseq;
@@ -3289,17 +3272,17 @@ the mouse event.")
                  keyseq = concat2 (Fchar_to_string (make_number (prefix)),
                                    Fchar_to_string (make_number (com_letter)));
                  
-                 pos = xrep.MouseY - (f->display.x->v_scrollbar_width - 2);
+                 pos = xrep.MouseY - (f->display.x->v_scroll_bar_width - 2);
                  XSET (tempx, Lisp_Int, pos);
                  len = ((FONT_HEIGHT (f->display.x->font) * f->height)
                         + f->display.x->internal_border_width
-                        - (2 * (f->display.x->v_scrollbar_width - 2)));
+                        - (2 * (f->display.x->v_scroll_bar_width - 2)));
                  XSET (tempy, Lisp_Int, len);
                  XSET (timestamp, Lisp_Int, (xrep.MouseTime & 0x7fffff));
                  Vmouse_window = f->selected_window;
                  Vmouse_event
                    = Fcons (Fcons (tempx, Fcons (tempy, 
-                                                 Fcons (make_number (f->display.x->v_scrollbar_width - 2),
+                                                 Fcons (make_number (f->display.x->v_scroll_bar_width - 2),
                                                         Qnil))),
                             Fcons (Vmouse_window,
                                    Fcons (intern (part),
@@ -3349,7 +3332,7 @@ the mouse event.")
            default:
              if (f = x_window_to_frame (xrep.MouseWindow))
                Vmouse_window = f->selected_window;
-             else if (f = x_window_to_scrollbar (xrep.MouseWindow, &part, &prefix))
+             else if (f = x_window_to_scroll_bar (xrep.MouseWindow, &part, &prefix))
                Vmouse_window = f->selected_window;
              return Vmouse_event = Qnil;
            }
@@ -3784,12 +3767,18 @@ syms_of_xfns ()
   staticpro (&Qauto_lower);
   Qbackground_color = intern ("background-color");
   staticpro (&Qbackground_color);
+  Qbar = intern ("bar");
+  staticpro (&Qbar);
   Qborder_color = intern ("border-color");
   staticpro (&Qborder_color);
   Qborder_width = intern ("border-width");
   staticpro (&Qborder_width);
+  Qbox = intern ("box");
+  staticpro (&Qbox);
   Qcursor_color = intern ("cursor-color");
   staticpro (&Qcursor_color);
+  Qcursor_type = intern ("cursor-type");
+  staticpro (&Qcursor_type);
   Qfont = intern ("font");
   staticpro (&Qfont);
   Qforeground_color = intern ("foreground-color");
@@ -3810,6 +3799,8 @@ syms_of_xfns ()
   staticpro (&Qleft);
   Qmouse_color = intern ("mouse-color");
   staticpro (&Qmouse_color);
+  Qnone = intern ("none");
+  staticpro (&Qnone);
   Qparent_id = intern ("parent-id");
   staticpro (&Qparent_id);
   Qsuppress_icon = intern ("suppress-icon");
@@ -3820,8 +3811,8 @@ syms_of_xfns ()
   staticpro (&Qtop);
   Qundefined_color = intern ("undefined-color");
   staticpro (&Qundefined_color);
-  Qvertical_scrollbars = intern ("vertical-scrollbars");
-  staticpro (&Qvertical_scrollbars);
+  Qvertical_scroll_bars = intern ("vertical-scroll-bars");
+  staticpro (&Qvertical_scroll_bars);
   Qwindow_id = intern ("window-id");
   staticpro (&Qwindow_id);
   Qx_frame_parameter = intern ("x-frame-parameter");
@@ -3851,10 +3842,6 @@ syms_of_xfns ()
              "The shape of the pointer when over the mode line.");
   Vx_mode_pointer_shape = Qnil;
 
-  DEFVAR_LISP ("x-bar-cursor", &Vbar_cursor,
-              "*If non-nil, use a vertical bar cursor.  Otherwise, use the traditional box.");
-  Vbar_cursor = Qnil;
-
   DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel,
               "A string indicating the foreground color of the cursor box.");
   Vx_cursor_fore_pixel = Qnil;
@@ -3891,8 +3878,6 @@ Values can be the symbols Always, WhenMapped, or NotUseful.");
 
 #ifdef HAVE_X11
   defsubr (&Sx_get_resource);
-  defsubr (&Sx_pixel_width);
-  defsubr (&Sx_pixel_height);
 #if 0
   defsubr (&Sx_draw_rectangle);
   defsubr (&Sx_erase_rectangle);