X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/f46305c86cd247b2396e73ce8bb064f69373834d..9c25330708e49ddaeb71f16a65cdc1b51be2a27d:/src/frame.c diff --git a/src/frame.c b/src/frame.c index e88432b980..bb44f3cc98 100644 --- a/src/frame.c +++ b/src/frame.c @@ -69,7 +69,6 @@ Lisp_Object Qnoelisp; static Lisp_Object Qx_frame_parameter; Lisp_Object Qx_resource_name; Lisp_Object Qterminal; -Lisp_Object Qterminal_live_p; /* Frame parameters (set or reported). */ @@ -114,7 +113,7 @@ Lisp_Object Qface_set_after_frame_default; static Lisp_Object Qdelete_frame_functions; -Lisp_Object Qgeometry, Qworkarea, Qmm_size, Qframes, Qsource; +static Lisp_Object Qgeometry, Qworkarea, Qmm_size, Qframes, Qsource; #ifdef HAVE_WINDOW_SYSTEM static void x_report_frame_params (struct frame *, Lisp_Object *); @@ -167,7 +166,7 @@ struct frame * decode_window_system_frame (Lisp_Object frame) { struct frame *f = decode_live_frame (frame); - + if (!window_system_available (f)) error ("Window system frame should be used"); return f; @@ -186,7 +185,6 @@ set_menu_bar_lines_1 (Lisp_Object window, int n) { struct window *w = XWINDOW (window); - w->last_modified = 0; w->top_line += n; w->total_lines -= n; @@ -310,7 +308,7 @@ predicates which report frame's specific UI-related capabilities. */) } struct frame * -make_frame (int mini_p) +make_frame (bool mini_p) { Lisp_Object frame; register struct frame *f; @@ -389,7 +387,7 @@ make_frame (int mini_p) etc. Running Lisp functions at this point surely ends in a SEGV. */ set_window_buffer (root_window, buf, 0, 0); - fset_buffer_list (f, Fcons (buf, Qnil)); + fset_buffer_list (f, list1 (buf)); } if (mini_p) @@ -694,24 +692,16 @@ affects all frames on the same terminal device. */) ? FRAME_TTY (XFRAME (selected_frame))->name : NULL)); if (!NILP (tty)) - { - name = alloca (SBYTES (tty) + 1); - memcpy (name, SSDATA (tty), SBYTES (tty)); - name[SBYTES (tty)] = 0; - } + name = xlispstrdupa (tty); tty_type = get_future_frame_param (Qtty_type, parms, (FRAME_TERMCAP_P (XFRAME (selected_frame)) ? FRAME_TTY (XFRAME (selected_frame))->type : NULL)); if (!NILP (tty_type)) - { - type = alloca (SBYTES (tty_type) + 1); - memcpy (type, SSDATA (tty_type), SBYTES (tty_type)); - type[SBYTES (tty_type)] = 0; - } + type = xlispstrdupa (tty_type); - t = init_tty (name, type, 0); /* Errors are not fatal. */ + t = init_tty (name, type, 0); /* Errors are not fatal. */ } f = make_terminal_frame (t); @@ -725,16 +715,13 @@ affects all frames on the same terminal device. */) adjust_glyphs (f); calculate_costs (f); XSETFRAME (frame, f); + + store_in_alist (&parms, Qtty_type, build_string (t->display_info.tty->type)); + store_in_alist (&parms, Qtty, + (t->display_info.tty->name + ? build_string (t->display_info.tty->name) + : Qnil)); Fmodify_frame_parameters (frame, parms); - Fmodify_frame_parameters (frame, Fcons (Fcons (Qtty_type, - build_string (t->display_info.tty->type)), - Qnil)); - if (t->display_info.tty->name != NULL) - Fmodify_frame_parameters (frame, Fcons (Fcons (Qtty, - build_string (t->display_info.tty->name)), - Qnil)); - else - Fmodify_frame_parameters (frame, Fcons (Fcons (Qtty, Qnil), Qnil)); /* Make the frame face alist be frame-specific, so that each frame could change its face definitions independently. */ @@ -887,6 +874,26 @@ This function returns FRAME, or nil if FRAME has been deleted. */) return do_switch_frame (frame, 1, 0, norecord); } +DEFUN ("handle-focus-in", Fhandle_focus_in, Shandle_focus_in, 1, 1, "e", + doc: /* Handle a focus-in event. +Focus in events are usually bound to this function. +Focus in events occur when a frame has focus, but a switch-frame event +is not generated. +This function checks if blink-cursor timers should be turned on again. */) + (Lisp_Object event) +{ + return call0 (intern ("blink-cursor-check")); +} + +DEFUN ("handle-focus-out", Fhandle_focus_out, Shandle_focus_out, 1, 1, "e", + doc: /* Handle a focus-out event. +Focus out events are usually bound to this function. +Focus out events occur when no frame has focus. +This function checks if blink-cursor timers should be turned off. */) + (Lisp_Object event) +{ + return call0 (intern ("blink-cursor-suspend")); +} DEFUN ("handle-switch-frame", Fhandle_switch_frame, Shandle_switch_frame, 1, 1, "e", doc: /* Handle a switch-frame event EVENT. @@ -902,6 +909,7 @@ to that frame. */) /* Preserve prefix arg that the command loop just cleared. */ kset_prefix_arg (current_kboard, Vcurrent_prefix_arg); Frun_hooks (1, &Qmouse_leave_buffer_hook); + Fhandle_focus_in (event); // switch-frame implies a focus in. return do_switch_frame (event, 0, 0, Qnil); } @@ -1076,7 +1084,7 @@ Otherwise, include all frames. */) (Exception: if F is the terminal frame, and we are using X, return 1.) */ static int -other_visible_frames (FRAME_PTR f) +other_visible_frames (struct frame *f) { Lisp_Object frames, this; @@ -1136,10 +1144,14 @@ delete_frame (Lisp_Object frame, Lisp_Object force) FOR_EACH_FRAME (frames, this) { - if (! EQ (this, frame) - && EQ (frame, - WINDOW_FRAME (XWINDOW - (FRAME_MINIBUF_WINDOW (XFRAME (this)))))) + Lisp_Object fminiw; + + if (EQ (this, frame)) + continue; + + fminiw = FRAME_MINIBUF_WINDOW (XFRAME (this)); + + if (WINDOWP (fminiw) && EQ (frame, WINDOW_FRAME (XWINDOW (fminiw)))) { /* If we MUST delete this frame, delete the other first. But do this only if FORCE equals `noelisp'. */ @@ -1446,7 +1458,7 @@ passing the normal return value to that function as an argument, and returns whatever that function returns. */) (void) { - FRAME_PTR f; + struct frame *f; Lisp_Object lispy_dummy; Lisp_Object x, y, retval; struct gcpro gcpro1; @@ -1492,7 +1504,7 @@ to read the mouse position, it returns the selected frame for FRAME and nil for X and Y. */) (void) { - FRAME_PTR f; + struct frame *f; Lisp_Object lispy_dummy; Lisp_Object x, y; @@ -1855,7 +1867,7 @@ See `redirect-frame-focus'. */) /* Return the value of frame parameter PROP in frame FRAME. */ #ifdef HAVE_WINDOW_SYSTEM -#if !HAVE_NS && !defined(WINDOWSNT) +#if !HAVE_NS && !defined (WINDOWSNT) static #endif Lisp_Object @@ -2228,7 +2240,9 @@ use is not recommended. Explicitly check for a frame-parameter instead. */) (Lisp_Object frame, Lisp_Object alist) { struct frame *f = decode_live_frame (frame); - register Lisp_Object tail, prop, val; + register Lisp_Object prop, val; + + CHECK_LIST (alist); /* I think this should be done with a hook. */ #ifdef HAVE_WINDOW_SYSTEM @@ -2253,12 +2267,11 @@ use is not recommended. Explicitly check for a frame-parameter instead. */) /* Extract parm names and values into those vectors. */ - i = 0; - for (tail = alist; CONSP (tail); tail = XCDR (tail)) + for (i = 0; CONSP (alist); alist = XCDR (alist)) { Lisp_Object elt; - elt = XCAR (tail); + elt = XCAR (alist); parms[i] = Fcar (elt); values[i] = Fcdr (elt); i++; @@ -2339,7 +2352,7 @@ to `frame-height'). */) #ifdef HAVE_WINDOW_SYSTEM if (FRAME_WINDOW_P (f)) - return make_number (x_pixel_height (f)); + return make_number (FRAME_PIXEL_HEIGHT (f)); else #endif return make_number (FRAME_LINES (f)); @@ -2356,7 +2369,7 @@ If FRAME is omitted or nil, the selected frame is used. */) #ifdef HAVE_WINDOW_SYSTEM if (FRAME_WINDOW_P (f)) - return make_number (x_pixel_width (f)); + return make_number (FRAME_PIXEL_WIDTH (f)); else #endif return make_number (FRAME_COLS (f)); @@ -2381,8 +2394,9 @@ is used. */) DEFUN ("set-frame-height", Fset_frame_height, Sset_frame_height, 2, 3, 0, doc: /* Specify that the frame FRAME has LINES lines. -Optional third arg non-nil means that redisplay should use LINES lines -but that the idea of the actual height of the frame should not be changed. */) +If FRAME is nil, the selected frame is used. Optional third arg +non-nil means that redisplay should use LINES lines but that the +idea of the actual height of the frame should not be changed. */) (Lisp_Object frame, Lisp_Object lines, Lisp_Object pretend) { register struct frame *f = decode_live_frame (frame); @@ -2405,8 +2419,9 @@ but that the idea of the actual height of the frame should not be changed. */) DEFUN ("set-frame-width", Fset_frame_width, Sset_frame_width, 2, 3, 0, doc: /* Specify that the frame FRAME has COLS columns. -Optional third arg non-nil means that redisplay should use COLS columns -but that the idea of the actual width of the frame should not be changed. */) +If FRAME is nil, the selected frame is used. Optional third arg +non-nil means that redisplay should use COLS columns but that the +idea of the actual width of the frame should not be changed. */) (Lisp_Object frame, Lisp_Object cols, Lisp_Object pretend) { register struct frame *f = decode_live_frame (frame); @@ -2428,15 +2443,14 @@ but that the idea of the actual width of the frame should not be changed. */) } DEFUN ("set-frame-size", Fset_frame_size, Sset_frame_size, 3, 3, 0, - doc: /* Sets size of FRAME to COLS by ROWS, measured in characters. */) + doc: /* Sets size of FRAME to COLS by ROWS, measured in characters. +If FRAME is nil, the selected frame is used. */) (Lisp_Object frame, Lisp_Object cols, Lisp_Object rows) { - register struct frame *f; + register struct frame *f = decode_live_frame (frame); - CHECK_LIVE_FRAME (frame); CHECK_TYPE_RANGED_INTEGER (int, cols); CHECK_TYPE_RANGED_INTEGER (int, rows); - f = XFRAME (frame); /* I think this should be done with a hook. */ #ifdef HAVE_WINDOW_SYSTEM @@ -2458,17 +2472,16 @@ DEFUN ("set-frame-size", Fset_frame_size, Sset_frame_size, 3, 3, 0, DEFUN ("set-frame-position", Fset_frame_position, Sset_frame_position, 3, 3, 0, doc: /* Sets position of FRAME in pixels to XOFFSET by YOFFSET. -This is actually the position of the upper left corner of the frame. -Negative values for XOFFSET or YOFFSET are interpreted relative to -the rightmost or bottommost possible position (that stays within the screen). */) +If FRAME is nil, the selected frame is used. XOFFSET and YOFFSET are +actually the position of the upper left corner of the frame. Negative +values for XOFFSET or YOFFSET are interpreted relative to the rightmost +or bottommost possible position (that stays within the screen). */) (Lisp_Object frame, Lisp_Object xoffset, Lisp_Object yoffset) { - register struct frame *f; + register struct frame *f = decode_live_frame (frame); - CHECK_LIVE_FRAME (frame); CHECK_TYPE_RANGED_INTEGER (int, xoffset); CHECK_TYPE_RANGED_INTEGER (int, yoffset); - f = XFRAME (frame); /* I think this should be done with a hook. */ #ifdef HAVE_WINDOW_SYSTEM @@ -2588,7 +2601,7 @@ x_fullscreen_adjust (struct frame *f, int *width, int *height, int *top_pos, int to store the new value in the parameter alist. */ void -x_set_frame_parameters (FRAME_PTR f, Lisp_Object alist) +x_set_frame_parameters (struct frame *f, Lisp_Object alist) { Lisp_Object tail; @@ -2607,9 +2620,9 @@ x_set_frame_parameters (FRAME_PTR f, Lisp_Object alist) Lisp_Object *parms; Lisp_Object *values; ptrdiff_t i, p; - int left_no_change = 0, top_no_change = 0; - int icon_left_no_change = 0, icon_top_no_change = 0; - int size_changed = 0; + bool left_no_change = 0, top_no_change = 0; + bool icon_left_no_change = 0, icon_top_no_change = 0; + bool size_changed = 0; struct gcpro gcpro1, gcpro2; i = 0; @@ -2731,7 +2744,7 @@ x_set_frame_parameters (FRAME_PTR f, Lisp_Object alist) { left_no_change = 1; if (f->left_pos < 0) - left = Fcons (Qplus, Fcons (make_number (f->left_pos), Qnil)); + left = list2 (Qplus, make_number (f->left_pos)); else XSETINT (left, f->left_pos); } @@ -2739,7 +2752,7 @@ x_set_frame_parameters (FRAME_PTR f, Lisp_Object alist) { top_no_change = 1; if (f->top_pos < 0) - top = Fcons (Qplus, Fcons (make_number (f->top_pos), Qnil)); + top = list2 (Qplus, make_number (f->top_pos)); else XSETINT (top, f->top_pos); } @@ -2845,10 +2858,11 @@ x_set_frame_parameters (FRAME_PTR f, Lisp_Object alist) /* Actually set that position, and convert to absolute. */ x_set_offset (f, leftpos, toppos, -1); } - +#ifdef HAVE_X_WINDOWS if ((!NILP (icon_left) || !NILP (icon_top)) && ! (icon_left_no_change && icon_top_no_change)) x_wm_set_icon_position (f, XINT (icon_left), XINT (icon_top)); +#endif /* HAVE_X_WINDOWS */ } UNGCPRO; @@ -2874,13 +2888,13 @@ x_report_frame_params (struct frame *f, Lisp_Object *alistptr) if (f->left_pos >= 0) store_in_alist (alistptr, Qleft, tem); else - store_in_alist (alistptr, Qleft, Fcons (Qplus, Fcons (tem, Qnil))); + store_in_alist (alistptr, Qleft, list2 (Qplus, tem)); XSETINT (tem, f->top_pos); if (f->top_pos >= 0) store_in_alist (alistptr, Qtop, tem); else - store_in_alist (alistptr, Qtop, Fcons (Qplus, Fcons (tem, Qnil))); + store_in_alist (alistptr, Qtop, list2 (Qplus, tem)); store_in_alist (alistptr, Qborder_width, make_number (f->border_width)); @@ -2925,7 +2939,7 @@ x_report_frame_params (struct frame *f, Lisp_Object *alistptr) if (FRAME_X_OUTPUT (f)->parent_desc == FRAME_X_DISPLAY_INFO (f)->root_window) tem = Qnil; else - XSETFASTINT (tem, FRAME_X_OUTPUT (f)->parent_desc); + tem = make_natnum ((uintptr_t) FRAME_X_OUTPUT (f)->parent_desc); store_in_alist (alistptr, Qexplicit_name, (f->explicit_name ? Qt : Qnil)); store_in_alist (alistptr, Qparent_id, tem); store_in_alist (alistptr, Qtool_bar_position, f->tool_bar_position); @@ -2964,6 +2978,15 @@ x_set_line_spacing (struct frame *f, Lisp_Object new_value, Lisp_Object old_valu f->extra_line_spacing = 0; else if (RANGED_INTEGERP (0, new_value, INT_MAX)) f->extra_line_spacing = XFASTINT (new_value); + else if (FLOATP (new_value)) + { + int new_spacing = XFLOAT_DATA (new_value) * FRAME_LINE_HEIGHT (f) + 0.5; + + if (new_spacing >= 0) + f->extra_line_spacing = new_spacing; + else + signal_error ("Invalid line-spacing", new_value); + } else signal_error ("Invalid line-spacing", new_value); if (FRAME_VISIBLE_P (f)) @@ -3316,7 +3339,7 @@ x_set_scroll_bar_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval) /* Return non-nil if frame F wants a bitmap icon. */ Lisp_Object -x_icon_type (FRAME_PTR f) +x_icon_type (struct frame *f) { Lisp_Object tem; @@ -3513,7 +3536,7 @@ xrdb_get_resource (XrmDatabase rdb, Lisp_Object attribute, Lisp_Object class, Li value = x_get_string_resource (rdb, name_key, class_key); - if (value != (char *) 0 && *value) + if (value && *value) return build_string (value); else return Qnil; @@ -3730,7 +3753,7 @@ x_default_parameter (struct frame *f, Lisp_Object alist, Lisp_Object prop, tem = x_frame_get_arg (f, alist, prop, xprop, xclass, type); if (EQ (tem, Qunbound)) tem = deflt; - x_set_frame_parameters (f, Fcons (Fcons (prop, tem), Qnil)); + x_set_frame_parameters (f, list1 (Fcons (prop, tem))); return tem; } @@ -3862,9 +3885,9 @@ On Nextstep, this just calls `ns-parse-geometry'. */) Lisp_Object element; if (x >= 0 && (geometry & XNegative)) - element = Fcons (Qleft, Fcons (Qminus, Fcons (make_number (-x), Qnil))); + element = list3 (Qleft, Qminus, make_number (-x)); else if (x < 0 && ! (geometry & XNegative)) - element = Fcons (Qleft, Fcons (Qplus, Fcons (make_number (x), Qnil))); + element = list3 (Qleft, Qplus, make_number (x)); else element = Fcons (Qleft, make_number (x)); result = Fcons (element, result); @@ -3875,9 +3898,9 @@ On Nextstep, this just calls `ns-parse-geometry'. */) Lisp_Object element; if (y >= 0 && (geometry & YNegative)) - element = Fcons (Qtop, Fcons (Qminus, Fcons (make_number (-y), Qnil))); + element = list3 (Qtop, Qminus, make_number (-y)); else if (y < 0 && ! (geometry & YNegative)) - element = Fcons (Qtop, Fcons (Qplus, Fcons (make_number (y), Qnil))); + element = list3 (Qtop, Qplus, make_number (y)); else element = Fcons (Qtop, make_number (y)); result = Fcons (element, result); @@ -3904,8 +3927,8 @@ On Nextstep, this just calls `ns-parse-geometry'. */) #define DEFAULT_ROWS 35 #define DEFAULT_COLS 80 -int -x_figure_window_size (struct frame *f, Lisp_Object parms, int toolbar_p) +long +x_figure_window_size (struct frame *f, Lisp_Object parms, bool toolbar_p) { register Lisp_Object tem0, tem1, tem2; long window_prompting = 0; @@ -4138,6 +4161,8 @@ selected frame. This is useful when `make-pointer-invisible' is set. */) #ifdef HAVE_WINDOW_SYSTEM +# if (defined HAVE_NS \ + || (!defined USE_GTK && (defined HAVE_XINERAMA || defined HAVE_XRANDR))) void free_monitors (struct MonitorInfo *monitors, int n_monitors) { @@ -4146,6 +4171,7 @@ free_monitors (struct MonitorInfo *monitors, int n_monitors) xfree (monitors[i].name); xfree (monitors); } +# endif Lisp_Object make_monitor_attribute_list (struct MonitorInfo *monitors, @@ -4169,8 +4195,7 @@ make_monitor_attribute_list (struct MonitorInfo *monitors, mi->work.width, mi->work.height); geometry = list4i (mi->geom.x, mi->geom.y, mi->geom.width, mi->geom.height); - attributes = Fcons (Fcons (Qsource, - make_string (source, strlen (source))), + attributes = Fcons (Fcons (Qsource, build_string (source)), attributes); attributes = Fcons (Fcons (Qframes, AREF (monitor_frames, i)), attributes); @@ -4253,7 +4278,6 @@ syms_of_frame (void) DEFSYM (Qx_frame_parameter, "x-frame-parameter"); DEFSYM (Qterminal, "terminal"); - DEFSYM (Qterminal_live_p, "terminal-live-p"); DEFSYM (Qgeometry, "geometry"); DEFSYM (Qworkarea, "workarea"); @@ -4437,6 +4461,8 @@ automatically. See also `mouse-autoselect-window'. */); defsubr (&Swindow_system); defsubr (&Smake_terminal_frame); defsubr (&Shandle_switch_frame); + defsubr (&Shandle_focus_in); + defsubr (&Shandle_focus_out); defsubr (&Sselect_frame); defsubr (&Sselected_frame); defsubr (&Sframe_list);