Get query terminal working again

Also return current OS Window's font size
This commit is contained in:
Kovid Goyal 2024-05-07 19:02:59 +05:30
parent 8844ae3a10
commit d826265fd7
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
7 changed files with 55 additions and 34 deletions

View file

@ -50,7 +50,7 @@ class Query:
return self.ans
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
raise NotImplementedError()
@ -69,7 +69,7 @@ class TerminalName(Query):
help_text: str = f'Terminal name (e.g. :code:`{names[0]}`)'
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
return appname
@ -79,7 +79,7 @@ class TerminalVersion(Query):
help_text: str = f'Terminal version (e.g. :code:`{str_version}`)'
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
return str_version
@ -89,7 +89,7 @@ class AllowHyperlinks(Query):
help_text: str = 'The config option :opt:`allow_hyperlinks` in :file:`kitty.conf` for allowing hyperlinks can be :code:`yes`, :code:`no` or :code:`ask`'
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
return 'ask' if opts.allow_hyperlinks == 0b11 else ('yes' if opts.allow_hyperlinks else 'no')
@ -99,10 +99,10 @@ class FontFamily(Query):
help_text: str = 'The current font\'s PostScript name'
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
from kitty.fast_data_types import current_fonts
cf = current_fonts()
return str(cf['medium'].display_name())
cf = current_fonts(os_window_id)
return cf['medium'].postscript_name()
@query
@ -111,10 +111,10 @@ class BoldFont(Query):
help_text: str = 'The current bold font\'s PostScript name'
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
from kitty.fast_data_types import current_fonts
cf = current_fonts()
return str(cf['bold'].display_name())
cf = current_fonts(os_window_id)
return cf['bold'].postscript_name()
@query
@ -123,10 +123,10 @@ class ItalicFont(Query):
help_text: str = 'The current italic font\'s PostScript name'
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
from kitty.fast_data_types import current_fonts
cf = current_fonts()
return str(cf['italic'].display_name())
cf = current_fonts(os_window_id)
return cf['italic'].postscript_name()
@query
@ -135,20 +135,22 @@ class BiFont(Query):
help_text: str = 'The current bold-italic font\'s PostScript name'
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
from kitty.fast_data_types import current_fonts
cf = current_fonts()
return str(cf['bi'].display_name())
cf = current_fonts(os_window_id)
return cf['bi'].postscript_name()
@query
class FontSize(Query):
name: str = 'font_size'
help_text: str = 'The current overall font size (individual windows can have different per window font sizes)'
help_text: str = 'The current font size in pts'
@staticmethod
def get_result(opts: Options) -> str:
return f'{opts.font_size:g}'
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
from kitty.fast_data_types import current_fonts
cf = current_fonts(os_window_id)
return f'{cf['font_sz_in_pts']:g}'
@query
@ -157,16 +159,16 @@ class ClipboardControl(Query):
help_text: str = 'The config option :opt:`clipboard_control` in :file:`kitty.conf` for allowing reads/writes to/from the clipboard'
@staticmethod
def get_result(opts: Options) -> str:
def get_result(opts: Options, window_id: int, os_window_id: int) -> str:
return ' '.join(opts.clipboard_control)
def get_result(name: str) -> Optional[str]:
def get_result(name: str, window_id: int, os_window_id: int) -> Optional[str]:
from kitty.fast_data_types import get_options
q = all_queries.get(name)
if q is None:
return None
return q.get_result(get_options())
return q.get_result(get_options(), window_id, os_window_id)
def do_queries(queries: Iterable[str], cli_opts: QueryTerminalCLIOptions) -> Dict[str, str]:

View file

@ -849,8 +849,15 @@ display_name(CTFace *self) {
return convert_cfstring(dn, true);
}
static PyObject*
postscript_name(CTFace *self) {
return self->postscript_name ? Py_BuildValue("O", self->postscript_name) : PyUnicode_FromString("");
}
static PyMethodDef methods[] = {
METHODB(display_name, METH_NOARGS),
METHODB(postscript_name, METH_NOARGS),
METHODB(get_variable_data, METH_NOARGS),
METHODB(identify_for_debug, METH_NOARGS),
METHODB(get_best_name, METH_O),
@ -894,7 +901,6 @@ static PyMemberDef members[] = {
MEM(family_name, T_OBJECT),
MEM(path, T_OBJECT),
MEM(full_name, T_OBJECT),
MEM(postscript_name, T_OBJECT),
{NULL} /* Sentinel */
};

View file

@ -425,7 +425,7 @@ class Face:
def __init__(self, descriptor: Optional[FontConfigPattern] = None, path: str = '', index: int = 0): ...
def get_variable_data(self) -> VariableData: ...
def identify_for_debug(self) -> str: ...
def display_name(self) -> str: ...
def postscript_name(self) -> str: ...
class CoreTextFont(TypedDict):
@ -456,7 +456,7 @@ class CTFace:
def __init__(self, descriptor: Optional[CoreTextFont] = None, path: str = ''): ...
def get_variable_data(self) -> VariableData: ...
def identify_for_debug(self) -> str: ...
def display_name(self) -> str: ...
def postscript_name(self) -> str: ...
def coretext_all_fonts(monospaced_only: bool) -> Tuple[CoreTextFont, ...]:
@ -922,9 +922,12 @@ class CurrentFonts(TypedDict):
bi: FontFace
symbol: Tuple[FontFace, ...]
fallback: Tuple[FontFace, ...]
font_sz_in_pts: float
logical_dpi_x: float
logical_dpi_y: float
def current_fonts() -> CurrentFonts: ...
def current_fonts(os_window_id: int = 0) -> CurrentFonts: ...
def remove_window(os_window_id: int, tab_id: int, window_id: int) -> None:

View file

@ -1633,11 +1633,18 @@ concat_cells(PyObject UNUSED *self, PyObject *args) {
}
static PyObject*
current_fonts(PYNOARG) {
current_fonts(PyObject *self UNUSED, PyObject *args) {
unsigned long long os_window_id = 0;
if (!PyArg_ParseTuple(args, "|K", &os_window_id)) return NULL;
if (!num_font_groups) { PyErr_SetString(PyExc_RuntimeError, "must create font group first"); return NULL; }
FontGroup *fg = font_groups;
if (os_window_id) {
OSWindow *os_window = os_window_for_id(os_window_id);
if (!os_window) { PyErr_SetString(PyExc_KeyError, "no oswindow with the specified id exists"); return NULL; }
fg = (FontGroup*)os_window->fonts_data;
}
RAII_PyObject(ans, PyDict_New());
if (!ans) return NULL;
FontGroup *fg = font_groups;
#define SET(key, val) {if (PyDict_SetItemString(ans, #key, fg->fonts[val].face) != 0) { return NULL; }}
SET(medium, fg->medium_font_idx);
if (fg->bold_font_idx > 0) SET(bold, fg->bold_font_idx);
@ -1658,6 +1665,9 @@ current_fonts(PYNOARG) {
PyTuple_SET_ITEM(ff, i, fg->fonts[fg->first_fallback_font_idx + i].face);
}
if (PyDict_SetItemString(ans, "fallback", ff) != 0) return NULL;
#define p(x) { RAII_PyObject(t, PyFloat_FromDouble(fg->x)); if (!t) return NULL; if (PyDict_SetItemString(ans, #x, t) != 0) return NULL; }
p(font_sz_in_pts); p(logical_dpi_x); p(logical_dpi_y);
#undef p
Py_INCREF(ans);
return ans;
#undef SET
@ -1725,7 +1735,7 @@ static PyMethodDef module_methods[] = {
METHODB(concat_cells, METH_VARARGS),
METHODB(set_send_sprite_to_gpu, METH_O),
METHODB(test_shape, METH_VARARGS),
METHODB(current_fonts, METH_NOARGS),
METHODB(current_fonts, METH_VARARGS),
METHODB(test_render_line, METH_VARARGS),
METHODB(get_fallback_font, METH_VARARGS),
{NULL, NULL, 0, NULL} /* Sentinel */

View file

@ -497,8 +497,8 @@ def test_render_string(
cell_width, cell_height, cells = render_string(text, family, size, dpi)
rgb_data = concat_cells(cell_width, cell_height, True, tuple(cells))
cf = current_fonts()
fonts = [cf['medium'].display_name()]
fonts.extend(f.display_name() for f in cf['fallback'])
fonts = [cf['medium'].postscript_name()]
fonts.extend(f.postscript_name() for f in cf['fallback'])
msg = 'Rendered string {} below, with fonts: {}\n'.format(text, ', '.join(fonts))
try:
print(msg)

View file

@ -517,7 +517,7 @@ def key_as_bytes(name: str) -> bytes:
return ans.encode('ascii')
def get_capabilities(query_string: str, opts: 'Options') -> Generator[str, None, None]:
def get_capabilities(query_string: str, opts: 'Options', window_id: int, os_window_id: int) -> Generator[str, None, None]:
from .fast_data_types import ERROR_PREFIX
def result(encoded_query_name: str, x: Optional[str] = None) -> str:
@ -533,7 +533,7 @@ def get_capabilities(query_string: str, opts: 'Options') -> Generator[str, None,
elif name.startswith('kitty-query-'):
from kittens.query_terminal.main import get_result
name = name[len('kitty-query-'):]
rval = get_result(name)
rval = get_result(name, window_id, os_window_id)
if rval is None:
from .utils import log_error
log_error('Unknown kitty terminfo query:', name)

View file

@ -1273,7 +1273,7 @@ class Window:
self.refresh()
def request_capabilities(self, q: str) -> None:
for result in get_capabilities(q, get_options()):
for result in get_capabilities(q, get_options(), self.id, self.os_window_id):
self.screen.send_escape_code_to_child(ESC_DCS, result)
def handle_remote_cmd(self, cmd: memoryview) -> None: