Lisp_Object Qnomini, Qvisible_nomini, Qiconic_nomini, Qinvisible_nomini;
Lisp_Object Qvisible_iconic_nomini, Qinvisible_iconic_nomini;
-Lisp_Object Qset_specifier, Qset_glyph_image, Qset_face_property;
+Lisp_Object Qset_specifier, Qset_face_property;
Lisp_Object Qface_property_instance;
Lisp_Object Qframe_property_alias;
XWINDOW (root_window)->pixel_width = 10;
XWINDOW (root_window)->pixel_height = 9;
- /* The size of the minibuffer window is now set in x_create_frame
- in xfns.c. */
-
f->root_window = root_window;
f->selected_window = root_window;
f->last_nonminibuf_window = root_window;
}
int
-device_matches_console_spec (Lisp_Object frame, Lisp_Object device,
- Lisp_Object console)
+device_matches_console_spec (Lisp_Object device, Lisp_Object console)
{
if (EQ (console, Qwindow_system))
return DEVICE_WIN_P (XDEVICE (device));
- if (NILP (console))
- console = (DEVICE_CONSOLE (XDEVICE (FRAME_DEVICE (XFRAME (frame)))));
if (DEVICEP (console))
return EQ (device, console);
if (CONSOLEP (console))
FRAMETYPE and CONSOLE control which frames and devices
are considered; see `next-frame'. */
-static Lisp_Object
-next_frame_internal (Lisp_Object frame, Lisp_Object frametype,
- Lisp_Object console, int called_from_delete_device)
+Lisp_Object
+next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
{
+ Lisp_Object first = Qnil;
+ Lisp_Object devcons, concons;
int passed = 0;
- int started_over = 0;
- /* If this frame is dead, it won't be in frame_list, and we'll loop
- forever. Forestall that. */
CHECK_LIVE_FRAME (frame);
- while (1)
+ DEVICE_LOOP_NO_BREAK (devcons, concons)
{
- Lisp_Object devcons, concons;
+ Lisp_Object device = XCAR (devcons);
+ Lisp_Object frmcons;
- DEVICE_LOOP_NO_BREAK (devcons, concons)
+ if (!device_matches_console_spec (device, console))
{
- Lisp_Object device = XCAR (devcons);
- Lisp_Object frmcons;
+ if (EQ (device, FRAME_DEVICE (XFRAME (frame))))
+ passed = 1;
+ continue;
+ }
- if (!device_matches_console_spec (frame, device, console))
- continue;
+ DEVICE_FRAME_LOOP (frmcons, XDEVICE (device))
+ {
+ Lisp_Object f = XCAR (frmcons);
- DEVICE_FRAME_LOOP (frmcons, XDEVICE (device))
+ if (passed)
{
- Lisp_Object f = XCAR (frmcons);
- if (passed)
+ if (frame_matches_frametype (f, frametype))
+ return f;
+ }
+ else
+ {
+ if (EQ (frame, f))
{
- /* #### Doing this here is bad and is now
- unnecessary. The real bug was that f->iconified
- was never, ever updated unless a user explicitly
- called frame-iconified-p. That has now been
- fixed. With this change removed all of the other
- changes made to support this routine having the
- called_from_delete_device arg could be removed.
- But it is too close to release to do that now. */
-#if 0
- /* Make sure the visibility and iconified flags are
- up-to-date unless we're being deleted. */
- if (!called_from_delete_device)
- {
- Fframe_iconified_p (f);
- Fframe_visible_p (f);
- }
-#endif
-
- /* Decide whether this frame is eligible to be returned. */
-
- /* If we've looped all the way around without finding any
- eligible frames, return the original frame. */
- if (EQ (f, frame))
- return f;
-
- if (frame_matches_frametype (f, frametype))
- return f;
+ passed = 1;
+ }
+ else
+ {
+ if (NILP (first) && frame_matches_frametype (f, frametype))
+ first = f;
}
-
- if (EQ (frame, f))
- passed++;
}
}
- /* We hit the end of the list, and need to start over again. */
- if (started_over)
- return Qnil;
- started_over++;
}
-}
-Lisp_Object
-next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
-{
- return next_frame_internal (frame, frametype, console, 0);
+ if (NILP (first))
+ /* We went through the whole frame list without finding a single
+ acceptable frame. Return the original frame. */
+ return frame;
+ else
+ /* There were no acceptable frames in the list after FRAME; otherwise,
+ we would have returned directly from the loop. Since FIRST is the last
+ acceptable frame in the list, return it. */
+ return first;
}
/* Return the previous frame in the frame list before FRAME.
are considered; see `next-frame'. */
Lisp_Object
-prev_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
+previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
{
Lisp_Object devcons, concons;
- Lisp_Object prev;
+ Lisp_Object last = Qnil;
- /* If this frame is dead, it won't be in frame_list, and we'll loop
- forever. Forestall that. */
CHECK_LIVE_FRAME (frame);
- prev = Qnil;
DEVICE_LOOP_NO_BREAK (devcons, concons)
{
Lisp_Object device = XCAR (devcons);
Lisp_Object frmcons;
- if (!device_matches_console_spec (frame, device, console))
- continue;
+ if (!device_matches_console_spec (device, console))
+ {
+ if (EQ (device, FRAME_DEVICE (XFRAME (frame)))
+ && !NILP (last))
+ return last;
+ continue;
+ }
DEVICE_FRAME_LOOP (frmcons, XDEVICE (device))
{
Lisp_Object f = XCAR (frmcons);
- if (EQ (frame, f) && !NILP (prev))
- return prev;
-
- /* Decide whether this frame is eligible to be returned,
- according to frametype. */
-
- if (frame_matches_frametype (f, frametype))
- prev = f;
-
+ if (EQ (frame, f))
+ {
+ if (!NILP (last))
+ return last;
+ }
+ else
+ {
+ if (frame_matches_frametype (f, frametype))
+ last = f;
+ }
}
}
- /* We've scanned the entire list. */
- if (NILP (prev))
+ if (NILP (last))
/* We went through the whole frame list without finding a single
acceptable frame. Return the original frame. */
return frame;
else
/* There were no acceptable frames in the list before FRAME; otherwise,
- we would have returned directly from the loop. Since PREV is the last
+ we would have returned directly from the loop. Since LAST is the last
acceptable frame in the list, return it. */
- return prev;
+ return last;
}
DEFUN ("next-frame", Fnext_frame, 0, 3, 0, /*
{
XSETFRAME (frame, decode_frame (frame));
- return prev_frame (frame, frametype, console);
+ return previous_frame (frame, frametype, console);
}
/* Return any frame for which PREDICATE is non-zero, or return Qnil
(Exception: if F is a stream frame, it's OK to delete if
any other frames exist.) */
-static int
-other_visible_frames_internal (struct frame *f, int called_from_delete_device)
+int
+other_visible_frames (struct frame *f)
{
Lisp_Object frame;
XSETFRAME (frame, f);
if (FRAME_STREAM_P (f))
- return !EQ (frame, next_frame_internal (frame, Qt, Qt,
- called_from_delete_device));
- return !EQ (frame, next_frame_internal (frame, Qvisible_iconic_nomini, Qt,
- called_from_delete_device));
-}
-
-int
-other_visible_frames (struct frame *f)
-{
- return other_visible_frames_internal (f, 0);
+ return !EQ (frame, next_frame (frame, Qt, Qt));
+ return !EQ (frame, next_frame (frame, Qvisible_iconic_nomini, Qt));
}
/* Delete frame F.
losing any way of communicating with the still running XEmacs process.
So we put it back. */
if (!force && !allow_deletion_of_last_visible_frame &&
- !other_visible_frames_internal (f, called_from_delete_device))
+ !other_visible_frames (f))
error ("Attempt to delete the sole visible or iconified frame");
/* Does this frame have a minibuffer, and is it the surrogate
next = DEVMETH_OR_GIVEN (d, get_frame_parent, (f), Qnil);
if (NILP (next) || EQ (next, frame) || ! FRAME_LIVE_P (XFRAME (next)))
- next = next_frame_internal (frame, Qvisible, device,
- called_from_delete_device);
+ next = next_frame (frame, Qvisible, device);
if (NILP (next) || EQ (next, frame))
- next = next_frame_internal (frame, Qvisible, console,
- called_from_delete_device);
+ next = next_frame (frame, Qvisible, console);
if (NILP (next) || EQ (next, frame))
- next = next_frame_internal (frame, Qvisible, Qt,
- called_from_delete_device);
+ next = next_frame (frame, Qvisible, Qt);
if (NILP (next) || EQ (next, frame))
- next = next_frame_internal (frame, Qt, device,
- called_from_delete_device);
+ next = next_frame (frame, Qt, device);
if (NILP (next) || EQ (next, frame))
- next = next_frame_internal (frame, Qt, console,
- called_from_delete_device);
+ next = next_frame (frame, Qt, console);
if (NILP (next) || EQ (next, frame))
- next = next_frame_internal (frame, Qt, Qt, called_from_delete_device);
+ next = next_frame (frame, Qt, Qt);
/* if we haven't found another frame at this point
then there aren't any. */
*/
if (!EQ (device, FRAME_DEVICE(XFRAME(next))))
{
- Lisp_Object next_f =
- next_frame_internal (frame, Qt, device,
- called_from_delete_device);
+ Lisp_Object next_f = next_frame (frame, Qt, device);
if (NILP (next_f) || EQ (next_f, frame))
set_device_selected_frame (d, Qnil);
else
/* Unfortunately deleting the frame will also delete the parent of
all of the subwindow instances current on the frame. I think this
can lead to bad things when trying to finalize the
- instances. Thus we loop over the instance cache calling the
+ instances. Thus we loop over all instance caches calling the
finalize method for each instance. */
- free_frame_subwindow_instance_cache (f);
+ free_frame_subwindow_instances (f);
/* This must be done before the window and window_mirror structures
are freed. The scrollbar information is attached to them. */
DEFUN ("mouse-pixel-position", Fmouse_pixel_position, 0, 1, 0, /*
Return a list (WINDOW X . Y) giving the current mouse window and position.
-The position is given in pixel units, where (0, 0) is the upper-left corner.
+The position is given in pixel units, where (0, 0) is the upper-left corner
+of the window.
When the cursor is not over a window, the return value is a list (nil nil).
DEVICE specifies the device on which to read the mouse position, and
defaults to the selected device. If the device is a mouseless terminal
-or Emacs hasn't been programmed to read its mouse position, it returns
+or XEmacs hasn't been programmed to read its mouse position, it returns
the device's selected window for WINDOW and nil for X and Y.
*/
(device))
return Qnil;
}
+\f
+DEFUN ("disable-frame", Fdisable_frame, 1, 1, 0, /*
+Disable frame FRAME, so that it cannot have the focus or receive user input.
+This is normally used during modal dialog boxes.
+WARNING: Be very careful not to wedge XEmacs!
+Use an `unwind-protect' that re-enables the frame to avoid this.
+*/
+ (frame))
+{
+ struct frame *f = decode_frame (frame);
+
+ f->disabled = 1;
+ MAYBE_FRAMEMETH (f, disable_frame, (f));
+ return Qnil;
+}
+
+DEFUN ("enable-frame", Fenable_frame, 1, 1, 0, /*
+Enable frame FRAME, so that it can have the focus and receive user input.
+Frames are normally enabled, unless explicitly disabled using `disable-frame'.
+*/
+ (frame))
+{
+ struct frame *f = decode_frame (frame);
+ f->disabled = 0;
+ MAYBE_FRAMEMETH (f, enable_frame, (f));
+ return Qnil;
+}
+
/* Ben thinks there is no need for `redirect-frame-focus' or `frame-focus',
crockish FSFmacs functions. See summary on focus in event-stream.c. */
\f
{
/* Adjust for gutters here so that we always get set
properly. */
- new_pixheight -=
+ new_pixheight -=
(FRAME_TOP_GUTTER_BOUNDS (f)
+ FRAME_BOTTOM_GUTTER_BOUNDS (f));
- XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_top
+ XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_top
= FRAME_TOP_BORDER_END (f) + FRAME_TOP_GUTTER_BOUNDS (f);
if (FRAME_HAS_MINIBUF_P (f)
XWINDOW (FRAME_MINIBUF_WINDOW (f))->pixel_top =
FRAME_TOP_BORDER_END (f) +
- FRAME_TOP_GUTTER_BOUNDS (f) +
+ FRAME_TOP_GUTTER_BOUNDS (f) +
FRAME_BOTTOM_GUTTER_BOUNDS (f) +
new_pixheight - minibuf_height;
{
/* Adjust for gutters here so that we always get set
properly. */
- new_pixwidth -=
+ new_pixwidth -=
(FRAME_LEFT_GUTTER_BOUNDS (f)
+ FRAME_RIGHT_GUTTER_BOUNDS (f));
-
- XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_left =
+
+ XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_left =
FRAME_LEFT_BORDER_END (f) + FRAME_LEFT_GUTTER_BOUNDS (f);
set_window_pixwidth (FRAME_ROOT_WINDOW (f), new_pixwidth, 0);
defsymbol (&Qborder_width, "border-width");
/* Qwidth, Qheight, Qleft, Qtop in general.c */
defsymbol (&Qset_specifier, "set-specifier");
- defsymbol (&Qset_glyph_image, "set-glyph-image");
defsymbol (&Qset_face_property, "set-face-property");
defsymbol (&Qface_property_instance, "face-property-instance");
defsymbol (&Qframe_property_alias, "frame-property-alias");
DEFSUBR (Fvisible_frame_list);
DEFSUBR (Fraise_frame);
DEFSUBR (Flower_frame);
+ DEFSUBR (Fdisable_frame);
+ DEFSUBR (Fenable_frame);
DEFSUBR (Fframe_property);
DEFSUBR (Fframe_properties);
DEFSUBR (Fset_frame_properties);