Mercurial > emacs
diff src/xdisp.c @ 25543:6289141fa825
(row_containing_pos): New.
(try_window_id): Use it.
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Likewise for upper-case etc.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Sun, 05 Sep 1999 15:48:57 +0000 |
parents | 5e59e2bd26b5 |
children | e98819a94512 |
line wrap: on
line diff
--- a/src/xdisp.c Sun Sep 05 15:48:38 1999 +0000 +++ b/src/xdisp.c Sun Sep 05 15:48:57 1999 +0000 @@ -227,23 +227,23 @@ Lisp_Object Vfontification_functions; Lisp_Object Qfontification_functions; -/* Non-zero means draw toolbar buttons raised when the mouse moves +/* Non-zero means draw tool bar buttons raised when the mouse moves over them. */ -int auto_raise_toolbar_buttons_p; - -/* Margin around toolbar buttons in pixels. */ - -int toolbar_button_margin; - -/* Thickness of shadow to draw around toolbar buttons. */ - -int toolbar_button_relief; - -/* Non-zero means automatically resize toolbars so that all toolbar +int auto_raise_tool_bar_buttons_p; + +/* Margin around tool bar buttons in pixels. */ + +int tool_bar_button_margin; + +/* Thickness of shadow to draw around tool bar buttons. */ + +int tool_bar_button_relief; + +/* Non-zero means automatically resize tool-bars so that all tool-bar items are visible, and no blank lines remain. */ -int auto_resize_toolbars_p; +int auto_resize_tool_bars_p; /* Non-nil means don't actually do any redisplay. */ @@ -584,6 +584,9 @@ /* Function prototypes. */ +static struct glyph_row *row_containing_pos P_ ((struct window *, int, + struct glyph_row *, + struct glyph_row *)); static Lisp_Object unwind_with_echo_area_buffer P_ ((Lisp_Object)); static Lisp_Object with_echo_area_buffer_unwind_data P_ ((struct window *)); static void clear_garbaged_frames P_ ((void)); @@ -678,10 +681,10 @@ #ifdef HAVE_WINDOW_SYSTEM -static void update_toolbar P_ ((struct frame *, int)); -static void build_desired_toolbar_string P_ ((struct frame *f)); -static int redisplay_toolbar P_ ((struct frame *)); -static void display_toolbar_line P_ ((struct it *)); +static void update_tool_bar P_ ((struct frame *, int)); +static void build_desired_tool_bar_string P_ ((struct frame *f)); +static int redisplay_tool_bar P_ ((struct frame *)); +static void display_tool_bar_line P_ ((struct it *)); #endif /* HAVE_WINDOW_SYSTEM */ @@ -1156,8 +1159,8 @@ BASE_FACE_ID is the id of a base face to use. It must be one of DEFAULT_FACE_ID for normal text, MODE_LINE_FACE_ID or - TOP_LINE_FACE_ID for displaying mode lines, or TOOLBAR_FACE_ID for - displaying the toolbar. + TOP_LINE_FACE_ID for displaying mode lines, or TOOL_BAR_FACE_ID for + displaying the tool-bar. If ROW is null and BASE_FACE_ID is equal to MODE_LINE_FACE_ID or TOP_LINE_FACE_ID, the iterator will be initialized to use the @@ -6070,7 +6073,7 @@ GCPRO1 (tail); update_menu_bar (f, 0); #ifdef HAVE_WINDOW_SYSTEM - update_toolbar (f, 0); + update_tool_bar (f, 0); #endif UNGCPRO; } @@ -6081,7 +6084,7 @@ { update_menu_bar (selected_frame, 1); #ifdef HAVE_WINDOW_SYSTEM - update_toolbar (selected_frame, 1); + update_tool_bar (selected_frame, 1); #endif } @@ -6184,23 +6187,23 @@ /*********************************************************************** - Toolbars + Tool-bars ***********************************************************************/ #ifdef HAVE_WINDOW_SYSTEM -/* Update the toolbar item list for frame F. This has to be done +/* Update the tool-bar item list for frame F. This has to be done before we start to fill in any display lines. Called from prepare_menu_bars. If SAVE_MATCH_DATA is non-zero, we must save and restore it here. */ static void -update_toolbar (f, save_match_data) +update_tool_bar (f, save_match_data) struct frame *f; int save_match_data; { - if (WINDOWP (f->toolbar_window) - && XFASTINT (XWINDOW (f->toolbar_window)->height) > 0) + if (WINDOWP (f->tool_bar_window) + && XFASTINT (XWINDOW (f->tool_bar_window)->height) > 0) { Lisp_Object window; struct window *w; @@ -6243,12 +6246,12 @@ specbind (Qoverriding_local_map, Qnil); } - /* Build desired toolbar items from keymaps. */ - f->desired_toolbar_items - = toolbar_items (f->desired_toolbar_items, - &f->n_desired_toolbar_items); + /* Build desired tool-bar items from keymaps. */ + f->desired_tool_bar_items + = tool_bar_items (f->desired_tool_bar_items, + &f->n_desired_tool_bar_items); - /* Redisplay the toolbar in case we changed it. */ + /* Redisplay the tool-bar in case we changed it. */ w->update_mode_line = Qt; unbind_to (count, Qnil); @@ -6258,12 +6261,12 @@ } -/* Set F->desired_toolbar_string to a Lisp string representing frame - F's desired toolbar contents. F->desired_toolbar_items must have +/* Set F->desired_tool_bar_string to a Lisp string representing frame + F's desired tool-bar contents. F->desired_tool_bar_items must have been set up previously by calling prepare_menu_bars. */ static void -build_desired_toolbar_string (f) +build_desired_tool_bar_string (f) struct frame *f; { int i, size, size_needed, string_idx; @@ -6273,60 +6276,60 @@ image = plist = props = Qnil; GCPRO3 (image, plist, props); - /* Prepare F->desired_toolbar_string. If we can reuse it, do so. + /* Prepare F->desired_tool_bar_string. If we can reuse it, do so. Otherwise, make a new string. */ /* The size of the string we might be able to reuse. */ - size = (STRINGP (f->desired_toolbar_string) - ? XSTRING (f->desired_toolbar_string)->size + size = (STRINGP (f->desired_tool_bar_string) + ? XSTRING (f->desired_tool_bar_string)->size : 0); /* Each image in the string we build is preceded by a space, and there is a space at the end. */ - size_needed = f->n_desired_toolbar_items + 1; - - /* Reuse f->desired_toolbar_string, if possible. */ + size_needed = f->n_desired_tool_bar_items + 1; + + /* Reuse f->desired_tool_bar_string, if possible. */ if (size < size_needed) - f->desired_toolbar_string = Fmake_string (make_number (size_needed), ' '); + f->desired_tool_bar_string = Fmake_string (make_number (size_needed), ' '); else { props = list4 (Qdisplay, Qnil, Qmenu_item, Qnil); Fremove_text_properties (make_number (0), make_number (size), - props, f->desired_toolbar_string); + props, f->desired_tool_bar_string); } /* Put a `display' property on the string for the images to display, - put a `menu_item' property on toolbar items with a value that - is the index of the item in F's toolbar item vector. */ + put a `menu_item' property on tool-bar items with a value that + is the index of the item in F's tool-bar item vector. */ for (i = 0, string_idx = 0; - i < f->n_desired_toolbar_items; + i < f->n_desired_tool_bar_items; ++i, string_idx += 1) { #define PROP(IDX) \ - (XVECTOR (f->desired_toolbar_items) \ - ->contents[i * TOOLBAR_ITEM_NSLOTS + (IDX)]) - - int enabled_p = !NILP (PROP (TOOLBAR_ITEM_ENABLED_P)); - int selected_p = !NILP (PROP (TOOLBAR_ITEM_SELECTED_P)); + (XVECTOR (f->desired_tool_bar_items) \ + ->contents[i * TOOL_BAR_ITEM_NSLOTS + (IDX)]) + + int enabled_p = !NILP (PROP (TOOL_BAR_ITEM_ENABLED_P)); + int selected_p = !NILP (PROP (TOOL_BAR_ITEM_SELECTED_P)); int margin, relief; extern Lisp_Object QCrelief, QCmargin, QCalgorithm, Qimage; extern Lisp_Object Qlaplace; /* If image is a vector, choose the image according to the button state. */ - image = PROP (TOOLBAR_ITEM_IMAGES); + image = PROP (TOOL_BAR_ITEM_IMAGES); if (VECTORP (image)) { - enum toolbar_item_image idx; + enum tool_bar_item_image idx; if (enabled_p) idx = (selected_p - ? TOOLBAR_IMAGE_ENABLED_SELECTED - : TOOLBAR_IMAGE_ENABLED_DESELECTED); + ? TOOL_BAR_IMAGE_ENABLED_SELECTED + : TOOL_BAR_IMAGE_ENABLED_DESELECTED); else idx = (selected_p - ? TOOLBAR_IMAGE_DISABLED_SELECTED - : TOOLBAR_IMAGE_DISABLED_DESELECTED); + ? TOOL_BAR_IMAGE_DISABLED_SELECTED + : TOOL_BAR_IMAGE_DISABLED_DESELECTED); xassert (XVECTOR (image)->size >= idx); image = XVECTOR (image)->contents[idx]; @@ -6336,14 +6339,14 @@ if (!valid_image_p (image)) continue; - /* Display the toolbar button pressed, or depressed. */ + /* Display the tool-bar button pressed, or depressed. */ plist = Fcopy_sequence (XCDR (image)); /* Compute margin and relief to draw. */ - relief = toolbar_button_relief > 0 ? toolbar_button_relief : 3; - margin = relief + max (0, toolbar_button_margin); - - if (auto_raise_toolbar_buttons_p) + relief = tool_bar_button_relief > 0 ? tool_bar_button_relief : 3; + margin = relief + max (0, tool_bar_button_margin); + + if (auto_raise_tool_bar_buttons_p) { /* Add a `:relief' property to the image spec if the item is selected. */ @@ -6376,14 +6379,14 @@ /* Put a `display' text property on the string for the image to display. Put a `menu-item' property on the string that gives - the start of this item's properties in the toolbar items + the start of this item's properties in the tool-bar items vector. */ image = Fcons (Qimage, plist); props = list4 (Qdisplay, image, - Qmenu_item, make_number (i * TOOLBAR_ITEM_NSLOTS)), + Qmenu_item, make_number (i * TOOL_BAR_ITEM_NSLOTS)), Fadd_text_properties (make_number (string_idx), make_number (string_idx + 1), - props, f->desired_toolbar_string); + props, f->desired_tool_bar_string); #undef PROP } @@ -6391,10 +6394,10 @@ } -/* Display one line of the toolbar of frame IT->f. */ +/* Display one line of the tool-bar of frame IT->f. */ static void -display_toolbar_line (it) +display_tool_bar_line (it) struct it *it; { struct glyph_row *row = it->glyph_row; @@ -6452,7 +6455,7 @@ last->right_box_line_p = 1; compute_line_metrics (it); - /* If line is empty, make it occupy the rest of the toolbar. */ + /* If line is empty, make it occupy the rest of the tool-bar. */ if (!row->displays_text_p) { row->height = row->phys_height = it->last_visible_y - row->y; @@ -6471,39 +6474,39 @@ } -/* Value is the number of screen lines needed to make all toolbar +/* Value is the number of screen lines needed to make all tool-bar items of frame F visible. */ static int -toolbar_lines_needed (f) +tool_bar_lines_needed (f) struct frame *f; { - struct window *w = XWINDOW (f->toolbar_window); + struct window *w = XWINDOW (f->tool_bar_window); struct it it; - /* Initialize an iterator for iteration over F->desired_toolbar_string - in the toolbar window of frame F. */ - init_iterator (&it, w, -1, -1, w->desired_matrix->rows, TOOLBAR_FACE_ID); + /* Initialize an iterator for iteration over + F->desired_tool_bar_string in the tool-bar window of frame F. */ + init_iterator (&it, w, -1, -1, w->desired_matrix->rows, TOOL_BAR_FACE_ID); it.first_visible_x = 0; it.last_visible_x = FRAME_WINDOW_WIDTH (f) * CANON_X_UNIT (f); - reseat_to_string (&it, NULL, f->desired_toolbar_string, 0, 0, 0, -1); + reseat_to_string (&it, NULL, f->desired_tool_bar_string, 0, 0, 0, -1); while (!ITERATOR_AT_END_P (&it)) { it.glyph_row = w->desired_matrix->rows; clear_glyph_row (it.glyph_row); - display_toolbar_line (&it); + display_tool_bar_line (&it); } return (it.current_y + CANON_Y_UNIT (f) - 1) / CANON_Y_UNIT (f); } -/* Display the toolbar of frame F. Value is non-zero if toolbar's +/* Display the tool-bar of frame F. Value is non-zero if tool-bar's height should be changed. */ static int -redisplay_toolbar (f) +redisplay_tool_bar (f) struct frame *f; { struct window *w; @@ -6511,65 +6514,65 @@ struct glyph_row *row; int change_height_p = 0; - /* If frame hasn't a toolbar window or if it is zero-height, don't - do anything. This means you must start with toolbar-lines + /* If frame hasn't a tool-bar window or if it is zero-height, don't + do anything. This means you must start with tool-bar-lines non-zero to get the auto-sizing effect. Or in other words, you - can turn off toolbars by specifying toolbar-lines zero. */ - if (!WINDOWP (f->toolbar_window) - || (w = XWINDOW (f->toolbar_window), + can turn off tool-bars by specifying tool-bar-lines zero. */ + if (!WINDOWP (f->tool_bar_window) + || (w = XWINDOW (f->tool_bar_window), XFASTINT (w->height) == 0)) return 0; - /* Set up an iterator for the toolbar window. */ - init_iterator (&it, w, -1, -1, w->desired_matrix->rows, TOOLBAR_FACE_ID); + /* Set up an iterator for the tool-bar window. */ + init_iterator (&it, w, -1, -1, w->desired_matrix->rows, TOOL_BAR_FACE_ID); it.first_visible_x = 0; it.last_visible_x = FRAME_WINDOW_WIDTH (f) * CANON_X_UNIT (f); row = it.glyph_row; - /* Build a string that represents the contents of the toolbar. */ - build_desired_toolbar_string (f); - reseat_to_string (&it, NULL, f->desired_toolbar_string, 0, 0, 0, -1); - - /* Display as many lines as needed to display all toolbar items. */ + /* Build a string that represents the contents of the tool-bar. */ + build_desired_tool_bar_string (f); + reseat_to_string (&it, NULL, f->desired_tool_bar_string, 0, 0, 0, -1); + + /* Display as many lines as needed to display all tool-bar items. */ while (it.current_y < it.last_visible_y) - display_toolbar_line (&it); - - /* It doesn't make much sense to try scrolling in the toolbar + display_tool_bar_line (&it); + + /* It doesn't make much sense to try scrolling in the tool-bar window, so don't do it. */ w->desired_matrix->no_scrolling_p = 1; w->must_be_updated_p = 1; - if (auto_resize_toolbars_p) + if (auto_resize_tool_bars_p) { int nlines; /* If there are blank lines at the end, except for a partially visible blank line at the end that is smaller than - CANON_Y_UNIT, change the toolbar's height. */ + CANON_Y_UNIT, change the tool-bar's height. */ row = it.glyph_row - 1; if (!row->displays_text_p && row->height >= CANON_Y_UNIT (f)) change_height_p = 1; - /* If row displays toolbar items, but is partially visible, - change the toolbar's height. */ + /* If row displays tool-bar items, but is partially visible, + change the tool-bar's height. */ if (row->displays_text_p && MATRIX_ROW_BOTTOM_Y (row) > it.last_visible_y) change_height_p = 1; - /* Resize windows as needed by changing the `toolbar-lines' + /* Resize windows as needed by changing the `tool-bar-lines' frame parameter. */ if (change_height_p - && (nlines = toolbar_lines_needed (f), + && (nlines = tool_bar_lines_needed (f), nlines != XFASTINT (w->height))) { - extern Lisp_Object Qtoolbar_lines; + extern Lisp_Object Qtool_bar_lines; Lisp_Object frame; XSETFRAME (frame, f); clear_glyph_matrix (w->desired_matrix); Fmodify_frame_parameters (frame, - Fcons (Fcons (Qtoolbar_lines, + Fcons (Fcons (Qtool_bar_lines, make_number (nlines)), Qnil)); fonts_changed_p = 1; @@ -6580,13 +6583,13 @@ } -/* Get information about the toolbar item which is displayed in GLYPH - on frame F. Return in *PROP_IDX the index where toolbar item - properties start in F->current_toolbar_items. Value is zero if - GLYPH doesn't display a toolbar item. */ +/* Get information about the tool-bar item which is displayed in GLYPH + on frame F. Return in *PROP_IDX the index where tool-bar item + properties start in F->current_tool_bar_items. Value is zero if + GLYPH doesn't display a tool-bar item. */ int -toolbar_item_info (f, glyph, prop_idx) +tool_bar_item_info (f, glyph, prop_idx) struct frame *f; struct glyph *glyph; int *prop_idx; @@ -6596,9 +6599,9 @@ /* Get the text property `menu-item' at pos. The value of that property is the start index of this item's properties in - F->current_toolbar_items. */ + F->current_tool_bar_items. */ prop = Fget_text_property (make_number (glyph->charpos), - Qmenu_item, f->current_toolbar_string); + Qmenu_item, f->current_tool_bar_string); if (INTEGERP (prop)) { *prop_idx = XINT (prop); @@ -6990,7 +6993,7 @@ if (frame_garbaged) clear_garbaged_frames (); - /* Build menubar and toolbar items. */ + /* Build menubar and tool-bar items. */ prepare_menu_bars (); if (windows_or_buffers_changed) @@ -8206,7 +8209,7 @@ { if (update_mode_line) /* We may have to update a tty frame's menu bar or a - toolbar. Example `M-x C-h C-h C-g'. */ + tool-bar. Example `M-x C-h C-h C-g'. */ goto finish_menu_bars; else /* We've already displayed the echo area glyphs in this window. */ @@ -8923,10 +8926,10 @@ display_menu_bar (w); #ifdef HAVE_WINDOW_SYSTEM - if (WINDOWP (f->toolbar_window) - && (FRAME_TOOLBAR_LINES (f) > 0 - || auto_resize_toolbars_p)) - redisplay_toolbar (f); + if (WINDOWP (f->tool_bar_window) + && (FRAME_TOOL_BAR_LINES (f) > 0 + || auto_resize_tool_bars_p)) + redisplay_tool_bar (f); #endif } @@ -9613,6 +9616,51 @@ } +/* Find the glyph row in window W containing CHARPOS. Consider all + rows between START and END (not inclusive). END null means search + all rows to the end of the display area of W. Value is the row + containing CHARPOS or null. */ + +static struct glyph_row * +row_containing_pos (w, charpos, start, end) + struct window *w; + int charpos; + struct glyph_row *start, *end; +{ + struct glyph_row *row = start; + int last_y; + + /* If we happen to start on a header-line, skip that. */ + if (row->mode_line_p) + ++row; + + if ((end && row >= end) || !row->enabled_p) + return NULL; + + last_y = window_text_bottom_y (w); + + while ((end == NULL || row < end) + && (MATRIX_ROW_END_CHARPOS (row) < charpos + /* The end position of a row equals the start + position of the next row. If CHARPOS is there, we + would rather display it in the next line, except + when this line ends in ZV. */ + || (MATRIX_ROW_END_CHARPOS (row) == charpos + && (MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row) + || !row->ends_at_zv_p))) + && MATRIX_ROW_BOTTOM_Y (row) < last_y) + ++row; + + /* Give up if CHARPOS not found. */ + if ((end && row >= end) + || charpos < MATRIX_ROW_START_CHARPOS (row) + || charpos > MATRIX_ROW_END_CHARPOS (row)) + row = NULL; + + return row; +} + + /* Try to redisplay window W by reusing its existing display. W's current matrix must be up to date when this function is called, i.e. window_end_valid must not be nil. @@ -9885,38 +9933,19 @@ if (PT < CHARPOS (start_pos) && last_unchanged_at_beg_row) { - row = MATRIX_FIRST_TEXT_ROW (w->current_matrix); - while (row <= last_unchanged_at_beg_row - && MATRIX_ROW_END_CHARPOS (row) <= PT) - ++row; - xassert (row <= last_unchanged_at_beg_row); + row = row_containing_pos (w, PT, + MATRIX_FIRST_TEXT_ROW (w->current_matrix), + last_unchanged_at_beg_row + 1); + xassert (row && row <= last_unchanged_at_beg_row); set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0); } /* Start from first_unchanged_at_end_row looking for PT. */ else if (first_unchanged_at_end_row) { - row = first_unchanged_at_end_row; - - while (MATRIX_ROW_DISPLAYS_TEXT_P (row)) - { - if (PT - delta >= MATRIX_ROW_START_CHARPOS (row) - && PT - delta < MATRIX_ROW_END_CHARPOS (row)) - { - set_cursor_from_row (w, row, w->current_matrix, delta, - delta_bytes, dy, dvpos); - break; - } - else if (MATRIX_ROW_BOTTOM_Y (row) >= last_y) - break; - ++row; - } - - /* If PT is at ZV, this is not in a line displaying text. - Check that case. */ - if (w->cursor.vpos < 0 - && PT - delta == MATRIX_ROW_START_CHARPOS (row) - && row->ends_at_zv_p) + row = row_containing_pos (w, PT - delta, + first_unchanged_at_end_row, NULL); + if (row) set_cursor_from_row (w, row, w->current_matrix, delta, delta_bytes, dy, dvpos); } @@ -10348,11 +10377,11 @@ } -DEFUN ("dump-toolbar-row", Fdump_toolbar_row, Sdump_toolbar_row, +DEFUN ("dump-tool-bar-row", Fdump_tool_bar_row, Sdump_tool_bar_row, 0, 0, "", "") () { - struct glyph_matrix *m = (XWINDOW (selected_frame->toolbar_window) + struct glyph_matrix *m = (XWINDOW (selected_frame->tool_bar_window) ->current_matrix); dump_glyph_row (m, 0, 1); return Qnil; @@ -12477,7 +12506,7 @@ #if GLYPH_DEBUG defsubr (&Sdump_glyph_matrix); defsubr (&Sdump_glyph_row); - defsubr (&Sdump_toolbar_row); + defsubr (&Sdump_tool_bar_row); defsubr (&Strace_redisplay_toggle); #endif @@ -12669,24 +12698,24 @@ is not valid when these functions are called."); Vwindow_scroll_functions = Qnil; - DEFVAR_BOOL ("auto-resize-toolbars", &auto_resize_toolbars_p, - "*Non-nil means automatically resize toolbars.\n\ -This increases a toolbar's height if not all toolbar items are visible.\n\ -It decreases a toolbar's height when it would display blank lines\n\ + DEFVAR_BOOL ("auto-resize-tool-bars", &auto_resize_tool_bars_p, + "*Non-nil means automatically resize tool-bars.\n\ +This increases a tool-bar's height if not all tool-bar items are visible.\n\ +It decreases a tool-bar's height when it would display blank lines\n\ otherwise."); - auto_resize_toolbars_p = 1; - - DEFVAR_BOOL ("auto-raise-toolbar-buttons", &auto_raise_toolbar_buttons_p, - "*Non-nil means raise toolbar buttons when the mouse moves over them."); - auto_raise_toolbar_buttons_p = 1; - - DEFVAR_INT ("toolbar-button-margin", &toolbar_button_margin, - "*Margin around toolbar buttons in pixels."); - toolbar_button_margin = 1; - - DEFVAR_INT ("toolbar-button-relief", &toolbar_button_relief, - "Relief thickness of toolbar buttons."); - toolbar_button_relief = 3; + auto_resize_tool_bars_p = 1; + + DEFVAR_BOOL ("auto-raise-tool-bar-buttons", &auto_raise_tool_bar_buttons_p, + "*Non-nil means raise tool-bar buttons when the mouse moves over them."); + auto_raise_tool_bar_buttons_p = 1; + + DEFVAR_INT ("tool-bar-button-margin", &tool_bar_button_margin, + "*Margin around tool-bar buttons in pixels."); + tool_bar_button_margin = 1; + + DEFVAR_INT ("tool-bar-button-relief", &tool_bar_button_relief, + "Relief thickness of tool-bar buttons."); + tool_bar_button_relief = 3; DEFVAR_LISP ("fontification-functions", &Vfontification_functions, "List of functions to call to fontify regions of text.\n\