From ec0edd6f458cced8867641da5c91319163437c0b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 2 Jun 2018 11:27:01 +0530 Subject: [PATCH] A new kitten to draw dock panels on X11 desktops showing the output from running arbitrary terminal programs --- docs/index.rst | 4 ++ docs/kittens/panel.rst | 37 ++++++++++ docs/screenshots/panel.png | Bin 0 -> 12097 bytes kittens/panel/__init__.py | 0 kittens/panel/main.py | 143 +++++++++++++++++++++++++++++++++++++ kittens/runner.py | 2 +- 6 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 docs/kittens/panel.rst create mode 100644 docs/screenshots/panel.png create mode 100644 kittens/panel/__init__.py create mode 100644 kittens/panel/main.py diff --git a/docs/index.rst b/docs/index.rst index c6292e7f7..955a6475c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -239,6 +239,10 @@ Some prominent kittens: filenames, words, lines, etc from the terminal screen. +:doc:`Panel ` + Draw a GPU accelerated dock panel on your desktop showing the output + from an arbitrary terminal program. + .. _sessions: Startup Sessions diff --git a/docs/kittens/panel.rst b/docs/kittens/panel.rst new file mode 100644 index 000000000..4d72e2a12 --- /dev/null +++ b/docs/kittens/panel.rst @@ -0,0 +1,37 @@ +Draw a GPU accelerated dock panel on your desktop +==================================================================================================== + +.. highlight:: sh + + +You can use this kitten to draw a GPU accelerated panel on the edge +of your screen, that shows the output from an arbitrary terminal program. + +It is useful for showing status information or notifications on your desktop +using terminal programs instead of GUI toolkits. + + +.. figure:: ../screenshots/panel.png + :alt: Screenshot, showing a sample panel + :align: center + :scale: 100% + + Screenshot, showing a sample panel + + +The screenshot above shows a sample panel that displays the current desktop and +window title as well as miscellaneous system information such as network +activity, CPU load, date/time, etc. + +.. note:: + + This kitten currently only works on X11 desktops + +Using this kitten is simple, for example:: + + kitty +kitten panel sh -c 'printf "\n\n\nHello, world."; sleep 5s' + +This will show ``Hello, world.`` at the top edge of your screen for five +seconds. Here the terminal program we are running is ``sh`` with a script to +print out ``Hello, world!``. You can make the terminal program as complex as +you like, as demonstrated in the screenshot above. diff --git a/docs/screenshots/panel.png b/docs/screenshots/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..5326f10d0e37e5dae914f0ac95dd304d849feb19 GIT binary patch literal 12097 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 W@+2*%O*g?4k5E=nlh2pE7xI7l{YFOs literal 0 HcmV?d00001 diff --git a/kittens/panel/__init__.py b/kittens/panel/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/kittens/panel/main.py b/kittens/panel/main.py new file mode 100644 index 000000000..b0640b83a --- /dev/null +++ b/kittens/panel/main.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2018, Kovid Goyal + +import subprocess +import sys + +from kitty.constants import is_macos, is_wayland +from kitty.cli import parse_args + + +OPTIONS = r''' +--lines +type=int +default=1 +The number of lines shown in the panel (the height of the panel). Applies to horizontal panels. + + +--columns +type=int +default=20 +The number of columns shown in the panel (the width of the panel). Applies to vertical panels. + + +--edge +choices=top,bottom,left,right +default=top +Which edge of the screen to place the panel on. Note that some window managers +(such as i3) do not support placing docked windows on the left and right edges. + + +--config -c +type=list +Path to config file to use for kitty when drawing the panel. + + +--override -o +type=list +Override individual kitty configuration options, can be specified multiple times. +Syntax: :italic:`name=value`. For example: :option:`kitty +kitten panel -o` font_size=20 +'''.format + + +args = None + + +def parse_panel_args(args): + msg = 'Use a command line program to draw a GPU accelerated panel on your X11 desktop' + return parse_args(args, OPTIONS, 'program-to-run', msg, 'panel') + + +def call_xprop(*cmd, silent=False): + cmd = ['xprop'] + list(cmd) + try: + cp = subprocess.run(cmd, stdout=subprocess.DEVNULL if silent else None) + except FileNotFoundError: + raise SystemExit('You must have the xprop program installed') + if cp.returncode != 0: + raise SystemExit(cp.returncode) + + +def create_strut( + win_id, + left=0, right=0, top=0, bottom=0, left_start_y=0, left_end_y=0, + right_start_y=0, right_end_y=0, top_start_x=0, top_end_x=0, + bottom_start_x=0, bottom_end_x=0 +): + call_xprop( + '-id', + str(int(win_id)), '-format', '_NET_WM_STRUT_PARTIAL', '32cccccccccccc', + '-set', '_NET_WM_STRUT_PARTIAL', + '{left},{right},{top},{bottom},' + '{left_start_y},{left_end_y},{right_start_y},{right_end_y},' + '{top_start_x},{top_end_x},{bottom_start_x},{bottom_end_x}'.format(**locals()) + ) + + +def create_top_strut(win_id, width, height): + create_strut(win_id, top=height, top_end_x=width) + + +def create_bottom_strut(win_id, width, height): + create_strut(win_id, bottom=height, bottom_end_x=width) + + +def create_left_strut(win_id, width, height): + create_strut(win_id, left=width, left_end_y=height) + + +def create_right_strut(win_id, width, height): + create_strut(win_id, right=width, right_end_y=height) + + +def setup_x11_window(win_id): + call_xprop( + '-id', str(win_id), '-format', '_NET_WM_WINDOW_TYPE', '32a', + '-set', '_NET_WM_WINDOW_TYPE', '_NET_WM_WINDOW_TYPE_DOCK' + ) + func = globals()['create_{}_strut'.format(args.edge)] + func(win_id, initial_window_size_func.width, initial_window_size_func.height) + + +def initial_window_size_func(opts, *a): + from kitty.fast_data_types import glfw_primary_monitor_size, set_smallest_allowed_resize + + def initial_window_size(cell_width, cell_height, dpi_x, dpi_y): + monitor_width, monitor_height = glfw_primary_monitor_size() + if args.edge in {'top', 'bottom'}: + h = initial_window_size_func.height = cell_height * args.lines + 1 + initial_window_size_func.width = monitor_width + set_smallest_allowed_resize(100, h) + else: + w = initial_window_size_func.width = cell_width * args.columns + 1 + initial_window_size_func.height = monitor_height + set_smallest_allowed_resize(w, 100) + return initial_window_size_func.width, initial_window_size_func.height + + return initial_window_size + + +def main(sys_args): + global args + if is_macos or is_wayland: + raise SystemExit('Currently the panel kitten is supported only on X11 desktops') + call_xprop('-version', silent=True) # ensure xprop is available + args, items = parse_panel_args(sys_args[1:]) + if not items: + raise SystemExit('You must specify the program to run') + sys.argv = ['kitty'] + if args.config: + sys.argv.append('--config={}'.format(args.config)) + for override in args.override: + sys.argv.append('--override={}'.format(override)) + sys.argv.extend(items) + from kitty.main import run_app, main + run_app.cached_values_name = 'panel' + run_app.first_window_callback = setup_x11_window + run_app.initial_window_size_func = initial_window_size_func + main() + + +if __name__ == '__main__': + main(sys.argv) diff --git a/kittens/runner.py b/kittens/runner.py index f3490692b..e974be4f4 100644 --- a/kittens/runner.py +++ b/kittens/runner.py @@ -12,7 +12,7 @@ aliases = {'url_hints': 'hints'} def resolved_kitten(k): - return aliases.get(k, k) + return aliases.get(k, k).replace('-', '_') def import_kitten_main_module(config_dir, kitten):