comparison src/xdisp.c @ 47134:c524e83e83c5

(Qbar, Qhbar, Qbox, Qhollow, Vblink_cursor_alist): Variables consolidated here. (Valternate_cursor_type, Qalternate_cursor_type): New variables. (Vcursor_in_non_selected_windows): Renamed from cursor_in_non_selected_windows and changed to Lisp_Object. (syms_of_xdisp): Define and staticpro new and moved variables. (get_specified_cursor_type): Renamed from x_specified_cursor_type; consolidated here. Recognize Qhollow setting. (set_frame_cursor_types): New function to set frame cursor types based on the frame parameters. (get_window_cursor_type): New function to calculate new cursor type and width for the specified window. Based on duplicated code consolidated here. Enhancements: cursor-in-non-selected-windows may be a cursor type, check buffer-local alternate-cursor-type and blink-cursor-alist before using built-in blink off methods.
author Kim F. Storm <storm@cua.dk>
date Fri, 30 Aug 2002 12:00:12 +0000
parents c7ddac695d06
children eab3292ff2df
comparison
equal deleted inserted replaced
47133:85e238cd7287 47134:c524e83e83c5
225 Lisp_Object Qfontified; 225 Lisp_Object Qfontified;
226 Lisp_Object Qgrow_only; 226 Lisp_Object Qgrow_only;
227 Lisp_Object Qinhibit_eval_during_redisplay; 227 Lisp_Object Qinhibit_eval_during_redisplay;
228 Lisp_Object Qbuffer_position, Qposition, Qobject; 228 Lisp_Object Qbuffer_position, Qposition, Qobject;
229 229
230 /* Cursor shapes */
231 Lisp_Object Qbar, Qhbar, Qbox, Qhollow;
232
230 Lisp_Object Qrisky_local_variable; 233 Lisp_Object Qrisky_local_variable;
231 234
232 /* Holds the list (error). */ 235 /* Holds the list (error). */
233 Lisp_Object list_of_error; 236 Lisp_Object list_of_error;
234 237
529 static int message_cleared_p; 532 static int message_cleared_p;
530 533
531 /* Non-zero means we want a hollow cursor in windows that are not 534 /* Non-zero means we want a hollow cursor in windows that are not
532 selected. Zero means there's no cursor in such windows. */ 535 selected. Zero means there's no cursor in such windows. */
533 536
534 int cursor_in_non_selected_windows; 537 Lisp_Object Vcursor_in_non_selected_windows;
535 Lisp_Object Qcursor_in_non_selected_windows; 538 Lisp_Object Qcursor_in_non_selected_windows;
539
540 /* Specifies the desired cursor-type to use to show the blinking
541 cursor off state and cursor shown in non-selected windows.
542 t means to use the default. */
543
544 Lisp_Object Valternate_cursor_type;
545 Lisp_Object Qalternate_cursor_type;
546
547 /* How to blink the default frame cursor off. */
548 Lisp_Object Vblink_cursor_alist;
536 549
537 /* A scratch glyph row with contents used for generating truncation 550 /* A scratch glyph row with contents used for generating truncation
538 glyphs. Also used in direct_output_for_insert. */ 551 glyphs. Also used in direct_output_for_insert. */
539 552
540 #define MAX_SCRATCH_GLYPHS 100 553 #define MAX_SCRATCH_GLYPHS 100
15192 return 0; 15205 return 0;
15193 } 15206 }
15194 15207
15195 15208
15196 /*********************************************************************** 15209 /***********************************************************************
15210 Cursor types
15211 ***********************************************************************/
15212
15213 /* Value is the internal representation of the specified cursor type
15214 ARG. If type is BAR_CURSOR, return in *WIDTH the specified width
15215 of the bar cursor. */
15216
15217 enum text_cursor_kinds
15218 get_specified_cursor_type (arg, width)
15219 Lisp_Object arg;
15220 int *width;
15221 {
15222 enum text_cursor_kinds type;
15223
15224 if (NILP (arg))
15225 return NO_CURSOR;
15226
15227 if (EQ (arg, Qbox))
15228 return FILLED_BOX_CURSOR;
15229
15230 if (EQ (arg, Qhollow))
15231 return HOLLOW_BOX_CURSOR;
15232
15233 if (EQ (arg, Qbar))
15234 {
15235 *width = 2;
15236 return BAR_CURSOR;
15237 }
15238
15239 if (CONSP (arg)
15240 && EQ (XCAR (arg), Qbar)
15241 && INTEGERP (XCDR (arg))
15242 && XINT (XCDR (arg)) >= 0)
15243 {
15244 *width = XINT (XCDR (arg));
15245 return BAR_CURSOR;
15246 }
15247
15248 if (EQ (arg, Qhbar))
15249 {
15250 *width = 2;
15251 return HBAR_CURSOR;
15252 }
15253
15254 if (CONSP (arg)
15255 && EQ (XCAR (arg), Qhbar)
15256 && INTEGERP (XCDR (arg))
15257 && XINT (XCDR (arg)) >= 0)
15258 {
15259 *width = XINT (XCDR (arg));
15260 return HBAR_CURSOR;
15261 }
15262
15263 /* Treat anything unknown as "hollow box cursor".
15264 It was bad to signal an error; people have trouble fixing
15265 .Xdefaults with Emacs, when it has something bad in it. */
15266 type = HOLLOW_BOX_CURSOR;
15267
15268 return type;
15269 }
15270
15271 /* Set the default cursor types for specified frame. */
15272 void
15273 set_frame_cursor_types (f, arg)
15274 struct frame *f;
15275 Lisp_Object arg;
15276 {
15277 int width;
15278 Lisp_Object tem;
15279
15280 FRAME_DESIRED_CURSOR (f) = get_specified_cursor_type (arg, &width);
15281 FRAME_CURSOR_WIDTH (f) = width;
15282
15283 /* By default, set up the blink-off state depending on the on-state. */
15284
15285 tem = Fassoc (arg, Vblink_cursor_alist);
15286 if (!NILP (tem))
15287 {
15288 FRAME_BLINK_OFF_CURSOR (f)
15289 = get_specified_cursor_type (XCDR (tem), &width);
15290 FRAME_BLINK_OFF_CURSOR_WIDTH (f) = width;
15291 }
15292 else
15293 FRAME_BLINK_OFF_CURSOR (f) = DEFAULT_CURSOR;
15294 }
15295
15296
15297 /* Return the cursor we want to be displayed. In a mini-buffer
15298 window, we want the cursor only to appear if we are reading input
15299 from this window. For the selected window, we want the cursor type
15300 given by the frame parameter or buffer local setting of
15301 cursor-type. If explicitly marked off, draw no cursor. In all
15302 other cases, we want a hollow box cursor. */
15303
15304 enum text_cursor_kinds
15305 get_window_cursor_type (w, width)
15306 struct window *w;
15307 int *width;
15308 {
15309 struct frame *f = XFRAME (w->frame);
15310 struct buffer *b = XBUFFER (w->buffer);
15311 int cursor_type = DEFAULT_CURSOR;
15312 Lisp_Object alt_cursor;
15313 int non_selected = 0;
15314
15315 /* Echo area */
15316 if (cursor_in_echo_area
15317 && FRAME_HAS_MINIBUF_P (f)
15318 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window))
15319 {
15320 if (w == XWINDOW (echo_area_window))
15321 {
15322 *width = FRAME_CURSOR_WIDTH (f);
15323 return FRAME_DESIRED_CURSOR (f);
15324 }
15325
15326 non_selected = 1;
15327 }
15328
15329 /* Nonselected window or nonselected frame. */
15330 else if (f != FRAME_X_DISPLAY_INFO (f)->x_highlight_frame
15331 || w != XWINDOW (f->selected_window))
15332 {
15333 if (MINI_WINDOW_P (w) && minibuf_level == 0)
15334 return NO_CURSOR;
15335
15336 non_selected = 1;
15337 }
15338
15339 /* Never display a cursor in a window in which cursor-type is nil. */
15340 if (NILP (b->cursor_type))
15341 return NO_CURSOR;
15342
15343 /* Use cursor-in-non-selected-windows for non-selected window or frame. */
15344 if (non_selected)
15345 {
15346 alt_cursor = Fbuffer_local_value (Qcursor_in_non_selected_windows, w->buffer);
15347 return get_specified_cursor_type (alt_cursor, width);
15348 }
15349
15350 /* Get the normal cursor type for this window. */
15351 if (EQ (b->cursor_type, Qt))
15352 {
15353 cursor_type = FRAME_DESIRED_CURSOR (f);
15354 *width = FRAME_CURSOR_WIDTH (f);
15355 }
15356 else
15357 cursor_type = get_specified_cursor_type (b->cursor_type, width);
15358
15359 /* Use normal cursor if not blinked off. */
15360 if (!w->cursor_off_p)
15361 return cursor_type;
15362
15363 /* Cursor is blinked off, so determine how to "toggle" it. */
15364
15365 /* First try to use alternate-cursor-type, unless it is t. */
15366 alt_cursor = Fbuffer_local_value (Qalternate_cursor_type, w->buffer);
15367 if (!EQ (alt_cursor, Qt))
15368 return get_specified_cursor_type (alt_cursor, width);
15369
15370 /* Then unless buffer's cursor-type is t (use default),
15371 look for an entry matching normal cursor in blink-cursor-alist. */
15372 if (!EQ (b->cursor_type, Qt) &&
15373 (alt_cursor = Fassoc (b->cursor_type, Vblink_cursor_alist), !NILP (alt_cursor)))
15374 return get_specified_cursor_type (XCDR (alt_cursor), width);
15375
15376 /* Then see if frame has specified a specific blink off cursor type. */
15377 if (FRAME_BLINK_OFF_CURSOR (f) != DEFAULT_CURSOR)
15378 {
15379 *width = FRAME_BLINK_OFF_CURSOR_WIDTH (f);
15380 return FRAME_BLINK_OFF_CURSOR (f);
15381 }
15382
15383 /* Finally perform built-in cursor blinking:
15384 filled box <-> hollow box
15385 wide [h]bar <-> narrow [h]bar
15386 narrow [h]bar <-> no cursor
15387 other type <-> no cursor */
15388
15389 if (cursor_type == FILLED_BOX_CURSOR)
15390 return HOLLOW_BOX_CURSOR;
15391
15392 if ((cursor_type == BAR_CURSOR || cursor_type == HBAR_CURSOR) && *width > 1)
15393 {
15394 *width = 1;
15395 return cursor_type;
15396 }
15397
15398 return NO_CURSOR;
15399 }
15400
15401
15402 /***********************************************************************
15197 Initialization 15403 Initialization
15198 ***********************************************************************/ 15404 ***********************************************************************/
15199 15405
15200 void 15406 void
15201 syms_of_xdisp () 15407 syms_of_xdisp ()
15291 staticpro (&Qimage); 15497 staticpro (&Qimage);
15292 Qmessage_truncate_lines = intern ("message-truncate-lines"); 15498 Qmessage_truncate_lines = intern ("message-truncate-lines");
15293 staticpro (&Qmessage_truncate_lines); 15499 staticpro (&Qmessage_truncate_lines);
15294 Qcursor_in_non_selected_windows = intern ("cursor-in-non-selected-windows"); 15500 Qcursor_in_non_selected_windows = intern ("cursor-in-non-selected-windows");
15295 staticpro (&Qcursor_in_non_selected_windows); 15501 staticpro (&Qcursor_in_non_selected_windows);
15502 Qalternate_cursor_type = intern ("alternate-cursor-type");
15503 staticpro (&Qalternate_cursor_type);
15296 Qgrow_only = intern ("grow-only"); 15504 Qgrow_only = intern ("grow-only");
15297 staticpro (&Qgrow_only); 15505 staticpro (&Qgrow_only);
15298 Qinhibit_menubar_update = intern ("inhibit-menubar-update"); 15506 Qinhibit_menubar_update = intern ("inhibit-menubar-update");
15299 staticpro (&Qinhibit_menubar_update); 15507 staticpro (&Qinhibit_menubar_update);
15300 Qinhibit_eval_during_redisplay = intern ("inhibit-eval-during-redisplay"); 15508 Qinhibit_eval_during_redisplay = intern ("inhibit-eval-during-redisplay");
15303 staticpro (&Qposition); 15511 staticpro (&Qposition);
15304 Qbuffer_position = intern ("buffer-position"); 15512 Qbuffer_position = intern ("buffer-position");
15305 staticpro (&Qbuffer_position); 15513 staticpro (&Qbuffer_position);
15306 Qobject = intern ("object"); 15514 Qobject = intern ("object");
15307 staticpro (&Qobject); 15515 staticpro (&Qobject);
15516 Qbar = intern ("bar");
15517 staticpro (&Qbar);
15518 Qhbar = intern ("hbar");
15519 staticpro (&Qhbar);
15520 Qbox = intern ("box");
15521 staticpro (&Qbox);
15522 Qhollow = intern ("hollow");
15523 staticpro (&Qhollow);
15308 Qrisky_local_variable = intern ("risky-local-variable"); 15524 Qrisky_local_variable = intern ("risky-local-variable");
15309 staticpro (&Qrisky_local_variable); 15525 staticpro (&Qrisky_local_variable);
15310 Qinhibit_free_realized_faces = intern ("inhibit-free-realized-faces"); 15526 Qinhibit_free_realized_faces = intern ("inhibit-free-realized-faces");
15311 staticpro (&Qinhibit_free_realized_faces); 15527 staticpro (&Qinhibit_free_realized_faces);
15312 15528
15513 A value of `grow-only', the default, means let mini-windows grow 15729 A value of `grow-only', the default, means let mini-windows grow
15514 only, until their display becomes empty, at which point the windows 15730 only, until their display becomes empty, at which point the windows
15515 go back to their normal size. */); 15731 go back to their normal size. */);
15516 Vresize_mini_windows = Qgrow_only; 15732 Vresize_mini_windows = Qgrow_only;
15517 15733
15518 DEFVAR_BOOL ("cursor-in-non-selected-windows", 15734 DEFVAR_LISP ("cursor-in-non-selected-windows",
15519 &cursor_in_non_selected_windows, 15735 &Vcursor_in_non_selected_windows,
15520 doc: /* *Non-nil means display a hollow cursor in non-selected windows. 15736 doc: /* *Cursor type to display in non-selected windows.
15521 nil means don't display a cursor there. */); 15737 t means to use hollow box cursor. See `cursor-type' for other values. */);
15522 cursor_in_non_selected_windows = 1; 15738 Vcursor_in_non_selected_windows = Qt;
15739
15740 DEFVAR_LISP ("alternate-cursor-type", &Valternate_cursor_type,
15741 doc: /* *Cursor type displayed in the blinking cursor off state.
15742 t means to use default. See `cursor-type' for other values. */);
15743 Valternate_cursor_type = Qt;
15744
15745 DEFVAR_LISP ("blink-cursor-alist", &Vblink_cursor_alist,
15746 doc: /* Alist specifying how to blink the cursor off.
15747 Each element has the form (ON-STATE . OFF-STATE). Whenever the
15748 `cursor-type' frame-parameter or variable equals ON-STATE,
15749 comparing using `equal', Emacs uses OFF-STATE to specify
15750 how to blink it off. */);
15751 Vblink_cursor_alist = Qnil;
15523 15752
15524 DEFVAR_BOOL ("auto-hscroll-mode", &automatic_hscrolling_p, 15753 DEFVAR_BOOL ("auto-hscroll-mode", &automatic_hscrolling_p,
15525 doc: /* *Non-nil means scroll the display automatically to make point visible. */); 15754 doc: /* *Non-nil means scroll the display automatically to make point visible. */);
15526 automatic_hscrolling_p = 1; 15755 automatic_hscrolling_p = 1;
15527 15756