summaryrefslogtreecommitdiff
path: root/mac
diff options
context:
space:
mode:
authorAndrew Choi <akochoi@shaw.ca>2001-02-27 14:33:20 +0000
committerAndrew Choi <akochoi@shaw.ca>2001-02-27 14:33:20 +0000
commit2e875e36887608b9e677bf4a3b45acfe6041ff06 (patch)
tree35225137b6f6bffc2dd80e1e1fd61f3976cadb56 /mac
parentc0cb1027c5273b57e67a989ba91189e7916d5b32 (diff)
downloademacs-2e875e36887608b9e677bf4a3b45acfe6041ff06.tar.gz
* src/macfns.c: Rename everything containing *busy_cursor* and
similar to *hourglass*. Change IMAGE_POSITIVE_INTEGER_VALUE to IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR throughout. (x_set_font): If font hasn't changed, avoid recomputing faces and other things, as in xfns.c. (Qcancel_timer): New variable. (syms_of_macfns): Rename x-busy-pointer-shape to x-hourglass-pointer-shape, display-busy-cursor to display-hourglass, busy-cursor-delay to hourglass-delay, as in xfns.c. (x_set_tool_bar_lines): Modify as in xfns.c (x_change_window_heights): New function. * inc/macterm.h (struct x_output): Rename busy_cursor to hourglass_cursor, busy_window to hourglass_window, busy_p to hourglass_p, as in xterm.h. * src/macmenu.c (set_frame_menubar): Run activate-menu-bar-hook with safe_run_hooks, as in xmenu.c. * src/macterm.c (do_check_ram_size): New function. * src/Emacs.r: Add ALRT resource #129 for alert when there is over 256 MB RAM.
Diffstat (limited to 'mac')
-rw-r--r--mac/ChangeLog28
-rw-r--r--mac/inc/macterm.h12
-rw-r--r--mac/src/Emacs.r39
-rw-r--r--mac/src/macfns.c462
-rw-r--r--mac/src/macmenu.c2
-rw-r--r--mac/src/macterm.c21
6 files changed, 401 insertions, 163 deletions
diff --git a/mac/ChangeLog b/mac/ChangeLog
index a2735d70e7e..149f62838a3 100644
--- a/mac/ChangeLog
+++ b/mac/ChangeLog
@@ -1,3 +1,31 @@
+2001-02-27 Andrew Choi <akochoi@i-cable.com>
+
+ * src/macfns.c: Rename everything containing *busy_cursor* and
+ similar to *hourglass*.
+ Change IMAGE_POSITIVE_INTEGER_VALUE to
+ IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR throughout.
+ (x_set_font): If font hasn't changed, avoid recomputing faces and
+ other things, as in xfns.c.
+ (Qcancel_timer): New variable.
+ (syms_of_macfns): Rename x-busy-pointer-shape to
+ x-hourglass-pointer-shape, display-busy-cursor to
+ display-hourglass, busy-cursor-delay to hourglass-delay, as in
+ xfns.c.
+ (x_set_tool_bar_lines): Modify as in xfns.c
+ (x_change_window_heights): New function.
+
+ * inc/macterm.h (struct x_output): Rename busy_cursor to
+ hourglass_cursor, busy_window to hourglass_window, busy_p to
+ hourglass_p, as in xterm.h.
+
+ * src/macmenu.c (set_frame_menubar): Run activate-menu-bar-hook with
+ safe_run_hooks, as in xmenu.c.
+
+ * src/macterm.c (do_check_ram_size): New function.
+
+ * src/Emacs.r: Add ALRT resource #129 for alert when there is over
+ 256 MB RAM.
+
2001-02-20 Andrew Choi <akochoi@i-cable.com>
* mac/INSTALL:
diff --git a/mac/inc/macterm.h b/mac/inc/macterm.h
index 7df8a932653..89a3ac91745 100644
--- a/mac/inc/macterm.h
+++ b/mac/inc/macterm.h
@@ -319,14 +319,14 @@ struct mac_output {
Cursor nontext_cursor;
Cursor modeline_cursor;
Cursor cross_cursor;
- Cursor busy_cursor;
+ Cursor hourglass_cursor;
#if 0
- /* Window whose cursor is busy_cursor. This window is temporarily
- mapped to display a busy-cursor. */
- Window busy_window;
+ /* Window whose cursor is hourglass_cursor. This window is temporarily
+ mapped to display a hourglass-cursor. */
+ Window hourglass_window;
- /* Non-zero means busy cursor is currently displayed. */
- unsigned busy_p : 1;
+ /* Non-zero means hourglass cursor is currently displayed. */
+ unsigned hourglass_p : 1;
/* Flag to set when the window needs to be completely repainted. */
int needs_exposure;
diff --git a/mac/src/Emacs.r b/mac/src/Emacs.r
index 4a66d7cf49c..12ed6562744 100644
--- a/mac/src/Emacs.r
+++ b/mac/src/Emacs.r
@@ -139,9 +139,42 @@ resource 'DITL' (128, purgeable) {
{10, 60, 72, 278},
StaticText {
disabled,
- "GNU Emacs 21.0.90 for Mac OS\n"
- "(11 October 2000 release)\n"
- "Report bugs to akochoi@users.sourceforge.net"
+ "GNU Emacs 21.0.99 for Mac OS\n"
+ "(27 February 2001 release)\n"
+ "Report bugs to emacs-pretest-bug@gnu.org"
+ }
+ }
+};
+
+resource 'ALRT' (129, "Ram Too Large", purgeable) {
+ {40, 20, 160, 297},
+ 129,
+ { /* array: 4 elements */
+ /* [1] */
+ OK, visible, silent,
+ /* [2] */
+ OK, visible, silent,
+ /* [3] */
+ OK, visible, silent,
+ /* [4] */
+ OK, visible, silent
+ },
+ centerMainScreen
+};
+
+resource 'DITL' (129, purgeable) {
+ { /* array DITLarray: 2 elements */
+ /* [1] */
+ {88, 185, 108, 265},
+ Button {
+ enabled,
+ "OK"
+ },
+ /* [2] */
+ {10, 60, 72, 278},
+ StaticText {
+ disabled,
+ "Emacs does not run on a Macintosh with more than 256 MB of physical or virtual memory"
}
}
};
diff --git a/mac/src/macfns.c b/mac/src/macfns.c
index 7bf97d88cc2..851b4d98036 100644
--- a/mac/src/macfns.c
+++ b/mac/src/macfns.c
@@ -102,24 +102,25 @@ unsigned char *gray_bitmap_bits = gray_bits;
Lisp_Object Vx_resource_name;
-/* Non nil if no window manager is in use. */
-
-Lisp_Object Vx_no_window_manager;
+/* Non-zero means we're allowed to display an hourglass cursor. */
-/* Non-zero means we're allowed to display a busy cursor. */
-
-int display_busy_cursor_p;
+int display_hourglass_p;
/* The background and shape of the mouse pointer, and shape when not
over text or in the modeline. */
Lisp_Object Vx_pointer_shape, Vx_nontext_pointer_shape, Vx_mode_pointer_shape;
-Lisp_Object Vx_busy_pointer_shape;
+Lisp_Object Vx_hourglass_pointer_shape;
/* The shape when over mouse-sensitive text. */
Lisp_Object Vx_sensitive_text_pointer_shape;
+/* If non-nil, the pointer shape to indicate that windows can be
+ dragged horizontally. */
+
+Lisp_Object Vx_window_horizontal_drag_shape;
+
/* Color of chars displayed in cursor box. */
Lisp_Object Vx_cursor_fore_pixel;
@@ -128,6 +129,10 @@ Lisp_Object Vx_cursor_fore_pixel;
static int mac_in_use;
+/* Non nil if no window manager is in use. */
+
+Lisp_Object Vx_no_window_manager;
+
/* Search path for bitmap files. */
Lisp_Object Vx_bitmap_file_path;
@@ -203,6 +208,7 @@ Lisp_Object Quser_size;
Lisp_Object Qscreen_gamma;
Lisp_Object Qline_spacing;
Lisp_Object Qcenter;
+Lisp_Object Qcancel_timer;
Lisp_Object Qhyper;
Lisp_Object Qsuper;
Lisp_Object Qmeta;
@@ -280,7 +286,7 @@ have_menus_p ()
}
/* Extract a frame as a FRAME_PTR, defaulting to the selected frame
- and checking validity for W32. */
+ and checking validity for Mac. */
FRAME_PTR
check_x_frame (frame)
@@ -2128,7 +2134,6 @@ x_set_mouse_color (f, arg, oldval)
struct frame *f;
Lisp_Object arg, oldval;
{
-
Cursor cursor, nontext_cursor, mode_cursor, cross_cursor;
int count;
int mask_color;
@@ -2168,14 +2173,14 @@ x_set_mouse_color (f, arg, oldval)
nontext_cursor = XCreateFontCursor (FRAME_W32_DISPLAY (f), XC_left_ptr);
x_check_errors (FRAME_W32_DISPLAY (f), "bad nontext pointer cursor: %s");
- if (!EQ (Qnil, Vx_busy_pointer_shape))
+ if (!EQ (Qnil, Vx_hourglass_pointer_shape))
{
- CHECK_NUMBER (Vx_busy_pointer_shape, 0);
- busy_cursor = XCreateFontCursor (FRAME_W32_DISPLAY (f),
- XINT (Vx_busy_pointer_shape));
+ CHECK_NUMBER (Vx_hourglass_pointer_shape, 0);
+ hourglass_cursor = XCreateFontCursor (FRAME_W32_DISPLAY (f),
+ XINT (Vx_hourglass_pointer_shape));
}
else
- busy_cursor = XCreateFontCursor (FRAME_W32_DISPLAY (f), XC_watch);
+ hourglass_cursor = XCreateFontCursor (FRAME_W32_DISPLAY (f), XC_watch);
x_check_errors (FRAME_W32_DISPLAY (f), "bad busy pointer cursor: %s");
x_check_errors (FRAME_W32_DISPLAY (f), "bad nontext pointer cursor: %s");
@@ -2199,6 +2204,17 @@ x_set_mouse_color (f, arg, oldval)
else
cross_cursor = XCreateFontCursor (FRAME_W32_DISPLAY (f), XC_crosshair);
+ if (!NILP (Vx_window_horizontal_drag_shape))
+ {
+ CHECK_NUMBER (Vx_window_horizontal_drag_shape, 0);
+ horizontal_drag_cursor
+ = XCreateFontCursor (FRAME_X_DISPLAY (f),
+ XINT (Vx_window_horizontal_drag_shape));
+ }
+ else
+ horizontal_drag_cursor
+ = XCreateFontCursor (FRAME_X_DISPLAY (f), XC_sb_h_double_arrow);
+
/* Check and report errors with the above calls. */
x_check_errors (FRAME_W32_DISPLAY (f), "can't set cursor shape: %s");
x_uncatch_errors (FRAME_W32_DISPLAY (f), count);
@@ -2224,7 +2240,7 @@ x_set_mouse_color (f, arg, oldval)
&fore_color, &back_color);
XRecolorCursor (FRAME_W32_DISPLAY (f), cross_cursor,
&fore_color, &back_color);
- XRecolorCursor (FRAME_W32_DISPLAY (f), busy_cursor,
+ XRecolorCursor (FRAME_W32_DISPLAY (f), hourglass_cursor,
&fore_color, &back_color);
}
@@ -2240,10 +2256,10 @@ x_set_mouse_color (f, arg, oldval)
XFreeCursor (FRAME_W32_DISPLAY (f), f->output_data.w32->nontext_cursor);
f->output_data.w32->nontext_cursor = nontext_cursor;
- if (busy_cursor != f->output_data.w32->busy_cursor
- && f->output_data.w32->busy_cursor != 0)
- XFreeCursor (FRAME_W32_DISPLAY (f), f->output_data.w32->busy_cursor);
- f->output_data.w32->busy_cursor = busy_cursor;
+ if (hourglass_cursor != f->output_data.w32->hourglass_cursor
+ && f->output_data.w32->hourglass_cursor != 0)
+ XFreeCursor (FRAME_W32_DISPLAY (f), f->output_data.w32->hourglass_cursor);
+ f->output_data.w32->hourglass_cursor = hourglass_cursor;
if (mode_cursor != f->output_data.w32->modeline_cursor
&& f->output_data.w32->modeline_cursor != 0)
@@ -2510,6 +2526,8 @@ x_set_font (f, arg, oldval)
error ("The characters of the given font have varying widths");
else if (STRINGP (result))
{
+ if (!NILP (Fequal (result, oldval)))
+ return;
store_frame_param (f, Qfont, result);
recompute_basic_faces (f);
}
@@ -2587,6 +2605,36 @@ x_set_visibility (f, value, oldval)
Fmake_frame_visible (frame);
}
+
+/* Change window heights in windows rooted in WINDOW by N lines. */
+
+static void
+x_change_window_heights (window, n)
+ Lisp_Object window;
+ int n;
+{
+ struct window *w = XWINDOW (window);
+
+ XSETFASTINT (w->top, XFASTINT (w->top) + n);
+ XSETFASTINT (w->height, XFASTINT (w->height) - n);
+
+ if (INTEGERP (w->orig_top))
+ XSETFASTINT (w->orig_top, XFASTINT (w->orig_top) + n);
+ if (INTEGERP (w->orig_height))
+ XSETFASTINT (w->orig_height, XFASTINT (w->orig_height) - n);
+
+ /* Handle just the top child in a vertical split. */
+ if (!NILP (w->vchild))
+ x_change_window_heights (w->vchild, n);
+
+ /* Adjust all children in a horizontal split. */
+ for (window = w->hchild; !NILP (window); window = w->next)
+ {
+ w = XWINDOW (window);
+ x_change_window_heights (window, n);
+ }
+}
+
void
x_set_menu_bar_lines (f, value, oldval)
struct frame *f;
@@ -2636,7 +2684,12 @@ x_set_tool_bar_lines (f, value, oldval)
struct frame *f;
Lisp_Object value, oldval;
{
- int delta, nlines;
+ int delta, nlines, root_height;
+ Lisp_Object root_window;
+
+ /* Treat tool bars like menu bars. */
+ if (FRAME_MINIBUF_ONLY_P (f))
+ return;
/* Use VALUE only if an integer >= 0. */
if (INTEGERP (value) && XINT (value) >= 0)
@@ -2648,10 +2701,48 @@ x_set_tool_bar_lines (f, value, oldval)
++windows_or_buffers_changed;
delta = nlines - FRAME_TOOL_BAR_LINES (f);
+
+ /* Don't resize the tool-bar to more than we have room for. */
+ root_window = FRAME_ROOT_WINDOW (f);
+ root_height = XINT (XWINDOW (root_window)->height);
+ if (root_height - delta < 1)
+ {
+ delta = root_height - 1;
+ nlines = FRAME_TOOL_BAR_LINES (f) + delta;
+ }
+
FRAME_TOOL_BAR_LINES (f) = nlines;
- x_set_window_size (f, 0, FRAME_WIDTH (f), FRAME_HEIGHT (f));
- do_pending_window_change (0);
+ x_change_window_heights (root_window, delta);
adjust_glyphs (f);
+
+ /* We also have to make sure that the internal border at the top of
+ the frame, below the menu bar or tool bar, is redrawn when the
+ tool bar disappears. This is so because the internal border is
+ below the tool bar if one is displayed, but is below the menu bar
+ if there isn't a tool bar. The tool bar draws into the area
+ below the menu bar. */
+ if (FRAME_MAC_WINDOW (f) && FRAME_TOOL_BAR_LINES (f) == 0)
+ {
+ updating_frame = f;
+ clear_frame ();
+ clear_current_matrices (f);
+ updating_frame = NULL;
+ }
+
+ /* If the tool bar gets smaller, the internal border below it
+ has to be cleared. It was formerly part of the display
+ of the larger tool bar, and updating windows won't clear it. */
+ if (delta < 0)
+ {
+ int height = FRAME_INTERNAL_BORDER_WIDTH (f);
+ int width = PIXEL_WIDTH (f);
+ int y = nlines * CANON_Y_UNIT (f);
+
+ BLOCK_INPUT;
+ XClearArea (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
+ 0, y, width, height, 0);
+ UNBLOCK_INPUT;
+ }
}
@@ -3538,7 +3629,7 @@ This function is an internal primitive--use `make-frame' instead.")
int minibuffer_only = 0;
long window_prompting = 0;
int width, height;
- int count = specpdl_ptr - specpdl;
+ int count = BINDING_STACK_SIZE ();
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
Lisp_Object display;
struct mac_display_info *dpyinfo = NULL;
@@ -4473,6 +4564,7 @@ enum image_value_type
IMAGE_STRING_VALUE,
IMAGE_SYMBOL_VALUE,
IMAGE_POSITIVE_INTEGER_VALUE,
+ IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR,
IMAGE_NON_NEGATIVE_INTEGER_VALUE,
IMAGE_ASCENT_VALUE,
IMAGE_INTEGER_VALUE,
@@ -4577,6 +4669,15 @@ parse_image_spec (spec, keywords, nkeywords, type)
return 0;
break;
+ case IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR:
+ if (INTEGERP (value) && XINT (value) >= 0)
+ break;
+ if (CONSP (value)
+ && INTEGERP (XCAR (value)) && INTEGERP (XCDR (value))
+ && XINT (XCAR (value)) >= 0 && XINT (XCDR (value)) >= 0)
+ break;
+ return 0;
+
case IMAGE_ASCENT_VALUE:
if (SYMBOLP (value) && EQ (value, Qcenter))
break;
@@ -5021,10 +5122,10 @@ lookup_image (f, spec)
/* If not found, create a new image and cache it. */
if (img == NULL)
{
+ BLOCK_INPUT;
img = make_image (spec, hash);
cache_image (f, img);
img->load_failed_p = img->type->load (f, img) == 0;
- xassert (!interrupt_input_blocked);
/* If we can't load the image, and we don't have a width and
height, use some arbitrary width and height so that we can
@@ -5322,9 +5423,9 @@ static struct image_keyword xbm_format[XBM_LAST] =
{":foreground", IMAGE_STRING_VALUE, 0},
{":background", IMAGE_STRING_VALUE, 0},
{":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0},
- {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0},
+ {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0},
{":relief", IMAGE_INTEGER_VALUE, 0},
- {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
@@ -5912,9 +6013,9 @@ static struct image_keyword xpm_format[XPM_LAST] =
{":file", IMAGE_STRING_VALUE, 0},
{":data", IMAGE_STRING_VALUE, 0},
{":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0},
- {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0},
+ {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0},
{":relief", IMAGE_INTEGER_VALUE, 0},
- {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":color-symbols", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
@@ -6602,9 +6703,9 @@ static struct image_keyword pbm_format[PBM_LAST] =
{":file", IMAGE_STRING_VALUE, 0},
{":data", IMAGE_STRING_VALUE, 0},
{":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0},
- {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0},
+ {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0},
{":relief", IMAGE_INTEGER_VALUE, 0},
- {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
@@ -6958,9 +7059,9 @@ static struct image_keyword png_format[PNG_LAST] =
{":data", IMAGE_STRING_VALUE, 0},
{":file", IMAGE_STRING_VALUE, 0},
{":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0},
- {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0},
+ {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0},
{":relief", IMAGE_INTEGER_VALUE, 0},
- {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
@@ -7444,9 +7545,9 @@ static struct image_keyword jpeg_format[JPEG_LAST] =
{":data", IMAGE_STRING_VALUE, 0},
{":file", IMAGE_STRING_VALUE, 0},
{":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0},
- {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0},
+ {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0},
{":relief", IMAGE_INTEGER_VALUE, 0},
- {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
@@ -7807,9 +7908,9 @@ static struct image_keyword tiff_format[TIFF_LAST] =
{":data", IMAGE_STRING_VALUE, 0},
{":file", IMAGE_STRING_VALUE, 0},
{":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0},
- {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0},
+ {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0},
{":relief", IMAGE_INTEGER_VALUE, 0},
- {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
@@ -8126,9 +8227,9 @@ static struct image_keyword gif_format[GIF_LAST] =
{":data", IMAGE_STRING_VALUE, 0},
{":file", IMAGE_STRING_VALUE, 0},
{":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0},
- {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0},
+ {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0},
{":relief", IMAGE_INTEGER_VALUE, 0},
- {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":image", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}
};
@@ -8441,9 +8542,9 @@ static struct image_keyword gs_format[GS_LAST] =
{":loader", IMAGE_FUNCTION_VALUE, 0},
{":bounding-box", IMAGE_DONT_CHECK_VALUE_TYPE, 1},
{":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0},
- {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0},
+ {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0},
{":relief", IMAGE_INTEGER_VALUE, 0},
- {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
+ {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0},
{":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
@@ -8794,117 +8895,117 @@ value.")
***********************************************************************/
/* If non-null, an asynchronous timer that, when it expires, displays
- a busy cursor on all frames. */
+ an hourglass cursor on all frames. */
-static struct atimer *busy_cursor_atimer;
+static struct atimer *hourglass_atimer;
-/* Non-zero means a busy cursor is currently shown. */
+/* Non-zero means an hourglass cursor is currently shown. */
-static int busy_cursor_shown_p;
+static int hourglass_shown_p;
-/* Number of seconds to wait before displaying a busy cursor. */
+/* Number of seconds to wait before displaying an hourglass cursor. */
-static Lisp_Object Vbusy_cursor_delay;
+static Lisp_Object Vhourglass_delay;
-/* Default number of seconds to wait before displaying a busy
+/* Default number of seconds to wait before displaying an hourglass
cursor. */
-#define DEFAULT_BUSY_CURSOR_DELAY 1
+#define DEFAULT_HOURGLASS_DELAY 1
/* Function prototypes. */
-static void show_busy_cursor P_ ((struct atimer *));
-static void hide_busy_cursor P_ ((void));
+static void show_hourglass P_ ((struct atimer *));
+static void hide_hourglass P_ ((void));
-/* Cancel a currently active busy-cursor timer, and start a new one. */
+/* Cancel a currently active hourglass timer, and start a new one. */
void
-start_busy_cursor ()
+start_hourglass ()
{
-#if 0 /* MAC_TODO: cursor shape changes. */
+#if 0 /* TODO: cursor shape changes. */
EMACS_TIME delay;
int secs, usecs = 0;
- cancel_busy_cursor ();
+ cancel_hourglass ();
- if (INTEGERP (Vbusy_cursor_delay)
- && XINT (Vbusy_cursor_delay) > 0)
- secs = XFASTINT (Vbusy_cursor_delay);
- else if (FLOATP (Vbusy_cursor_delay)
- && XFLOAT_DATA (Vbusy_cursor_delay) > 0)
+ if (INTEGERP (Vhourglass_delay)
+ && XINT (Vhourglass_delay) > 0)
+ secs = XFASTINT (Vhourglass_delay);
+ else if (FLOATP (Vhourglass_delay)
+ && XFLOAT_DATA (Vhourglass_delay) > 0)
{
Lisp_Object tem;
- tem = Ftruncate (Vbusy_cursor_delay, Qnil);
+ tem = Ftruncate (Vhourglass_delay, Qnil);
secs = XFASTINT (tem);
- usecs = (XFLOAT_DATA (Vbusy_cursor_delay) - secs) * 1000000;
+ usecs = (XFLOAT_DATA (Vhourglass_delay) - secs) * 1000000;
}
else
- secs = DEFAULT_BUSY_CURSOR_DELAY;
+ secs = DEFAULT_HOURGLASS_DELAY;
EMACS_SET_SECS_USECS (delay, secs, usecs);
- busy_cursor_atimer = start_atimer (ATIMER_RELATIVE, delay,
- show_busy_cursor, NULL);
+ hourglass_atimer = start_atimer (ATIMER_RELATIVE, delay,
+ show_hourglass, NULL);
#endif
}
-/* Cancel the busy cursor timer if active, hide a busy cursor if
- shown. */
+/* Cancel the hourglass cursor timer if active, hide an hourglass
+ cursor if shown. */
void
-cancel_busy_cursor ()
+cancel_hourglass ()
{
- if (busy_cursor_atimer)
+ if (hourglass_atimer)
{
- cancel_atimer (busy_cursor_atimer);
- busy_cursor_atimer = NULL;
+ cancel_atimer (hourglass_atimer);
+ hourglass_atimer = NULL;
}
- if (busy_cursor_shown_p)
- hide_busy_cursor ();
+ if (hourglass_shown_p)
+ hide_hourglass ();
}
-/* Timer function of busy_cursor_atimer. TIMER is equal to
- busy_cursor_atimer.
+/* Timer function of hourglass_atimer. TIMER is equal to
+ hourglass_atimer.
- Display a busy cursor on all frames by mapping the frames'
- busy_window. Set the busy_p flag in the frames' output_data.x
- structure to indicate that a busy cursor is shown on the
- frames. */
+ Display an hourglass cursor on all frames by mapping the frames'
+ hourglass_window. Set the hourglass_p flag in the frames'
+ output_data.x structure to indicate that an hourglass cursor is
+ shown on the frames. */
static void
-show_busy_cursor (timer)
+show_hourglass (timer)
struct atimer *timer;
{
#if 0 /* MAC_TODO: cursor shape changes. */
/* The timer implementation will cancel this timer automatically
- after this function has run. Set busy_cursor_atimer to null
+ after this function has run. Set hourglass_atimer to null
so that we know the timer doesn't have to be canceled. */
- busy_cursor_atimer = NULL;
+ hourglass_atimer = NULL;
- if (!busy_cursor_shown_p)
+ if (!hourglass_shown_p)
{
Lisp_Object rest, frame;
BLOCK_INPUT;
FOR_EACH_FRAME (rest, frame)
- if (FRAME_X_P (XFRAME (frame)))
+ if (FRAME_W32_P (XFRAME (frame)))
{
struct frame *f = XFRAME (frame);
- f->output_data.w32->busy_p = 1;
+ f->output_data.w32->hourglass_p = 1;
- if (!f->output_data.w32->busy_window)
+ if (!f->output_data.w32->hourglass_window)
{
unsigned long mask = CWCursor;
XSetWindowAttributes attrs;
- attrs.cursor = f->output_data.w32->busy_cursor;
+ attrs.cursor = f->output_data.w32->hourglass_cursor;
- f->output_data.w32->busy_window
+ f->output_data.w32->hourglass_window
= XCreateWindow (FRAME_X_DISPLAY (f),
FRAME_OUTER_WINDOW (f),
0, 0, 32000, 32000, 0, 0,
@@ -8913,24 +9014,25 @@ show_busy_cursor (timer)
mask, &attrs);
}
- XMapRaised (FRAME_X_DISPLAY (f), f->output_data.w32->busy_window);
+ XMapRaised (FRAME_X_DISPLAY (f),
+ f->output_data.w32->hourglass_window);
XFlush (FRAME_X_DISPLAY (f));
}
- busy_cursor_shown_p = 1;
+ hourglass_shown_p = 1;
UNBLOCK_INPUT;
}
#endif
}
-/* Hide the busy cursor on all frames, if it is currently shown. */
+/* Hide the hourglass cursor on all frames, if it is currently shown. */
static void
-hide_busy_cursor ()
+hide_hourglass ()
{
-#if 0 /* MAC_TODO: cursor shape changes. */
- if (busy_cursor_shown_p)
+#if 0 /* TODO: cursor shape changes. */
+ if (hourglass_shown_p)
{
Lisp_Object rest, frame;
@@ -8939,19 +9041,20 @@ hide_busy_cursor ()
{
struct frame *f = XFRAME (frame);
- if (FRAME_X_P (f)
+ if (FRAME_W32_P (f)
/* Watch out for newly created frames. */
- && f->output_data.x->busy_window)
+ && f->output_data.x->hourglass_window)
{
- XUnmapWindow (FRAME_X_DISPLAY (f), f->output_data.x->busy_window);
- /* Sync here because XTread_socket looks at the busy_p flag
- that is reset to zero below. */
+ XUnmapWindow (FRAME_X_DISPLAY (f),
+ f->output_data.x->hourglass_window);
+ /* Sync here because XTread_socket looks at the
+ hourglass_p flag that is reset to zero below. */
XSync (FRAME_X_DISPLAY (f), False);
- f->output_data.x->busy_p = 0;
+ f->output_data.x->hourglass_p = 0;
}
}
- busy_cursor_shown_p = 0;
+ hourglass_shown_p = 0;
UNBLOCK_INPUT;
}
#endif
@@ -9214,23 +9317,33 @@ x_create_tip_frame (dpyinfo, parms)
return Qnil;
}
-
+#ifdef TODO /* Tooltip support not complete. */
DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
"Show STRING in a \"tooltip\" window on frame FRAME.\n\
-A tooltip window is a small X window displaying STRING at\n\
-the current mouse position.\n\
+A tooltip window is a small window displaying a string.\n\
+\n\
FRAME nil or omitted means use the selected frame.\n\
+\n\
PARMS is an optional list of frame parameters which can be\n\
used to change the tooltip's appearance.\n\
+\n\
Automatically hide the tooltip after TIMEOUT seconds.\n\
-TIMEOUT nil means use the default timeout of 5 seconds.")
- (string, frame, parms, timeout)
- Lisp_Object string, frame, parms, timeout;
+TIMEOUT nil means use the default timeout of 5 seconds.\n\
+\n\
+If the list of frame parameters PARAMS contains a `left' parameters,\n\
+the tooltip is displayed at that x-position. Otherwise it is\n\
+displayed at the mouse position, with offset DX added (default is 5 if\n\
+DX isn't specified). Likewise for the y-position; if a `top' frame\n\
+parameter is specified, it determines the y-position of the tooltip\n\
+window, otherwise it is displayed at the mouse position, with offset\n\
+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;
+ Lisp_Object buffer, top, left;
struct buffer *old_buffer;
struct text_pos pos;
int i, width, height;
@@ -9251,9 +9364,55 @@ TIMEOUT nil means use the default timeout of 5 seconds.")
else
CHECK_NATNUM (timeout, 2);
+ if (NILP (dx))
+ dx = make_number (5);
+ else
+ CHECK_NUMBER (dx, 5);
+
+ if (NILP (dy))
+ dy = make_number (-10);
+ else
+ CHECK_NUMBER (dy, 6);
+
+ if (NILP (last_show_tip_args))
+ last_show_tip_args = Fmake_vector (make_number (3), Qnil);
+
+ if (!NILP (tip_frame))
+ {
+ Lisp_Object last_string = AREF (last_show_tip_args, 0);
+ Lisp_Object last_frame = AREF (last_show_tip_args, 1);
+ Lisp_Object last_parms = AREF (last_show_tip_args, 2);
+
+ if (EQ (frame, last_frame)
+ && !NILP (Fequal (last_string, string))
+ && !NILP (Fequal (last_parms, parms)))
+ {
+ struct frame *f = XFRAME (tip_frame);
+
+ /* Only DX and DY have changed. */
+ if (!NILP (tip_timer))
+ {
+ Lisp_Object timer = tip_timer;
+ tip_timer = Qnil;
+ call1 (Qcancel_timer, timer);
+ }
+
+ 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 - PIXEL_HEIGHT (f));
+ UNBLOCK_INPUT;
+ goto start_timer;
+ }
+ }
+
/* Hide a previous tip, if any. */
Fx_hide_tip ();
+ ASET (last_show_tip_args, 0, string);
+ ASET (last_show_tip_args, 1, frame);
+ ASET (last_show_tip_args, 2, parms);
+
/* Add default values to frame parameters. */
if (NILP (Fassq (Qname, parms)))
parms = Fcons (Fcons (Qname, build_string ("tooltip")), parms);
@@ -9277,8 +9436,8 @@ TIMEOUT nil means use the default timeout of 5 seconds.")
will loose. I don't think this is a realistic case. */
w = XWINDOW (FRAME_ROOT_WINDOW (f));
w->left = w->top = make_number (0);
- w->width = 80;
- w->height = 40;
+ w->width = make_number (80);
+ w->height = make_number (40);
adjust_glyphs (f);
w->pseudo_window_p = 1;
@@ -9288,7 +9447,7 @@ TIMEOUT nil means use the default timeout of 5 seconds.")
old_buffer = current_buffer;
set_buffer_internal_1 (XBUFFER (buffer));
Ferase_buffer ();
- Finsert (make_number (1), &string);
+ Finsert (1, &string);
clear_glyph_matrix (w->desired_matrix);
clear_glyph_matrix (w->current_matrix);
SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
@@ -9330,15 +9489,15 @@ TIMEOUT nil means use the default timeout of 5 seconds.")
/* Move the tooltip window where the mouse pointer is. Resize and
show it. */
-#if 0 /* MAC_TODO : Mac specifics */
+ compute_tip_xy (f, parms, dx, dy, &root_x, &root_y);
+
+#if 0 /* TODO : Mac specifics */
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));
+ XMoveResizeWindow (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+ root_x, root_y - height, width, height);
+ XMapRaised (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f));
UNBLOCK_INPUT;
-#endif /* MAC_TODO */
+#endif /* TODO */
/* Draw into the window. */
w->must_be_updated_p = 1;
@@ -9348,6 +9507,7 @@ TIMEOUT nil means use the default timeout of 5 seconds.")
set_buffer_internal_1 (old_buffer);
windows_or_buffers_changed = old_windows_or_buffers_changed;
+ start_timer:
/* Let the tip disappear after timeout seconds. */
tip_timer = call3 (intern ("run-at-time"), timeout, Qnil,
intern ("x-hide-tip"));
@@ -9356,49 +9516,42 @@ TIMEOUT nil means use the default timeout of 5 seconds.")
return unbind_to (count, Qnil);
}
+
DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
"Hide the current tooltip window, if there is any.\n\
Value is t is tooltip was open, nil otherwise.")
()
{
int count;
- Lisp_Object deleted;
+ Lisp_Object deleted, frame, timer;
+ struct gcpro gcpro1, gcpro2;
/* Return quickly if nothing to do. */
- if (NILP (tip_timer) && !FRAMEP (tip_frame))
+ if (NILP (tip_timer) && NILP (tip_frame))
return Qnil;
+ frame = tip_frame;
+ timer = tip_timer;
+ GCPRO2 (frame, timer);
+ tip_frame = tip_timer = deleted = Qnil;
+
count = BINDING_STACK_SIZE ();
- deleted = Qnil;
specbind (Qinhibit_redisplay, Qt);
specbind (Qinhibit_quit, Qt);
- if (!NILP (tip_timer))
- {
- Lisp_Object tem;
- struct gcpro gcpro1;
- tem = tip_timer;
- GCPRO1 (tem);
- tip_timer = Qnil;
- call1 (intern ("cancel-timer"), tem);
- UNGCPRO;
- }
+ if (!NILP (timer))
+ call1 (Qcancel_timer, timer);
- if (FRAMEP (tip_frame))
+ if (FRAMEP (frame))
{
- Lisp_Object frame;
- struct gcpro gcpro1;
-
- frame = tip_frame;
- GCPRO1 (frame);
- tip_frame = Qnil;
Fdelete_frame (frame, Qnil);
deleted = Qt;
- UNGCPRO;
}
+ UNGCPRO;
return unbind_to (count, deleted);
}
+#endif
@@ -9620,6 +9773,8 @@ syms_of_macfns ()
staticpro (&Qline_spacing);
Qcenter = intern ("center");
staticpro (&Qcenter);
+ Qcancel_timer = intern ("cancel-timer");
+ staticpro (&Qcancel_timer);
/* This is the end of symbol initialization. */
Qhyper = intern ("hyper");
@@ -9678,20 +9833,20 @@ switches, if present.");
Vx_mode_pointer_shape = Qnil;
- DEFVAR_LISP ("x-busy-pointer-shape", &Vx_busy_pointer_shape,
+ DEFVAR_LISP ("x-hourglass-pointer-shape", &Vx_hourglass_pointer_shape,
"The shape of the pointer when Emacs is busy.\n\
This variable takes effect when you create a new frame\n\
or when you set the mouse color.");
- Vx_busy_pointer_shape = Qnil;
+ Vx_hourglass_pointer_shape = Qnil;
- DEFVAR_BOOL ("display-busy-cursor", &display_busy_cursor_p,
- "Non-zero means Emacs displays a busy cursor on window systems.");
- display_busy_cursor_p = 1;
+ DEFVAR_BOOL ("display-hourglass", &display_hourglass_p,
+ "Non-zero means Emacs displays an hourglass pointer on window systems.");
+ display_hourglass_p = 1;
- DEFVAR_LISP ("busy-cursor-delay", &Vbusy_cursor_delay,
- "*Seconds to wait before displaying a busy-cursor.\n\
+ DEFVAR_LISP ("hourglass-delay", &Vhourglass_delay,
+ "*Seconds to wait before displaying an hourglass pointer.\n\
Value must be an integer or float.");
- Vbusy_cursor_delay = make_number (DEFAULT_BUSY_CURSOR_DELAY);
+ Vhourglass_delay = make_number (DEFAULT_HOURGLASS_DELAY);
DEFVAR_LISP ("x-sensitive-text-pointer-shape",
&Vx_sensitive_text_pointer_shape,
@@ -9841,15 +9996,18 @@ meaning don't clear the cache.");
defsubr (&Simagep);
defsubr (&Slookup_image);
#endif
-#endif /* MAC_TODO */
-
- busy_cursor_atimer = NULL;
- busy_cursor_shown_p = 0;
+#endif /* TODO */
+ hourglass_atimer = NULL;
+ hourglass_shown_p = 0;
+#ifdef TODO /* Tooltip support not complete. */
defsubr (&Sx_show_tip);
defsubr (&Sx_hide_tip);
- staticpro (&tip_timer);
+#endif
tip_timer = Qnil;
+ staticpro (&tip_timer);
+ tip_frame = Qnil;
+ staticpro (&tip_frame);
#if 0 /* MAC_TODO */
defsubr (&Sx_file_dialog);
@@ -9863,8 +10021,8 @@ init_xfns ()
image_types = NULL;
Vimage_types = Qnil;
+#if 0 /* TODO : Image support for W32 */
define_image_type (&xbm_type);
-#if 0 /* NTEMACS_TODO : Image support for W32 */
define_image_type (&gs_type);
define_image_type (&pbm_type);
diff --git a/mac/src/macmenu.c b/mac/src/macmenu.c
index ac697cf7490..41536e466aa 100644
--- a/mac/src/macmenu.c
+++ b/mac/src/macmenu.c
@@ -1345,7 +1345,7 @@ set_frame_menubar (f, first_time, deep_p)
set_buffer_internal_1 (XBUFFER (buffer));
/* Run the Lucid hook. */
- call1 (Vrun_hooks, Qactivate_menubar_hook);
+ safe_run_hooks (Qactivate_menubar_hook);
/* If it has changed current-menubar from previous value,
really recompute the menubar from the value. */
if (! NILP (Vlucid_menu_bar_dirty_flag))
diff --git a/mac/src/macterm.c b/mac/src/macterm.c
index 2b7ea0f0a61..a6f979ed7b4 100644
--- a/mac/src/macterm.c
+++ b/mac/src/macterm.c
@@ -540,7 +540,7 @@ XDrawLine (display, w, gc, x1, y1, x2, y2)
/* Mac version of XClearArea. */
-static void
+void
XClearArea (display, w, x, y, width, height, exposures)
Display *display;
WindowPtr w;
@@ -11101,6 +11101,7 @@ static long app_sleep_time = WNE_SLEEP_AT_RESUME;
#define ARGV_STRING_LIST_ID 129
#define ABOUT_ALERT_ID 128
+#define RAM_TOO_LARGE_ALERT_ID 129
Boolean terminate_flag = false;
@@ -11178,6 +11179,22 @@ do_init_managers (void)
static void
+do_check_ram_size (void)
+{
+ SInt32 physical_ram_size, logical_ram_size;
+
+ if (Gestalt (gestaltPhysicalRAMSize, &physical_ram_size) != noErr
+ || Gestalt (gestaltLogicalRAMSize, &logical_ram_size) != noErr
+ || physical_ram_size > 256 * 1024 * 1024
+ || logical_ram_size > 256 * 1024 * 1024)
+ {
+ StopAlert (RAM_TOO_LARGE_ALERT_ID, NULL);
+ exit (1);
+ }
+}
+
+
+static void
do_window_update (WindowPtr win)
{
struct mac_output *mwp = (mac_output *) GetWRefCon (win);
@@ -11644,6 +11661,8 @@ main (void)
do_get_menus ();
+ do_check_ram_size ();
+
init_emacs_passwd_dir ();
init_environ ();