/* Graphical user interface functions for Mac OS.
- Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2004,
+ 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Emacs.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA. */
/* Contributed by Andrew Choi (akochoi@mac.com). */
#include <config.h>
-
-#include <signal.h>
#include <stdio.h>
#include <math.h>
-#include <limits.h>
-#include <errno.h>
#include "lisp.h"
-#include "charset.h"
#include "macterm.h"
#include "frame.h"
#include "window.h"
#include "buffer.h"
-#include "dispextern.h"
-#include "fontset.h"
#include "intervals.h"
+#include "dispextern.h"
#include "keyboard.h"
#include "blockinput.h"
-#include "epaths.h"
-#include "termhooks.h"
+#include <epaths.h>
+#include "charset.h"
#include "coding.h"
+#include "fontset.h"
#include "systime.h"
+#include "termhooks.h"
+#include "atimer.h"
-/* #include "bitmaps/gray.xbm" */
-#define gray_width 2
-#define gray_height 2
-static unsigned char gray_bits[] = {
- 0x01, 0x02};
-
-/*#include <commdlg.h>
-#include <shellapi.h>*/
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <limits.h>
+#include <errno.h>
#include <sys/param.h>
-#include <stdlib.h>
-#include <string.h>
-
-/*extern void free_frame_menubar ();
-extern double atof ();
-extern int w32_console_toggle_lock_key (int vk_code, Lisp_Object new_state);
-extern int quit_char;*/
-
-extern char *lispy_function_keys[];
-
-/* The gray bitmap `bitmaps/gray'. This is done because macterm.c uses
- it, and including `bitmaps/gray' more than once is a problem when
- config.h defines `static' as an empty replacement string. */
-
-int gray_bitmap_width = gray_width;
-int gray_bitmap_height = gray_height;
-unsigned char *gray_bitmap_bits = gray_bits;
+extern void free_frame_menubar ();
/* Non-zero means we're allowed to display an hourglass cursor. */
Lisp_Object Vx_pixel_size_width_font_regexp;
-/* Evaluate this expression to rebuild the section of syms_of_macfns
- that initializes and staticpros the symbols declared below. Note
- that Emacs 18 has a bug that keeps C-x C-e from being able to
- evaluate this expression.
-
-(progn
- ;; Accumulate a list of the symbols we want to initialize from the
- ;; declarations at the top of the file.
- (goto-char (point-min))
- (search-forward "/\*&&& symbols declared here &&&*\/\n")
- (let (symbol-list)
- (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)")
- (setq symbol-list
- (cons (buffer-substring (match-beginning 1) (match-end 1))
- symbol-list))
- (forward-line 1))
- (setq symbol-list (nreverse symbol-list))
- ;; Delete the section of syms_of_... where we initialize the symbols.
- (search-forward "\n /\*&&& init symbols here &&&*\/\n")
- (let ((start (point)))
- (while (looking-at "^ Q")
- (forward-line 2))
- (kill-region start (point)))
- ;; Write a new symbol initialization section.
- (while symbol-list
- (insert (format " %s = intern (\"" (car symbol-list)))
- (let ((start (point)))
- (insert (substring (car symbol-list) 1))
- (subst-char-in-region start (point) ?_ ?-))
- (insert (format "\");\n staticpro (&%s);\n" (car symbol-list)))
- (setq symbol-list (cdr symbol-list)))))
-
- */
-
-/*&&& symbols declared here &&&*/
Lisp_Object Qnone;
Lisp_Object Qsuppress_icon;
Lisp_Object Qundefined_color;
Lisp_Object Qcancel_timer;
+/* In dispnew.c */
+
extern Lisp_Object Vwindow_system_version;
+#if GLYPH_DEBUG
+int image_cache_refcount, dpyinfo_refcount;
+#endif
+
+
#if 0 /* Use xstricmp instead. */
/* compare two strings ignoring case */
CHECK_LIVE_FRAME (frame);
f = XFRAME (frame);
if (! FRAME_MAC_P (f))
- error ("non-mac frame used");
+ error ("Non-Mac frame used");
return f;
}
return dpyinfo;
}
-\f
-/* Return the Emacs frame-object corresponding to a mac window.
- It could be the frame's main window or an icon window. */
-
-/* This function can be called during GC, so use GC_xxx type test macros. */
-
-struct frame *
-x_window_to_frame (dpyinfo, wdesc)
- struct mac_display_info *dpyinfo;
- WindowPtr wdesc;
-{
- Lisp_Object tail, frame;
- struct frame *f;
-
- for (tail = Vframe_list; GC_CONSP (tail); tail = XCDR (tail))
- {
- frame = XCAR (tail);
- if (!GC_FRAMEP (frame))
- continue;
- f = XFRAME (frame);
- if (!FRAME_W32_P (f) || FRAME_MAC_DISPLAY_INFO (f) != dpyinfo)
- continue;
- /*if (f->output_data.w32->hourglass_window == wdesc)
- return f;*/
-
- /* MAC_TODO: Check tooltips when supported. */
- if (FRAME_MAC_WINDOW (f) == wdesc)
- return f;
- }
- return 0;
-}
\f
+
static Lisp_Object unwind_create_frame P_ ((Lisp_Object));
+static Lisp_Object unwind_create_tip_frame P_ ((Lisp_Object));
void x_set_foreground_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
void x_set_background_color 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));
-void x_set_scroll_bar_foreground P_ ((struct frame *, Lisp_Object,
- Lisp_Object));
-void x_set_scroll_bar_background P_ ((struct frame *, Lisp_Object,
- Lisp_Object));
-static Lisp_Object x_default_scroll_bar_color_parameter P_ ((struct frame *,
- Lisp_Object,
- Lisp_Object,
- char *, char *,
- int));
extern void mac_get_window_bounds P_ ((struct frame *, Rect *, Rect *));
+\f
+
/* Store the screen positions of frame F into XPTR and YPTR.
These are the positions of the containing window manager window,
not Emacs's own window. */
x_to_mac_color (colorname)
char * colorname;
{
- register Lisp_Object tail, ret = Qnil;
+ register Lisp_Object ret = Qnil;
BLOCK_INPUT;
Lisp_Object arg, oldval;
{
struct x_output *x = f->output_data.x;
- Display *dpy = FRAME_MAC_DISPLAY (f);
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));
BLOCK_INPUT;
- rif->define_frame_cursor (f, cursor);
+ if (FRAME_MAC_WINDOW (f) != 0)
+ rif->define_frame_cursor (f, cursor);
f->output_data.mac->text_cursor = cursor;
f->output_data.mac->nontext_cursor = nontext_cursor;
{
BLOCK_INPUT;
/* Update frame's cursor_gc. */
- f->output_data.mac->cursor_gc->foreground = fore_pixel;
- f->output_data.mac->cursor_gc->background = pixel;
-
+ XSetBackground (FRAME_MAC_DISPLAY (f),
+ f->output_data.mac->cursor_gc, pixel);
+ XSetForeground (FRAME_MAC_DISPLAY (f),
+ f->output_data.mac->cursor_gc, fore_pixel);
UNBLOCK_INPUT;
if (FRAME_VISIBLE_P (f))
struct frame *f;
Lisp_Object value, oldval;
{
- int nlines;
- int olines = FRAME_MENU_BAR_LINES (f);
-
- /* Right now, menu bars don't work properly in minibuf-only frames;
- most of the commands try to apply themselves to the minibuffer
- frame itself, and get an error because you can't switch buffers
- in or split the minibuffer window. */
- if (FRAME_MINIBUF_ONLY_P (f))
- return;
-
- if (INTEGERP (value))
- nlines = XINT (value);
- else
- nlines = 0;
+ /* Make sure we redisplay all windows in this frame. */
+ windows_or_buffers_changed++;
FRAME_MENU_BAR_LINES (f) = 0;
- if (nlines)
- FRAME_EXTERNAL_MENU_BAR (f) = 1;
- else
- {
- if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
- free_frame_menubar (f);
- FRAME_EXTERNAL_MENU_BAR (f) = 0;
-
- /* Adjust the frame size so that the client (text) dimensions
- remain the same. This depends on FRAME_EXTERNAL_MENU_BAR being
- set correctly. */
- x_set_window_size (f, 0, FRAME_COLS (f), FRAME_LINES (f));
- do_pending_window_change (0);
- }
+ /* The menu bar is always shown. */
+ FRAME_EXTERNAL_MENU_BAR (f) = 1;
+ if (FRAME_MAC_P (f) && f->output_data.mac->menubar_widget == 0)
+ /* Make sure next redisplay shows the menu bar. */
+ XWINDOW (FRAME_SELECTED_WINDOW (f))->update_mode_line = Qt;
adjust_glyphs (f);
}
int y = nlines * FRAME_LINE_HEIGHT (f);
BLOCK_INPUT;
- XClearArea (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
- 0, y, width, height, 0);
+ mac_clear_area (f, 0, y, width, height);
UNBLOCK_INPUT;
if (WINDOWP (f->tool_bar_window))
}
+\f
+/* Set the Mac window title to NAME for frame F. */
+
+static void
+x_set_name_internal (f, name)
+ FRAME_PTR f;
+ Lisp_Object name;
+{
+ if (FRAME_MAC_WINDOW (f))
+ {
+ if (STRING_MULTIBYTE (name))
+#if TARGET_API_MAC_CARBON
+ name = ENCODE_UTF_8 (name);
+#else
+ name = ENCODE_SYSTEM (name);
+#endif
+
+ BLOCK_INPUT;
+
+ {
+#if TARGET_API_MAC_CARBON
+ CFStringRef windowTitle =
+ cfstring_create_with_utf8_cstring (SDATA (name));
+
+ SetWindowTitleWithCFString (FRAME_MAC_WINDOW (f), windowTitle);
+ CFRelease (windowTitle);
+#else
+ Str255 windowTitle;
+ if (strlen (SDATA (name)) < 255)
+ {
+ strcpy (windowTitle, SDATA (name));
+ c2pstr (windowTitle);
+ SetWTitle (FRAME_MAC_WINDOW (f), windowTitle);
+ }
+#endif
+ }
+
+ UNBLOCK_INPUT;
+ }
+}
+
/* Change the name of frame F to NAME. If NAME is nil, set F's name to
- w32_id_name.
+ mac_id_name.
If EXPLICIT is non-zero, that indicates that lisp code is setting the
name; if NAME is a string, set F's name to NAME and set
else if (f->explicit_name)
return;
- /* If NAME is nil, set the name to the w32_id_name. */
+ /* If NAME is nil, set the name to the mac_id_name. */
if (NILP (name))
{
/* Check for no change needed in this very common case
if (! NILP (f->title))
name = f->title;
- if (FRAME_MAC_WINDOW (f))
- {
- if (STRING_MULTIBYTE (name))
-#if TARGET_API_MAC_CARBON
- name = ENCODE_UTF_8 (name);
-#else
- return;
-#endif
-
- BLOCK_INPUT;
-
- {
-#if TARGET_API_MAC_CARBON
- CFStringRef windowTitle =
- cfstring_create_with_utf8_cstring (SDATA (name));
-
- SetWindowTitleWithCFString (FRAME_MAC_WINDOW (f), windowTitle);
- CFRelease (windowTitle);
-#else
- Str255 windowTitle;
- if (strlen (SDATA (name)) < 255)
- {
- strcpy (windowTitle, SDATA (name));
- c2pstr (windowTitle);
- SetWTitle (FRAME_MAC_WINDOW (f), windowTitle);
- }
-#endif
- }
-
- UNBLOCK_INPUT;
- }
+ x_set_name_internal (f, name);
}
/* This function should be called when the user's lisp code has
if (NILP (name))
name = f->name;
+ else
+ CHECK_STRING (name);
- if (FRAME_MAC_WINDOW (f))
- {
- if (STRING_MULTIBYTE (name))
-#if TARGET_API_MAC_CARBON
- name = ENCODE_UTF_8 (name);
-#else
- return;
-#endif
-
- BLOCK_INPUT;
-
- {
-#if TARGET_API_MAC_CARBON
- CFStringRef windowTitle =
- cfstring_create_with_utf8_cstring (SDATA (name));
-
- SetWindowTitleWithCFString (FRAME_MAC_WINDOW (f), windowTitle);
- CFRelease (windowTitle);
-#else
- Str255 windowTitle;
- if (strlen (SDATA (name)) < 255)
- {
- strcpy (windowTitle, SDATA (name));
- c2pstr (windowTitle);
- SetWTitle (FRAME_MAC_WINDOW (f), windowTitle);
- }
-#endif
- }
-
- UNBLOCK_INPUT;
- }
+ x_set_name_internal (f, name);
}
void
int wid = FRAME_COLUMN_WIDTH (f);
#ifdef MAC_OSX
- FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = 16; /* Aqua scroll bars. */
+ FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = MAC_AQUA_VERTICAL_SCROLL_BAR_WIDTH;
FRAME_CONFIG_SCROLL_BAR_COLS (f) = (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) +
wid - 1) / wid;
#else /* not MAC_OSX */
#endif /* not MAC_OSX */
}
-\f
-/* Subroutines of creating a frame. */
+void
+mac_set_scroll_bar_width (f, arg, oldval)
+ struct frame *f;
+ Lisp_Object arg, oldval;
+{
+#ifdef MAC_OSX
+ if (INTEGERP (arg) && XINT (arg) > 0)
+ {
+ if (XINT (arg) < (MAC_AQUA_SMALL_VERTICAL_SCROLL_BAR_WIDTH
+ + MAC_AQUA_VERTICAL_SCROLL_BAR_WIDTH) / 2)
+ XSETINT (arg, MAC_AQUA_SMALL_VERTICAL_SCROLL_BAR_WIDTH);
+ else
+ XSETINT (arg, MAC_AQUA_VERTICAL_SCROLL_BAR_WIDTH);
+ }
+#endif
+ x_set_scroll_bar_width (f, arg, oldval);
+}
-static char *
-mac_get_rdb_resource (rdb, resource)
- char *rdb;
- char *resource;
+#if TARGET_API_MAC_CARBON
+static void
+mac_update_proxy_icon (f)
+ struct frame *f;
{
- char *value = rdb;
- int len = strlen (resource);
+ Lisp_Object file_name =
+ XBUFFER (XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer)->filename;
+ Window w = FRAME_MAC_WINDOW (f);
+
+ if (FRAME_FILE_NAME (f) == NULL && !STRINGP (file_name))
+ return;
+ if (FRAME_FILE_NAME (f) && STRINGP (file_name)
+ && strcmp (FRAME_FILE_NAME (f), SDATA (file_name)) == 0)
+ return;
+
+ if (FRAME_FILE_NAME (f))
+ {
+ xfree (FRAME_FILE_NAME (f));
+ FRAME_FILE_NAME (f) = NULL;
+ }
- while (*value)
+ BLOCK_INPUT;
+
+ if (STRINGP (file_name))
{
- if ((strncmp (value, resource, len) == 0) && (value[len] == ':'))
- return xstrdup (&value[len + 1]);
+ OSStatus err;
+ AEDesc desc;
+ Lisp_Object encoded_file_name = ENCODE_FILE (file_name);
+
+#ifdef MAC_OS8
+ SetPortWindowPort (w);
+#endif
+ err = AECoercePtr (TYPE_FILE_NAME, SDATA (encoded_file_name),
+ SBYTES (encoded_file_name), typeAlias, &desc);
+ if (err == noErr)
+ {
+ Size size = AEGetDescDataSize (&desc);
+ AliasHandle alias = (AliasHandle) NewHandle (size);
- value = strchr (value, '\0') + 1;
+ if (alias == NULL)
+ err = memFullErr;
+ else
+ {
+ HLock ((Handle) alias);
+ err = AEGetDescData (&desc, *alias, size);
+ HUnlock ((Handle) alias);
+ if (err == noErr)
+ err = SetWindowProxyAlias (w, alias);
+ DisposeHandle ((Handle) alias);
+ }
+ AEDisposeDesc (&desc);
+ }
+ if (err == noErr)
+ {
+ FRAME_FILE_NAME (f) = xmalloc (SBYTES (file_name) + 1);
+ strcpy (FRAME_FILE_NAME (f), SDATA (file_name));
+ }
}
- return NULL;
+ if (FRAME_FILE_NAME (f) == NULL)
+ RemoveWindowProxy (w);
+
+ UNBLOCK_INPUT;
}
+#endif
+
+void
+mac_update_title_bar (f, save_match_data)
+ struct frame *f;
+ int save_match_data;
+{
+#if TARGET_API_MAC_CARBON
+ struct window *w;
+ int modified_p;
+
+ if (!FRAME_MAC_P (f))
+ return;
+
+ w = XWINDOW (FRAME_SELECTED_WINDOW (f));
+ modified_p = (BUF_SAVE_MODIFF (XBUFFER (w->buffer))
+ < BUF_MODIFF (XBUFFER (w->buffer)));
+ if (windows_or_buffers_changed
+ /* Minibuffer modification status shown in the close button is
+ confusing. */
+ || (!MINI_WINDOW_P (w)
+ && (modified_p != !NILP (w->last_had_star))))
+ SetWindowModified (FRAME_MAC_WINDOW (f),
+ !MINI_WINDOW_P (w) && modified_p);
+
+ if (windows_or_buffers_changed)
+ mac_update_proxy_icon (f);
+#endif
+}
+
+\f
+/* Subroutines of creating a frame. */
/* Retrieve the string resource specified by NAME with CLASS from
- database RDB. */
+ database RDB.
+
+ The return value points to the contents of a Lisp string. So it
+ will not be valid after the next GC where string compaction will
+ occur. */
char *
x_get_string_resource (rdb, name, class)
XrmDatabase rdb;
char *name, *class;
{
- if (rdb)
- {
- char *resource;
-
- if (resource = mac_get_rdb_resource (rdb, name))
- return resource;
- if (resource = mac_get_rdb_resource (rdb, class))
- return resource;
- }
+ Lisp_Object value = xrm_get_resource (rdb, name, class);
- /* MAC_TODO: implement resource strings. (Maybe Property Lists?) */
-#if 0
- return mac_get_string_resource (name, class);
-#else
- return (char *)0;
-#endif
+ if (STRINGP (value))
+ return SDATA (value);
+ else
+ return NULL;
}
/* Return the value of parameter PARAM.
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.
+ doc: /* Make a new window, which is called a "frame" in Emacs terms.
Returns an Emacs frame object.
ALIST is an alist of frame parameters.
If the parameters specify that the frame should not have a minibuffer,
be shared by the new frame.
This function is an internal primitive--use `make-frame' instead. */)
- (parms)
+ (parms)
Lisp_Object parms;
{
struct frame *f;
struct mac_display_info *dpyinfo = NULL;
Lisp_Object parent;
struct kboard *kb;
- char x_frame_name[10];
- static int x_frame_count = 2; /* begins at 2 because terminal frame is F1 */
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;
frame = Qnil;
GCPRO4 (parms, parent, name, frame);
tem = mac_get_arg (parms, Qminibuffer, "minibuffer", "Minibuffer",
- RES_TYPE_SYMBOL);
+ RES_TYPE_SYMBOL);
if (EQ (tem, Qnone) || NILP (tem))
f = make_frame_without_minibuffer (Qnil, kb, display);
else if (EQ (tem, Qonly))
else
f = make_frame (1);
- if (EQ (name, Qunbound) || NILP (name))
- {
- sprintf (x_frame_name, "F%d", x_frame_count++);
- f->name = build_string (x_frame_name);
- f->explicit_name = 0;
- }
- else
- {
- f->name = name;
- f->explicit_name = 1;
- }
-
XSETFRAME (frame, f);
/* Note that X Windows does support scroll bars. */
if (! STRINGP (f->icon_name))
f->icon_name = Qnil;
-/* FRAME_W32_DISPLAY_INFO (f) = dpyinfo; */
+/* FRAME_MAC_DISPLAY_INFO (f) = dpyinfo; */
+#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
}
/* Try out a font which we hope has bold and italic variations. */
+#if USE_ATSUI
+ if (! STRINGP (font))
+ font = x_new_font (f, "-*-monaco-medium-r-normal--12-*-*-*-*-*-iso10646-1");
+#endif
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_fontset (f, "fontset-standard");
if (! STRINGP (font))
font = x_new_font (f, "-*-monaco-*-12-*-mac-roman");
if (! STRINGP (font))
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);
+ "toolBar", "ToolBar", RES_TYPE_NUMBER);
x_default_parameter (f, parms, Qbuffer_predicate, Qnil,
- "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL);
+ "bufferPredicate", "BufferPredicate",
+ RES_TYPE_SYMBOL);
x_default_parameter (f, parms, Qtitle, Qnil,
"title", "Title", RES_TYPE_STRING);
x_default_parameter (f, parms, Qfullscreen, Qnil,
if (EQ (visibility, Qunbound))
visibility = Qt;
-#if 0 /* MAC_TODO: really no iconify on Mac */
if (EQ (visibility, Qicon))
x_iconify_frame (f);
- else
-#endif
- if (! NILP (visibility))
+ else if (! NILP (visibility))
x_make_frame_visible (f);
else
/* Must have been Qnil. */
;
}
+
+ /* Initialize `default-minibuffer-frame' in case this is the first
+ frame on this display device. */
+ if (FRAME_HAS_MINIBUF_P (f)
+ && (!FRAMEP (kb->Vdefault_minibuffer_frame)
+ || !FRAME_LIVE_P (XFRAME (kb->Vdefault_minibuffer_frame))))
+ kb->Vdefault_minibuffer_frame = frame;
+
+ /* 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))
+ if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem))))
+ f->param_alist = Fcons (XCAR (tem), f->param_alist);
+
UNGCPRO;
/* Make sure windows on this frame appear in calls to next-window
return unbind_to (count, frame);
}
+
/* FRAME is used only to get a handle on the X display. We don't pass the
display info directly because we're called from frame.c, which doesn't
know about that structure. */
+
Lisp_Object
x_get_focus_frame (frame)
struct frame *frame;
XSETFRAME (xfocus, dpyinfo->x_focus_frame);
return xfocus;
}
+
+
+DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0,
+ doc: /* Set the input focus to FRAME.
+FRAME nil means use the selected frame. */)
+ (frame)
+ Lisp_Object frame;
+{
+ struct frame *f = check_x_frame (frame);
+ struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f);
+
+ if (dpyinfo->x_focus_frame != f)
+ {
+ BLOCK_INPUT;
+#ifdef MAC_OSX
+ ActivateWindow (ActiveNonFloatingWindow (), false);
+ ActivateWindow (FRAME_MAC_WINDOW (f), true);
+#else
+#if !TARGET_API_MAC_CARBON
+ /* SelectWindow (Non-Carbon) does not issue deactivate events if
+ the possibly inactive window that is to be selected is
+ already the frontmost one. */
+ SendBehind (FRAME_MAC_WINDOW (f), NULL);
+#endif
+ /* This brings the window to the front. */
+ SelectWindow (FRAME_MAC_WINDOW (f));
+#endif
+ UNBLOCK_INPUT;
+ }
+
+ return Qnil;
+}
+
\f
DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
doc: /* Internal function called by `color-defined-p', which see. */)
- (color, frame)
+ (color, frame)
Lisp_Object color, frame;
{
XColor foo;
DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
doc: /* Internal function called by `color-values', which see. */)
- (color, frame)
+ (color, frame)
Lisp_Object color, frame;
{
XColor foo;
DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0,
doc: /* Internal function called by `display-color-p', which see. */)
- (display)
+ (display)
Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p, Sx_display_grayscale_p,
0, 1, 0,
- doc: /* Return t if the X display supports shades of gray.
+ doc: /* Return t if DISPLAY supports shades of gray.
Note that color displays do support shades of gray.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
0, 1, 0,
- doc: /* Returns the width in pixels of the X display DISPLAY.
+ doc: /* Returns the width in pixels of DISPLAY.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
Sx_display_pixel_height, 0, 1, 0,
- doc: /* Returns the height in pixels of the X display DISPLAY.
+ doc: /* Returns the height in pixels of DISPLAY.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
0, 1, 0,
- doc: /* Returns the number of bitplanes of the display DISPLAY.
+ doc: /* Returns the number of bitplanes of DISPLAY.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells,
0, 1, 0,
- doc: /* Returns the number of color cells of the display DISPLAY.
+ doc: /* Returns the number of color cells of DISPLAY.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
Sx_server_max_request_size,
0, 1, 0,
- doc: /* Returns the maximum request size of the server of display DISPLAY.
+ doc: /* Returns the maximum request size of the server of DISPLAY.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
}
DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0,
- doc: /* Returns the vendor ID string of the Mac OS system (Apple).
+ doc: /* Returns the "vendor ID" string of the Mac OS system (Apple).
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
return build_string ("Apple Computers");
}
DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0,
- doc: /* Returns the version numbers of the server of display DISPLAY.
+ doc: /* Returns the version numbers of the Mac OS system.
The value is a list of three integers: the major and minor
version numbers, and the vendor-specific release
number. See also the function `x-server-vendor'.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
- int mac_major_version;
- SInt32 response;
+ UInt32 response, major, minor, bugfix;
+ OSErr err;
- if (Gestalt (gestaltSystemVersion, &response) != noErr)
- error ("Cannot get Mac OS version");
+ BLOCK_INPUT;
+ err = Gestalt (gestaltSystemVersion, &response);
+ if (err == noErr)
+ {
+ if (response >= 0x00001040)
+ {
+ err = Gestalt ('sys1', &major); /* gestaltSystemVersionMajor */
+ if (err == noErr)
+ err = Gestalt ('sys2', &minor); /* gestaltSystemVersionMinor */
+ if (err == noErr)
+ err = Gestalt ('sys3', &bugfix); /* gestaltSystemVersionBugFix */
+ }
+ else
+ {
+ bugfix = response & 0xf;
+ response >>= 4;
+ minor = response & 0xf;
+ response >>= 4;
+ /* convert BCD to int */
+ major = response - (response >> 4) * 6;
+ }
+ }
+ UNBLOCK_INPUT;
- mac_major_version = (response >> 8) & 0xff;
- /* convert BCD to int */
- mac_major_version -= (mac_major_version >> 4) * 6;
+ if (err != noErr)
+ error ("Cannot get Mac OS version");
- return Fcons (make_number (mac_major_version),
- Fcons (make_number ((response >> 4) & 0xf),
- Fcons (make_number (response & 0xf),
+ return Fcons (make_number (major),
+ Fcons (make_number (minor),
+ Fcons (make_number (bugfix),
Qnil)));
}
DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0,
- doc: /* Return the number of screens on the server of display DISPLAY.
+ doc: /* Return the number of screens on the server of DISPLAY.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
return make_number (1);
}
DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 1, 0,
- doc: /* Return the height in millimeters of the X display DISPLAY.
+ doc: /* Return the height in millimeters of DISPLAY.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
/* MAC_TODO: this is an approximation, and only of the main display */
}
DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0,
- doc: /* Return the width in millimeters of the X display DISPLAY.
+ doc: /* Return the width in millimeters of DISPLAY.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
/* MAC_TODO: this is an approximation, and only of the main display */
DEFUN ("x-display-backing-store", Fx_display_backing_store,
Sx_display_backing_store, 0, 1, 0,
- doc: /* Returns an indication of whether display DISPLAY does backing store.
+ doc: /* Returns an indication of whether DISPLAY does backing store.
The value may be `always', `when-mapped', or `not-useful'.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
return intern ("not-useful");
DEFUN ("x-display-visual-class", Fx_display_visual_class,
Sx_display_visual_class, 0, 1, 0,
- doc: /* Returns the visual class of the display DISPLAY.
+ doc: /* Returns the visual class of DISPLAY.
The value is one of the symbols `static-gray', `gray-scale',
`static-color', `pseudo-color', `true-color', or `direct-color'.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
DEFUN ("x-display-save-under", Fx_display_save_under,
Sx_display_save_under, 0, 1, 0,
- doc: /* Returns t if the display DISPLAY supports the save-under feature.
+ doc: /* Returns t if DISPLAY supports the save-under feature.
The optional argument DISPLAY specifies which display to ask about.
DISPLAY should be either a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
- (display)
+ (display)
Lisp_Object display;
{
return Qnil;
Optional second arg XRM-STRING is a string of resources in xrdb format.
If the optional third arg MUST-SUCCEED is non-nil,
terminate Emacs if we can't open the connection. */)
- (display, xrm_string, must_succeed)
+ (display, xrm_string, must_succeed)
Lisp_Object display, xrm_string, must_succeed;
{
unsigned char *xrm_option;
doc: /* Close the connection to DISPLAY's server.
For DISPLAY, specify either a frame or a display name (a string).
If DISPLAY is nil, that stands for the selected frame's display. */)
- (display)
- Lisp_Object display;
+ (display)
+ Lisp_Object display;
{
struct mac_display_info *dpyinfo = check_x_display_info (display);
int i;
DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0,
doc: /* Return the list of display names that Emacs has connections to. */)
- ()
+ ()
{
Lisp_Object tail, result;
}
DEFUN ("x-synchronize", Fx_synchronize, Sx_synchronize, 1, 2, 0,
- doc: /* If ON is non-nil, report errors as soon as the erring request is made.
-If ON is nil, allow buffering of requests.
-This is a noop on Mac OS systems.
-The optional second argument DISPLAY specifies which display to act on.
-DISPLAY should be either a frame or a display name (a string).
-If DISPLAY is omitted or nil, that stands for the selected frame's display. */)
- (on, display)
+ doc: /* This is a noop on Mac OS systems. */)
+ (on, display)
Lisp_Object display, on;
{
return Qnil;
}
+/* x_sync is a no-op on Mac. */
+
+void
+x_sync (f)
+ FRAME_PTR f;
+{
+}
+
\f
/***********************************************************************
Window properties
Sx_delete_window_property, 1, 2, 0,
doc: /* Remove window property PROP from X window of FRAME.
FRAME nil or omitted means use the selected frame. Value is PROP. */)
- (prop, frame)
+ (prop, frame)
Lisp_Object prop, frame;
{
#if 0 /* MAC_TODO : port window properties to Mac */
If FRAME is nil or omitted, use the selected frame. Value is nil
if FRAME hasn't a property with name PROP or if PROP has no string
value. */)
- (prop, frame)
+ (prop, frame)
Lisp_Object prop, frame;
{
#if 0 /* MAC_TODO : port window properties to Mac */
EMACS_TIME delay;
int secs, usecs = 0;
+ /* Don't bother for ttys. */
+ if (NILP (Vwindow_system))
+ return;
+
cancel_hourglass ();
if (INTEGERP (Vhourglass_delay)
if (FRAME_LIVE_P (f) && FRAME_MAC_P (f)
&& FRAME_MAC_WINDOW (f) != tip_window)
{
+#if USE_CG_DRAWING
+ mac_prepare_for_quickdraw (f);
+#endif
if (!f->output_data.mac->hourglass_control)
{
Window w = FRAME_MAC_WINDOW (f);
if (FRAME_MAC_P (f)
/* Watch out for newly created frames. */
&& f->output_data.mac->hourglass_control)
- HideControl (f->output_data.mac->hourglass_control);
+ {
+#if USE_CG_DRAWING
+ mac_prepare_for_quickdraw (f);
+#endif
+ HideControl (f->output_data.mac->hourglass_control);
+ }
}
hourglass_shown_p = 0;
check_mac ();
- /* Use this general default value to start with until we know if
- this frame has a specified name. */
- Vx_resource_name = Vinvocation_name;
+ parms = Fcopy_alist (parms);
#ifdef MULTI_KBOARD
kb = dpyinfo->kboard;
&& !EQ (name, Qunbound)
&& !NILP (name))
error ("Invalid frame name--not a string or nil");
- Vx_resource_name = name;
frame = Qnil;
GCPRO3 (parms, name, frame);
FRAME_FONTSET (f) = -1;
f->icon_name = Qnil;
-
-#if 0 /* GLYPH_DEBUG TODO: image support. */
+/* FRAME_X_DISPLAY_INFO (f) = dpyinfo; */
+#if GLYPH_DEBUG
image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount;
dpyinfo_refcount = dpyinfo->reference_count;
#endif /* GLYPH_DEBUG */
}
/* Try out a font which we hope has bold and italic variations. */
+#if USE_ATSUI
+ if (! STRINGP (font))
+ font = x_new_font (f, "-*-monaco-medium-r-normal--12-*-*-*-*-*-iso10646-1");
+#endif
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_fontset (f, "fontset-standard");
if (! STRINGP (font))
font = x_new_font (f, "-*-monaco-*-12-*-mac-roman");
if (! STRINGP (font))
if (INTEGERP (top))
*root_y = XINT (top);
- else if (*root_y + XINT (dy) - height < 0)
- *root_y -= XINT (dy);
+ else if (*root_y + XINT (dy) <= 0)
+ *root_y = 0; /* Can happen for negative dy */
+ else if (*root_y + XINT (dy) + height <= FRAME_MAC_DISPLAY_INFO (f)->height)
+ /* It fits below the pointer */
+ *root_y += XINT (dy);
+ else if (height + XINT (dy) <= *root_y)
+ /* It fits above the pointer. */
+ *root_y -= height + XINT (dy);
else
- {
- *root_y -= height;
- *root_y += XINT (dy);
- }
+ /* Put it on the top. */
+ *root_y = 0;
if (INTEGERP (left))
*root_x = XINT (left);
+ else if (*root_x + XINT (dx) <= 0)
+ *root_x = 0; /* Can happen for negative dx */
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);
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.
+A tooltip window is a small window displaying a string.
FRAME nil or omitted means use the selected frame.
Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
means use the default timeout of 5 seconds.
-If the list of frame parameters PARAMS contains a `left' parameters,
+If the list of frame parameters PARMS contains a `left' parameter,
the tooltip is displayed at that x-position. Otherwise it is
displayed at the mouse position, with offset DX added (default is 5 if
DX isn't specified). Likewise for the y-position; if a `top' frame
clear_glyph_matrix (w->desired_matrix);
clear_glyph_matrix (w->current_matrix);
SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
- try_window (FRAME_ROOT_WINDOW (f), pos);
+ try_window (FRAME_ROOT_WINDOW (f), pos, 0);
/* Compute width and height of the tooltip. */
width = height = 0;
BringToFront (FRAME_MAC_WINDOW (f));
UNBLOCK_INPUT;
+ FRAME_PIXEL_WIDTH (f) = width;
+ FRAME_PIXEL_HEIGHT (f) = height;
+
/* Draw into the window. */
w->must_be_updated_p = 1;
update_single_window (w, 1);
Select DEFAULT-FILENAME in the dialog's file selection box, if
specified. Ensure that file exists if MUSTMATCH is non-nil.
If ONLY-DIR-P is non-nil, the user can only select directories. */)
- (prompt, dir, default_filename, mustmatch, only_dir_p)
+ (prompt, dir, default_filename, mustmatch, only_dir_p)
Lisp_Object prompt, dir, default_filename, mustmatch, only_dir_p;
{
struct frame *f = SELECTED_FRAME ();
int count = SPECPDL_INDEX ();
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
char filename[MAXPATHLEN];
- int default_filter_index = 1; /* 1: All Files, 2: Directories only */
static NavEventUPP mac_nav_event_callbackUPP = NULL;
GCPRO6 (prompt, dir, default_filename, mustmatch, file, only_dir_p);
NavTypeListHandle fileTypes = NULL;
NavUserAction userAction;
CFStringRef message=NULL, saveName = NULL;
-
+
BLOCK_INPUT;
/* No need for a callback function because we are modal */
NavGetDefaultDialogCreationOptions(&options);
options.optionFlags = kNavDefaultNavDlogOptions;
options.optionFlags |= kNavAllFilesInPopup; /* All files allowed */
options.optionFlags |= kNavSelectAllReadableItem;
+ options.optionFlags &= ~kNavAllowMultipleFiles;
if (!NILP(prompt))
{
- message =
- cfstring_create_with_utf8_cstring (SDATA (ENCODE_UTF_8 (prompt)));
+ message = cfstring_create_with_string (prompt);
options.message = message;
}
/* Don't set the application, let it use default.
if (!NILP (only_dir_p))
status = NavCreateChooseFolderDialog(&options, mac_nav_event_callbackUPP,
NULL, NULL, &dialogRef);
- else if (NILP (mustmatch))
- {
+ else if (NILP (mustmatch))
+ {
/* This is a save dialog */
options.optionFlags |= kNavDontConfirmReplacement;
options.actionButtonLabel = CFSTR ("Ok");
options.saveFileName = saveName;
options.optionFlags |= kNavSelectDefaultLocation;
}
- status = NavCreatePutFileDialog(&options,
+ status = NavCreatePutFileDialog(&options,
'TEXT', kNavGenericSignature,
mac_nav_event_callbackUPP, NULL,
&dialogRef);
mac_nav_event_callbackUPP, NULL,
NULL, NULL, &dialogRef);
}
-
+
/* Set the default location and continue*/
if (status == noErr)
{
+ Lisp_Object encoded_dir = ENCODE_FILE (dir);
AEDesc defLocAed;
-#ifdef MAC_OSX
- FSRef defLoc;
- status = FSPathMakeRef(SDATA(ENCODE_FILE(dir)), &defLoc, NULL);
-#else
- FSSpec defLoc;
- status = posix_pathname_to_fsspec (SDATA (ENCODE_FILE (dir)), &defLoc);
-#endif
- if (status == noErr)
+
+ status = AECreateDesc (TYPE_FILE_NAME, SDATA (encoded_dir),
+ SBYTES (encoded_dir), &defLocAed);
+ if (status == noErr)
{
-#ifdef MAC_OSX
- AECreateDesc(typeFSRef, &defLoc, sizeof(FSRef), &defLocAed);
-#else
- AECreateDesc(typeFSS, &defLoc, sizeof(FSSpec), &defLocAed);
-#endif
NavCustomControl(dialogRef, kNavCtlSetLocation, (void*) &defLocAed);
AEDisposeDesc(&defLocAed);
}
case kNavUserActionSaveAs:
{
NavReplyRecord reply;
- AEDesc aed;
-#ifdef MAC_OSX
- FSRef fsRef;
-#else
- FSSpec fs;
-#endif
- status = NavDialogGetReply(dialogRef, &reply);
+ Size len;
-#ifdef MAC_OSX
- AECoerceDesc(&reply.selection, typeFSRef, &aed);
- AEGetDescData(&aed, (void *) &fsRef, sizeof (FSRef));
- FSRefMakePath(&fsRef, (UInt8 *) filename, sizeof (filename));
+ status = NavDialogGetReply(dialogRef, &reply);
+ if (status != noErr)
+ break;
+ status = AEGetNthPtr (&reply.selection, 1, TYPE_FILE_NAME,
+ NULL, NULL, filename,
+ sizeof (filename) - 1, &len);
+ if (status == noErr)
+ {
+ len = min (len, sizeof (filename) - 1);
+ filename[len] = '\0';
+ if (reply.saveFileName)
+ {
+ /* If it was a saved file, we need to add the file name */
+ if (len && len < sizeof (filename) - 1
+ && filename[len-1] != '/')
+ filename[len++] = '/';
+ CFStringGetCString(reply.saveFileName, filename+len,
+ sizeof (filename) - len,
+#if MAC_OSX
+ kCFStringEncodingUTF8
#else
- AECoerceDesc (&reply.selection, typeFSS, &aed);
- AEGetDescData (&aed, (void *) &fs, sizeof (FSSpec));
- fsspec_to_posix_pathname (&fs, filename, sizeof (filename) - 1);
+ CFStringGetSystemEncoding ()
#endif
- AEDisposeDesc(&aed);
- if (reply.saveFileName)
- {
- /* If it was a saved file, we need to add the file name */
- int len = strlen(filename);
- if (len && filename[len-1] != '/')
- filename[len++] = '/';
- CFStringGetCString(reply.saveFileName, filename+len,
- sizeof (filename) - len,
- kCFStringEncodingUTF8);
+ );
+ }
+ file = DECODE_FILE (make_unibyte_string (filename,
+ strlen (filename)));
}
- file = DECODE_FILE (make_unibyte_string (filename,
- strlen (filename)));
NavDisposeReply(&reply);
}
break;
}
NavDialogDispose(dialogRef);
+ UNBLOCK_INPUT;
}
else {
+ UNBLOCK_INPUT;
/* Fall back on minibuffer if there was a problem */
file = Fcompleting_read (prompt, intern ("read-file-name-internal"),
dir, mustmatch, dir, Qfile_name_history,
default_filename, Qnil);
}
- UNBLOCK_INPUT;
}
UNGCPRO;
-
+
/* Make "Cancel" equivalent to C-g. */
if (NILP (file))
Fsignal (Qquit, Qnil);
-
+
return unbind_to (count, file);
}
x_set_menu_bar_lines,
x_set_mouse_color,
x_explicitly_set_name,
- x_set_scroll_bar_width,
+ mac_set_scroll_bar_width,
x_set_title,
x_set_unsplittable,
x_set_vertical_scroll_bars,
defsubr (&Sx_close_connection);
defsubr (&Sx_display_list);
defsubr (&Sx_synchronize);
+ defsubr (&Sx_focus_frame);
/* Setting callback functions for fontset handler. */
get_font_info_func = x_get_font_info;