diff --git a/kitty/options/definition.py b/kitty/options/definition.py index 1e1ab0828..1bf8a0dde 100644 --- a/kitty/options/definition.py +++ b/kitty/options/definition.py @@ -815,6 +815,17 @@ opt('tab_bar_margin_width', '0.0', long_text='The margin to the left and right of the tab bar (in pts)' ) +opt('tab_bar_margin_height', '0.0 0.0', + option_type='tab_bar_margin_height', ctype='!tab_bar_margin_height', + long_text=''' +The margin above and below the tab bar (in pts). The first number is the +margin between the edge of the OS Window and the tab bar and the second +number is the margin between the tab bar and the contents of the current +tab. +''' + ) + + opt('tab_bar_style', 'fade', choices=('fade', 'hidden', 'powerline', 'separator'), ctype='!tab_bar_style', long_text=''' diff --git a/kitty/options/parse.py b/kitty/options/parse.py index a6aef75ab..b98d19b2b 100644 --- a/kitty/options/parse.py +++ b/kitty/options/parse.py @@ -14,9 +14,9 @@ from kitty.options.utils import ( edge_width, env, font_features, hide_window_decorations, kitten_alias, macos_option_as_alt, macos_titlebar_color, optional_edge_width, parse_map, parse_mouse_map, resize_draw_strategy, scrollback_lines, scrollback_pager_history_size, symbol_map, tab_activity_symbol, tab_bar_edge, - tab_bar_min_tabs, tab_fade, tab_font_style, tab_separator, tab_title_template, to_cursor_shape, - to_font_size, to_layout_names, to_modifiers, url_prefixes, url_style, window_border_width, - window_size + tab_bar_margin_height, tab_bar_min_tabs, tab_fade, tab_font_style, tab_separator, + tab_title_template, to_cursor_shape, to_font_size, to_layout_names, to_modifiers, url_prefixes, + url_style, window_border_width, window_size ) @@ -1149,6 +1149,9 @@ class Parser: def tab_bar_edge(self, val: str, ans: typing.Dict[str, typing.Any]) -> None: ans['tab_bar_edge'] = tab_bar_edge(val) + def tab_bar_margin_height(self, val: str, ans: typing.Dict[str, typing.Any]) -> None: + ans['tab_bar_margin_height'] = tab_bar_margin_height(val) + def tab_bar_margin_width(self, val: str, ans: typing.Dict[str, typing.Any]) -> None: ans['tab_bar_margin_width'] = positive_float(val) diff --git a/kitty/options/to-c-generated.h b/kitty/options/to-c-generated.h index 81dba839a..89d13e5bb 100644 --- a/kitty/options/to-c-generated.h +++ b/kitty/options/to-c-generated.h @@ -525,6 +525,19 @@ convert_from_opts_tab_bar_edge(PyObject *py_opts, Options *opts) { Py_DECREF(ret); } +static void +convert_from_python_tab_bar_margin_height(PyObject *val, Options *opts) { + tab_bar_margin_height(val, opts); +} + +static void +convert_from_opts_tab_bar_margin_height(PyObject *py_opts, Options *opts) { + PyObject *ret = PyObject_GetAttrString(py_opts, "tab_bar_margin_height"); + if (ret == NULL) return; + convert_from_python_tab_bar_margin_height(ret, opts); + Py_DECREF(ret); +} + static void convert_from_python_tab_bar_style(PyObject *val, Options *opts) { tab_bar_style(val, opts); @@ -945,6 +958,8 @@ convert_opts_from_python_opts(PyObject *py_opts, Options *opts) { if (PyErr_Occurred()) return false; convert_from_opts_tab_bar_edge(py_opts, opts); if (PyErr_Occurred()) return false; + convert_from_opts_tab_bar_margin_height(py_opts, opts); + if (PyErr_Occurred()) return false; convert_from_opts_tab_bar_style(py_opts, opts); if (PyErr_Occurred()) return false; convert_from_opts_tab_bar_min_tabs(py_opts, opts); diff --git a/kitty/options/to-c.h b/kitty/options/to-c.h index 4b428db01..4de83e3b8 100644 --- a/kitty/options/to-c.h +++ b/kitty/options/to-c.h @@ -138,6 +138,16 @@ tab_bar_style(PyObject *val, Options *opts) { opts->tab_bar_hidden = PyUnicode_CompareWithASCIIString(val, "hidden") == 0 ? true: false; } +static void +tab_bar_margin_height(PyObject *val, Options *opts) { + if (!PyTuple_Check(val) || PyTuple_GET_SIZE(val) != 2) { + PyErr_SetString(PyExc_TypeError, "tab_bar_margin_height is not a 2-item tuple"); + return; + } + opts->tab_bar_margin_height.outer = PyFloat_AsDouble(PyTuple_GET_ITEM(val, 0)); + opts->tab_bar_margin_height.inner = PyFloat_AsDouble(PyTuple_GET_ITEM(val, 1)); +} + #define read_adjust(name) { \ if (PyFloat_Check(al)) { \ opts->name##_frac = (float)PyFloat_AsDouble(al); \ diff --git a/kitty/options/types.py b/kitty/options/types.py index a0ebc908e..a44a10d65 100644 --- a/kitty/options/types.py +++ b/kitty/options/types.py @@ -7,7 +7,7 @@ from kitty.conf.utils import KeyAction import kitty.conf.utils from kitty.constants import is_macos import kitty.constants -from kitty.options.utils import KeyDefinition, KeyMap, MouseMap, MouseMapping, SequenceMap +from kitty.options.utils import KeyDefinition, KeyMap, MouseMap, MouseMapping, SequenceMap, TabBarMarginHeight import kitty.options.utils from kitty.rgb import Color import kitty.rgb @@ -403,6 +403,7 @@ option_names = ( # {{{ 'tab_activity_symbol', 'tab_bar_background', 'tab_bar_edge', + 'tab_bar_margin_height', 'tab_bar_margin_width', 'tab_bar_min_tabs', 'tab_bar_style', @@ -530,6 +531,7 @@ class Options: tab_activity_symbol: typing.Optional[str] = None tab_bar_background: typing.Optional[kitty.rgb.Color] = None tab_bar_edge: int = 3 + tab_bar_margin_height: TabBarMarginHeight = TabBarMarginHeight(outer=0, inner=0) tab_bar_margin_width: float = 0 tab_bar_min_tabs: int = 2 tab_bar_style: choices_for_tab_bar_style = 'fade' @@ -811,10 +813,10 @@ if is_macos: defaults.map.append(KeyDefinition(False, KeyAction('edit_config_file'), 8, False, 44, ())) defaults.mouse_map = [ MouseMapping(0, 0, -2, False, KeyAction('mouse_click_url_or_select')), - MouseMapping(0, 1, -2, True, KeyAction('mouse_click_url_or_select')), MouseMapping(0, 1, -2, False, KeyAction('mouse_click_url_or_select')), - MouseMapping(0, 5, -1, True, KeyAction('mouse_click_url')), + MouseMapping(0, 1, -2, True, KeyAction('mouse_click_url_or_select')), MouseMapping(0, 5, -1, False, KeyAction('mouse_click_url')), + MouseMapping(0, 5, -1, True, KeyAction('mouse_click_url')), MouseMapping(2, 0, -1, False, KeyAction('paste_selection')), MouseMapping(0, 0, 1, False, KeyAction('mouse_selection', (0,))), MouseMapping(0, 6, 1, False, KeyAction('mouse_selection', (2,))), @@ -822,18 +824,18 @@ defaults.mouse_map = [ MouseMapping(0, 0, 3, False, KeyAction('mouse_selection', (4,))), MouseMapping(0, 6, 3, False, KeyAction('mouse_selection', (5,))), MouseMapping(1, 0, 1, False, KeyAction('mouse_selection', (1,))), - MouseMapping(2, 1, -1, True, KeyAction('paste_selection')), MouseMapping(2, 1, -1, False, KeyAction('paste_selection')), - MouseMapping(0, 1, 1, True, KeyAction('mouse_selection', (0,))), + MouseMapping(2, 1, -1, True, KeyAction('paste_selection')), MouseMapping(0, 1, 1, False, KeyAction('mouse_selection', (0,))), - MouseMapping(0, 7, 1, True, KeyAction('mouse_selection', (2,))), + MouseMapping(0, 1, 1, True, KeyAction('mouse_selection', (0,))), MouseMapping(0, 7, 1, False, KeyAction('mouse_selection', (2,))), - MouseMapping(0, 1, 2, True, KeyAction('mouse_selection', (3,))), + MouseMapping(0, 7, 1, True, KeyAction('mouse_selection', (2,))), MouseMapping(0, 1, 2, False, KeyAction('mouse_selection', (3,))), - MouseMapping(0, 1, 3, True, KeyAction('mouse_selection', (4,))), + MouseMapping(0, 1, 2, True, KeyAction('mouse_selection', (3,))), MouseMapping(0, 1, 3, False, KeyAction('mouse_selection', (4,))), - MouseMapping(0, 7, 3, True, KeyAction('mouse_selection', (5,))), + MouseMapping(0, 1, 3, True, KeyAction('mouse_selection', (4,))), MouseMapping(0, 7, 3, False, KeyAction('mouse_selection', (5,))), - MouseMapping(1, 1, 1, True, KeyAction('mouse_selection', (1,))), + MouseMapping(0, 7, 3, True, KeyAction('mouse_selection', (5,))), MouseMapping(1, 1, 1, False, KeyAction('mouse_selection', (1,))), + MouseMapping(1, 1, 1, True, KeyAction('mouse_selection', (1,))), ] diff --git a/kitty/options/utils.py b/kitty/options/utils.py index de9c75a2b..9841bbf4f 100644 --- a/kitty/options/utils.py +++ b/kitty/options/utils.py @@ -7,7 +7,8 @@ import os import re import sys from typing import ( - Any, Callable, Dict, Iterable, List, Optional, Sequence, Tuple, Union + Any, Callable, Dict, Iterable, List, NamedTuple, Optional, Sequence, Tuple, + Union ) import kitty.fast_data_types as defines @@ -661,6 +662,20 @@ def macos_option_as_alt(x: str) -> int: return 0 +class TabBarMarginHeight(NamedTuple): + outer: float = 0 + inner: float = 0 + + +def tab_bar_margin_height(x: str) -> TabBarMarginHeight: + parts = x.split(maxsplit=1) + if len(parts) != 2: + log_error(f'Invalid tab_bar_margin_height: {tab_bar_margin_height}, ignoring') + return TabBarMarginHeight() + ans = map(positive_float, parts) + return TabBarMarginHeight(next(ans), next(ans)) + + def clear_all_shortcuts(val: str, dict_with_parse_results: Optional[Dict[str, Any]] = None) -> bool: ans = to_bool(val) if ans and dict_with_parse_results is not None: diff --git a/kitty/state.h b/kitty/state.h index 82b65b69a..919343316 100644 --- a/kitty/state.h +++ b/kitty/state.h @@ -73,6 +73,9 @@ typedef struct { bool detect_urls; bool tab_bar_hidden; double font_size; + struct { + double outer, inner; + } tab_bar_margin_height; } Options; typedef struct {