Mercurial > hg > xemacs-beta
diff src/window.c @ 284:558f606b08ae r21-0b40
Import from CVS: tag r21-0b40
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:34:13 +0200 |
parents | c42ec1d1cded |
children | 57709be46d1b |
line wrap: on
line diff
--- a/src/window.c Mon Aug 13 10:33:19 2007 +0200 +++ b/src/window.c Mon Aug 13 10:34:13 2007 +0200 @@ -68,9 +68,21 @@ /* Thickness of shadow border around 3d modelines. */ Lisp_Object Vmodeline_shadow_thickness; +/* Whether vertical dividers are draggable and displayed */ +Lisp_Object Vvertical_divider_draggable_p; + /* Whether a modeline should be displayed. */ Lisp_Object Vhas_modeline_p; +/* Thickness of shadow border around vertical dividers. */ +Lisp_Object Vvertical_divider_shadow_thickness; + +/* Divider surface width (not counting 3-d borders) */ +Lisp_Object Vvertical_divider_line_width; + +/* Spacing between outer egde of divider border and window edge */ +Lisp_Object Vvertical_divider_spacing; + /* Scroll if point lands on the bottom line and that line is partially clipped. */ int scroll_on_clipped_lines; @@ -150,52 +162,12 @@ MARK_DISP_VARIABLE (last_facechange); ((markobj) (window->line_cache_last_updated)); ((markobj) (window->redisplay_end_trigger)); - /* Cached specifiers: */ - ((markobj) (window->display_table)); - ((markobj) (window->has_modeline_p)); - ((markobj) (window->modeline_shadow_thickness)); -#ifdef HAVE_SCROLLBARS - ((markobj) (window->scrollbar_width)); - ((markobj) (window->scrollbar_height)); - ((markobj) (window->horizontal_scrollbar_visible_p)); - ((markobj) (window->vertical_scrollbar_visible_p)); - ((markobj) (window->scrollbar_on_left_p)); - ((markobj) (window->scrollbar_on_top_p)); - ((markobj) (window->scrollbar_pointer)); -#endif /* HAVE_SCROLLBARS */ - ((markobj) (window->left_margin_width)); - ((markobj) (window->right_margin_width)); -#ifdef HAVE_TOOLBARS - ((markobj) (window->toolbar[0])); - ((markobj) (window->toolbar[1])); - ((markobj) (window->toolbar[2])); - ((markobj) (window->toolbar[3])); - ((markobj) (window->toolbar_size[0])); - ((markobj) (window->toolbar_size[1])); - ((markobj) (window->toolbar_size[2])); - ((markobj) (window->toolbar_size[3])); - ((markobj) (window->toolbar_visible_p[0])); - ((markobj) (window->toolbar_visible_p[1])); - ((markobj) (window->toolbar_visible_p[2])); - ((markobj) (window->toolbar_visible_p[3])); - ((markobj) (window->toolbar_buttons_captioned_p)); - ((markobj) (window->default_toolbar)); - ((markobj) (window->default_toolbar_height)); - ((markobj) (window->default_toolbar_width)); - ((markobj) (window->default_toolbar_visible_p)); -#endif /* HAVE_TOOLBARS */ - ((markobj) (window->minimum_line_ascent)); - ((markobj) (window->minimum_line_descent)); - ((markobj) (window->use_left_overflow)); - ((markobj) (window->use_right_overflow)); -#ifdef HAVE_MENUBARS - ((markobj) (window->menubar_visible_p)); -#endif /* HAVE_MENUBARS */ - ((markobj) (window->text_cursor_visible_p)); - /* End cached specifiers. */ - ((markobj) (window->dedicated)); mark_face_cachels (window->face_cachels, markobj); mark_glyph_cachels (window->glyph_cachels, markobj); + +#define WINDOW_SLOT(slot, compare) ((markobj) (window->slot)) +#include "winslots.h" + return Qnil; } @@ -307,38 +279,10 @@ INIT_DISP_VARIABLE (last_point_y, 0); INIT_DISP_VARIABLE (window_end_pos, 0); p->redisplay_end_trigger = Qnil; - /* cached specifier values: will get set properly later */ - p->display_table = Qnil; - p->has_modeline_p = Qnil; - p->modeline_shadow_thickness = Qnil; -#ifdef HAVE_SCROLLBARS - p->scrollbar_width = Qnil; - p->scrollbar_height = Qnil; - p->horizontal_scrollbar_visible_p = Qnil; - p->vertical_scrollbar_visible_p = Qnil; - p->scrollbar_on_left_p = Qnil; - p->scrollbar_on_top_p = Qnil; -#endif - p->left_margin_width = Qnil; - p->right_margin_width = Qnil; -#ifdef HAVE_TOOLBARS - p->toolbar_size[0] = Qnil; - p->toolbar_size[1] = Qnil; - p->toolbar_size[2] = Qnil; - p->toolbar_size[3] = Qnil; - p->toolbar_buttons_captioned_p = Qnil; -#endif - p->minimum_line_ascent = Qnil; - p->minimum_line_descent = Qnil; - p->use_left_overflow = Qnil; - p->use_right_overflow = Qnil; -#ifdef HAVE_MENUBARS - p->menubar_visible_p = Qnil; -#endif - p->text_cursor_visible_p = Qnil; - /* end cached specifier values. */ - - p->dedicated = Qnil; + +#define WINDOW_SLOT(slot, compare) p->slot = Qnil +#include "winslots.h" + p->windows_changed = 1; p->shadow_thickness_changed = 1; @@ -776,16 +720,86 @@ } int +have_undivided_common_edge (struct window *w_right, void *closure) +{ + struct window *w_left = (struct window *) closure; + return (WINDOW_RIGHT (w_left) == WINDOW_LEFT (w_right) + && WINDOW_TOP (w_left) < WINDOW_BOTTOM (w_right) + && WINDOW_TOP (w_right) < WINDOW_BOTTOM (w_left) +#ifdef HAVE_SCROLLBARS + && (NILP (w_right->scrollbar_on_left_p) + || NILP (w_right->vertical_scrollbar_visible_p) + || ZEROP (w_right->scrollbar_width)) +#endif + ); +} + +static int +window_needs_vertical_divider_1 (struct window *w) +{ + /* Never if we're on the right */ + if (window_is_rightmost (w)) + return 0; + + /* Always if draggable */ + if (!NILP (w->vertical_divider_draggable_p)) + return 1; + +#ifdef HAVE_SCROLLBARS + /* Our right scrollabr is enough to separate us at the right */ + if (NILP (w->scrollbar_on_left_p) + && !NILP (w->vertical_scrollbar_visible_p) + && !ZEROP (w->scrollbar_width)) + return 0; +#endif + + /* Ok. to determine whether we need a divider on the left, we must + check that out right neighbor windows have scrollbars on their + left sides. We mist check all such windows which have common + left edge with our window's right edge. */ + return map_windows (XFRAME (WINDOW_FRAME (w)), + have_undivided_common_edge, (void*)w); +} + +int window_needs_vertical_divider (struct window *w) { -#ifdef HAVE_SCROLLBARS - return (!window_scrollbar_width (w) && - (!NILP (w->scrollbar_on_left_p) ? - !window_is_leftmost (w) : - !window_is_rightmost (w))); -#else - return !window_is_leftmost (w); -#endif /* HAVE_SCROLLBARS */ + if (!w->need_vertical_divider_valid_p) + { + w->need_vertical_divider_p = + window_needs_vertical_divider_1 (w); + w->need_vertical_divider_valid_p = 1; + } + return w->need_vertical_divider_p; +} + +/* Called from invalidate_vertical_divider_cache_in_frame */ +int +invalidate_vertical_divider_cache_in_window (struct window *w, + void *u_n_u_s_e_d) +{ + w->need_vertical_divider_valid_p = 0; + return 0; +} + +/* Calculate width of vertical divider, including its shadows + and spacing. The returned value is effectively the distance + between adjacent window edges. This function does not check + whether a windows needs vertival divider, so the returned + value is a "theoretical" one */ +int +window_divider_width (struct window *w) +{ + /* the shadow thickness can be negative. This means that the divider + will have a depressed look */ + + if (FRAME_WIN_P (XFRAME (WINDOW_FRAME (w)))) + return + XINT (w->vertical_divider_line_width) + + 2 * XINT (w->vertical_divider_spacing) + + 2 * abs (XINT (w->vertical_divider_shadow_thickness)); + else + return XINT (w->vertical_divider_line_width) == 0 ? 0 : 1; } int @@ -1033,72 +1047,40 @@ return other_height; } -static int -window_left_right_gutter_width_internal (struct window *w, int modeline) -{ - struct frame *f = XFRAME (w->frame); - int scrollbar_width = window_scrollbar_width (w); - - if (!NILP (w->hchild) || !NILP (w->vchild)) - return 0; - - if (!modeline) - { - if (scrollbar_width) - return scrollbar_width; - else if (window_needs_vertical_divider (w)) - return FRAMEMETH (f, divider_width, ()); - else - return 0; - } - else - { - /* The shadows on the 3D modelines provide a visual break - between the modelines of horizontally split windows. 2D - modelines need some help, though. */ - if (!EQ (Qzero, w->modeline_shadow_thickness)) - return 0; - else if (window_needs_vertical_divider (w)) - return FRAMEMETH (f, divider_width, ()); - else - return 0; - } -} - int window_left_gutter_width (struct window *w, int modeline) { + int gutter = window_left_toolbar_width (w); + if (!NILP (w->hchild) || !NILP (w->vchild)) return 0; + #ifdef HAVE_SCROLLBARS - if (!NILP (w->scrollbar_on_left_p)) - { + if (!modeline && !NILP (w->scrollbar_on_left_p)) + gutter += window_scrollbar_width (w); #endif - return (window_left_right_gutter_width_internal (w, modeline) + - window_left_toolbar_width (w)); -#ifdef HAVE_SCROLLBARS - } - else - return window_left_toolbar_width (w); -#endif + + return gutter; } int window_right_gutter_width (struct window *w, int modeline) { + int gutter = window_left_toolbar_width (w); + if (!NILP (w->hchild) || !NILP (w->vchild)) return 0; #ifdef HAVE_SCROLLBARS - if (NILP (w->scrollbar_on_left_p)) - { - return (window_left_right_gutter_width_internal (w, modeline) + - window_right_toolbar_width (w)); - } - else + if (!modeline && NILP (w->scrollbar_on_left_p)) + gutter += window_scrollbar_width (w); #endif - return window_right_toolbar_width (w); + + if (window_needs_vertical_divider (w)) + gutter += window_divider_width (w); + + return gutter; } @@ -4379,21 +4361,22 @@ If MAPFUN create or delete windows, the behaviour is undefined. */ -void +int map_windows (struct frame *f, int (*mapfun) (struct window *w, void *closure), void *closure) { if (f) - map_windows_1 (FRAME_ROOT_WINDOW (f), mapfun, closure); + return map_windows_1 (FRAME_ROOT_WINDOW (f), mapfun, closure); else { Lisp_Object frmcons, devcons, concons; FRAME_LOOP_NO_BREAK(frmcons, devcons, concons) { - if (map_windows_1 (FRAME_ROOT_WINDOW (XFRAME (XCAR (frmcons))), - mapfun, closure)) - return; + int v = map_windows_1 (FRAME_ROOT_WINDOW (XFRAME (XCAR (frmcons))), + mapfun, closure); + if (v) + return v; } } } @@ -4407,6 +4390,15 @@ MARK_WINDOWS_CHANGED (w); } +static void +vertical_divider_changed_in_window (Lisp_Object specifier, + struct window *w, + Lisp_Object oldval) +{ + MARK_WINDOWS_CHANGED (w); + MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (XFRAME (WINDOW_FRAME (w))); +} + /* also used in scrollbar.c */ void some_window_value_changed (Lisp_Object specifier, struct window *w, @@ -4543,38 +4535,11 @@ int modeline_hscroll; int parent_index; /* index into saved_windows */ int prev_index; /* index into saved_windows */ - Lisp_Object dedicated; char start_at_line_beg; /* boolean */ - Lisp_Object display_table; - Lisp_Object modeline_shadow_thickness; - Lisp_Object has_modeline_p; -#ifdef HAVE_SCROLLBARS - Lisp_Object scrollbar_width; - Lisp_Object scrollbar_height; - Lisp_Object horizontal_scrollbar_visible_p; - Lisp_Object vertical_scrollbar_visible_p; - Lisp_Object scrollbar_on_left_p; - Lisp_Object scrollbar_on_top_p; - Lisp_Object scrollbar_pointer; -#endif /* HAVE_SCROLLBARS */ -#ifdef HAVE_TOOLBARS - Lisp_Object toolbar[4]; - Lisp_Object toolbar_size[4]; - Lisp_Object toolbar_border_width[4]; - Lisp_Object toolbar_visible_p[4]; - Lisp_Object toolbar_buttons_captioned_p; - Lisp_Object default_toolbar; - Lisp_Object default_toolbar_width, default_toolbar_height; - Lisp_Object default_toolbar_visible_p; - Lisp_Object default_toolbar_border_width; -#endif /* HAVE_TOOLBARS */ - Lisp_Object left_margin_width, right_margin_width; - Lisp_Object minimum_line_ascent, minimum_line_descent; - Lisp_Object use_left_overflow, use_right_overflow; -#ifdef HAVE_MENUBARS - Lisp_Object menubar_visible_p; -#endif /* HAVE_MENUBARS */ - Lisp_Object text_cursor_visible_p; + +#define WINDOW_SLOT_DECLARATION +#define WINDOW_SLOT(slot, compare) Lisp_Object slot +#include "winslots.h" }; /* If you add anything to this structure make sure window_config_equal @@ -4625,7 +4590,16 @@ ((markobj) (s->pointm)); ((markobj) (s->sb_point)); ((markobj) (s->mark)); +#if 0 + /* #### This looked like this. I do not see why specifier cached + values should not be marked, as such specifiers as toolbars + might have GC-able instances. Freed configs are not marked, + aren't they? -- kkm */ ((markobj) (s->dedicated)); +#else +#define WINDOW_SLOT(slot, compare) ((markobj) (s->slot)) +#include "winslots.h" +#endif } return Qnil; } @@ -4671,6 +4645,11 @@ static int saved_window_equal (struct saved_window *win1, struct saved_window *win2) { +#define WINDOW_SLOT(slot, compare) \ + if (!compare (win1->slot, win2->slot)) \ + return 0; +#include "winslots.h" + return EQ (win1->window, win2->window) && EQ (win1->buffer, win2->buffer) && @@ -4686,54 +4665,7 @@ win1->modeline_hscroll == win2->modeline_hscroll && win1->parent_index == win2->parent_index && win1->prev_index == win2->prev_index && - EQ (win1->dedicated, win2->dedicated) && - win1->start_at_line_beg == win2->start_at_line_beg && - internal_equal(win1->display_table, win2->display_table, 0) && - EQ(win1->modeline_shadow_thickness, win2->modeline_shadow_thickness) && - EQ(win1->has_modeline_p, win2->has_modeline_p) && -#ifdef HAVE_SCROLLBARS - EQ(win1->scrollbar_width, win2->scrollbar_width) && - EQ(win1->scrollbar_height, win2->scrollbar_height) && - EQ(win1->horizontal_scrollbar_visible_p, win2->horizontal_scrollbar_visible_p) && - EQ(win1->vertical_scrollbar_visible_p, win2->vertical_scrollbar_visible_p) && - EQ(win1->scrollbar_on_left_p, win2->scrollbar_on_left_p) && - EQ(win1->scrollbar_on_top_p, win2->scrollbar_on_top_p) && - EQ(win1->scrollbar_pointer, win2->scrollbar_pointer) && -#endif /* HAVE_SCROLLBARS */ -#ifdef HAVE_TOOLBARS - internal_equal(win1->toolbar[0], win2->toolbar[0], 0) && - internal_equal(win1->toolbar[1], win2->toolbar[1], 0) && - internal_equal(win1->toolbar[2], win2->toolbar[2], 0) && - internal_equal(win1->toolbar[3], win2->toolbar[3], 0) && - internal_equal(win1->toolbar_border_width[0], win2->toolbar_border_width[0], 0) && - internal_equal(win1->toolbar_border_width[1], win2->toolbar_border_width[1], 0) && - internal_equal(win1->toolbar_border_width[2], win2->toolbar_border_width[2], 0) && - internal_equal(win1->toolbar_border_width[3], win2->toolbar_border_width[3], 0) && - internal_equal(win1->toolbar_size[0], win2->toolbar_size[0], 0) && - internal_equal(win1->toolbar_size[1], win2->toolbar_size[1], 0) && - internal_equal(win1->toolbar_size[2], win2->toolbar_size[2], 0) && - internal_equal(win1->toolbar_size[3], win2->toolbar_size[3], 0) && - internal_equal(win1->toolbar_visible_p[0], win2->toolbar_visible_p[0], 0) && - internal_equal(win1->toolbar_visible_p[1], win2->toolbar_visible_p[1], 0) && - internal_equal(win1->toolbar_visible_p[2], win2->toolbar_visible_p[2], 0) && - internal_equal(win1->toolbar_visible_p[3], win2->toolbar_visible_p[3], 0) && - EQ(win1->toolbar_buttons_captioned_p, win2->toolbar_buttons_captioned_p) && - internal_equal(win1->default_toolbar, win2->default_toolbar, 0) && - EQ(win1->default_toolbar_width, win2->default_toolbar_width) && - EQ(win1->default_toolbar_height, win2->default_toolbar_height) && - EQ(win1->default_toolbar_visible_p, win2->default_toolbar_visible_p) && - EQ(win1->default_toolbar_border_width, win2->default_toolbar_border_width) && -#endif /* HAVE_TOOLBARS */ - EQ(win1->left_margin_width, win2->left_margin_width) && - EQ(win1->right_margin_width, win2->right_margin_width) && - EQ(win1->minimum_line_ascent, win2->minimum_line_ascent) && - EQ(win1->minimum_line_descent, win2->minimum_line_descent) && - EQ(win1->use_left_overflow, win2->use_left_overflow) && - EQ(win1->use_right_overflow, win2->use_right_overflow) && -#ifdef HAVE_MENUBARS - EQ(win1->menubar_visible_p, win2->menubar_visible_p) && -#endif /* HAVE_MENUBARS */ - EQ(win1->text_cursor_visible_p, win2->text_cursor_visible_p); + win1->start_at_line_beg == win2->start_at_line_beg; } /* Returns a boolean indicating whether the two given configurations @@ -5011,52 +4943,14 @@ WINDOW_HEIGHT (w) = WINDOW_HEIGHT (p); w->hscroll = p->hscroll; w->modeline_hscroll = p->modeline_hscroll; - w->display_table = p->display_table; - w->modeline_shadow_thickness = p->modeline_shadow_thickness; - w->has_modeline_p = p->has_modeline_p; -#ifdef HAVE_SCROLLBARS - w->scrollbar_width = p->scrollbar_width; - w->scrollbar_height = p->scrollbar_height; - w->horizontal_scrollbar_visible_p = p->horizontal_scrollbar_visible_p; - w->vertical_scrollbar_visible_p = p->vertical_scrollbar_visible_p; - w->scrollbar_on_left_p = p->scrollbar_on_left_p; - w->scrollbar_on_top_p = p->scrollbar_on_top_p; - w->scrollbar_pointer = p->scrollbar_pointer; -#endif /* HAVE_SCROLLBARS */ -#ifdef HAVE_TOOLBARS - { - int ix; - for (ix = 0; ix < 4; ix++) - { - w->toolbar[ix] = p->toolbar[ix]; - w->toolbar_size[ix] = p->toolbar_size[ix]; - w->toolbar_border_width[ix] = p->toolbar_border_width[ix]; - w->toolbar_visible_p[ix] = p->toolbar_visible_p[ix]; - } - } - w->toolbar_buttons_captioned_p = p->toolbar_buttons_captioned_p; - w->default_toolbar = p->default_toolbar; - w->default_toolbar_width = p->default_toolbar_width; - w->default_toolbar_height = p->default_toolbar_height; - w->default_toolbar_visible_p = p->default_toolbar_visible_p; - w->default_toolbar_border_width = p->default_toolbar_border_width; -#endif /* HAVE_TOOLBARS */ - w->left_margin_width = p->left_margin_width; - w->right_margin_width = p->right_margin_width; - w->minimum_line_ascent = p->minimum_line_ascent; - w->minimum_line_descent = p->minimum_line_descent; - w->use_left_overflow = p->use_left_overflow; - w->use_right_overflow = p->use_right_overflow; -#ifdef HAVE_MENUBARS - w->menubar_visible_p = p->menubar_visible_p; -#endif /* HAVE_MENUBARS */ - w->text_cursor_visible_p = p->text_cursor_visible_p; - w->dedicated = p->dedicated; w->line_cache_last_updated = Qzero; SET_LAST_MODIFIED (w, 1); SET_LAST_FACECHANGE (w); w->config_mark = 0; +#define WINDOW_SLOT(slot, compare) w->slot = p->slot; +#include "winslots.h" + /* Reinstall the saved buffer and pointers into it. */ if (NILP (p->buffer)) w->buffer = p->buffer; @@ -5277,46 +5171,9 @@ WINDOW_HEIGHT (p) = WINDOW_HEIGHT (w); p->hscroll = w->hscroll; p->modeline_hscroll = w->modeline_hscroll; - p->display_table = w->display_table; - p->modeline_shadow_thickness = w->modeline_shadow_thickness; - p->has_modeline_p = w->has_modeline_p; -#ifdef HAVE_SCROLLBARS - p->scrollbar_width = w->scrollbar_width; - p->scrollbar_height = w->scrollbar_height; - p->horizontal_scrollbar_visible_p = w->horizontal_scrollbar_visible_p; - p->vertical_scrollbar_visible_p = w->vertical_scrollbar_visible_p; - p->scrollbar_on_left_p = w->scrollbar_on_left_p; - p->scrollbar_on_top_p = w->scrollbar_on_top_p; - p->scrollbar_pointer = w->scrollbar_pointer; -#endif /* HAVE_SCROLLBARS */ -#ifdef HAVE_TOOLBARS - { - int ix; - for (ix = 0; ix < 4; ix++) - { - p->toolbar[ix] = w->toolbar[ix]; - p->toolbar_size[ix] = w->toolbar_size[ix]; - p->toolbar_border_width[ix] = w->toolbar_border_width[ix]; - p->toolbar_visible_p[ix] = w->toolbar_visible_p[ix]; - } - } - p->toolbar_buttons_captioned_p = w->toolbar_buttons_captioned_p; - p->default_toolbar = w->default_toolbar; - p->default_toolbar_width = w->default_toolbar_width; - p->default_toolbar_height = w->default_toolbar_height; - p->default_toolbar_visible_p = w->default_toolbar_visible_p; - p->default_toolbar_border_width = w->default_toolbar_border_width; -#endif /* HAVE_TOOLBARS */ - p->left_margin_width = w->left_margin_width; - p->right_margin_width = w->right_margin_width; - p->minimum_line_ascent = w->minimum_line_ascent; - p->minimum_line_descent = w->minimum_line_descent; - p->use_left_overflow = w->use_left_overflow; - p->use_right_overflow = w->use_right_overflow; -#ifdef HAVE_MENUBARS - p->menubar_visible_p = w->menubar_visible_p; -#endif /* HAVE_MENUBARS */ - p->text_cursor_visible_p = w->text_cursor_visible_p; + +#define WINDOW_SLOT(slot, compare) p->slot = w->slot; +#include "winslots.h" if (!NILP (w->buffer)) { @@ -5356,7 +5213,6 @@ p->prev_index = -1; else p->prev_index = saved_window_index (w->prev, config, i); - p->dedicated = w->dedicated; if (!NILP (w->vchild)) i = save_window_save (w->vchild, config, i); if (!NILP (w->hchild)) @@ -5674,7 +5530,7 @@ modeline_shadow_thickness), modeline_shadow_thickness_changed, 0, 0); - + DEFVAR_SPECIFIER ("has-modeline-p", &Vhas_modeline_p /* *Whether the modeline should be displayed. This is a specifier; use `set-specifier' to change it. @@ -5691,4 +5547,97 @@ the modeline has been turned off or on. */ some_window_value_changed, 0, 0); + + DEFVAR_SPECIFIER ("vertical-divider-draggable-p", &Vvertical_divider_draggable_p /* +*Should XEmacs allow resizing windows by dragging vertical dividers. +When t, vertical dividers are always shown, and are draggable. +When nil, vertical dividers are shown only when there are no scrollbars +in between windows, and not draggable. +This is a specifier; use `set-specifier' to change it. +*/ ); + Vvertical_divider_draggable_p = Fmake_specifier (Qboolean); + set_specifier_fallback (Vvertical_divider_draggable_p, + list1 (Fcons (Qnil, Qt))); + set_specifier_caching (Vvertical_divider_draggable_p, + slot_offset (struct window, + vertical_divider_draggable_p), + vertical_divider_changed_in_window, + 0, 0); + + DEFVAR_SPECIFIER ("vertical-divider-shadow-thickness", &Vvertical_divider_shadow_thickness /* +*How thick to draw shadows around the vertical dividers. +This is a specifier; use `set-specifier' to change it. +*/ ); + Vvertical_divider_shadow_thickness = Fmake_specifier (Qinteger); + set_specifier_fallback (Vvertical_divider_shadow_thickness, + list1 (Fcons (Qnil, Qzero))); + Fadd_spec_to_specifier (Vvertical_divider_shadow_thickness, make_int (2), + Qnil, Qnil, Qnil); + set_specifier_caching (Vvertical_divider_shadow_thickness, + slot_offset (struct window, + vertical_divider_shadow_thickness), + vertical_divider_changed_in_window, + 0, 0); + DEFVAR_SPECIFIER ("vertical-divider-line-width", &Vvertical_divider_line_width /* +*The width of the vertical dividers, not including shadows. + +For TTY windows, divider line is always one character wide. When +instance of this specifier is zero in a TTY window, no divider is +drawn at all between windows. When non-zero, one character wide +divider is displayed. + +*Whether the modeline should be displayed. +This is a specifier; use `set-specifier' to change it. +*/ ); + + Vvertical_divider_line_width = Fmake_specifier (Qnatnum); + { + Lisp_Object fb = Qnil; +#ifdef HAVE_TTY + fb = Fcons (Fcons (list1 (Qtty), Qzero), fb); +#endif +#ifdef HAVE_X_WINDOWS + fb = Fcons (Fcons (list1 (Qx), make_int (3)), fb); +#endif +#ifdef HAVE_MS_WINDOWS + /* #### This should be made magic and made to obey system settings */ + fb = Fcons (Fcons (list1 (Qmswindows), make_int (3)), fb); +#endif + set_specifier_fallback (Vvertical_divider_line_width, fb); + } + set_specifier_caching (Vvertical_divider_line_width, + slot_offset (struct window, + vertical_divider_line_width), + vertical_divider_changed_in_window, + 0, 0); + + DEFVAR_SPECIFIER ("vertical-divider-spacing", &Vvertical_divider_spacing /* +*How much space to leave around the vertical dividers. + +In TTY windows, spacing is always zero, and the value of this +specifier is ignored. + +This is a specifier; use `set-specifier' to change it. +*/ ); + Vvertical_divider_spacing = Fmake_specifier (Qnatnum); + { + Lisp_Object fb = Qnil; +#ifdef HAVE_TTY + fb = Fcons (Fcons (list1 (Qtty), Qzero), fb); +#endif +#ifdef HAVE_X_WINDOWS + /* #### 3D dividers look great on MS Windows with spacing = 0. + Shoud not the same value be the fallback under X? - kkm */ + fb = Fcons (Fcons (list1 (Qx), make_int (2)), fb); +#endif +#ifdef HAVE_MS_WINDOWS + fb = Fcons (Fcons (list1 (Qmswindows), Qzero), fb); +#endif + set_specifier_fallback (Vvertical_divider_spacing, fb); + } + set_specifier_caching (Vvertical_divider_spacing, + slot_offset (struct window, + vertical_divider_spacing), + vertical_divider_changed_in_window, + 0, 0); }