diff options
Diffstat (limited to 'src/macfns.c')
-rw-r--r-- | src/macfns.c | 205 |
1 files changed, 108 insertions, 97 deletions
diff --git a/src/macfns.c b/src/macfns.c index 411340e8ad7..7afeaafd85b 100644 --- a/src/macfns.c +++ b/src/macfns.c @@ -107,7 +107,6 @@ extern Lisp_Object Vwindow_system_version; int image_cache_refcount, dpyinfo_refcount; #endif - #if 0 /* Use xstricmp instead. */ /* compare two strings ignoring case */ @@ -218,9 +217,6 @@ void x_explicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object)); void x_set_menu_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object)); void x_set_title P_ ((struct frame *, Lisp_Object, Lisp_Object)); void x_set_tool_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object)); - -extern void mac_get_window_bounds P_ ((struct frame *, Rect *, Rect *)); - /* Store the screen positions of frame F into XPTR and YPTR. @@ -1370,11 +1366,11 @@ x_set_mouse_color (f, arg, oldval) Cursor cursor, nontext_cursor, mode_cursor, hand_cursor; Cursor hourglass_cursor, horizontal_drag_cursor; unsigned long pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); - unsigned long mask_color = x->background_pixel; + unsigned long mask_color = FRAME_BACKGROUND_PIXEL (f); /* Don't let pointers be invisible. */ if (mask_color == pixel) - pixel = x->foreground_pixel; + pixel = FRAME_FOREGROUND_PIXEL (f); f->output_data.mac->mouse_pixel = pixel; @@ -1447,7 +1443,7 @@ x_set_mouse_color (f, arg, oldval) BLOCK_INPUT; if (FRAME_MAC_WINDOW (f) != 0) - rif->define_frame_cursor (f, cursor); + FRAME_TERMINAL (f)->rif->define_frame_cursor (f, cursor); f->output_data.mac->text_cursor = cursor; f->output_data.mac->nontext_cursor = nontext_cursor; @@ -1685,6 +1681,25 @@ x_set_tool_bar_lines (f, value, oldval) /* Make sure we redisplay all windows in this frame. */ ++windows_or_buffers_changed; +#if USE_MAC_TOOLBAR + FRAME_TOOL_BAR_LINES (f) = 0; + if (nlines) + { + FRAME_EXTERNAL_TOOL_BAR (f) = 1; + if (FRAME_MAC_P (f) && !IsWindowToolbarVisible (FRAME_MAC_WINDOW (f))) + /* Make sure next redisplay shows the tool bar. */ + XWINDOW (FRAME_SELECTED_WINDOW (f))->update_mode_line = Qt; + } + else + { + if (FRAME_EXTERNAL_TOOL_BAR (f)) + free_frame_tool_bar (f); + FRAME_EXTERNAL_TOOL_BAR (f) = 0; + } + + return; +#endif + delta = nlines - FRAME_TOOL_BAR_LINES (f); /* Don't resize the tool-bar to more than we have room for. */ @@ -1708,10 +1723,8 @@ x_set_tool_bar_lines (f, value, oldval) below the menu bar. */ if (FRAME_MAC_WINDOW (f) && FRAME_TOOL_BAR_LINES (f) == 0) { - updating_frame = f; - clear_frame (); + clear_frame (f); clear_current_matrices (f); - updating_frame = NULL; } /* If the tool bar gets smaller, the internal border below it @@ -2229,8 +2242,10 @@ XParseGeometry (string, x, y, width, height) /* Create and set up the Mac window for frame F. */ static void -mac_window (f) +mac_window (f, window_prompting, minibuffer_only) struct frame *f; + long window_prompting; + int minibuffer_only; { Rect r; @@ -2255,11 +2270,11 @@ mac_window (f) FRAME_MAC_WINDOW (f) = NULL; } } -#else +#else /* !TARGET_API_MAC_CARBON */ FRAME_MAC_WINDOW (f) = NewCWindow (NULL, &r, "\p", false, zoomDocProc, - (WindowPtr) -1, 1, (long) f->output_data.mac); -#endif + (WindowRef) -1, 1, (long) f->output_data.mac); +#endif /* !TARGET_API_MAC_CARBON */ /* so that update events can find this mac_output struct */ f->output_data.mac->mFP = f; /* point back to emacs frame */ @@ -2279,6 +2294,16 @@ mac_window (f) XSetWindowBackground (FRAME_MAC_DISPLAY(f), FRAME_MAC_WINDOW (f), FRAME_BACKGROUND_PIXEL (f)); +#if USE_MAC_TOOLBAR + /* At the moment, the size of the tool bar is not yet known. We + record the gravity value of the newly created window and use it + to adjust the position of the window (especially for a negative + specification of its vertical position) when the tool bar is + first redisplayed. */ + if (FRAME_EXTERNAL_TOOL_BAR (f)) + f->output_data.mac->toolbar_win_gravity = f->win_gravity; +#endif + validate_x_resource_name (); /* x_set_name normally ignores requests to set the name if the @@ -2393,8 +2418,8 @@ x_make_gc (f) = (XCreatePixmapFromBitmapData (FRAME_X_DISPLAY (f), FRAME_X_DISPLAY_INFO (f)->root_window, gray_bits, gray_width, gray_height, - f->output_data.x->foreground_pixel, - f->output_data.x->background_pixel, + FRAME_FOREGROUND_PIXEL (f), + FRAME_BACKGROUND_PIXEL (f), DefaultDepth (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)))); #endif @@ -2489,15 +2514,15 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame, 1, 1, 0, doc: /* Make a new window, which is called a "frame" in Emacs terms. Return an Emacs frame object. -ALIST is an alist of frame parameters. +PARAMETERS is an alist of frame parameters. If the parameters specify that the frame should not have a minibuffer, and do not specify a specific minibuffer window to use, then `default-minibuffer-frame' must be a frame whose minibuffer can be shared by the new frame. This function is an internal primitive--use `make-frame' instead. */) - (parms) - Lisp_Object parms; + (parameters) + Lisp_Object parameters; { struct frame *f; Lisp_Object frame, tem; @@ -2514,23 +2539,17 @@ This function is an internal primitive--use `make-frame' instead. */) check_mac (); - parms = Fcopy_alist (parms); - /* Use this general default value to start with until we know if this frame has a specified name. */ Vx_resource_name = Vinvocation_name; - display = mac_get_arg (parms, Qdisplay, 0, 0, RES_TYPE_STRING); + display = mac_get_arg (parameters, Qdisplay, 0, 0, RES_TYPE_STRING); if (EQ (display, Qunbound)) display = Qnil; dpyinfo = check_x_display_info (display); -#ifdef MULTI_KBOARD - kb = dpyinfo->kboard; -#else - kb = &the_only_kboard; -#endif + kb = dpyinfo->terminal->kboard; - name = mac_get_arg (parms, Qname, "name", "Name", RES_TYPE_STRING); + name = mac_get_arg (parameters, Qname, "name", "Name", RES_TYPE_STRING); if (!STRINGP (name) && ! EQ (name, Qunbound) && ! NILP (name)) @@ -2540,7 +2559,7 @@ This function is an internal primitive--use `make-frame' instead. */) Vx_resource_name = name; /* See if parent window is specified. */ - parent = mac_get_arg (parms, Qparent_id, NULL, NULL, RES_TYPE_NUMBER); + parent = mac_get_arg (parameters, Qparent_id, NULL, NULL, RES_TYPE_NUMBER); if (EQ (parent, Qunbound)) parent = Qnil; if (! NILP (parent)) @@ -2550,8 +2569,8 @@ This function is an internal primitive--use `make-frame' instead. */) /* No need to protect DISPLAY because that's not used after passing it to make_frame_without_minibuffer. */ frame = Qnil; - GCPRO4 (parms, parent, name, frame); - tem = mac_get_arg (parms, Qminibuffer, "minibuffer", "Minibuffer", + GCPRO4 (parameters, parent, name, frame); + tem = mac_get_arg (parameters, Qminibuffer, "minibuffer", "Minibuffer", RES_TYPE_SYMBOL); if (EQ (tem, Qnone) || NILP (tem)) f = make_frame_without_minibuffer (Qnil, kb, display); @@ -2570,27 +2589,29 @@ This function is an internal primitive--use `make-frame' instead. */) /* Note that X Windows does support scroll bars. */ FRAME_CAN_HAVE_SCROLL_BARS (f) = 1; + f->terminal = dpyinfo->terminal; + f->terminal->reference_count++; + 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; + record_unwind_protect (unwind_create_frame, frame); f->icon_name - = mac_get_arg (parms, Qicon_name, "iconName", "Title", RES_TYPE_STRING); + = mac_get_arg (parameters, Qicon_name, "iconName", "Title", RES_TYPE_STRING); if (! STRINGP (f->icon_name)) f->icon_name = Qnil; -/* FRAME_MAC_DISPLAY_INFO (f) = dpyinfo; */ + /* XXX Is this needed? */ + /*FRAME_MAC_DISPLAY_INFO (f) = dpyinfo;*/ /* With FRAME_MAC_DISPLAY_INFO set up, this unwind-protect is safe. */ - record_unwind_protect (unwind_create_frame, frame); #if GLYPH_DEBUG 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 /* Specify the parent under which to make this window. */ @@ -2625,7 +2646,7 @@ This function is an internal primitive--use `make-frame' instead. */) { Lisp_Object font; - font = mac_get_arg (parms, Qfont, "font", "Font", RES_TYPE_STRING); + font = mac_get_arg (parameters, Qfont, "font", "Font", RES_TYPE_STRING); BLOCK_INPUT; /* First, try whatever font the caller has specified. */ @@ -2637,7 +2658,6 @@ This function is an internal primitive--use `make-frame' instead. */) else font = x_new_font (f, SDATA (font)); } - /* Try out a font which we hope has bold and italic variations. */ #if USE_ATSUI if (! STRINGP (font)) @@ -2656,48 +2676,50 @@ This function is an internal primitive--use `make-frame' instead. */) error ("Cannot find any usable font"); UNBLOCK_INPUT; - x_set_frame_parameters (f, Fcons (Fcons (Qfont, font), Qnil)); + x_default_parameter (f, parameters, Qfont, font, + "font", "Font", RES_TYPE_STRING); } - x_default_parameter (f, parms, Qborder_width, make_number (0), + /* XXX Shouldn't this be borderWidth, not borderwidth ?*/ + x_default_parameter (f, parameters, Qborder_width, make_number (0), "borderwidth", "BorderWidth", RES_TYPE_NUMBER); /* This defaults to 2 in order to match xterm. We recognize either internalBorderWidth or internalBorder (which is what xterm calls it). */ - if (NILP (Fassq (Qinternal_border_width, parms))) + if (NILP (Fassq (Qinternal_border_width, parameters))) { Lisp_Object value; - value = mac_get_arg (parms, Qinternal_border_width, + value = mac_get_arg (parameters, Qinternal_border_width, "internalBorder", "InternalBorder", RES_TYPE_NUMBER); if (! EQ (value, Qunbound)) - parms = Fcons (Fcons (Qinternal_border_width, value), - parms); + parameters = Fcons (Fcons (Qinternal_border_width, value), + parameters); } /* Default internalBorderWidth to 0 on Windows to match other programs. */ - x_default_parameter (f, parms, Qinternal_border_width, make_number (0), + x_default_parameter (f, parameters, Qinternal_border_width, make_number (0), "internalBorderWidth", "InternalBorder", RES_TYPE_NUMBER); - x_default_parameter (f, parms, Qvertical_scroll_bars, Qright, + x_default_parameter (f, parameters, Qvertical_scroll_bars, Qright, "verticalScrollBars", "ScrollBars", RES_TYPE_SYMBOL); /* Also do the stuff which must be set before the window exists. */ - x_default_parameter (f, parms, Qforeground_color, build_string ("black"), + x_default_parameter (f, parameters, Qforeground_color, build_string ("black"), "foreground", "Foreground", RES_TYPE_STRING); - x_default_parameter (f, parms, Qbackground_color, build_string ("white"), + x_default_parameter (f, parameters, Qbackground_color, build_string ("white"), "background", "Background", RES_TYPE_STRING); - x_default_parameter (f, parms, Qmouse_color, build_string ("black"), + x_default_parameter (f, parameters, Qmouse_color, build_string ("black"), "pointerColor", "Foreground", RES_TYPE_STRING); - x_default_parameter (f, parms, Qcursor_color, build_string ("black"), + x_default_parameter (f, parameters, Qcursor_color, build_string ("black"), "cursorColor", "Foreground", RES_TYPE_STRING); - x_default_parameter (f, parms, Qborder_color, build_string ("black"), + x_default_parameter (f, parameters, Qborder_color, build_string ("black"), "borderColor", "BorderColor", RES_TYPE_STRING); - x_default_parameter (f, parms, Qscreen_gamma, Qnil, + x_default_parameter (f, parameters, Qscreen_gamma, Qnil, "screenGamma", "ScreenGamma", RES_TYPE_FLOAT); - x_default_parameter (f, parms, Qline_spacing, Qnil, + x_default_parameter (f, parameters, Qline_spacing, Qnil, "lineSpacing", "LineSpacing", RES_TYPE_NUMBER); - x_default_parameter (f, parms, Qleft_fringe, Qnil, + x_default_parameter (f, parameters, Qleft_fringe, Qnil, "leftFringe", "LeftFringe", RES_TYPE_NUMBER); - x_default_parameter (f, parms, Qright_fringe, Qnil, + x_default_parameter (f, parameters, Qright_fringe, Qnil, "rightFringe", "RightFringe", RES_TYPE_NUMBER); @@ -2709,29 +2731,29 @@ This function is an internal primitive--use `make-frame' instead. */) happen. */ init_frame_faces (f); - x_default_parameter (f, parms, Qmenu_bar_lines, make_number (1), + x_default_parameter (f, parameters, 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); - x_default_parameter (f, parms, Qtitle, Qnil, + x_default_parameter (f, parameters, Qtool_bar_lines, make_number (1), + "toolBar", "ToolBar", RES_TYPE_NUMBER); + + x_default_parameter (f, parameters, Qbuffer_predicate, Qnil, + "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL); + x_default_parameter (f, parameters, Qtitle, Qnil, "title", "Title", RES_TYPE_STRING); - x_default_parameter (f, parms, Qfullscreen, Qnil, + x_default_parameter (f, parameters, Qfullscreen, Qnil, "fullscreen", "Fullscreen", RES_TYPE_SYMBOL); f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window; /* Compute the size of the window. */ - window_prompting = x_figure_window_size (f, parms, 1); + window_prompting = x_figure_window_size (f, parameters, 1); - tem = mac_get_arg (parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN); + tem = mac_get_arg (parameters, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN); f->no_split = minibuffer_only || EQ (tem, Qt); - mac_window (f); + mac_window (f, window_prompting, minibuffer_only); + x_icon (f, parameters); - x_icon (f, parms); x_make_gc (f); /* Now consider the frame official. */ @@ -2740,18 +2762,17 @@ This function is an internal primitive--use `make-frame' instead. */) /* We need to do this after creating the window, so that the icon-creation functions can say whose icon they're describing. */ - x_default_parameter (f, parms, Qicon_type, Qnil, + x_default_parameter (f, parameters, Qicon_type, Qnil, "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL); - x_default_parameter (f, parms, Qauto_raise, Qnil, + x_default_parameter (f, parameters, Qauto_raise, Qnil, "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN); - x_default_parameter (f, parms, Qauto_lower, Qnil, + x_default_parameter (f, parameters, Qauto_lower, Qnil, "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN); - x_default_parameter (f, parms, Qcursor_type, Qbox, + x_default_parameter (f, parameters, Qcursor_type, Qbox, "cursorType", "CursorType", RES_TYPE_SYMBOL); - x_default_parameter (f, parms, Qscroll_bar_width, Qnil, - "scrollBarWidth", "ScrollBarWidth", - RES_TYPE_NUMBER); + x_default_parameter (f, parameters, 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 @@ -2759,8 +2780,8 @@ This function is an internal primitive--use `make-frame' instead. */) width = FRAME_COLS (f); height = FRAME_LINES (f); - SET_FRAME_COLS (f, 0); FRAME_LINES (f) = 0; + SET_FRAME_COLS (f, 0); change_frame_size (f, height, width, 1, 0, 0); /* Tell the server what size and position, etc, we want, and how @@ -2777,7 +2798,7 @@ This function is an internal primitive--use `make-frame' instead. */) { Lisp_Object visibility; - visibility = mac_get_arg (parms, Qvisibility, 0, 0, RES_TYPE_SYMBOL); + visibility = mac_get_arg (parameters, Qvisibility, 0, 0, RES_TYPE_SYMBOL); if (EQ (visibility, Qunbound)) visibility = Qt; @@ -2799,7 +2820,7 @@ This function is an internal primitive--use `make-frame' instead. */) /* All remaining specified parameters, which have not been "used" by x_get_arg and friends, now go in the misc. alist of the frame. */ - for (tem = parms; !NILP (tem); tem = XCDR (tem)) + for (tem = parameters; CONSP (tem); tem = XCDR (tem)) if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem)))) f->param_alist = Fcons (XCAR (tem), f->param_alist); @@ -3112,7 +3133,7 @@ If omitted or nil, that stands for the selected frame's display. */) UNBLOCK_INPUT; } #if MAC_OS_X_VERSION_MIN_REQUIRED == 1020 - else + else /* CGDisplayScreenSize == NULL */ #endif #endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 */ #if MAC_OS_X_VERSION_MAX_ALLOWED < 1030 || MAC_OS_X_VERSION_MIN_REQUIRED == 1020 @@ -3149,7 +3170,7 @@ If omitted or nil, that stands for the selected frame's display. */) UNBLOCK_INPUT; } #if MAC_OS_X_VERSION_MIN_REQUIRED == 1020 - else + else /* CGDisplayScreenSize == NULL */ #endif #endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 */ #if MAC_OS_X_VERSION_MAX_ALLOWED < 1030 || MAC_OS_X_VERSION_MIN_REQUIRED == 1020 @@ -3265,9 +3286,6 @@ x_display_info_for_name (name) CHECK_STRING (name); - if (! EQ (Vwindow_system, intern ("mac"))) - error ("Not using Mac native windows"); - for (dpyinfo = &one_mac_display_info, names = x_display_name_list; dpyinfo; dpyinfo = dpyinfo->next, names = XCDR (names)) @@ -3312,9 +3330,6 @@ terminate Emacs if we can't open the connection. */) if (! NILP (xrm_string)) CHECK_STRING (xrm_string); - if (! EQ (Vwindow_system, intern ("mac"))) - error ("Not using Mac native windows"); - if (! NILP (xrm_string)) xrm_option = (unsigned char *) SDATA (xrm_string); else @@ -3379,7 +3394,7 @@ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, Lisp_Object tail, result; result = Qnil; - for (tail = x_display_name_list; ! NILP (tail); tail = XCDR (tail)) + for (tail = x_display_name_list; CONSP (tail); tail = XCDR (tail)) result = Fcons (XCAR (XCAR (tail)), result); return result; @@ -3577,10 +3592,6 @@ start_hourglass () EMACS_TIME delay; int secs, usecs = 0; - /* Don't bother for ttys. */ - if (NILP (Vwindow_system)) - return; - cancel_hourglass (); if (INTEGERP (Vhourglass_delay) @@ -3792,11 +3803,7 @@ x_create_tip_frame (dpyinfo, parms, text) parms = Fcopy_alist (parms); -#ifdef MULTI_KBOARD - kb = dpyinfo->kboard; -#else - kb = &the_only_kboard; -#endif + kb = dpyinfo->terminal->kboard; /* Get the name of the frame to use for resource lookup. */ name = mac_get_arg (parms, Qname, "name", "Name", RES_TYPE_STRING); @@ -3828,6 +3835,8 @@ x_create_tip_frame (dpyinfo, parms, text) 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->terminal = dpyinfo->terminal; + f->terminal->reference_count++; f->output_method = output_mac; f->output_data.mac = (struct mac_output *) xmalloc (sizeof (struct mac_output)); @@ -3840,9 +3849,7 @@ x_create_tip_frame (dpyinfo, parms, text) 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; @@ -4068,8 +4075,12 @@ compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y) Point mouse_pos; BLOCK_INPUT; +#if TARGET_API_MAC_CARBON + GetGlobalMouse (&mouse_pos); +#else GetMouse (&mouse_pos); LocalToGlobal (&mouse_pos); +#endif *root_x = mouse_pos.h; *root_y = mouse_pos.v; UNBLOCK_INPUT; |