Commit 50bf7673 authored by Steven Tamm's avatar Steven Tamm
Browse files

Support Tooltips with the Carbon emacs port.

Some code cleanup using helper macros.
parent f2f82fa4
2004-05-29 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
* macfns.c: Don't include ccl.h.
[MAC_OSX]: Don't include QuickTime/QuickTime.h.
[!MAC_OSX]: Don't include alloca.h, Windows.h, Gestalt.h, or
TextUtils.h.
(Fx_create_frame): Sync with xfns.c. Initialize cursor
descriptors.
(Fx_display_mm_height, Fx_display_mm_width): Calculate length from
display height/width.
(compute_tip_xy, Vx_max_tooltip_size): Declare.
(unwind_create_tip_frame, compute_tip_xy): New functions.
(x_create_tip_frame, Fx_show_tip, Fx_hide_tip): Sync with xfns.c.
(syms_of_macfns): Initialize Qcancel_timer, Vx_max_tooltip_size,
and last_show_tip_args.
* macgui.h [!MAC_OSX]: Include Gestalt.h.
(Cursor, No_Cursor): New defines.
[!TARGET_API_MAC_CARBON] (SetPortWindowPort): New compatibility
macro.
[!TARGET_API_MAC_CARBON] (arrow_cursor): Declare.
* macmenu.c (mac_menu_show, mac_dialog): Use SetPortWindowPort.
* macterm.c: Don't include Gestalt.h.
(enum mouse_tracking_type, mouse_tracking_in_progress): Remove.
(XDrawLine, XClearArea, XClearWindow, mac_draw_bitmap)
(mac_set_clip_rectangle, mac_reset_clipping, XCreatePixmap)
(XFillRectangle, mac_draw_rectangle, mac_draw_string_common)
(mac_copy_area, mac_copy_area_with_mask, x_update_end)
(construct_mouse_click, XTmouse_position)
(x_scroll_bar_report_motion, x_calc_absolute_position)
(do_mouse_moved, do_zoom_window, mac_do_receive_drag)
(XTread_socket, make_mac_frame): Use SetPortWindowPort.
(note_mouse_movement): Clear the mouse face and reset the pointer
shape when the pointer goes outside the frame without grabbing.
(mac_front_window): New function.
(mac_window_to_frame): New macro.
(XTmouse_position, x_scroll_bar_report_motion, do_window_update)
(do_window_activate, do_window_deactivate, do_app_resume)
(do_app_suspend, do_mouse_moved, do_menu_choice, do_grow_window)
(do_zoom_window, mac_do_receive_drag, XTread_socket)
(mac_check_for_quit_char): Use mac_front_window and/or
mac_window_to_frame.
(x_scroll_bar_handle_click): Set `(PORTION . WHOLE)' part in a
scroll-bar click event.
(mac_define_frame_cursor): Change the pointer shape.
(x_free_frame_resources): Reset tip_window to NULL when it is
disposed.
[!TARGET_API_MAC_CARBON] (arrow_cursor): New variable.
[!TARGET_API_MAC_CARBON] (do_init_managers): Initialize
arrow_cursor.
(do_window_update): Don't do anything if the updated window is the
tooltip window.
(do_mouse_moved): Handle mouse movement events here (previously in
XTread_socket). Clear the mouse face if
dpyinfo->mouse_face_hidden is set.
(do_os_event, do_events): Remove (now in XTread_socket).
(XTread_socket): Immediately return if interrupt_input_blocked.
Loop until all the events in the queue are processed. Rearrange
codes for mouse grabbing. Add tooltip support. Include the
contents of do_os_event and do_events. Remove mouse movement
handling (now in do_mouse_moved). Add the case where
Vmouse_highlight has an integer value.
(NewMacWindow): Remove.
(make_mac_frame): Do what NewMacWindow previously did. Don't do
excess initializations.
(make_mac_terminal_frame): Previous initializations in
make_mac_frame are moved here.
(mac_initialize_display_info): Initialize
dpyinfo->mouse_face_overlay and dpyinfo->mouse_face_hidden.
* xdisp.c [MAC_OS] (No_Cursor): Remove variable.
(define_frame_cursor1): Don't treat HAVE_CARBON as a special case.
2004-05-29 Richard M. Stallman <rms@gnu.org> 2004-05-29 Richard M. Stallman <rms@gnu.org>
* lisp.h (truncate_undo_list): Update decl. * lisp.h (truncate_undo_list): Update decl.
......
...@@ -42,7 +42,6 @@ Boston, MA 02111-1307, USA. */ ...@@ -42,7 +42,6 @@ Boston, MA 02111-1307, USA. */
#include "epaths.h" #include "epaths.h"
#include "termhooks.h" #include "termhooks.h"
#include "coding.h" #include "coding.h"
#include "ccl.h"
#include "systime.h" #include "systime.h"
/* #include "bitmaps/gray.xbm" */ /* #include "bitmaps/gray.xbm" */
...@@ -59,17 +58,6 @@ static unsigned char gray_bits[] = { ...@@ -59,17 +58,6 @@ static unsigned char gray_bits[] = {
#include <stdlib.h> #include <stdlib.h>
#include <string.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 void free_frame_menubar ();
extern double atof (); extern double atof ();
...@@ -2580,8 +2568,6 @@ This function is an internal primitive--use `make-frame' instead. */) ...@@ -2580,8 +2568,6 @@ This function is an internal primitive--use `make-frame' instead. */)
f->output_data.mac = (struct mac_output *) xmalloc (sizeof (struct mac_output)); f->output_data.mac = (struct mac_output *) xmalloc (sizeof (struct mac_output));
bzero (f->output_data.mac, sizeof (struct mac_output)); bzero (f->output_data.mac, sizeof (struct mac_output));
FRAME_FONTSET (f) = -1; 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); record_unwind_protect (unwind_create_frame, frame);
f->icon_name f->icon_name
...@@ -2717,25 +2703,32 @@ This function is an internal primitive--use `make-frame' instead. */) ...@@ -2717,25 +2703,32 @@ This function is an internal primitive--use `make-frame' instead. */)
f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window; f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window;
/* MAC_TODO: specify 1 below when toolbars are implemented. */ #if TARGET_API_MAC_CARBON
window_prompting = x_figure_window_size (f, parms, 0); 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); tem = mac_get_arg (parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN);
f->no_split = minibuffer_only || EQ (tem, Qt); 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); */ /* mac_window (f, window_prompting, minibuffer_only); */
make_mac_frame (f); make_mac_frame (f);
x_icon (f, parms); x_icon (f, parms);
x_make_gc (f); x_make_gc (f);
/* Now consider the frame official. */ /* Now consider the frame official. */
...@@ -2754,7 +2747,8 @@ This function is an internal primitive--use `make-frame' instead. */) ...@@ -2754,7 +2747,8 @@ This function is an internal primitive--use `make-frame' instead. */)
x_default_parameter (f, parms, Qcursor_type, Qbox, x_default_parameter (f, parms, Qcursor_type, Qbox,
"cursorType", "CursorType", RES_TYPE_SYMBOL); "cursorType", "CursorType", RES_TYPE_SYMBOL);
x_default_parameter (f, parms, Qscroll_bar_width, Qnil, x_default_parameter (f, parms, Qscroll_bar_width, Qnil,
"scrollBarWidth", "ScrollBarWidth", RES_TYPE_NUMBER); "scrollBarWidth", "ScrollBarWidth",
RES_TYPE_NUMBER);
/* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size. /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
Change will not be effected unless different from the current Change will not be effected unless different from the current
...@@ -2762,13 +2756,10 @@ This function is an internal primitive--use `make-frame' instead. */) ...@@ -2762,13 +2756,10 @@ This function is an internal primitive--use `make-frame' instead. */)
width = FRAME_COLS (f); width = FRAME_COLS (f);
height = FRAME_LINES (f); height = FRAME_LINES (f);
FRAME_LINES (f) = 0;
SET_FRAME_COLS (f, 0); SET_FRAME_COLS (f, 0);
FRAME_LINES (f) = 0;
change_frame_size (f, height, width, 1, 0, 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 */ #if 0 /* MAC_TODO: when we have window manager hints */
/* Tell the server what size and position, etc, we want, and how /* 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 badly we want them. This should be done after we have the menu
...@@ -3025,11 +3016,8 @@ If omitted or nil, that stands for the selected frame's display. */) ...@@ -3025,11 +3016,8 @@ If omitted or nil, that stands for the selected frame's display. */)
/* MAC_TODO: this is an approximation, and only of the main display */ /* MAC_TODO: this is an approximation, and only of the main display */
struct mac_display_info *dpyinfo = check_x_display_info (display); struct mac_display_info *dpyinfo = check_x_display_info (display);
short h, v;
ScreenRes (&h, &v); return make_number ((int) (dpyinfo->height * 25.4 / dpyinfo->resy));
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, DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0,
...@@ -3043,11 +3031,8 @@ If omitted or nil, that stands for the selected frame's display. */) ...@@ -3043,11 +3031,8 @@ If omitted or nil, that stands for the selected frame's display. */)
/* MAC_TODO: this is an approximation, and only of the main display */ /* MAC_TODO: this is an approximation, and only of the main display */
struct mac_display_info *dpyinfo = check_x_display_info (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)); return make_number ((int) (dpyinfo->width * 25.4 / dpyinfo->resx));
} }
DEFUN ("x-display-backing-store", Fx_display_backing_store, DEFUN ("x-display-backing-store", Fx_display_backing_store,
...@@ -3595,9 +3580,11 @@ hide_hourglass () ...@@ -3595,9 +3580,11 @@ hide_hourglass ()
***********************************************************************/ ***********************************************************************/
static Lisp_Object x_create_tip_frame P_ ((struct mac_display_info *, static Lisp_Object x_create_tip_frame P_ ((struct mac_display_info *,
Lisp_Object)); 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, or null. */ /* The frame of a currently visible tooltip. */
Lisp_Object tip_frame; Lisp_Object tip_frame;
...@@ -3612,15 +3599,42 @@ Window tip_window; ...@@ -3612,15 +3599,42 @@ Window tip_window;
Lisp_Object last_show_tip_args; 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. /* Create a frame for a tooltip on the display described by DPYINFO.
PARMS is a list of frame parameters. Value is the frame. */ 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 static Lisp_Object
x_create_tip_frame (dpyinfo, parms) x_create_tip_frame (dpyinfo, parms, text)
struct mac_display_info *dpyinfo; struct mac_display_info *dpyinfo;
Lisp_Object parms; Lisp_Object parms, text;
{ {
#if 0 /* MAC_TODO : Mac version */
struct frame *f; struct frame *f;
Lisp_Object frame, tem; Lisp_Object frame, tem;
Lisp_Object name; Lisp_Object name;
...@@ -3629,8 +3643,11 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3629,8 +3643,11 @@ x_create_tip_frame (dpyinfo, parms)
int count = SPECPDL_INDEX (); int count = SPECPDL_INDEX ();
struct gcpro gcpro1, gcpro2, gcpro3; struct gcpro gcpro1, gcpro2, gcpro3;
struct kboard *kb; struct kboard *kb;
int face_change_count_before = face_change_count;
Lisp_Object buffer;
struct buffer *old_buffer;
check_x (); check_mac ();
/* Use this general default value to start with until we know if /* Use this general default value to start with until we know if
this frame has a specified name. */ this frame has a specified name. */
...@@ -3643,7 +3660,7 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3643,7 +3660,7 @@ x_create_tip_frame (dpyinfo, parms)
#endif #endif
/* Get the name of the frame to use for resource lookup. */ /* Get the name of the frame to use for resource lookup. */
name = w32_get_arg (parms, Qname, "name", "Name", RES_TYPE_STRING); name = mac_get_arg (parms, Qname, "name", "Name", RES_TYPE_STRING);
if (!STRINGP (name) if (!STRINGP (name)
&& !EQ (name, Qunbound) && !EQ (name, Qunbound)
&& !NILP (name)) && !NILP (name))
...@@ -3652,31 +3669,50 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3652,31 +3669,50 @@ x_create_tip_frame (dpyinfo, parms)
frame = Qnil; frame = Qnil;
GCPRO3 (parms, name, frame); GCPRO3 (parms, name, frame);
tip_frame = f = make_frame (1); f = make_frame (1);
XSETFRAME (frame, f); 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; FRAME_CAN_HAVE_SCROLL_BARS (f) = 0;
record_unwind_protect (unwind_create_tip_frame, frame);
f->output_method = output_w32; /* By setting the output method, we're essentially saying that
f->output_data.w32 = the frame is live, as per FRAME_LIVE_P. If we get a signal
(struct w32_output *) xmalloc (sizeof (struct w32_output)); from this point on, x_destroy_window might screw up reference
bzero (f->output_data.w32, sizeof (struct w32_output)); counts etc. */
#if 0 f->output_method = output_mac;
f->output_data.w32->icon_bitmap = -1; f->output_data.mac =
#endif (struct mac_output *) xmalloc (sizeof (struct mac_output));
FRAME_FONTSET (f) = -1; bzero (f->output_data.mac, sizeof (struct mac_output));
FRAME_FONTSET (f) = -1;
f->icon_name = Qnil; 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 #ifdef MULTI_KBOARD
FRAME_KBOARD (f) = kb; FRAME_KBOARD (f) = kb;
#endif #endif
f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO (f)->root_window; f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window;
f->output_data.w32->explicit_parent = 0; f->output_data.mac->explicit_parent = 0;
/* Set the name; the functions to which we pass f expect the name to /* Set the name; the functions to which we pass f expect the name to
be set. */ be set. */
if (EQ (name, Qunbound) || NILP (name)) if (EQ (name, Qunbound) || NILP (name))
{ {
f->name = build_string (dpyinfo->x_id_name); f->name = build_string (dpyinfo->mac_id_name);
f->explicit_name = 0; f->explicit_name = 0;
} }
else else
...@@ -3687,12 +3723,12 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3687,12 +3723,12 @@ x_create_tip_frame (dpyinfo, parms)
specbind (Qx_resource_name, name); specbind (Qx_resource_name, name);
} }
/* Extract the window parameters from the supplied values /* Extract the window parameters from the supplied values that are
that are needed to determine window geometry. */ needed to determine window geometry. */
{ {
Lisp_Object font; Lisp_Object font;
font = w32_get_arg (parms, Qfont, "font", "Font", RES_TYPE_STRING); font = mac_get_arg (parms, Qfont, "font", "Font", RES_TYPE_STRING);
BLOCK_INPUT; BLOCK_INPUT;
/* First, try whatever font the caller has specified. */ /* First, try whatever font the caller has specified. */
...@@ -3706,22 +3742,16 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3706,22 +3742,16 @@ x_create_tip_frame (dpyinfo, parms)
} }
/* Try out a font which we hope has bold and italic variations. */ /* 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)) if (! STRINGP (font))
/* This was formerly the first thing tried, but it finds too many fonts font = x_new_font (f, "-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1");
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 those didn't work, look for something which will at least work. */
if (! STRINGP (font)) if (! STRINGP (font))
font = x_new_font (f, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1"); font = x_new_font (f, "-*-monaco-*-12-*-mac-roman");
if (! STRINGP (font))
font = x_new_font (f, "-*-courier-*-10-*-mac-roman");
UNBLOCK_INPUT; UNBLOCK_INPUT;
if (! STRINGP (font)) if (! STRINGP (font))
font = build_string ("fixed"); error ("Cannot find any usable font");
x_default_parameter (f, parms, Qfont, font, x_default_parameter (f, parms, Qfont, font,
"font", "Font", RES_TYPE_STRING); "font", "Font", RES_TYPE_STRING);
...@@ -3737,7 +3767,7 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3737,7 +3767,7 @@ x_create_tip_frame (dpyinfo, parms)
{ {
Lisp_Object value; Lisp_Object value;
value = w32_get_arg (parms, Qinternal_border_width, value = mac_get_arg (parms, Qinternal_border_width,
"internalBorder", "internalBorder", RES_TYPE_NUMBER); "internalBorder", "internalBorder", RES_TYPE_NUMBER);
if (! EQ (value, Qunbound)) if (! EQ (value, Qunbound))
parms = Fcons (Fcons (Qinternal_border_width, value), parms = Fcons (Fcons (Qinternal_border_width, value),
...@@ -3768,34 +3798,26 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3768,34 +3798,26 @@ x_create_tip_frame (dpyinfo, parms)
happen. */ happen. */
init_frame_faces (f); init_frame_faces (f);
f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO (f)->root_window; f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window;
window_prompting = x_figure_window_size (f, parms, 0); window_prompting = x_figure_window_size (f, parms, 0);
{ {
XSetWindowAttributes attrs;
unsigned long mask;
BLOCK_INPUT; BLOCK_INPUT;
mask = CWBackPixel | CWOverrideRedirect | CWSaveUnder | CWEventMask; Rect r;
/* Window managers looks at the override-redirect flag to
determine whether or net to give windows a decoration (Xlib SetRect (&r, 0, 0, 1, 1);
3.2.8). */ if (CreateNewWindow (kHelpWindowClass,
attrs.override_redirect = True; kWindowNoActivatesAttribute
attrs.save_under = True; | kWindowIgnoreClicksAttribute,
attrs.background_pixel = FRAME_BACKGROUND_PIXEL (f); &r, &tip_window) == noErr)
/* Arrange for getting MapNotify and UnmapNotify events. */ {
attrs.event_mask = StructureNotifyMask; FRAME_MAC_WINDOW (f) = tip_window;
tip_window SetWRefCon (tip_window, (long) f->output_data.mac);
= FRAME_W32_WINDOW (f) /* so that update events can find this mac_output struct */
= XCreateWindow (FRAME_W32_DISPLAY (f), f->output_data.mac->mFP = f;
FRAME_W32_DISPLAY_INFO (f)->root_window, ShowWindow (tip_window);
/* x, y, width, height */ }
0, 0, 1, 1,
/* Border. */
1,
CopyFromParent, InputOutput, CopyFromParent,
mask, &attrs);
UNBLOCK_INPUT; UNBLOCK_INPUT;
} }
...@@ -3813,8 +3835,8 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3813,8 +3835,8 @@ x_create_tip_frame (dpyinfo, parms)
FRAME_LINES (f). */ FRAME_LINES (f). */
width = FRAME_COLS (f); width = FRAME_COLS (f);
height = FRAME_LINES (f); height = FRAME_LINES (f);
FRAME_LINES (f) = 0;
SET_FRAME_COLS (f, 0); SET_FRAME_COLS (f, 0);
FRAME_LINES (f) = 0;
change_frame_size (f, height, width, 1, 0, 0); change_frame_size (f, height, width, 1, 0, 0);
/* Add `tooltip' frame parameter's default value. */ /* Add `tooltip' frame parameter's default value. */
...@@ -3822,6 +3844,26 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3822,6 +3844,26 @@ x_create_tip_frame (dpyinfo, parms)
Fmodify_frame_parameters (frame, Fcons (Fcons (intern ("tooltip"), Qt), Fmodify_frame_parameters (frame, Fcons (Fcons (intern ("tooltip"), Qt),
Qnil)); 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; f->no_split = 1;
UNGCPRO; UNGCPRO;
...@@ -3833,17 +3875,80 @@ x_create_tip_frame (dpyinfo, parms) ...@@ -3833,17 +3875,80 @@ x_create_tip_frame (dpyinfo, parms)
/* Now that the frame is official, it counts as a reference to /* Now that the frame is official, it counts as a reference to
its display. */ its display. */
FRAME_W32_DISPLAY_INFO (f)->reference_count++; 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); return unbind_to (count, frame);
#endif /* MAC_TODO */ }
return Qnil;
/* 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