emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/macfns.c [emacs-unicode-2]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/macfns.c [emacs-unicode-2]
Date: Mon, 28 Jun 2004 03:56:07 -0400

Index: emacs/src/macfns.c
diff -c emacs/src/macfns.c:1.24.4.1 emacs/src/macfns.c:1.24.4.2
*** emacs/src/macfns.c:1.24.4.1 Fri Apr 16 12:50:48 2004
--- emacs/src/macfns.c  Mon Jun 28 07:29:22 2004
***************
*** 1,5 ****
  /* Graphical user interface functions for Mac OS.
!    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
  
--- 1,5 ----
  /* Graphical user interface functions for Mac OS.
!    Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
  
***************
*** 42,48 ****
  #include "epaths.h"
  #include "termhooks.h"
  #include "coding.h"
- #include "ccl.h"
  #include "systime.h"
  
  /* #include "bitmaps/gray.xbm" */
--- 42,47 ----
***************
*** 59,75 ****
  
  #include <stdlib.h>
  #include <string.h>
- #ifndef MAC_OSX
- #include <alloca.h>
- #endif
- 
- #ifdef MAC_OSX
- #include <QuickTime/QuickTime.h>
- #else /* not MAC_OSX */
- #include <Windows.h>
- #include <Gestalt.h>
- #include <TextUtils.h>
- #endif /* not MAC_OSX */
  
  /*extern void free_frame_menubar ();
  extern double atof ();
--- 58,63 ----
***************
*** 2580,2587 ****
    f->output_data.mac = (struct mac_output *) xmalloc (sizeof (struct 
mac_output));
    bzero (f->output_data.mac, sizeof (struct mac_output));
    FRAME_FONTSET (f) = -1;
-   f->output_data.mac->scroll_bar_foreground_pixel = -1;
-   f->output_data.mac->scroll_bar_background_pixel = -1;
    record_unwind_protect (unwind_create_frame, frame);
  
    f->icon_name
--- 2568,2573 ----
***************
*** 2598,2604 ****
  
    if (!NILP (parent))
      {
!       f->output_data.mac->parent_desc = (Window) parent;
        f->output_data.mac->explicit_parent = 1;
      }
    else
--- 2584,2590 ----
  
    if (!NILP (parent))
      {
!       f->output_data.mac->parent_desc = (Window) XFASTINT (parent);
        f->output_data.mac->explicit_parent = 1;
      }
    else
***************
*** 2708,2714 ****
  
    x_default_parameter (f, parms, Qmenu_bar_lines, make_number (1),
                       "menuBar", "MenuBar", RES_TYPE_NUMBER);
!   x_default_parameter (f, parms, Qtool_bar_lines, make_number (0),
                         "toolBar", "ToolBar", RES_TYPE_NUMBER);
    x_default_parameter (f, parms, Qbuffer_predicate, Qnil,
                       "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL);
--- 2694,2700 ----
  
    x_default_parameter (f, parms, Qmenu_bar_lines, make_number (1),
                       "menuBar", "MenuBar", RES_TYPE_NUMBER);
!   x_default_parameter (f, parms, Qtool_bar_lines, make_number (1),
                         "toolBar", "ToolBar", RES_TYPE_NUMBER);
    x_default_parameter (f, parms, Qbuffer_predicate, Qnil,
                       "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL);
***************
*** 2717,2741 ****
  
    f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window;
  
!   /* MAC_TODO: specify 1 below when toolbars are implemented.  */
!   window_prompting = x_figure_window_size (f, parms, 0);
  
    tem = mac_get_arg (parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN);
    f->no_split = minibuffer_only || EQ (tem, Qt);
  
-   /* Create the window. Add the tool-bar height to the initial frame
-      height so that the user gets a text display area of the size he
-      specified with -g or via the registry. Later changes of the
-      tool-bar height don't change the frame size. This is done so that
-      users can create tall Emacs frames without having to guess how
-      tall the tool-bar will get. */
-   FRAME_LINES (f) += FRAME_TOOL_BAR_LINES (f);
- 
    /* mac_window (f, window_prompting, minibuffer_only); */
    make_mac_frame (f);
  
    x_icon (f, parms);
- 
    x_make_gc (f);
  
    /* Now consider the frame official.  */
--- 2703,2734 ----
  
    f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window;
  
! #if TARGET_API_MAC_CARBON
!   f->output_data.mac->text_cursor = kThemeIBeamCursor;
!   f->output_data.mac->nontext_cursor = kThemeArrowCursor;
!   f->output_data.mac->modeline_cursor = kThemeArrowCursor;
!   f->output_data.mac->hand_cursor = kThemePointingHandCursor;
!   f->output_data.mac->hourglass_cursor = kThemeWatchCursor;
!   f->output_data.mac->horizontal_drag_cursor = kThemeResizeLeftRightCursor;
! #else
!   f->output_data.mac->text_cursor = GetCursor (iBeamCursor);
!   f->output_data.mac->nontext_cursor = &arrow_cursor;
!   f->output_data.mac->modeline_cursor = &arrow_cursor;
!   f->output_data.mac->hand_cursor = &arrow_cursor;
!   f->output_data.mac->hourglass_cursor = GetCursor (watchCursor);
!   f->output_data.mac->horizontal_drag_cursor = &arrow_cursor;
! #endif
! 
!   /* Compute the size of the window.  */
!   window_prompting = x_figure_window_size (f, parms, 1);
  
    tem = mac_get_arg (parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN);
    f->no_split = minibuffer_only || EQ (tem, Qt);
  
    /* mac_window (f, window_prompting, minibuffer_only); */
    make_mac_frame (f);
  
    x_icon (f, parms);
    x_make_gc (f);
  
    /* Now consider the frame official.  */
***************
*** 2754,2760 ****
    x_default_parameter (f, parms, Qcursor_type, Qbox,
                       "cursorType", "CursorType", RES_TYPE_SYMBOL);
    x_default_parameter (f, parms, Qscroll_bar_width, Qnil,
!                      "scrollBarWidth", "ScrollBarWidth", RES_TYPE_NUMBER);
  
    /* Dimensions, especially FRAME_LINES (f), must be done via 
change_frame_size.
       Change will not be effected unless different from the current
--- 2747,2754 ----
    x_default_parameter (f, parms, Qcursor_type, Qbox,
                       "cursorType", "CursorType", RES_TYPE_SYMBOL);
    x_default_parameter (f, parms, Qscroll_bar_width, Qnil,
!                      "scrollBarWidth", "ScrollBarWidth",
!                      RES_TYPE_NUMBER);
  
    /* Dimensions, especially FRAME_LINES (f), must be done via 
change_frame_size.
       Change will not be effected unless different from the current
***************
*** 2762,2774 ****
    width = FRAME_COLS (f);
    height = FRAME_LINES (f);
  
-   FRAME_LINES (f) = 0;
    SET_FRAME_COLS (f, 0);
    change_frame_size (f, height, width, 1, 0, 0);
  
-   /* Set up faces after all frame parameters are known.  */
-   call1 (Qface_set_after_frame_default, frame);
- 
  #if 0 /* MAC_TODO: when we have window manager hints */
    /* Tell the server what size and position, etc, we want, and how
       badly we want them.  This should be done after we have the menu
--- 2756,2765 ----
    width = FRAME_COLS (f);
    height = FRAME_LINES (f);
  
    SET_FRAME_COLS (f, 0);
+   FRAME_LINES (f) = 0;
    change_frame_size (f, height, width, 1, 0, 0);
  
  #if 0 /* MAC_TODO: when we have window manager hints */
    /* Tell the server what size and position, etc, we want, and how
       badly we want them.  This should be done after we have the menu
***************
*** 2948,2955 ****
  {
    struct mac_display_info *dpyinfo = check_x_display_info (display);
  
!   /* MAC_TODO: check whether this is right */
!   return make_number (dpyinfo->n_planes >= 8 ? 256 : 1 << dpyinfo->n_planes - 
1);
  }
  
  DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
--- 2939,2946 ----
  {
    struct mac_display_info *dpyinfo = check_x_display_info (display);
  
!   /* We force 24+ bit depths to 24-bit to prevent an overflow.  */
!   return make_number (1 << min (dpyinfo->n_planes, 24));
  }
  
  DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
***************
*** 3025,3035 ****
    /* MAC_TODO: this is an approximation, and only of the main display */
  
    struct mac_display_info *dpyinfo = check_x_display_info (display);
-   short h, v;
  
!   ScreenRes (&h, &v);
! 
!   return make_number ((int) (v / 72.0 * 25.4));
  }
  
  DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 
0,
--- 3016,3023 ----
    /* MAC_TODO: this is an approximation, and only of the main display */
  
    struct mac_display_info *dpyinfo = check_x_display_info (display);
  
!   return make_number ((int) (dpyinfo->height * 25.4 / dpyinfo->resy));
  }
  
  DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 
0,
***************
*** 3043,3053 ****
    /* MAC_TODO: this is an approximation, and only of the main display */
  
    struct mac_display_info *dpyinfo = check_x_display_info (display);
-   short h, v;
- 
-   ScreenRes (&h, &v);
  
!   return make_number ((int) (h / 72.0 * 25.4));
  }
  
  DEFUN ("x-display-backing-store", Fx_display_backing_store,
--- 3031,3038 ----
    /* MAC_TODO: this is an approximation, and only of the main display */
  
    struct mac_display_info *dpyinfo = check_x_display_info (display);
  
!   return make_number ((int) (dpyinfo->width * 25.4 / dpyinfo->resx));
  }
  
  DEFUN ("x-display-backing-store", Fx_display_backing_store,
***************
*** 3595,3603 ****
   ***********************************************************************/
  
  static Lisp_Object x_create_tip_frame P_ ((struct mac_display_info *,
!                                          Lisp_Object));
  
! /* The frame of a currently visible tooltip, or null.  */
  
  Lisp_Object tip_frame;
  
--- 3580,3590 ----
   ***********************************************************************/
  
  static Lisp_Object x_create_tip_frame P_ ((struct mac_display_info *,
!                                          Lisp_Object, Lisp_Object));
! static void compute_tip_xy P_ ((struct frame *, Lisp_Object, Lisp_Object,
!                               Lisp_Object, int, int, int *, int *));
  
! /* The frame of a currently visible tooltip.  */
  
  Lisp_Object tip_frame;
  
***************
*** 3612,3626 ****
  
  Lisp_Object last_show_tip_args;
  
  /* Create a frame for a tooltip on the display described by DPYINFO.
!    PARMS is a list of frame parameters.  Value is the frame.  */
  
  static Lisp_Object
! x_create_tip_frame (dpyinfo, parms)
       struct mac_display_info *dpyinfo;
!      Lisp_Object parms;
  {
- #if 0 /* MAC_TODO : Mac version */
    struct frame *f;
    Lisp_Object frame, tem;
    Lisp_Object name;
--- 3599,3640 ----
  
  Lisp_Object last_show_tip_args;
  
+ /* Maximum size for tooltips; a cons (COLUMNS . ROWS).  */
+ 
+ Lisp_Object Vx_max_tooltip_size;
+ 
+ 
+ static Lisp_Object
+ unwind_create_tip_frame (frame)
+      Lisp_Object frame;
+ {
+   Lisp_Object deleted;
+ 
+   deleted = unwind_create_frame (frame);
+   if (EQ (deleted, Qt))
+     {
+       tip_window = NULL;
+       tip_frame = Qnil;
+     }
+ 
+   return deleted;
+ }
+ 
+ 
  /* Create a frame for a tooltip on the display described by DPYINFO.
!    PARMS is a list of frame parameters.  TEXT is the string to
!    display in the tip frame.  Value is the frame.
! 
!    Note that functions called here, esp. x_default_parameter can
!    signal errors, for instance when a specified color name is
!    undefined.  We have to make sure that we're in a consistent state
!    when this happens.  */
  
  static Lisp_Object
! x_create_tip_frame (dpyinfo, parms, text)
       struct mac_display_info *dpyinfo;
!      Lisp_Object parms, text;
  {
    struct frame *f;
    Lisp_Object frame, tem;
    Lisp_Object name;
***************
*** 3629,3636 ****
    int count = SPECPDL_INDEX ();
    struct gcpro gcpro1, gcpro2, gcpro3;
    struct kboard *kb;
  
!   check_x ();
  
    /* Use this general default value to start with until we know if
       this frame has a specified name.  */
--- 3643,3653 ----
    int count = SPECPDL_INDEX ();
    struct gcpro gcpro1, gcpro2, gcpro3;
    struct kboard *kb;
+   int face_change_count_before = face_change_count;
+   Lisp_Object buffer;
+   struct buffer *old_buffer;
  
!   check_mac ();
  
    /* Use this general default value to start with until we know if
       this frame has a specified name.  */
***************
*** 3643,3649 ****
  #endif
  
    /* Get the name of the frame to use for resource lookup.  */
!   name = w32_get_arg (parms, Qname, "name", "Name", RES_TYPE_STRING);
    if (!STRINGP (name)
        && !EQ (name, Qunbound)
        && !NILP (name))
--- 3660,3666 ----
  #endif
  
    /* Get the name of the frame to use for resource lookup.  */
!   name = mac_get_arg (parms, Qname, "name", "Name", RES_TYPE_STRING);
    if (!STRINGP (name)
        && !EQ (name, Qunbound)
        && !NILP (name))
***************
*** 3652,3682 ****
  
    frame = Qnil;
    GCPRO3 (parms, name, frame);
!   tip_frame = f = make_frame (1);
    XSETFRAME (frame, f);
    FRAME_CAN_HAVE_SCROLL_BARS (f) = 0;
  
!   f->output_method = output_w32;
!   f->output_data.w32 =
!     (struct w32_output *) xmalloc (sizeof (struct w32_output));
!   bzero (f->output_data.w32, sizeof (struct w32_output));
! #if 0
!   f->output_data.w32->icon_bitmap = -1;
! #endif
!   FRAME_FONTSET (f) = -1;
    f->icon_name = Qnil;
  
  #ifdef MULTI_KBOARD
    FRAME_KBOARD (f) = kb;
  #endif
!   f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO (f)->root_window;
!   f->output_data.w32->explicit_parent = 0;
  
    /* Set the name; the functions to which we pass f expect the name to
       be set.  */
    if (EQ (name, Qunbound) || NILP (name))
      {
!       f->name = build_string (dpyinfo->x_id_name);
        f->explicit_name = 0;
      }
    else
--- 3669,3718 ----
  
    frame = Qnil;
    GCPRO3 (parms, name, frame);
!   f = make_frame (1);
    XSETFRAME (frame, f);
+ 
+   buffer = Fget_buffer_create (build_string (" *tip*"));
+   Fset_window_buffer (FRAME_ROOT_WINDOW (f), buffer, Qnil);
+   old_buffer = current_buffer;
+   set_buffer_internal_1 (XBUFFER (buffer));
+   current_buffer->truncate_lines = Qnil;
+   specbind (Qinhibit_read_only, Qt);
+   specbind (Qinhibit_modification_hooks, Qt);
+   Ferase_buffer ();
+   Finsert (1, &text);
+   set_buffer_internal_1 (old_buffer);
+ 
    FRAME_CAN_HAVE_SCROLL_BARS (f) = 0;
+   record_unwind_protect (unwind_create_tip_frame, frame);
  
!   /* By setting the output method, we're essentially saying that
!      the frame is live, as per FRAME_LIVE_P.  If we get a signal
!      from this point on, x_destroy_window might screw up reference
!      counts etc.  */
!   f->output_method = output_mac;
!   f->output_data.mac =
!     (struct mac_output *) xmalloc (sizeof (struct mac_output));
!   bzero (f->output_data.mac, sizeof (struct mac_output));
! 
!   FRAME_FONTSET (f)  = -1;
    f->icon_name = Qnil;
  
+ #if 0 /* GLYPH_DEBUG TODO: image support.  */
+   image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount;
+   dpyinfo_refcount = dpyinfo->reference_count;
+ #endif /* GLYPH_DEBUG */
  #ifdef MULTI_KBOARD
    FRAME_KBOARD (f) = kb;
  #endif
!   f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window;
!   f->output_data.mac->explicit_parent = 0;
  
    /* Set the name; the functions to which we pass f expect the name to
       be set.  */
    if (EQ (name, Qunbound) || NILP (name))
      {
!       f->name = build_string (dpyinfo->mac_id_name);
        f->explicit_name = 0;
      }
    else
***************
*** 3687,3698 ****
        specbind (Qx_resource_name, name);
      }
  
!   /* Extract the window parameters from the supplied values
!      that are needed to determine window geometry.  */
    {
      Lisp_Object font;
  
!     font = w32_get_arg (parms, Qfont, "font", "Font", RES_TYPE_STRING);
  
      BLOCK_INPUT;
      /* First, try whatever font the caller has specified.  */
--- 3723,3734 ----
        specbind (Qx_resource_name, name);
      }
  
!   /* Extract the window parameters from the supplied values that are
!      needed to determine window geometry.  */
    {
      Lisp_Object font;
  
!     font = mac_get_arg (parms, Qfont, "font", "Font", RES_TYPE_STRING);
  
      BLOCK_INPUT;
      /* First, try whatever font the caller has specified.  */
***************
*** 3706,3727 ****
        }
  
      /* Try out a font which we hope has bold and italic variations.  */
-     if (!STRINGP (font))
-       font = x_new_font (f, 
"-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1");
-     if (!STRINGP (font))
-       font = x_new_font (f, 
"-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
-     if (! STRINGP (font))
-       font = x_new_font (f, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
      if (! STRINGP (font))
!       /* This was formerly the first thing tried, but it finds too many fonts
!        and takes too long.  */
!       font = x_new_font (f, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1");
      /* If those didn't work, look for something which will at least work.  */
      if (! STRINGP (font))
!       font = x_new_font (f, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1");
      UNBLOCK_INPUT;
      if (! STRINGP (font))
!       font = build_string ("fixed");
  
      x_default_parameter (f, parms, Qfont, font,
                         "font", "Font", RES_TYPE_STRING);
--- 3742,3757 ----
        }
  
      /* Try out a font which we hope has bold and italic variations.  */
      if (! STRINGP (font))
!       font = x_new_font (f, "-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1");
      /* If those didn't work, look for something which will at least work.  */
      if (! STRINGP (font))
!       font = x_new_font (f, "-*-monaco-*-12-*-mac-roman");
!     if (! STRINGP (font))
!       font = x_new_font (f, "-*-courier-*-10-*-mac-roman");
      UNBLOCK_INPUT;
      if (! STRINGP (font))
!       error ("Cannot find any usable font");
  
      x_default_parameter (f, parms, Qfont, font,
                         "font", "Font", RES_TYPE_STRING);
***************
*** 3737,3743 ****
      {
        Lisp_Object value;
  
!       value = w32_get_arg (parms, Qinternal_border_width,
                         "internalBorder", "internalBorder", RES_TYPE_NUMBER);
        if (! EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value),
--- 3767,3773 ----
      {
        Lisp_Object value;
  
!       value = mac_get_arg (parms, Qinternal_border_width,
                         "internalBorder", "internalBorder", RES_TYPE_NUMBER);
        if (! EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value),
***************
*** 3768,3801 ****
       happen.  */
    init_frame_faces (f);
  
!   f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO (f)->root_window;
  
    window_prompting = x_figure_window_size (f, parms, 0);
  
    {
!     XSetWindowAttributes attrs;
!     unsigned long mask;
  
      BLOCK_INPUT;
!     mask = CWBackPixel | CWOverrideRedirect | CWSaveUnder | CWEventMask;
!     /* Window managers looks at the override-redirect flag to
!        determine whether or net to give windows a decoration (Xlib
!        3.2.8).  */
!     attrs.override_redirect = True;
!     attrs.save_under = True;
!     attrs.background_pixel = FRAME_BACKGROUND_PIXEL (f);
!     /* Arrange for getting MapNotify and UnmapNotify events.  */
!     attrs.event_mask = StructureNotifyMask;
!     tip_window
!       = FRAME_W32_WINDOW (f)
!       = XCreateWindow (FRAME_W32_DISPLAY (f),
!                      FRAME_W32_DISPLAY_INFO (f)->root_window,
!                      /* x, y, width, height */
!                      0, 0, 1, 1,
!                      /* Border.  */
!                      1,
!                      CopyFromParent, InputOutput, CopyFromParent,
!                      mask, &attrs);
      UNBLOCK_INPUT;
    }
  
--- 3798,3825 ----
       happen.  */
    init_frame_faces (f);
  
!   f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window;
  
    window_prompting = x_figure_window_size (f, parms, 0);
  
    {
!     Rect r;
  
      BLOCK_INPUT;
!     SetRect (&r, 0, 0, 1, 1);
!     if (CreateNewWindow (kHelpWindowClass,
! #ifdef MAC_OS_X_VERSION_10_2
!                        kWindowIgnoreClicksAttribute |
! #endif
!                        kWindowNoActivatesAttribute,
!                        &r, &tip_window) == noErr)
!       {
!       FRAME_MAC_WINDOW (f) = tip_window;
!       SetWRefCon (tip_window, (long) f->output_data.mac);
!       /* so that update events can find this mac_output struct */
!       f->output_data.mac->mFP = f;
!       ShowWindow (tip_window);
!       }
      UNBLOCK_INPUT;
    }
  
***************
*** 3813,3820 ****
       FRAME_LINES (f).  */
    width = FRAME_COLS (f);
    height = FRAME_LINES (f);
-   FRAME_LINES (f) = 0;
    SET_FRAME_COLS (f, 0);
    change_frame_size (f, height, width, 1, 0, 0);
  
    /* Add `tooltip' frame parameter's default value. */
--- 3837,3844 ----
       FRAME_LINES (f).  */
    width = FRAME_COLS (f);
    height = FRAME_LINES (f);
    SET_FRAME_COLS (f, 0);
+   FRAME_LINES (f) = 0;
    change_frame_size (f, height, width, 1, 0, 0);
  
    /* Add `tooltip' frame parameter's default value. */
***************
*** 3822,3827 ****
--- 3846,3871 ----
      Fmodify_frame_parameters (frame, Fcons (Fcons (intern ("tooltip"), Qt),
                                            Qnil));
  
+   /* Set up faces after all frame parameters are known.  This call
+      also merges in face attributes specified for new frames.
+ 
+      Frame parameters may be changed if .Xdefaults contains
+      specifications for the default font.  For example, if there is an
+      `Emacs.default.attributeBackground: pink', the `background-color'
+      attribute of the frame get's set, which let's the internal border
+      of the tooltip frame appear in pink.  Prevent this.  */
+   {
+     Lisp_Object bg = Fframe_parameter (frame, Qbackground_color);
+ 
+     /* Set tip_frame here, so that */
+     tip_frame = frame;
+     call1 (Qface_set_after_frame_default, frame);
+ 
+     if (!EQ (bg, Fframe_parameter (frame, Qbackground_color)))
+       Fmodify_frame_parameters (frame, Fcons (Fcons (Qbackground_color, bg),
+                                             Qnil));
+   }
+ 
    f->no_split = 1;
  
    UNGCPRO;
***************
*** 3833,3849 ****
  
    /* Now that the frame is official, it counts as a reference to
       its display.  */
!   FRAME_W32_DISPLAY_INFO (f)->reference_count++;
  
    return unbind_to (count, frame);
! #endif /* MAC_TODO */
!   return Qnil;
  }
  
  
  DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
!        doc : /* Show STRING in a "tooltip" window on frame FRAME.
! A tooltip window is a small window displaying a string.
  
  FRAME nil or omitted means use the selected frame.
  
--- 3877,3956 ----
  
    /* Now that the frame is official, it counts as a reference to
       its display.  */
!   FRAME_MAC_DISPLAY_INFO (f)->reference_count++;
! 
!   /* Setting attributes of faces of the tooltip frame from resources
!      and similar will increment face_change_count, which leads to the
!      clearing of all current matrices.  Since this isn't necessary
!      here, avoid it by resetting face_change_count to the value it
!      had before we created the tip frame.  */
!   face_change_count = face_change_count_before;
  
+   /* Discard the unwind_protect.  */
    return unbind_to (count, frame);
! }
! 
! 
! /* Compute where to display tip frame F.  PARMS is the list of frame
!    parameters for F.  DX and DY are specified offsets from the current
!    location of the mouse.  WIDTH and HEIGHT are the width and height
!    of the tooltip.  Return coordinates relative to the root window of
!    the display in *ROOT_X, and *ROOT_Y.  */
! 
! static void
! compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y)
!      struct frame *f;
!      Lisp_Object parms, dx, dy;
!      int width, height;
!      int *root_x, *root_y;
! {
!   Lisp_Object left, top;
! 
!   /* User-specified position?  */
!   left = Fcdr (Fassq (Qleft, parms));
!   top  = Fcdr (Fassq (Qtop, parms));
! 
!   /* Move the tooltip window where the mouse pointer is.  Resize and
!      show it.  */
!   if (!INTEGERP (left) || !INTEGERP (top))
!     {
!       Point mouse_pos;
! 
!       BLOCK_INPUT;
!       GetMouse (&mouse_pos);
!       LocalToGlobal (&mouse_pos);
!       *root_x = mouse_pos.h;
!       *root_y = mouse_pos.v;
!       UNBLOCK_INPUT;
!     }
! 
!   if (INTEGERP (top))
!     *root_y = XINT (top);
!   else if (*root_y + XINT (dy) - height < 0)
!     *root_y -= XINT (dy);
!   else
!     {
!       *root_y -= height;
!       *root_y += XINT (dy);
!     }
! 
!   if (INTEGERP (left))
!     *root_x = XINT (left);
!   else if (*root_x + XINT (dx) + width <= FRAME_MAC_DISPLAY_INFO (f)->width)
!     /* It fits to the right of the pointer.  */
!     *root_x += XINT (dx);
!   else if (width + XINT (dx) <= *root_x)
!     /* It fits to the left of the pointer.  */
!     *root_x -= width + XINT (dx);
!   else
!     /* Put it left-justified on the screen -- it ought to fit that way.  */
!     *root_x = 0;
  }
  
  
  DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
!        doc: /* Show STRING in a "tooltip" window on frame FRAME.
! A tooltip window is a small X window displaying a string.
  
  FRAME nil or omitted means use the selected frame.
  
***************
*** 3859,3877 ****
  DX isn't specified).  Likewise for the y-position; if a `top' frame
  parameter is specified, it determines the y-position of the tooltip
  window, otherwise it is displayed at the mouse position, with offset
! DY added (default is 10).  */)
!   (string, frame, parms, timeout, dx, dy)
       Lisp_Object string, frame, parms, timeout, dx, dy;
  {
    struct frame *f;
    struct window *w;
!   Window root, child;
!   Lisp_Object buffer, top, left;
    struct buffer *old_buffer;
    struct text_pos pos;
    int i, width, height;
-   int root_x, root_y, win_x, win_y;
-   unsigned pmask;
    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
    int old_windows_or_buffers_changed = windows_or_buffers_changed;
    int count = SPECPDL_INDEX ();
--- 3966,3984 ----
  DX isn't specified).  Likewise for the y-position; if a `top' frame
  parameter is specified, it determines the y-position of the tooltip
  window, otherwise it is displayed at the mouse position, with offset
! DY added (default is -10).
! 
! A tooltip's maximum size is specified by `x-max-tooltip-size'.
! Text larger than the specified size is clipped.  */)
!      (string, frame, parms, timeout, dx, dy)
       Lisp_Object string, frame, parms, timeout, dx, dy;
  {
    struct frame *f;
    struct window *w;
!   int root_x, root_y;
    struct buffer *old_buffer;
    struct text_pos pos;
    int i, width, height;
    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
    int old_windows_or_buffers_changed = windows_or_buffers_changed;
    int count = SPECPDL_INDEX ();
***************
*** 3920,3932 ****
              call1 (Qcancel_timer, timer);
            }
  
- #if 0 /* MAC_TODO : Mac specifics */
          BLOCK_INPUT;
!         compute_tip_xy (f, parms, dx, dy, &root_x, &root_y);
!         XMoveWindow (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
!                      root_x, root_y - FRAME_PIXEL_HEIGHT (f));
          UNBLOCK_INPUT;
- #endif /* MAC_TODO */
          goto start_timer;
        }
      }
--- 4027,4037 ----
              call1 (Qcancel_timer, timer);
            }
  
          BLOCK_INPUT;
!         compute_tip_xy (f, parms, dx, dy, FRAME_PIXEL_WIDTH (f),
!                         FRAME_PIXEL_HEIGHT (f), &root_x, &root_y);
!         MoveWindow (FRAME_MAC_WINDOW (f), root_x, root_y, false);
          UNBLOCK_INPUT;
          goto start_timer;
        }
      }
***************
*** 3953,3978 ****
  
    /* Create a frame for the tooltip, and record it in the global
       variable tip_frame.  */
!   frame = x_create_tip_frame (FRAME_MAC_DISPLAY_INFO (f), parms);
    f = XFRAME (frame);
  
!   /* Set up the frame's root window.  Currently we use a size of 80
!      columns x 40 lines.  If someone wants to show a larger tip, he
!      will loose.  I don't think this is a realistic case.  */
    w = XWINDOW (FRAME_ROOT_WINDOW (f));
    w->left_col = w->top_line = make_number (0);
!   w->total_cols = make_number (80);
!   w->total_lines = make_number (40);
    adjust_glyphs (f);
    w->pseudo_window_p = 1;
  
    /* Display the tooltip text in a temporary buffer.  */
-   buffer = Fget_buffer_create (build_string (" *tip*"));
-   Fset_window_buffer (FRAME_ROOT_WINDOW (f), buffer, Qnil);
    old_buffer = current_buffer;
!   set_buffer_internal_1 (XBUFFER (buffer));
!   Ferase_buffer ();
!   Finsert (1, &string);
    clear_glyph_matrix (w->desired_matrix);
    clear_glyph_matrix (w->current_matrix);
    SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
--- 4058,4093 ----
  
    /* Create a frame for the tooltip, and record it in the global
       variable tip_frame.  */
!   frame = x_create_tip_frame (FRAME_MAC_DISPLAY_INFO (f), parms, string);
    f = XFRAME (frame);
  
!   /* Set up the frame's root window.  */
    w = XWINDOW (FRAME_ROOT_WINDOW (f));
    w->left_col = w->top_line = make_number (0);
! 
!   if (CONSP (Vx_max_tooltip_size)
!       && INTEGERP (XCAR (Vx_max_tooltip_size))
!       && XINT (XCAR (Vx_max_tooltip_size)) > 0
!       && INTEGERP (XCDR (Vx_max_tooltip_size))
!       && XINT (XCDR (Vx_max_tooltip_size)) > 0)
!     {
!       w->total_cols = XCAR (Vx_max_tooltip_size);
!       w->total_lines = XCDR (Vx_max_tooltip_size);
!     }
!   else
!     {
!       w->total_cols = make_number (80);
!       w->total_lines = make_number (40);
!     }
! 
!   FRAME_TOTAL_COLS (f) = XINT (w->total_cols);
    adjust_glyphs (f);
    w->pseudo_window_p = 1;
  
    /* Display the tooltip text in a temporary buffer.  */
    old_buffer = current_buffer;
!   set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f))->buffer));
!   current_buffer->truncate_lines = Qnil;
    clear_glyph_matrix (w->desired_matrix);
    clear_glyph_matrix (w->current_matrix);
    SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
***************
*** 3993,3999 ****
        /* Let the row go over the full width of the frame.  */
        row->full_width_p = 1;
  
!       /* There's a glyph at the end of rows that is use to place
         the cursor there.  Don't include the width of this glyph.  */
        if (row->used[TEXT_AREA])
        {
--- 4108,4114 ----
        /* Let the row go over the full width of the frame.  */
        row->full_width_p = 1;
  
!       /* There's a glyph at the end of rows that is used to place
         the cursor there.  Don't include the width of this glyph.  */
        if (row->used[TEXT_AREA])
        {
***************
*** 4014,4030 ****
  
    /* Move the tooltip window where the mouse pointer is.  Resize and
       show it.  */
! #if 0 /* TODO : Mac specifics */
!   compute_tip_xy (f, parms, dx, dy, &root_x, &root_y);
  
    BLOCK_INPUT;
!   XQueryPointer (FRAME_W32_DISPLAY (f), FRAME_W32_DISPLAY_INFO 
(f)->root_window,
!                &root, &child, &root_x, &root_y, &win_x, &win_y, &pmask);
!   XMoveResizeWindow (FRAME_W32_DISPLAY (f), FRAME_W32_WINDOW (f),
!                    root_x + 5, root_y - height - 5, width, height);
!   XMapRaised (FRAME_W32_DISPLAY (f), FRAME_W32_WINDOW (f));
    UNBLOCK_INPUT;
- #endif /* MAC_TODO */
  
    /* Draw into the window.  */
    w->must_be_updated_p = 1;
--- 4129,4141 ----
  
    /* Move the tooltip window where the mouse pointer is.  Resize and
       show it.  */
!   compute_tip_xy (f, parms, dx, dy, width, height, &root_x, &root_y);
  
    BLOCK_INPUT;
!   MoveWindow (FRAME_MAC_WINDOW (f), root_x, root_y, false);
!   SizeWindow (FRAME_MAC_WINDOW (f), width, height, true);
!   BringToFront (FRAME_MAC_WINDOW (f));
    UNBLOCK_INPUT;
  
    /* Draw into the window.  */
    w->must_be_updated_p = 1;
***************
*** 4046,4053 ****
  
  DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
         doc: /* Hide the current tooltip window, if there is any.
! Value is t is tooltip was open, nil otherwise.  */)
!   ()
  {
    int count;
    Lisp_Object deleted, frame, timer;
--- 4157,4164 ----
  
  DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
         doc: /* Hide the current tooltip window, if there is any.
! Value is t if tooltip was open, nil otherwise.  */)
!      ()
  {
    int count;
    Lisp_Object deleted, frame, timer;
***************
*** 4249,4255 ****
    staticpro (&Qsuppress_icon);
    Qundefined_color = intern ("undefined-color");
    staticpro (&Qundefined_color);
!   /* This is the end of symbol initialization.  */
  
    Qhyper = intern ("hyper");
    staticpro (&Qhyper);
--- 4360,4367 ----
    staticpro (&Qsuppress_icon);
    Qundefined_color = intern ("undefined-color");
    staticpro (&Qundefined_color);
!   Qcancel_timer = intern ("cancel-timer");
!   staticpro (&Qcancel_timer);
  
    Qhyper = intern ("hyper");
    staticpro (&Qhyper);
***************
*** 4265,4270 ****
--- 4377,4383 ----
    staticpro (&Qcontrol);
    Qshift = intern ("shift");
    staticpro (&Qshift);
+   /* This is the end of symbol initialization.  */
  
    /* Text property `display' should be nonsticky by default.  */
    Vtext_property_default_nonsticky
***************
*** 4314,4319 ****
--- 4427,4437 ----
               doc: /* A string indicating the foreground color of the cursor 
box.  */);
    Vx_cursor_fore_pixel = Qnil;
  
+   DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size,
+     doc: /* Maximum size for tooltips.  Value is a pair (COLUMNS . ROWS).
+ Text larger than this is clipped.  */);
+   Vx_max_tooltip_size = Fcons (make_number (80), make_number (40));
+ 
    DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager,
               doc: /* Non-nil if no window manager is in use.
  Emacs doesn't try to figure this out; this is always nil
***************
*** 4386,4391 ****
--- 4504,4512 ----
    tip_frame = Qnil;
    staticpro (&tip_frame);
  
+   last_show_tip_args = Qnil;
+   staticpro (&last_show_tip_args);
+ 
  #if 0 /* MAC_TODO */
    defsubr (&Sx_file_dialog);
  #endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]