comparison src/frame.c @ 1709:b86b3237e017

* frame.h (struct frame): New fields `can_have_scrollbars' and `has_vertical_scrollbars'. (FRAME_CAN_HAVE_SCROLLBARS, FRAME_HAS_VERTICAL_SCROLLBARS): New accessors, for both the MULTI_FRAME and non-MULTI_FRAME. (VERTICAL_SCROLLBAR_WIDTH, WINDOW_VERTICAL_SCROLLBAR, WINDOW_VERTICAL_SCROLLBAR_COLUMN, WINDOW_VERTICAL_SCROLLBAR_HEIGHT): New macros. * window.h (struct window): New field `vertical_scrollbar'. * xterm.h (struct x_display): vertical_scrollbars, judge_timestamp, vertical_scrollbar_extra: New fields. (struct scrollbar): New struct. (VERTICAL_SCROLLBAR_PIXEL_WIDTH, VERTICAL_SCROLLBAR_PIXEL_HEIGHT, VERTICAL_SCROLLBAR_LEFT_BORDER, VERTICAL_SCROLLBAR_RIGHT_BORDER, VERTICAL_SCROLLBAR_TOP_BORDER, VERTICAL_SCROLLBAR_BOTTOM_BORDER, CHAR_TO_PIXEL_WIDTH, CHAR_TO_PIXEL_HEIGHT, PIXEL_TO_CHAR_WIDTH, PIXEL_TO_CHAR_HEIGHT): New accessors and macros. * frame.c (make_frame): Initialize the `can_have_scrollbars' and `has_vertical_scrollbars' fields of the frame. * term.c (term_init): Note that TERMCAP terminals don't support scrollbars. (mouse_position_hook): Document new args. (set_vertical_scrollbar_hook, condemn_scrollbars_hook, redeem_scrollbar_hook, judge_scrollbars_hook): New hooks. * termhooks.h: Declare and document them. (enum scrollbar_part): New type. (struct input_event): Describe the new form of the scrollbar_click event type. Change `part' from a Lisp_Object to an enum scrollbar_part. Add a new field `scrollbar'. * keyboard.c (kbd_buffer_get_event): Pass appropriate new parameters to *mouse_position_hook, and make_lispy_movement. * xfns.c (x_set_vertical_scrollbar): New function. (x_figure_window_size): Use new macros to calculate frame size. (Fx_create_frame): Note that X Windows frames do support scroll bars. Default to "yes". * xterm.c: #include <X11/cursorfont.h> and "window.h". (x_vertical_scrollbar_cursor): New variable. (x_term_init): Initialize it. (last_mouse_bar, last_mouse_bar_frame, last_mouse_part, last_mouse_scroll_range_start, last_mouse_scroll_range_end): New variables. (XTmouse_position): Use them to return scrollbar movement events. Take new arguments, for that purpose. (x_window_to_scrollbar, x_scrollbar_create, x_scrollbar_set_handle, x_scrollbar_remove, x_scrollbar_move, XTset_scrollbar, XTcondemn_scrollbars, XTredeem_scrollbar, XTjudge_scrollbars, x_scrollbar_expose, x_scrollbar_background_expose, x_scrollbar_handle_click, x_scrollbar_handle_motion): New functions to implement scrollbars. (x_term_init): Set the termhooks.h hooks to point to them. (x_set_window_size): Use new macros to calculate frame size. Set vertical_scrollbar_extra field. (x_make_frame_visible): Use the frame accessor FRAME_HAS_VERTICAL_SCROLLBARS to decide if we need to map the frame's subwindows as well. (XTread_socket): Use new size-calculation macros from xterm.h when processing ConfigureNotify events. (x_wm_set_size_hint): Use PIXEL_TO_CHAR_WIDTH and PIXEL_TO_CHAR_HEIGHT macros. * ymakefile (xdisp.o): This now depends on termhooks.h. (xterm.o): This now depends on window.h. * floatfns.c (Flog): Fix unescaped newline in string. * frame.c (Fnext_frame): Same. * textprop.c (Fprevious_single_property_change): Same. (syms_of_textprop): Same, for DEFVAR for `interval_balance_threshold'. Change the meaning of focus redirection to make switching windows work properly. Fredirect_frame_focus has the details. * frame.h (focus_frame): Doc fix. [not MULTI_FRAME] (FRAME_FOCUS_FRAME): Make this Qnil, which indicates no focus redirection, instead of zero, which is selected_frame. * frame.c (make_frame): Initialize f->focus_frame to Qnil, rather than making it point to frame itself. (Fselect_frame): If changing the selected frame from FOO to BAR, make all redirections to FOO shift to BAR as well. Doc fix. (Fredirect_frame_focus): Doc fix. Accept nil as a valid redirection, not just as a default for FRAME. (Fframe_focus): Doc fix. * keyboard.c (kbd_buffer_store_event, kbd_buffer_get_event): Deal with focus redirections being nil. * xterm.c (XTframe_rehighlight): Doc fix. Deal with focus redirections being nil. It's a pain to remember that you can't assign to FRAME->visible. Let's change all references to the `visible' member of struct frame to use the accessor macros, and then write a setter for the `visible' field that does the right thing. * frame.h (FRAME_VISIBLE_P): Make this not an l-value. (FRAME_SET_VISIBLE): New macro. * frame.c (make_terminal_frame, Fdelete_frame): Use FRAME_SET_VISIBLE. (Fframe_visible_p, Fvisible_frame_list): Use FRAME_VISIBLE_P and FRAME_ICONIFIED_P. * dispnew.c (Fredraw_display): Use the FRAME_VISIBLE_P and FRAME_GARBAGED_P accessors. * xdisp.c (redisplay): Use the FRAME_VISIBLE_P accessor. * xfns.c (x_set_foreground_color, x_set_background_color, x_set_cursor_color, x_set_border_pixel, x_set_icon_type): Use the FRAME_VISIBLE_P accessor. (Fx_create_frame): Use FRAME_SET_VISIBILITY. * xterm.c (clear_cursor, x_display_bar_cursor, x_display_box_cursor): Use FRAME_SET_VISIBILITY.
author Jim Blandy <jimb@redhat.com>
date Thu, 24 Dec 1992 06:05:56 +0000
parents 357b58c8c858
children 11f62e53acff
comparison
equal deleted inserted replaced
1708:a688543448e7 1709:b86b3237e017
154 f->auto_raise = 0; 154 f->auto_raise = 0;
155 f->auto_lower = 0; 155 f->auto_lower = 0;
156 f->no_split = 0; 156 f->no_split = 0;
157 f->garbaged = 0; 157 f->garbaged = 0;
158 f->has_minibuffer = mini_p; 158 f->has_minibuffer = mini_p;
159 f->focus_frame = frame; 159 f->focus_frame = Qnil;
160 f->explicit_name = 0; 160 f->explicit_name = 0;
161 f->can_have_scrollbars = 0;
162 f->has_vertical_scrollbars = 0;
161 163
162 f->param_alist = Qnil; 164 f->param_alist = Qnil;
163 165
164 root_window = make_window (); 166 root_window = make_window ();
165 if (mini_p) 167 if (mini_p)
312 register struct frame *f; 314 register struct frame *f;
313 315
314 Vframe_list = Qnil; 316 Vframe_list = Qnil;
315 f = make_frame (1); 317 f = make_frame (1);
316 f->name = build_string ("terminal"); 318 f->name = build_string ("terminal");
317 f->async_visible = 1; 319 FRAME_SET_VISIBLE (f, 1);
318 f->visible = 1;
319 f->display.nothing = 1; /* Nonzero means frame isn't deleted. */ 320 f->display.nothing = 1; /* Nonzero means frame isn't deleted. */
320 XSET (Vterminal_frame, Lisp_Frame, f); 321 XSET (Vterminal_frame, Lisp_Frame, f);
321 return f; 322 return f;
322 } 323 }
323 324
327 focus on that frame.\n\ 328 focus on that frame.\n\
328 \n\ 329 \n\
329 This function is interactive, and may be bound to the ``switch-frame''\n\ 330 This function is interactive, and may be bound to the ``switch-frame''\n\
330 event; when invoked this way, it switches to the frame named in the\n\ 331 event; when invoked this way, it switches to the frame named in the\n\
331 event. When called from lisp, FRAME may be a ``switch-frame'' event;\n\ 332 event. When called from lisp, FRAME may be a ``switch-frame'' event;\n\
332 if it is, select the frame named in the event.") 333 if it is, select the frame named in the event.\n\
334 \n\
335 Changing the selected frame can change focus redirections. See\n\
336 `redirect-frame-focus' for details.")
333 (frame, no_enter) 337 (frame, no_enter)
334 Lisp_Object frame, no_enter; 338 Lisp_Object frame, no_enter;
335 { 339 {
336 /* If FRAME is a switch-frame event, extract the frame we should 340 /* If FRAME is a switch-frame event, extract the frame we should
337 switch to. */ 341 switch to. */
342 346
343 CHECK_LIVE_FRAME (frame, 0); 347 CHECK_LIVE_FRAME (frame, 0);
344 348
345 if (selected_frame == XFRAME (frame)) 349 if (selected_frame == XFRAME (frame))
346 return frame; 350 return frame;
351
352 /* If a frame's focus has been redirected toward the currently
353 selected frame, we should change the redirection to point to the
354 newly selected frame. This means that if the focus is redirected
355 from a minibufferless frame to a surrogate minibuffer frame, we
356 can use `other-window' to switch between all the frames using
357 that minibuffer frame, and the focus redirection will follow us
358 around. */
359 {
360 Lisp_Object tail;
361
362 for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr)
363 {
364 Lisp_Object focus;
365
366 if (XTYPE (XCONS (tail)->car) != Lisp_Frame)
367 abort ();
368
369 focus = FRAME_FOCUS_FRAME (XFRAME (XCONS (tail)->car));
370
371 if (XTYPE (focus) == Lisp_Frame
372 && XFRAME (focus) == selected_frame)
373 Fredirect_frame_focus (XCONS (tail)->car, frame);
374 }
375 }
347 376
348 selected_frame = XFRAME (frame); 377 selected_frame = XFRAME (frame);
349 if (! FRAME_MINIBUF_ONLY_P (selected_frame)) 378 if (! FRAME_MINIBUF_ONLY_P (selected_frame))
350 last_nonminibuf_frame = selected_frame; 379 last_nonminibuf_frame = selected_frame;
351 380
533 } 562 }
534 #endif 563 #endif
535 564
536 DEFUN ("next-frame", Fnext_frame, Snext_frame, 0, 2, 0, 565 DEFUN ("next-frame", Fnext_frame, Snext_frame, 0, 2, 0,
537 "Return the next frame in the frame list after FRAME.\n\ 566 "Return the next frame in the frame list after FRAME.\n\
538 By default, skip minibuffer-only frames. 567 By default, skip minibuffer-only frames.\n\
539 If omitted, FRAME defaults to the selected frame.\n\ 568 If omitted, FRAME defaults to the selected frame.\n\
540 If optional argument MINIFRAME is non-nil, include minibuffer-only frames.\n\ 569 If optional argument MINIFRAME is non-nil, include minibuffer-only frames.\n\
541 If MINIFRAME is a window, include only frames using that window for their\n\ 570 If MINIFRAME is a window, include only frames using that window for their\n\
542 minibuffer.\n\ 571 minibuffer.\n\
543 If MINIFRAME is non-nil and not a window, include all frames.") 572 If MINIFRAME is non-nil and not a window, include all frames.")
621 remove the reference to them. */ 650 remove the reference to them. */
622 delete_all_subwindows (XWINDOW (f->root_window)); 651 delete_all_subwindows (XWINDOW (f->root_window));
623 f->root_window = Qnil; 652 f->root_window = Qnil;
624 653
625 Vframe_list = Fdelq (frame, Vframe_list); 654 Vframe_list = Fdelq (frame, Vframe_list);
626 f->visible = 0; 655 FRAME_SET_VISIBLE (f, 0);
627 displ = f->display; 656 displ = f->display;
628 f->display.nothing = 0; 657 f->display.nothing = 0;
629 658
630 #ifdef HAVE_X_WINDOWS 659 #ifdef HAVE_X_WINDOWS
631 if (FRAME_X_P (f)) 660 if (FRAME_X_P (f))
865 (frame) 894 (frame)
866 Lisp_Object frame; 895 Lisp_Object frame;
867 { 896 {
868 CHECK_LIVE_FRAME (frame, 0); 897 CHECK_LIVE_FRAME (frame, 0);
869 898
870 if (XFRAME (frame)->visible) 899 if (FRAME_VISIBLE_P (XFRAME (frame)))
871 return Qt; 900 return Qt;
872 if (XFRAME (frame)->iconified) 901 if (FRAME_ICONIFIED_P (XFRAME (frame)))
873 return Qicon; 902 return Qicon;
874 return Qnil; 903 return Qnil;
875 } 904 }
876 905
877 DEFUN ("visible-frame-list", Fvisible_frame_list, Svisible_frame_list, 906 DEFUN ("visible-frame-list", Fvisible_frame_list, Svisible_frame_list,
888 { 917 {
889 frame = XCONS (tail)->car; 918 frame = XCONS (tail)->car;
890 if (XTYPE (frame) != Lisp_Frame) 919 if (XTYPE (frame) != Lisp_Frame)
891 continue; 920 continue;
892 f = XFRAME (frame); 921 f = XFRAME (frame);
893 if (f->visible) 922 if (FRAME_VISIBLE_P (f))
894 value = Fcons (frame, value); 923 value = Fcons (frame, value);
895 } 924 }
896 return value; 925 return value;
897 } 926 }
898 927
899 928
900 929
901 DEFUN ("redirect-frame-focus", Fredirect_frame_focus, Sredirect_frame_focus, 930 DEFUN ("redirect-frame-focus", Fredirect_frame_focus, Sredirect_frame_focus,
902 1, 2, 0, 931 1, 2, 0,
903 "Arrange for keystrokes typed at FRAME to be sent to FOCUS-FRAME.\n\ 932 "Arrange for keystrokes typed at FRAME to be sent to FOCUS-FRAME.\n\
904 This means that, after reading a keystroke typed at FRAME,\n\ 933 In other words, switch-frame events caused by events in FRAME will\n\
905 `last-event-frame' will be FOCUS-FRAME.\n\ 934 request a switch to FOCUS-FRAME, and `last-event-frame' will be\n\
935 FOCUS-FRAME after reading an event typed at FRAME.\n\
906 \n\ 936 \n\
907 If FOCUS-FRAME is omitted or eq to FRAME, any existing redirection is\n\ 937 If FOCUS-FRAME is omitted or nil, any existing redirection is\n\
908 cancelled, and the frame again receives its own keystrokes.\n\ 938 cancelled, and the frame again receives its own keystrokes.\n\
909 \n\ 939 \n\
910 The redirection lasts until the next call to `redirect-frame-focus'\n\ 940 Focus redirection is useful for temporarily redirecting keystrokes to\n\
911 or `select-frame'.\n\ 941 a surrogate minibuffer frame when a frame doesn't have its own\n\
942 minibuffer window.\n\
912 \n\ 943 \n\
913 This is useful for temporarily redirecting keystrokes to the minibuffer\n\ 944 A frame's focus redirection can be changed by select-frame. If frame\n\
914 window when a frame doesn't have its own minibuffer.") 945 FOO is selected, and then a different frame BAR is selected, any\n\
946 frames redirecting their focus to FOO are shifted to redirect their\n\
947 focus to BAR. This allows focus redirection to work properly when the\n\
948 user switches from one frame to another using `select-window'.\n\
949 \n\
950 This means that a frame whose focus is redirected to itself is treated\n\
951 differently from a frame whose focus is redirected to nil; the former\n\
952 is affected by select-frame, while the latter is not.\n\
953 \n\
954 The redirection lasts until `redirect-frame-focus' is called to change it.")
915 (frame, focus_frame) 955 (frame, focus_frame)
916 Lisp_Object frame, focus_frame; 956 Lisp_Object frame, focus_frame;
917 { 957 {
918 CHECK_LIVE_FRAME (frame, 0); 958 CHECK_LIVE_FRAME (frame, 0);
919 959
920 if (NILP (focus_frame)) 960 if (! NILP (focus_frame))
921 focus_frame = frame;
922 else
923 CHECK_LIVE_FRAME (focus_frame, 1); 961 CHECK_LIVE_FRAME (focus_frame, 1);
924 962
925 XFRAME (frame)->focus_frame = focus_frame; 963 XFRAME (frame)->focus_frame = focus_frame;
926 964
927 if (frame_rehighlight_hook) 965 if (frame_rehighlight_hook)
931 } 969 }
932 970
933 971
934 DEFUN ("frame-focus", Fframe_focus, Sframe_focus, 1, 1, 0, 972 DEFUN ("frame-focus", Fframe_focus, Sframe_focus, 1, 1, 0,
935 "Return the frame to which FRAME's keystrokes are currently being sent.\n\ 973 "Return the frame to which FRAME's keystrokes are currently being sent.\n\
974 This returns nil if FRAME's focus is not redirected.\n\
936 See `redirect-frame-focus'.") 975 See `redirect-frame-focus'.")
937 (frame) 976 (frame)
938 Lisp_Object frame; 977 Lisp_Object frame;
939 { 978 {
940 CHECK_LIVE_FRAME (frame, 0); 979 CHECK_LIVE_FRAME (frame, 0);
980
941 return FRAME_FOCUS_FRAME (XFRAME (frame)); 981 return FRAME_FOCUS_FRAME (XFRAME (frame));
942 } 982 }
943 983
944 984
945 985