A new kitten to draw dock panels on X11 desktops showing the output from running arbitrary terminal programs
This commit is contained in:
parent
0f82f90968
commit
ec0edd6f45
@ -239,6 +239,10 @@ Some prominent kittens:
|
|||||||
filenames, words, lines, etc from the terminal screen.
|
filenames, words, lines, etc from the terminal screen.
|
||||||
|
|
||||||
|
|
||||||
|
:doc:`Panel <kittens/panel>`
|
||||||
|
Draw a GPU accelerated dock panel on your desktop showing the output
|
||||||
|
from an arbitrary terminal program.
|
||||||
|
|
||||||
.. _sessions:
|
.. _sessions:
|
||||||
|
|
||||||
Startup Sessions
|
Startup Sessions
|
||||||
|
|||||||
37
docs/kittens/panel.rst
Normal file
37
docs/kittens/panel.rst
Normal file
@ -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.
|
||||||
BIN
docs/screenshots/panel.png
Normal file
BIN
docs/screenshots/panel.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
0
kittens/panel/__init__.py
Normal file
0
kittens/panel/__init__.py
Normal file
143
kittens/panel/main.py
Normal file
143
kittens/panel/main.py
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# vim:fileencoding=utf-8
|
||||||
|
# License: GPL v3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>
|
||||||
|
|
||||||
|
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)
|
||||||
@ -12,7 +12,7 @@ aliases = {'url_hints': 'hints'}
|
|||||||
|
|
||||||
|
|
||||||
def resolved_kitten(k):
|
def resolved_kitten(k):
|
||||||
return aliases.get(k, k)
|
return aliases.get(k, k).replace('-', '_')
|
||||||
|
|
||||||
|
|
||||||
def import_kitten_main_module(config_dir, kitten):
|
def import_kitten_main_module(config_dir, kitten):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user