mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-13 12:09:10 +02:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
715645e69c | ||
|
|
4e697abb34 | ||
|
|
96b0c463e8 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -28,4 +28,3 @@ terminfo/x/* linguist-generated=true
|
||||
*.py text diff=python
|
||||
*.m text diff=objc
|
||||
*.go text diff=go
|
||||
*.mod filter=goreplace
|
||||
|
||||
@@ -302,9 +302,9 @@
|
||||
"name": "wayland",
|
||||
"os": "linux",
|
||||
"unix": {
|
||||
"filename": "wayland-1.23.1.tar.xz",
|
||||
"hash": "sha256:864fb2a8399e2d0ec39d56e9d9b753c093775beadc6022ce81f441929a81e5ed",
|
||||
"urls": ["https://gitlab.freedesktop.org/wayland/wayland/-/releases/1.23.1/downloads/{filename}"]
|
||||
"filename": "wayland-1.23.0.tar.xz",
|
||||
"hash": "sha256:05b3e1574d3e67626b5974f862f36b5b427c7ceeb965cb36a4e6c2d342e45ab2",
|
||||
"urls": ["https://gitlab.freedesktop.org/wayland/wayland/-/releases/1.23.0/downloads/{filename}"]
|
||||
}
|
||||
},
|
||||
|
||||
@@ -312,9 +312,9 @@
|
||||
"name": "wayland-protocols",
|
||||
"os": "linux",
|
||||
"unix": {
|
||||
"filename": "wayland-protocols-1.44.tar.xz",
|
||||
"hash": "sha256:3df1107ecf8bfd6ee878aeca5d3b7afd81248a48031e14caf6ae01f14eebb50e",
|
||||
"urls": ["https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.44/downloads/{filename}"]
|
||||
"filename": "wayland-protocols-1.41.tar.xz",
|
||||
"hash": "sha256:2786b6b1b79965e313f2c289c12075b9ed700d41844810c51afda10ee329576b",
|
||||
"urls": ["https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.41/downloads/{filename}"]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,34 +106,6 @@ consumption to do the same tasks.
|
||||
Detailed list of changes
|
||||
-------------------------------------
|
||||
|
||||
0.42.2 [future]
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Fix :opt:`remember_window_position` not working because of a stupid typo (:iss:`8646`)
|
||||
|
||||
- A new :option:`kitty --grab-keyboard` that can be used to grab the keyboard so that global shortcuts are sent to kitty instead
|
||||
|
||||
0.42.1 [2025-05-17]
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Fix ambiguous width and private use characters not being rendered when used with variable width text-sizing protocol escape codes
|
||||
|
||||
- Quick access terminal: Restore focus to previously active window when hiding the quick access terminal window on macOS (:iss:`8627`)
|
||||
|
||||
- Wayland: Fix an abort if the terminal program sets a window title longer than 2KB that contains CSI escape sequences and multibyte UTF-8 (:iss:`8619`)
|
||||
|
||||
- Quick access terminal: Allow toggling the window to full screen using the standard kitty :sc:`toggle_fullscreen` shortcut (:iss:`8626`)
|
||||
|
||||
- Quick access terminal: Allow configuring the monitor to display the panel on in Wayland/X11 (:iss:`8630`)
|
||||
|
||||
- A new setting :opt:`remember_window_position` to optionally use the position of the last closed kitty OS Window as the position of the first kitty OS Window when running a new kitty instance (:pull:`8601`)
|
||||
|
||||
- Panel kitten: A new ``center-sized`` value for :option:`--edge <kitty +kitten panel --edge>` to allow easily creating sized and centered panels
|
||||
|
||||
- Wayland: The `kitty --name` flag now sets the XDG *window tag* on compositors
|
||||
that support the `xdg-toplevel-tag <https://wayland.app/protocols/xdg-toplevel-tag-v1>`__ protocol.
|
||||
|
||||
|
||||
0.42.0 [2025-05-11]
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
@@ -395,7 +395,7 @@ Key Value
|
||||
``c`` ``c=1`` if the terminal supports close events, otherwise the ``c``
|
||||
must be omitted.
|
||||
|
||||
``o`` Comma separated list of occasions from the ``o`` key that the
|
||||
``o`` Comma separated list of occassions from the ``o`` key that the
|
||||
terminal implements. If no occasions are supported, the value
|
||||
``o=always`` must be sent in the query response.
|
||||
|
||||
@@ -405,7 +405,7 @@ Key Value
|
||||
|
||||
``s`` Comma separated list of sound names from the table of standard sound names above.
|
||||
Terminals will report the list of standard sound names they support.
|
||||
Terminals *should* support at least ``system`` and ``silent``.
|
||||
Terminals *should* support atleast ``system`` and ``silent``.
|
||||
|
||||
``u`` Comma separated list of urgency values that the terminal implements.
|
||||
If urgency is not supported, the ``u`` key must be absent from the
|
||||
@@ -450,10 +450,10 @@ Key Value Default Description
|
||||
encoded UTF-8
|
||||
application name
|
||||
|
||||
``g`` :ref:`identifier` ``unset`` Identifier for icon data. Make these globally unique,
|
||||
``g`` :ref:`identifier` ``unset`` Identifier for icon data. Make these globally unqiue,
|
||||
like an UUID.
|
||||
|
||||
``i`` :ref:`identifier` ``unset`` Identifier for the notification. Make these globally unique,
|
||||
``i`` :ref:`identifier` ``unset`` Identifier for the notification. Make these globally unqiue,
|
||||
like an UUID, so that terminal multiplexers can
|
||||
direct responses to the correct window. Note that for backwards
|
||||
compatibility reasons i=0 is special and should not be used.
|
||||
|
||||
@@ -354,7 +354,7 @@ are the :kbd:`Enter`, :kbd:`Tab` and :kbd:`Backspace` keys which still generate
|
||||
bytes as in legacy mode this is to allow the user to type and execute commands
|
||||
in the shell such as ``reset`` after a program that sets this mode crashes
|
||||
without clearing it. Note that the Lock modifiers are not reported for text
|
||||
producing keys, to keep them usable in legacy programs. To get lock modifiers
|
||||
producing keys, to keep them useable in legacy programs. To get lock modifiers
|
||||
for all keys use the :ref:`report_all_keys` enhancement.
|
||||
|
||||
.. _report_events:
|
||||
|
||||
@@ -118,7 +118,7 @@ that is, they are used to set the variable value for some font characteristic.
|
||||
<https://harfbuzz.github.io/harfbuzz-hb-common.html#hb-feature-from-string>`__
|
||||
|
||||
``system``
|
||||
This can be used to pass an arbitrary string, usually a family or full name
|
||||
This can be used to pass an arbitrary string, usuall a family or full name
|
||||
to the OS font selection APIs. Should not be used in conjunction with any
|
||||
other keys. Is the same as specifying just the font name without any keys.
|
||||
|
||||
|
||||
@@ -114,12 +114,11 @@ shell.
|
||||
|
||||
The Linux dock panel was::
|
||||
|
||||
wm bar
|
||||
kitten panel kitty +launch my-panel.py
|
||||
|
||||
This is a custom program I wrote for my personal use. It uses kitty's kitten
|
||||
infrastructure to implement the bar in a `few hundred lines of code
|
||||
<https://github.com/kovidgoyal/wm/blob/master/bar/main.go>`__.
|
||||
This was designed for my personal use only, but, there are :ref:`public projects implementing
|
||||
This creates the panel window and runs the ``my-panel.py`` script inside it
|
||||
using the Python interpreter that comes bundled with kitty. Unfortunately the
|
||||
actual script is not public, but there are :ref:`public projects implementing
|
||||
general purpose panels using kitty <panel_projects>`.
|
||||
|
||||
|
||||
@@ -148,8 +147,7 @@ Compatibility with various platforms
|
||||
Fully working, no known issues
|
||||
|
||||
🟢 **KDE** (kwin)
|
||||
Fully working, no known issues. KDE uses an `undocumented mapping <https://invent.kde.org/plasma/kwin/-/blob/3dc5cee6b34792486b343098e55e7f2b90dfcd00/src/layershellv1window.cpp#L24>`__ under Wayland to set the window type from the :code:`kitten panel --app-id` flag. You might want to use :code:`--app-id=dock` so that KDE treats the window as a dock panel, and disables window
|
||||
appearing/disappearing animations for it.
|
||||
Fully working, no known issues
|
||||
|
||||
🟠 **Sway**
|
||||
Partially working. Issues include:
|
||||
@@ -162,8 +160,8 @@ Compatibility with various platforms
|
||||
🟠 **niri**
|
||||
Breaks when hiding (unmapping) layer shell windows. This means the quick
|
||||
access terminal is non-functional, but background and dock panels work.
|
||||
More technically, when trying to remap the hidden window niri never sends
|
||||
configure events for the remapped surface.
|
||||
More technically, keyboard focus gets stuck in the hidden window and when trying
|
||||
to remap the hidden window niri never sends configure events for the remapped surface.
|
||||
|
||||
🟠 **labwc**
|
||||
Breaks when hiding (unmapping) layer shell windows. This means the quick
|
||||
|
||||
@@ -310,7 +310,7 @@ below::
|
||||
|
||||
# Beep on unknown keys
|
||||
map --new-mode XXX --on-unknown beep ...
|
||||
# Ignore unknown keys silently
|
||||
# Ingore unknown keys silently
|
||||
map --new-mode XXX --on-unknown ignore ...
|
||||
# Beep and exit the keyboard mode on unknown key
|
||||
map --new-mode XXX --on-unknown end ...
|
||||
|
||||
@@ -101,7 +101,7 @@ ASCII only text.
|
||||
|
||||
foot, iterm2 and Terminal.app are left out as they do not run under X11.
|
||||
Alacritty+tmux is included just to show the effect of putting a terminal
|
||||
multiplexer into the mix (halving throughput) and because alacritty isn't
|
||||
multiplexer into the mix (halving throughput) and because alacritty isnt
|
||||
remotely comparable to any of the other terminals feature wise without tmux.
|
||||
|
||||
.. note::
|
||||
|
||||
@@ -255,17 +255,17 @@ Detecting if the terminal supports this protocol
|
||||
-----------------------------------------------------
|
||||
|
||||
To detect support for this protocol use the `CPR (Cursor Position Report)
|
||||
<https://vt100.net/docs/vt510-rm/CPR.html>`__ escape code. Send a ``CR``
|
||||
(carriage return) followed by ``CPR`` followed by ``\e]_text_size_code;w=2; \a``
|
||||
which will draw a space character in two cells, followed by another ``CPR``.
|
||||
Then send ``\e]_text_size_code;s=2; \a`` which will draw a space in a ``2 by 2``
|
||||
block of cells, followed by another ``CPR``.
|
||||
<https://vt100.net/docs/vt510-rm/CPR.html>`__ escape code. Send a ``CPR``
|
||||
followed by ``\e]_text_size_code;w=2; \a`` which will draw a space character in
|
||||
two cells, followed by another ``CPR``. Then send ``\e]_text_size_code;s=2; \a``
|
||||
which will draw a space in a ``2 by 2`` block of cells, followed by another
|
||||
``CPR``.
|
||||
|
||||
Then wait for the three responses from the terminal to the three CPR queries.
|
||||
If the cursor position in the three responses is the same, the terminal does
|
||||
not support this protocol at all, if the second response has the cursor
|
||||
moved by two cells, then the width part is supported and if the third response has the
|
||||
cursor moved by another two cells, then the scale part is supported.
|
||||
not support this protocol at all, if the second response has a different cursor
|
||||
position then the width part is supported and if the third response has yet
|
||||
another position, the scale part is supported.
|
||||
|
||||
|
||||
Interaction with other terminal controls
|
||||
|
||||
@@ -259,9 +259,9 @@ def completion_for_launch_wrappers(*names: str) -> None:
|
||||
|
||||
def generate_completions_for_kitty() -> None:
|
||||
print('package completion\n')
|
||||
print('import "github.com/kovidgoyal/kitty/tools/cli"')
|
||||
print('import "github.com/kovidgoyal/kitty/tools/cmd/tool"')
|
||||
print('import "github.com/kovidgoyal/kitty/tools/cmd/at"')
|
||||
print('import "kitty/tools/cli"')
|
||||
print('import "kitty/tools/cmd/tool"')
|
||||
print('import "kitty/tools/cmd/at"')
|
||||
|
||||
print('func kitty(root *cli.Command) {')
|
||||
|
||||
@@ -458,7 +458,7 @@ def generate_conf_parser(kitten: str, defn: Definition) -> None:
|
||||
|
||||
|
||||
def generate_extra_cli_parser(name: str, spec: str) -> None:
|
||||
print('import "github.com/kovidgoyal/kitty/tools/cli"')
|
||||
print('import "kitty/tools/cli"')
|
||||
go_opts = tuple(go_options_for_seq(parse_option_spec(spec)[0]))
|
||||
print(f'type {name}_options struct ''{')
|
||||
for opt in go_opts:
|
||||
@@ -508,7 +508,7 @@ def kitten_clis() -> None:
|
||||
has_underscore = '_' in kitten
|
||||
print(f'package {kitten}')
|
||||
print('import "fmt"')
|
||||
print('import "github.com/kovidgoyal/kitty/tools/cli"')
|
||||
print('import "kitty/tools/cli"')
|
||||
print('var _ = fmt.Sprintf')
|
||||
print('func create_cmd(root *cli.Command, run_func func(*cli.Command, *Options, []string)(int, error)) {')
|
||||
print('ans := root.AddSubCommand(&cli.Command{')
|
||||
@@ -723,7 +723,7 @@ def update_at_commands() -> None:
|
||||
odef = '\n'.join(opt_def)
|
||||
code = f'''
|
||||
package at
|
||||
import "github.com/kovidgoyal/kitty/tools/cli"
|
||||
import "kitty/tools/cli"
|
||||
type rc_global_options struct {{
|
||||
{sdef}
|
||||
}}
|
||||
@@ -751,7 +751,7 @@ def update_completion() -> None:
|
||||
|
||||
with replace_if_needed('tools/cmd/edit_in_kitty/launch_generated.go'):
|
||||
print('package edit_in_kitty')
|
||||
print('import "github.com/kovidgoyal/kitty/tools/cli"')
|
||||
print('import "kitty/tools/cli"')
|
||||
print('func AddCloneSafeOpts(cmd *cli.Command) {')
|
||||
completion_for_launch_wrappers('cmd')
|
||||
print(''.join(CompletionSpec.from_string('type:file mime:text/* group:"Text files"').as_go_code('cmd.ArgCompleter', ' = ')))
|
||||
|
||||
@@ -828,7 +828,7 @@ int _glfwPlatformInit(bool *supports_window_occlusion)
|
||||
{
|
||||
debug_key("---------------- key down -------------------\n");
|
||||
debug_key("%s\n", [[event description] UTF8String]);
|
||||
if (!_glfw.ignoreOSKeyboardProcessing && !_glfw.keyboard_grabbed) {
|
||||
if (!_glfw.ignoreOSKeyboardProcessing) {
|
||||
// first check if there is a global menu bar shortcut
|
||||
if ([[NSApp mainMenu] performKeyEquivalent:event]) {
|
||||
debug_key("keyDown triggered global menu bar action ignoring\n");
|
||||
@@ -1144,4 +1144,3 @@ void _glfwPlatformUpdateTimer(unsigned long long timer_id, monotonic_t interval,
|
||||
}
|
||||
|
||||
void _glfwPlatformInputColorScheme(GLFWColorScheme appearance UNUSED) { }
|
||||
bool _glfwPlatformGrabKeyboard(bool grab UNUSED) { return true; /* directly uses _glfw.keyboard_grabbed */ }
|
||||
|
||||
1
glfw/cocoa_platform.h
vendored
1
glfw/cocoa_platform.h
vendored
@@ -125,7 +125,6 @@ typedef struct _GLFWwindowNS
|
||||
id delegate;
|
||||
id view;
|
||||
id layer;
|
||||
pid_t previous_front_most_application;
|
||||
|
||||
bool maximized;
|
||||
bool retina;
|
||||
|
||||
@@ -1940,22 +1940,6 @@ screen_for_window_center(_GLFWwindow *window) {
|
||||
return NSScreen.mainScreen;
|
||||
}
|
||||
|
||||
const GLFWLayerShellConfig*
|
||||
_glfwPlatformGetLayerShellConfig(_GLFWwindow *window) {
|
||||
return &window->ns.layer_shell.config;
|
||||
}
|
||||
|
||||
static NSScreen*
|
||||
screen_for_name(const char *name) {
|
||||
int count = 0;
|
||||
GLFWmonitor **monitors = glfwGetMonitors(&count);
|
||||
for (int i = 0; i < count; i++) {
|
||||
const char *q = glfwGetMonitorName(monitors[i]);
|
||||
if (q && strcmp(q, name) == 0) return ((_GLFWmonitor*)monitors[i])->ns.screen;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool
|
||||
_glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig *value) {
|
||||
#define config window->ns.layer_shell.config
|
||||
@@ -1986,10 +1970,6 @@ _glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig
|
||||
// HACK: Changing the style mask can cause the first responder to be cleared
|
||||
[nswindow makeFirstResponder:window->ns.view];
|
||||
NSScreen *screen = screen_for_window_center(window);
|
||||
if (config.output_name[0]) {
|
||||
NSScreen *q = screen_for_name(config.output_name);
|
||||
if (q) screen = q;
|
||||
}
|
||||
unsigned cell_width, cell_height; double left_edge_spacing, top_edge_spacing, right_edge_spacing, bottom_edge_spacing;
|
||||
float xscale = (float)config.expected.xscale, yscale = (float)config.expected.yscale;
|
||||
_glfwPlatformGetWindowContentScale(window, &xscale, &yscale);
|
||||
@@ -2031,11 +2011,6 @@ _glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig
|
||||
x += width - panel_width + 1.;
|
||||
width = panel_width;
|
||||
break;
|
||||
case GLFW_EDGE_CENTER_SIZED:
|
||||
x += (width - panel_width) / 2;
|
||||
y += (height - panel_height) / 2;
|
||||
width = panel_width; height = panel_height;
|
||||
break;
|
||||
default: // top left
|
||||
y += height - panel_height + 1.;
|
||||
height = panel_height; width = panel_width;
|
||||
@@ -2045,10 +2020,8 @@ _glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig
|
||||
if (height < 1.) height = NSWidth(screen.visibleFrame);
|
||||
}
|
||||
|
||||
if (config.edge != GLFW_EDGE_CENTER_SIZED) {
|
||||
x += config.requested_left_margin; width -= config.requested_left_margin + config.requested_right_margin;
|
||||
y += config.requested_bottom_margin; height -= config.requested_top_margin + config.requested_bottom_margin;
|
||||
}
|
||||
x += config.requested_left_margin; width -= config.requested_left_margin + config.requested_right_margin;
|
||||
y += config.requested_bottom_margin; height -= config.requested_top_margin + config.requested_bottom_margin;
|
||||
|
||||
[nswindow setAnimationBehavior:animation_behavior];
|
||||
[nswindow setLevel:level];
|
||||
@@ -2228,39 +2201,14 @@ void _glfwPlatformMaximizeWindow(_GLFWwindow* window)
|
||||
|
||||
void _glfwPlatformShowWindow(_GLFWwindow* window)
|
||||
{
|
||||
NSRunningApplication *app = [[NSWorkspace sharedWorkspace] frontmostApplication];
|
||||
window->ns.previous_front_most_application = 0;
|
||||
if (app && app.processIdentifier != getpid()) window->ns.previous_front_most_application = app.processIdentifier;
|
||||
if (window->ns.layer_shell.is_active && window->ns.layer_shell.config.type == GLFW_LAYER_SHELL_BACKGROUND) {
|
||||
[window->ns.object orderBack:nil];
|
||||
} else [window->ns.object orderFront:nil];
|
||||
debug("Previously active application pid: %d bundle identifier: %s\n",
|
||||
window->ns.previous_front_most_application, app ? app.bundleIdentifier.UTF8String : "");
|
||||
}
|
||||
|
||||
void _glfwPlatformHideWindow(_GLFWwindow* window)
|
||||
{
|
||||
[window->ns.object orderOut:nil];
|
||||
pid_t prev_app_pid = window->ns.previous_front_most_application; window->ns.previous_front_most_application = 0;
|
||||
NSRunningApplication *app;
|
||||
if (window->ns.layer_shell.is_active && prev_app_pid > 0 && (app = [NSRunningApplication runningApplicationWithProcessIdentifier:prev_app_pid])) {
|
||||
unsigned num_visible = 0;
|
||||
for (_GLFWwindow *w = _glfw.windowListHead; w; w = w->next) {
|
||||
if (_glfwPlatformWindowVisible(w)) num_visible++;
|
||||
}
|
||||
if (!num_visible) {
|
||||
// yieldActivationToApplication was introduced in macOS 14 (Sonoma)
|
||||
SEL selector = NSSelectorFromString(@"yieldActivationToApplication:");
|
||||
if ([NSApp respondsToSelector:selector]) {
|
||||
[NSApp performSelector:selector withObject:app];
|
||||
[app activateWithOptions:0];
|
||||
} else {
|
||||
#define NSApplicationActivateIgnoringOtherApps 2
|
||||
[app activateWithOptions:NSApplicationActivateIgnoringOtherApps];
|
||||
#undef NSApplicationActivateIgnoringOtherApps
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _glfwPlatformRequestWindowAttention(_GLFWwindow* window UNUSED)
|
||||
|
||||
@@ -325,6 +325,7 @@ def generate_wrappers(glfw_header: str) -> None:
|
||||
void glfwWaylandRedrawCSDWindowTitle(GLFWwindow *handle)
|
||||
bool glfwWaylandIsWindowFullyCreated(GLFWwindow *handle)
|
||||
bool glfwWaylandBeep(GLFWwindow *handle)
|
||||
GLFWLayerShellConfig* glfwWaylandLayerShellConfig(GLFWwindow *handle)
|
||||
pid_t glfwWaylandCompositorPID(void)
|
||||
unsigned long long glfwDBusUserNotify(const GLFWDBUSNotificationData *n, GLFWDBusnotificationcreatedfun callback, void *data)
|
||||
void glfwDBusSetUserNotificationHandler(GLFWDBusnotificationactivatedfun handler)
|
||||
|
||||
13
glfw/glfw3.h
vendored
13
glfw/glfw3.h
vendored
@@ -1056,7 +1056,6 @@ typedef enum {
|
||||
|
||||
#define GLFW_WAYLAND_APP_ID 0x00025001
|
||||
#define GLFW_WAYLAND_BGCOLOR 0x00025002
|
||||
#define GLFW_WAYLAND_WINDOW_TAG 0x00025003
|
||||
/*! @} */
|
||||
|
||||
#define GLFW_NO_API 0
|
||||
@@ -1303,19 +1302,14 @@ typedef struct GLFWkeyevent
|
||||
|
||||
typedef enum { GLFW_LAYER_SHELL_NONE, GLFW_LAYER_SHELL_BACKGROUND, GLFW_LAYER_SHELL_PANEL, GLFW_LAYER_SHELL_TOP, GLFW_LAYER_SHELL_OVERLAY } GLFWLayerShellType;
|
||||
|
||||
typedef enum { GLFW_EDGE_TOP, GLFW_EDGE_BOTTOM, GLFW_EDGE_LEFT, GLFW_EDGE_RIGHT, GLFW_EDGE_CENTER, GLFW_EDGE_NONE, GLFW_EDGE_CENTER_SIZED } GLFWEdge;
|
||||
typedef enum { GLFW_EDGE_TOP, GLFW_EDGE_BOTTOM, GLFW_EDGE_LEFT, GLFW_EDGE_RIGHT, GLFW_EDGE_CENTER, GLFW_EDGE_NONE } GLFWEdge;
|
||||
|
||||
typedef enum { GLFW_FOCUS_NOT_ALLOWED, GLFW_FOCUS_EXCLUSIVE, GLFW_FOCUS_ON_DEMAND} GLFWFocusPolicy;
|
||||
|
||||
typedef struct GLFWLayerShellConfig {
|
||||
GLFWLayerShellType type;
|
||||
GLFWEdge edge;
|
||||
struct {
|
||||
GLFWEdge edge;
|
||||
int requested_top_margin, requested_left_margin, requested_bottom_margin, requested_right_margin;
|
||||
} previous;
|
||||
bool was_toggled_to_fullscreen;
|
||||
char output_name[128];
|
||||
char output_name[64];
|
||||
GLFWFocusPolicy focus_policy;
|
||||
unsigned x_size_in_cells, x_size_in_pixels;
|
||||
unsigned y_size_in_cells, y_size_in_pixels;
|
||||
@@ -2386,7 +2380,6 @@ GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, flo
|
||||
* @ingroup monitor
|
||||
*/
|
||||
GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor);
|
||||
GLFWAPI const char* glfwGetMonitorDescription(GLFWmonitor* monitor);
|
||||
|
||||
/*! @brief Sets the user pointer of the specified monitor.
|
||||
*
|
||||
@@ -2881,7 +2874,6 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, G
|
||||
GLFWAPI bool glfwToggleFullscreen(GLFWwindow *window, unsigned int flags);
|
||||
GLFWAPI bool glfwIsFullscreen(GLFWwindow *window, unsigned int flags);
|
||||
GLFWAPI bool glfwAreSwapsAllowed(const GLFWwindow* window);
|
||||
GLFWAPI const GLFWLayerShellConfig* glfwGetLayerShellConfig(GLFWwindow* handle);
|
||||
GLFWAPI bool glfwSetLayerShellConfig(GLFWwindow* handle, const GLFWLayerShellConfig *value);
|
||||
|
||||
/*! @brief Destroys the specified window and its context.
|
||||
@@ -4247,7 +4239,6 @@ GLFWAPI void glfwPostEmptyEvent(void);
|
||||
|
||||
GLFWAPI bool glfwGetIgnoreOSKeyboardProcessing(void);
|
||||
GLFWAPI void glfwSetIgnoreOSKeyboardProcessing(bool enabled);
|
||||
GLFWAPI bool glfwGrabKeyboard(int grab);
|
||||
|
||||
/*! @brief Returns the value of an input option for the specified window.
|
||||
*
|
||||
|
||||
7
glfw/input.c
vendored
7
glfw/input.c
vendored
@@ -684,13 +684,6 @@ GLFWAPI void glfwSetIgnoreOSKeyboardProcessing(bool enabled) {
|
||||
_glfw.ignoreOSKeyboardProcessing = enabled;
|
||||
}
|
||||
|
||||
GLFWAPI bool glfwGrabKeyboard(int grab) {
|
||||
if (grab == 0 || grab == 1) {
|
||||
if (_glfwPlatformGrabKeyboard(grab)) _glfw.keyboard_grabbed = grab;
|
||||
}
|
||||
return _glfw.keyboard_grabbed;
|
||||
}
|
||||
|
||||
GLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode)
|
||||
{
|
||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||
|
||||
8
glfw/internal.h
vendored
8
glfw/internal.h
vendored
@@ -331,7 +331,7 @@ struct _GLFWwndconfig
|
||||
char instanceName[256];
|
||||
} x11;
|
||||
struct {
|
||||
char appId[256], windowTag[256];
|
||||
char appId[256];
|
||||
uint32_t bgcolor;
|
||||
} wl;
|
||||
};
|
||||
@@ -490,7 +490,7 @@ struct _GLFWwindow
|
||||
//
|
||||
struct _GLFWmonitor
|
||||
{
|
||||
const char *name, *description;
|
||||
char* name;
|
||||
void* userPointer;
|
||||
|
||||
// Physical dimensions in millimeters.
|
||||
@@ -616,7 +616,7 @@ struct _GLFWlibrary
|
||||
_GLFWtls contextSlot;
|
||||
_GLFWmutex errorLock;
|
||||
|
||||
bool ignoreOSKeyboardProcessing, keyboard_grabbed;
|
||||
bool ignoreOSKeyboardProcessing;
|
||||
|
||||
struct {
|
||||
bool available;
|
||||
@@ -719,7 +719,6 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title);
|
||||
void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
|
||||
int count, const GLFWimage* images);
|
||||
bool _glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig *value);
|
||||
const GLFWLayerShellConfig* _glfwPlatformGetLayerShellConfig(_GLFWwindow* window);
|
||||
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos);
|
||||
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos);
|
||||
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height);
|
||||
@@ -884,7 +883,6 @@ void _glfwPlatformUpdateTimer(unsigned long long timer_id, monotonic_t interval,
|
||||
void _glfwPlatformRemoveTimer(unsigned long long timer_id);
|
||||
int _glfwPlatformSetWindowBlur(_GLFWwindow* handle, int value);
|
||||
MonitorGeometry _glfwPlatformGetMonitorGeometry(_GLFWmonitor* monitor);
|
||||
bool _glfwPlatformGrabKeyboard(bool grab);
|
||||
|
||||
char* _glfw_strdup(const char* source);
|
||||
|
||||
|
||||
15
glfw/monitor.c
vendored
15
glfw/monitor.c
vendored
@@ -186,8 +186,7 @@ void _glfwFreeMonitor(_GLFWmonitor* monitor)
|
||||
_glfwFreeGammaArrays(&monitor->currentRamp);
|
||||
|
||||
free(monitor->modes);
|
||||
free((void*)monitor->name);
|
||||
free((void*)monitor->description);
|
||||
free(monitor->name);
|
||||
free(monitor);
|
||||
}
|
||||
|
||||
@@ -394,19 +393,9 @@ GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* handle)
|
||||
assert(monitor != NULL);
|
||||
|
||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||
return monitor->name ? monitor->name : "";
|
||||
return monitor->name;
|
||||
}
|
||||
|
||||
GLFWAPI const char* glfwGetMonitorDescription(GLFWmonitor* handle)
|
||||
{
|
||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||
assert(monitor != NULL);
|
||||
|
||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||
return monitor->description ? monitor->description : "";
|
||||
}
|
||||
|
||||
|
||||
GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* handle, void* pointer)
|
||||
{
|
||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||
|
||||
@@ -84,10 +84,8 @@
|
||||
"staging/fractional-scale/fractional-scale-v1.xml",
|
||||
"staging/single-pixel-buffer/single-pixel-buffer-v1.xml",
|
||||
"unstable/idle-inhibit/idle-inhibit-unstable-v1.xml",
|
||||
"unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml",
|
||||
"staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml",
|
||||
"staging/xdg-system-bell/xdg-system-bell-v1.xml",
|
||||
"staging/xdg-toplevel-tag/xdg-toplevel-tag-v1.xml",
|
||||
|
||||
"kwin-blur-v1.xml",
|
||||
"wlr-layer-shell-unstable-v1.xml"
|
||||
|
||||
13
glfw/window.c
vendored
13
glfw/window.c
vendored
@@ -495,10 +495,6 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value)
|
||||
strncpy(_glfw.hints.window.wl.appId, value,
|
||||
sizeof(_glfw.hints.window.wl.appId) - 1);
|
||||
return;
|
||||
case GLFW_WAYLAND_WINDOW_TAG:
|
||||
strncpy(_glfw.hints.window.wl.windowTag, value,
|
||||
sizeof(_glfw.hints.window.wl.windowTag) - 1);
|
||||
return;
|
||||
}
|
||||
|
||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid window hint string 0x%08X", hint);
|
||||
@@ -555,15 +551,6 @@ GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* handle, int value)
|
||||
window->shouldClose = value;
|
||||
}
|
||||
|
||||
GLFWAPI const GLFWLayerShellConfig* glfwGetLayerShellConfig(GLFWwindow* handle) {
|
||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||
assert(window != NULL);
|
||||
|
||||
_GLFW_REQUIRE_INIT_OR_RETURN(false);
|
||||
return _glfwPlatformGetLayerShellConfig(window);
|
||||
}
|
||||
|
||||
|
||||
GLFWAPI bool glfwSetLayerShellConfig(GLFWwindow* handle, const GLFWLayerShellConfig *value) {
|
||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||
assert(window != NULL);
|
||||
|
||||
10
glfw/wl_init.c
vendored
10
glfw/wl_init.c
vendored
@@ -600,16 +600,11 @@ static void registryHandleGlobal(void* data UNUSED,
|
||||
else if (is(zwp_idle_inhibit_manager_v1)) {
|
||||
_glfw.wl.idle_inhibit_manager = wl_registry_bind(registry, name, &zwp_idle_inhibit_manager_v1_interface, 1);
|
||||
}
|
||||
else if (is(zwp_keyboard_shortcuts_inhibit_manager_v1)) {
|
||||
_glfw.wl.keyboard_shortcuts_inhibit_manager = wl_registry_bind(registry, name, &zwp_keyboard_shortcuts_inhibit_manager_v1_interface, 1);
|
||||
}
|
||||
else if (is(xdg_toplevel_icon_manager_v1)) {
|
||||
_glfw.wl.xdg_toplevel_icon_manager_v1 = wl_registry_bind(registry, name, &xdg_toplevel_icon_manager_v1_interface, 1);
|
||||
}
|
||||
else if (is(xdg_system_bell_v1)) {
|
||||
_glfw.wl.xdg_system_bell_v1 = wl_registry_bind(registry, name, &xdg_system_bell_v1_interface, 1);
|
||||
} else if (is(xdg_toplevel_tag_manager_v1)) {
|
||||
_glfw.wl.xdg_toplevel_tag_manager_v1 = wl_registry_bind(registry, name, &xdg_toplevel_tag_manager_v1_interface, 1);
|
||||
}
|
||||
#undef is
|
||||
}
|
||||
@@ -721,7 +716,6 @@ get_compositor_missing_capabilities(void) {
|
||||
C(cursor_shape, wp_cursor_shape_manager_v1); C(layer_shell, zwlr_layer_shell_v1);
|
||||
C(single_pixel_buffer, wp_single_pixel_buffer_manager_v1); C(preferred_scale, has_preferred_buffer_scale);
|
||||
C(idle_inhibit, idle_inhibit_manager); C(icon, xdg_toplevel_icon_manager_v1); C(bell, xdg_system_bell_v1);
|
||||
C(window-tag, xdg_toplevel_tag_manager_v1); C(keyboard_shortcuts_inhibit, keyboard_shortcuts_inhibit_manager);
|
||||
if (_glfw.wl.xdg_wm_base_version < 6) p += snprintf(p, sizeof(buf) - (p - buf), "%s ", "window-state-suspended");
|
||||
if (_glfw.wl.xdg_wm_base_version < 5) p += snprintf(p, sizeof(buf) - (p - buf), "%s ", "window-capabilities");
|
||||
#undef C
|
||||
@@ -900,8 +894,6 @@ void _glfwPlatformTerminate(void)
|
||||
xdg_toplevel_icon_manager_v1_destroy(_glfw.wl.xdg_toplevel_icon_manager_v1);
|
||||
if (_glfw.wl.xdg_system_bell_v1)
|
||||
xdg_system_bell_v1_destroy(_glfw.wl.xdg_system_bell_v1);
|
||||
if (_glfw.wl.xdg_toplevel_tag_manager_v1)
|
||||
xdg_toplevel_tag_manager_v1_destroy(_glfw.wl.xdg_toplevel_tag_manager_v1);
|
||||
if (_glfw.wl.wp_single_pixel_buffer_manager_v1)
|
||||
wp_single_pixel_buffer_manager_v1_destroy(_glfw.wl.wp_single_pixel_buffer_manager_v1);
|
||||
if (_glfw.wl.wp_cursor_shape_manager_v1)
|
||||
@@ -916,8 +908,6 @@ void _glfwPlatformTerminate(void)
|
||||
zwlr_layer_shell_v1_destroy(_glfw.wl.zwlr_layer_shell_v1);
|
||||
if (_glfw.wl.idle_inhibit_manager)
|
||||
zwp_idle_inhibit_manager_v1_destroy(_glfw.wl.idle_inhibit_manager);
|
||||
if (_glfw.wl.keyboard_shortcuts_inhibit_manager)
|
||||
zwp_keyboard_shortcuts_inhibit_manager_v1_destroy(_glfw.wl.keyboard_shortcuts_inhibit_manager);
|
||||
|
||||
if (_glfw.wl.registry)
|
||||
wl_registry_destroy(_glfw.wl.registry);
|
||||
|
||||
24
glfw/wl_monitor.c
vendored
24
glfw/wl_monitor.c
vendored
@@ -41,15 +41,20 @@ static void outputHandleGeometry(void* data,
|
||||
int32_t physicalWidth,
|
||||
int32_t physicalHeight,
|
||||
int32_t subpixel UNUSED,
|
||||
const char* make UNUSED,
|
||||
const char* model UNUSED,
|
||||
const char* make,
|
||||
const char* model,
|
||||
int32_t transform UNUSED)
|
||||
{
|
||||
struct _GLFWmonitor *monitor = data;
|
||||
char name[1024];
|
||||
|
||||
monitor->wl.x = x;
|
||||
monitor->wl.y = y;
|
||||
monitor->widthMM = physicalWidth;
|
||||
monitor->heightMM = physicalHeight;
|
||||
|
||||
snprintf(name, sizeof(name), "%s %s", make, model);
|
||||
monitor->name = _glfw_strdup(name);
|
||||
}
|
||||
|
||||
static void outputHandleMode(void* data,
|
||||
@@ -100,20 +105,15 @@ static void outputHandleName(void* data,
|
||||
struct wl_output* output UNUSED,
|
||||
const char* name) {
|
||||
struct _GLFWmonitor *monitor = data;
|
||||
if (name) {
|
||||
if (monitor->name) free((void*)monitor->name);
|
||||
monitor->name = _glfw_strdup(name);
|
||||
}
|
||||
if (name) strncpy(monitor->wl.friendly_name, name, sizeof(monitor->wl.friendly_name)-1);
|
||||
}
|
||||
|
||||
static void outputHandleDescription(void* data,
|
||||
struct wl_output* output UNUSED,
|
||||
const char* description) {
|
||||
struct _GLFWmonitor *monitor = data;
|
||||
if (description) {
|
||||
if (monitor->description) free((void*)monitor->description);
|
||||
monitor->description = _glfw_strdup(description);
|
||||
}
|
||||
if (description) strncpy(monitor->wl.description, description, sizeof(monitor->wl.description)-1);
|
||||
|
||||
}
|
||||
|
||||
static const struct wl_output_listener outputListener = {
|
||||
@@ -142,8 +142,8 @@ void _glfwAddOutputWayland(uint32_t name, uint32_t version)
|
||||
return;
|
||||
}
|
||||
|
||||
// The actual name of this output will be set in the handlers.
|
||||
monitor = _glfwAllocMonitor("unnamed", 0, 0);
|
||||
// The actual name of this output will be set in the geometry handler.
|
||||
monitor = _glfwAllocMonitor(NULL, 0, 0);
|
||||
|
||||
output = wl_registry_bind(_glfw.wl.registry,
|
||||
name,
|
||||
|
||||
8
glfw/wl_platform.h
vendored
8
glfw/wl_platform.h
vendored
@@ -66,10 +66,8 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR
|
||||
#include "wayland-wlr-layer-shell-unstable-v1-client-protocol.h"
|
||||
#include "wayland-single-pixel-buffer-v1-client-protocol.h"
|
||||
#include "wayland-idle-inhibit-unstable-v1-client-protocol.h"
|
||||
#include "wayland-keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h"
|
||||
#include "wayland-xdg-toplevel-icon-v1-client-protocol.h"
|
||||
#include "wayland-xdg-system-bell-v1-client-protocol.h"
|
||||
#include "wayland-xdg-toplevel-tag-v1-client-protocol.h"
|
||||
|
||||
#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
|
||||
#define _glfw_dlclose(handle) dlclose(handle)
|
||||
@@ -212,7 +210,7 @@ typedef struct _GLFWwindowWayland
|
||||
double cursorPosX, cursorPosY, allCursorPosX, allCursorPosY;
|
||||
|
||||
char* title;
|
||||
char appId[256], windowTag[256];
|
||||
char appId[256];
|
||||
|
||||
// We need to track the monitors the window spans on to calculate the
|
||||
// optimal scaling factor.
|
||||
@@ -291,7 +289,6 @@ typedef struct _GLFWwindowWayland
|
||||
WaylandWindowState toplevel_states;
|
||||
uint32_t decoration_mode;
|
||||
} current, pending;
|
||||
struct zwp_keyboard_shortcuts_inhibitor_v1 *keyboard_shortcuts_inhibitor;
|
||||
} _GLFWwindowWayland;
|
||||
|
||||
typedef enum _GLFWWaylandOfferType
|
||||
@@ -343,7 +340,6 @@ typedef struct _GLFWlibraryWayland
|
||||
struct xdg_activation_v1* xdg_activation_v1;
|
||||
struct xdg_toplevel_icon_manager_v1* xdg_toplevel_icon_manager_v1;
|
||||
struct xdg_system_bell_v1* xdg_system_bell_v1;
|
||||
struct xdg_toplevel_tag_manager_v1* xdg_toplevel_tag_manager_v1;
|
||||
struct wp_cursor_shape_manager_v1* wp_cursor_shape_manager_v1;
|
||||
struct wp_cursor_shape_device_v1* wp_cursor_shape_device_v1;
|
||||
struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager_v1;
|
||||
@@ -352,7 +348,6 @@ typedef struct _GLFWlibraryWayland
|
||||
struct zwlr_layer_shell_v1* zwlr_layer_shell_v1; uint32_t zwlr_layer_shell_v1_version;
|
||||
struct wp_single_pixel_buffer_manager_v1 *wp_single_pixel_buffer_manager_v1;
|
||||
struct zwp_idle_inhibit_manager_v1* idle_inhibit_manager;
|
||||
struct zwp_keyboard_shortcuts_inhibit_manager_v1 *keyboard_shortcuts_inhibit_manager;
|
||||
|
||||
int compositorVersion;
|
||||
int seatVersion;
|
||||
@@ -411,6 +406,7 @@ typedef struct _GLFWmonitorWayland
|
||||
{
|
||||
struct wl_output* output;
|
||||
uint32_t name;
|
||||
char friendly_name[64], description[64];
|
||||
int currentMode;
|
||||
|
||||
int x;
|
||||
|
||||
45
glfw/wl_window.c
vendored
45
glfw/wl_window.c
vendored
@@ -46,18 +46,6 @@
|
||||
static bool
|
||||
is_layer_shell(_GLFWwindow *window) { return window->wl.layer_shell.config.type != GLFW_LAYER_SHELL_NONE; }
|
||||
|
||||
static void
|
||||
inhibit_shortcuts_for(_GLFWwindow *window, bool inhibit) {
|
||||
if (inhibit) {
|
||||
if (window->wl.keyboard_shortcuts_inhibitor) return;
|
||||
window->wl.keyboard_shortcuts_inhibitor = zwp_keyboard_shortcuts_inhibit_manager_v1_inhibit_shortcuts(_glfw.wl.keyboard_shortcuts_inhibit_manager, window->wl.surface, _glfw.wl.seat);
|
||||
} else {
|
||||
if (!window->wl.keyboard_shortcuts_inhibitor) return;
|
||||
zwp_keyboard_shortcuts_inhibitor_v1_destroy(window->wl.keyboard_shortcuts_inhibitor);
|
||||
window->wl.keyboard_shortcuts_inhibitor = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
activation_token_done(void *data, struct xdg_activation_token_v1 *xdg_token, const char *token) {
|
||||
for (size_t i = 0; i < _glfw.wl.activation_requests.sz; i++) {
|
||||
@@ -628,7 +616,6 @@ static bool createSurface(_GLFWwindow* window,
|
||||
update_regions(window);
|
||||
|
||||
wl_surface_set_buffer_scale(window->wl.surface, scale);
|
||||
if (_glfw.keyboard_grabbed) inhibit_shortcuts_for(window, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -984,7 +971,7 @@ find_output_by_name(const char* name) {
|
||||
if (!name || !name[0]) return NULL;
|
||||
for (int i = 0; i < _glfw.monitorCount; i++) {
|
||||
_GLFWmonitor *m = _glfw.monitors[i];
|
||||
if (strcmp(m->name, name) == 0) return m->wl.output;
|
||||
if (strcmp(m->wl.friendly_name, name) == 0) return m->wl.output;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -1041,13 +1028,12 @@ layer_set_properties(const _GLFWwindow *window, bool during_creation, uint32_t w
|
||||
if (!config.override_exclusive_zone) exclusive_zone = width;
|
||||
break;
|
||||
case GLFW_EDGE_CENTER:
|
||||
break;
|
||||
case GLFW_EDGE_CENTER_SIZED:
|
||||
panel_width = width; panel_height = height;
|
||||
which_anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM;
|
||||
break;
|
||||
case GLFW_EDGE_NONE:
|
||||
which_anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP;
|
||||
panel_width = width; panel_height = height;
|
||||
panel_width = width;
|
||||
panel_height = height;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1157,7 +1143,7 @@ create_layer_shell_surface(_GLFWwindow *window) {
|
||||
struct wl_output *wl_output = find_output_by_name(window->wl.layer_shell.config.output_name);
|
||||
#define ls window->wl.layer_shell.zwlr_layer_surface_v1
|
||||
ls = zwlr_layer_shell_v1_get_layer_surface(
|
||||
_glfw.wl.zwlr_layer_shell_v1, window->wl.surface, wl_output, get_layer_shell_layer(window), window->wl.appId[0] ? window->wl.appId : "kitty");
|
||||
_glfw.wl.zwlr_layer_shell_v1, window->wl.surface, wl_output, get_layer_shell_layer(window), "kitty");
|
||||
if (!ls) {
|
||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: layer-surface creation failed");
|
||||
return false;
|
||||
@@ -1211,10 +1197,8 @@ create_window_desktop_surface(_GLFWwindow* window)
|
||||
zxdg_toplevel_decoration_v1_add_listener(window->wl.xdg.decoration, &xdgDecorationListener, window);
|
||||
}
|
||||
|
||||
if (window->wl.appId[0])
|
||||
if (strlen(window->wl.appId))
|
||||
xdg_toplevel_set_app_id(window->wl.xdg.toplevel, window->wl.appId);
|
||||
if (window->wl.windowTag[0] && _glfw.wl.xdg_toplevel_tag_manager_v1)
|
||||
xdg_toplevel_tag_manager_v1_set_toplevel_tag(_glfw.wl.xdg_toplevel_tag_manager_v1, window->wl.xdg.toplevel, window->wl.windowTag);
|
||||
|
||||
if (window->wl.title)
|
||||
xdg_toplevel_set_title(window->wl.xdg.toplevel, window->wl.title);
|
||||
@@ -1482,8 +1466,6 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
||||
if (window->id == _glfw.wl.keyRepeatInfo.keyboardFocusId) {
|
||||
_glfw.wl.keyRepeatInfo.keyboardFocusId = 0;
|
||||
}
|
||||
if (window->wl.keyboard_shortcuts_inhibitor)
|
||||
zwp_keyboard_shortcuts_inhibitor_v1_destroy(window->wl.keyboard_shortcuts_inhibitor);
|
||||
|
||||
if (window->wl.temp_buffer_used_during_window_creation)
|
||||
wl_buffer_destroy(window->wl.temp_buffer_used_during_window_creation);
|
||||
@@ -2835,16 +2817,6 @@ _glfwPlatformSetWindowBlur(_GLFWwindow *window, int blur_radius) {
|
||||
return has_blur ? 1 : 0;
|
||||
}
|
||||
|
||||
bool
|
||||
_glfwPlatformGrabKeyboard(bool grab) {
|
||||
if (!_glfw.wl.keyboard_shortcuts_inhibit_manager) {
|
||||
_glfwInputError(GLFW_PLATFORM_ERROR, "The Wayland compositor does not implement inhibit-keyboard-shortcuts, cannot grab keyboard");
|
||||
return false;
|
||||
}
|
||||
for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next) inhibit_shortcuts_for(window, grab);
|
||||
return true;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
////// GLFW native API //////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -2920,9 +2892,8 @@ GLFWAPI void glfwWaylandRedrawCSDWindowTitle(GLFWwindow *handle) {
|
||||
if (csd_change_title(window)) commit_window_surface_if_safe(window);
|
||||
}
|
||||
|
||||
const GLFWLayerShellConfig*
|
||||
_glfwPlatformGetLayerShellConfig(_GLFWwindow *window) {
|
||||
return &window->wl.layer_shell.config;
|
||||
GLFWAPI GLFWLayerShellConfig* glfwWaylandLayerShellConfig(GLFWwindow *handle) {
|
||||
return &((_GLFWwindow*)handle)->wl.layer_shell.config;
|
||||
}
|
||||
|
||||
GLFWAPI bool glfwIsLayerShellSupported(void) { return _glfw.wl.zwlr_layer_shell_v1 != NULL; }
|
||||
|
||||
24
glfw/x11_window.c
vendored
24
glfw/x11_window.c
vendored
@@ -606,11 +606,6 @@ calculate_layer_geometry(_GLFWwindow *window) {
|
||||
ans.width = m.width - config.requested_right_margin - config.requested_left_margin;
|
||||
ans.struts[s.bottom] = ans.height; ans.struts[s.bottom_end_x] = ans.width;
|
||||
break;
|
||||
case GLFW_EDGE_CENTER_SIZED:
|
||||
ans.needs_strut = false;
|
||||
ans.x = (m.width - ans.width) / 2;
|
||||
ans.y = (m.height - ans.height) / 2;
|
||||
break;
|
||||
default:
|
||||
ans.needs_strut = false;
|
||||
ans.x = m.x + config.requested_left_margin;
|
||||
@@ -2097,13 +2092,7 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
||||
XFlush(_glfw.x11.display);
|
||||
}
|
||||
|
||||
const GLFWLayerShellConfig*
|
||||
_glfwPlatformGetLayerShellConfig(_GLFWwindow *window) {
|
||||
return &window->x11.layer_shell.config;
|
||||
}
|
||||
|
||||
bool
|
||||
_glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig *value) {
|
||||
bool _glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig *value) {
|
||||
if (value) window->x11.layer_shell.config = *value;
|
||||
WindowGeometry wg = calculate_layer_geometry(window);
|
||||
update_wm_hints(window, &wg, NULL);
|
||||
@@ -3384,17 +3373,6 @@ _glfwPlatformSetWindowBlur(_GLFWwindow *window, int blur_radius) {
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
_glfwPlatformGrabKeyboard(bool grab) {
|
||||
int result;
|
||||
if (grab) {
|
||||
result = XGrabKeyboard(_glfw.x11.display, _glfw.x11.root, True, GrabModeAsync, GrabModeAsync, CurrentTime);
|
||||
} else {
|
||||
result = XUngrabKeyboard(_glfw.x11.display, CurrentTime);
|
||||
}
|
||||
return result == GrabSuccess;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
////// GLFW native API //////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
11
go.mod
11
go.mod
@@ -1,4 +1,4 @@
|
||||
module github.com/kovidgoyal/kitty
|
||||
module kitty
|
||||
|
||||
go 1.23.0
|
||||
|
||||
@@ -6,25 +6,22 @@ toolchain go1.24.1
|
||||
|
||||
require (
|
||||
github.com/ALTree/bigfloat v0.2.0
|
||||
github.com/alecthomas/chroma/v2 v2.18.0
|
||||
github.com/alecthomas/chroma/v2 v2.17.2
|
||||
github.com/bmatcuk/doublestar/v4 v4.8.1
|
||||
github.com/dlclark/regexp2 v1.11.5
|
||||
github.com/edwvee/exiffix v0.0.0-20240229113213-0dbb146775be
|
||||
github.com/google/go-cmp v0.7.0
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/kovidgoyal/dbus v0.0.0-20250519011319-e811c41c0bc1
|
||||
github.com/kovidgoyal/imaging v1.6.4
|
||||
github.com/seancfoley/ipaddress-go v1.7.1
|
||||
github.com/shirou/gopsutil/v3 v3.24.5
|
||||
github.com/zeebo/xxh3 v1.0.2
|
||||
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b
|
||||
golang.org/x/image v0.27.0
|
||||
golang.org/x/sys v0.33.0
|
||||
golang.org/x/image v0.26.0
|
||||
golang.org/x/sys v0.32.0
|
||||
howett.net/plist v1.0.1
|
||||
)
|
||||
|
||||
//replace github.com/kovidgoyal/dbus => ../dbus
|
||||
|
||||
require (
|
||||
github.com/disintegration/imaging v1.6.2 // indirect
|
||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
||||
|
||||
18
go.sum
18
go.sum
@@ -2,8 +2,8 @@ github.com/ALTree/bigfloat v0.2.0 h1:AwNzawrpFuw55/YDVlcPw0F0cmmXrmngBHhVrvdXPvM
|
||||
github.com/ALTree/bigfloat v0.2.0/go.mod h1:+NaH2gLeY6RPBPPQf4aRotPPStg+eXc8f9ZaE4vRfD4=
|
||||
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
|
||||
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||
github.com/alecthomas/chroma/v2 v2.18.0 h1:6h53Q4hW83SuF+jcsp7CVhLsMozzvQvO8HBbKQW+gn4=
|
||||
github.com/alecthomas/chroma/v2 v2.18.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk=
|
||||
github.com/alecthomas/chroma/v2 v2.17.2 h1:Rm81SCZ2mPoH+Q8ZCc/9YvzPUN/E7HgPiPJD8SLV6GI=
|
||||
github.com/alecthomas/chroma/v2 v2.17.2/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk=
|
||||
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
|
||||
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
|
||||
github.com/bmatcuk/doublestar/v4 v4.8.1 h1:54Bopc5c2cAvhLRAzqOGCYHYyhcDHsFF4wWIR5wKP38=
|
||||
@@ -28,12 +28,6 @@ github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSo
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
github.com/kovidgoyal/dbus v0.0.0-20250518162316-472d38549895 h1:CQ+iKunklzE89I7C/AtXXltUhokfDNwL4rlst4AFQ9Q=
|
||||
github.com/kovidgoyal/dbus v0.0.0-20250518162316-472d38549895/go.mod h1:RbNG3Q1g6GUy1/WzWVx+S24m7VKyvl57vV+cr2hpt50=
|
||||
github.com/kovidgoyal/dbus v0.0.0-20250518163929-5e5bfb2bd2f2 h1:txptp4rHsZ8LPdmJSbak3fU08C+SmVqKy+FRBbQhl84=
|
||||
github.com/kovidgoyal/dbus v0.0.0-20250518163929-5e5bfb2bd2f2/go.mod h1:RbNG3Q1g6GUy1/WzWVx+S24m7VKyvl57vV+cr2hpt50=
|
||||
github.com/kovidgoyal/dbus v0.0.0-20250519011319-e811c41c0bc1 h1:rMY/hWfcVzBm6BLX6YLA+gLJEpuXBed/VP6YEkXt8R4=
|
||||
github.com/kovidgoyal/dbus v0.0.0-20250519011319-e811c41c0bc1/go.mod h1:RbNG3Q1g6GUy1/WzWVx+S24m7VKyvl57vV+cr2hpt50=
|
||||
github.com/kovidgoyal/imaging v1.6.4 h1:K0idhRPXnRrJBKnBYcTfI1HTWSNDeAn7hYDvf9I0dCk=
|
||||
github.com/kovidgoyal/imaging v1.6.4/go.mod h1:bEIgsaZmXlvFfkv/CUxr9rJook6AQkJnpB5EPosRfRY=
|
||||
github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik=
|
||||
@@ -69,15 +63,15 @@ github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaD
|
||||
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b h1:r+vk0EmXNmekl0S0BascoeeoHk/L7wmaW2QF90K+kYI=
|
||||
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w=
|
||||
golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g=
|
||||
golang.org/x/image v0.26.0 h1:4XjIFEZWQmCZi6Wv8BoxsDhRU3RVnLX04dToTDAEPlY=
|
||||
golang.org/x/image v0.26.0/go.mod h1:lcxbMFAovzpnJxzXS3nyL83K27tmqtKzIJpctK8YO5c=
|
||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
|
||||
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
|
||||
|
||||
@@ -4,13 +4,13 @@ package ask
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty/tools/cli/markup"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/style"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"io"
|
||||
"kitty/tools/cli/markup"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/style"
|
||||
"kitty/tools/wcswidth"
|
||||
"os"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
@@ -9,9 +9,9 @@ import (
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/readline"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/tui/readline"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -6,9 +6,9 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/cli/markup"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/cli/markup"
|
||||
"kitty/tools/tui"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -9,10 +9,10 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -5,8 +5,8 @@ import (
|
||||
"math"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -2,10 +2,10 @@ package choose_fonts
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/subseq"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/subseq"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -5,9 +5,9 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/config"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -4,9 +4,9 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -5,10 +5,10 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/readline"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/tui/readline"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -5,11 +5,11 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/readline"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/style"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/tui/readline"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/style"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -4,9 +4,9 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui/loop"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -2,7 +2,7 @@ package choose_fonts
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/utils"
|
||||
"slices"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shlex"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/shlex"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -6,10 +6,10 @@ import (
|
||||
"strconv"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -11,9 +11,9 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -5,7 +5,7 @@ package clipboard
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"kitty/tools/cli"
|
||||
)
|
||||
|
||||
func run_mime_loop(opts *Options, args []string) (err error) {
|
||||
|
||||
@@ -14,10 +14,10 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
@@ -201,7 +201,7 @@ func unescape_metadata_value(k, x string) (ans string) {
|
||||
return x
|
||||
}
|
||||
|
||||
func Encode_bytes(metadata map[string]string, payload []byte) string {
|
||||
func encode_bytes(metadata map[string]string, payload []byte) string {
|
||||
ans := strings.Builder{}
|
||||
enc_payload := ""
|
||||
if len(payload) > 0 {
|
||||
@@ -228,7 +228,7 @@ func Encode_bytes(metadata map[string]string, payload []byte) string {
|
||||
}
|
||||
|
||||
func encode(metadata map[string]string, payload string) string {
|
||||
return Encode_bytes(metadata, utils.UnsafeStringToBytes(payload))
|
||||
return encode_bytes(metadata, utils.UnsafeStringToBytes(payload))
|
||||
}
|
||||
|
||||
func error_from_status(status string) error {
|
||||
|
||||
@@ -8,11 +8,10 @@ import (
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
@@ -38,7 +37,12 @@ func (self *Input) has_mime_matching(predicate func(string) bool) bool {
|
||||
if predicate(self.mime_type) {
|
||||
return true
|
||||
}
|
||||
return slices.ContainsFunc(self.extra_mime_types, predicate)
|
||||
for _, i := range self.extra_mime_types {
|
||||
if predicate(i) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func write_loop(inputs []*Input, opts *Options) (err error) {
|
||||
@@ -95,7 +99,7 @@ func write_loop(inputs []*Input, opts *Options) (err error) {
|
||||
i := inputs[0]
|
||||
n, err := i.src.Read(buf[:])
|
||||
if n > 0 {
|
||||
waiting_for_write = lp.QueueWriteString(Encode_bytes(make_metadata("wdata", i.mime_type), buf[:n]))
|
||||
waiting_for_write = lp.QueueWriteString(encode_bytes(make_metadata("wdata", i.mime_type), buf[:n]))
|
||||
}
|
||||
if err != nil {
|
||||
if errors.Is(err, io.EOF) {
|
||||
|
||||
@@ -1,192 +0,0 @@
|
||||
package desktop_ui
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/kovidgoyal/dbus"
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
type Options struct {
|
||||
Color_scheme, AccentColor, Contrast string
|
||||
}
|
||||
|
||||
func run_server(opts *Options) (err error) {
|
||||
portal, err := NewPortal(opts)
|
||||
if err == nil {
|
||||
err = portal.Start()
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
c := make(chan string)
|
||||
<-c
|
||||
return
|
||||
}
|
||||
|
||||
func EntryPoint(root *cli.Command) {
|
||||
parent := root.AddSubCommand(&cli.Command{
|
||||
Name: "desktop-ui",
|
||||
ShortDescription: "Implement various desktop components for use with lightweight compositors/window managers on Linux",
|
||||
Run: func(cmd *cli.Command, args []string) (int, error) {
|
||||
cmd.ShowHelp()
|
||||
return 1, nil
|
||||
},
|
||||
})
|
||||
rs := parent.AddSubCommand(&cli.Command{
|
||||
Name: "run-server",
|
||||
ShortDescription: "Start the various servers used to integrate with the Linux desktop",
|
||||
HelpText: "This should be run very early in the startup sequence of your window manager, before any other programs are run.",
|
||||
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
|
||||
opts := Options{}
|
||||
err = cmd.GetOptionValues(&opts)
|
||||
if err == nil {
|
||||
err = run_server(&opts)
|
||||
}
|
||||
return utils.IfElse(err == nil, 0, 1), err
|
||||
},
|
||||
})
|
||||
rs.Add(cli.OptionSpec{
|
||||
Name: `--color-scheme`, Type: "choices", Dest: `Color_scheme`, Choices: "no-preference, light, dark",
|
||||
Completer: cli.NamesCompleter("Choices for color-scheme", "no-preference", "light", "dark"),
|
||||
Help: "The color scheme for your system. This sets the initial value of the color scheme. It can be changed subsequently by using the color-scheme sub-command.",
|
||||
})
|
||||
rs.Add(cli.OptionSpec{
|
||||
Name: `--accent-color`,
|
||||
Help: "The RGB accent color for your system, can be specified as a color name or in hex a decimal format.",
|
||||
Default: "cyan",
|
||||
})
|
||||
rs.Add(cli.OptionSpec{
|
||||
Name: `--contrast`, Type: "choices", Choices: "normal, high",
|
||||
Help: "The preferred contrast level. Choices: normal, high",
|
||||
Default: "normal",
|
||||
})
|
||||
|
||||
parent.AddSubCommand(&cli.Command{
|
||||
Name: "enable-portal",
|
||||
ShortDescription: "This will create or edit the various files needed so that the portal from this kitten is used by xdg-desktop-portal",
|
||||
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
|
||||
err = enable_portal()
|
||||
return utils.IfElse(err == nil, 0, 1), err
|
||||
},
|
||||
})
|
||||
parent.AddSubCommand(&cli.Command{
|
||||
Name: "set-color-scheme",
|
||||
ShortDescription: "Change the color scheme",
|
||||
ArgCompleter: cli.NamesCompleter("Choices for color-scheme", "no-preference", "light", "dark", "toggle"),
|
||||
Usage: " light|dark|no-preference|toggle",
|
||||
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
|
||||
if len(args) != 1 {
|
||||
cmd.ShowHelp()
|
||||
return 1, fmt.Errorf("must specify the new color scheme value")
|
||||
}
|
||||
err = set_color_scheme(args[0])
|
||||
return utils.IfElse(err == nil, 0, 1), err
|
||||
},
|
||||
})
|
||||
parent.AddSubCommand(&cli.Command{
|
||||
Name: "set-accent-color",
|
||||
ShortDescription: "Change the accent color",
|
||||
Usage: " color_as_hex_or_name",
|
||||
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
|
||||
if len(args) != 1 {
|
||||
cmd.ShowHelp()
|
||||
return 1, fmt.Errorf("must specify the new accent color value")
|
||||
}
|
||||
var v dbus.Variant
|
||||
if v, err = to_color(args[0]); err == nil {
|
||||
err = set_variant_setting(PORTAL_APPEARANCE_NAMESPACE, PORTAL_ACCENT_COLOR_KEY, v, false)
|
||||
}
|
||||
return utils.IfElse(err == nil, 0, 1), err
|
||||
},
|
||||
})
|
||||
parent.AddSubCommand(&cli.Command{
|
||||
Name: "set-contrast",
|
||||
ShortDescription: "Change the contrast. Can be high or normal.",
|
||||
Usage: " high|normal",
|
||||
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
|
||||
if len(args) != 1 {
|
||||
cmd.ShowHelp()
|
||||
return 1, fmt.Errorf("must specify the new contrast value")
|
||||
}
|
||||
|
||||
var v dbus.Variant
|
||||
switch args[0] {
|
||||
case "normal":
|
||||
v = dbus.MakeVariant(uint32(0))
|
||||
case "high":
|
||||
v = dbus.MakeVariant(uint32(1))
|
||||
default:
|
||||
return 1, fmt.Errorf("%s is not a valid contrast value", args[0])
|
||||
}
|
||||
err = set_variant_setting(PORTAL_APPEARANCE_NAMESPACE, PORTAL_CONTRAST_KEY, v, false)
|
||||
return utils.IfElse(err == nil, 0, 1), err
|
||||
},
|
||||
})
|
||||
st := parent.AddSubCommand(&cli.Command{
|
||||
Name: "set-setting",
|
||||
ShortDescription: "Change an arbitrary setting",
|
||||
Usage: " key [value]",
|
||||
HelpText: "Set an arbitrary setting. If you want to set the color-scheme use the dedicated command for it. Use this command with care as it does no validation for the type of value. The syntax for specifying values is described at: :link:`the glib docs <https://docs.gtk.org/glib/gvariant-text-format.html>`. Leaving out the value or specifying an empty value, will delete the setting.",
|
||||
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
|
||||
val := ""
|
||||
if len(args) < 1 {
|
||||
cmd.ShowHelp()
|
||||
return 1, fmt.Errorf("must specify the key")
|
||||
}
|
||||
if len(args) > 1 {
|
||||
val = args[1]
|
||||
}
|
||||
opts := SetOptions{}
|
||||
if err = cmd.GetOptionValues(&opts); err == nil {
|
||||
err = set_setting(args[0], val, &opts)
|
||||
}
|
||||
return utils.IfElse(err == nil, 0, 1), err
|
||||
},
|
||||
})
|
||||
st.Add(cli.OptionSpec{
|
||||
Name: "--namespace -n",
|
||||
Help: "The namespace in which to change the setting.",
|
||||
Default: PORTAL_APPEARANCE_NAMESPACE,
|
||||
})
|
||||
st.Add(cli.OptionSpec{
|
||||
Name: "--data-type",
|
||||
Help: "The DBUS data type signature of the value. The default is to guess from the textual representation, see :link:`the glib docs <https://docs.gtk.org/glib/gvariant-text-format.html>` for details.",
|
||||
})
|
||||
|
||||
ss := parent.AddSubCommand(&cli.Command{
|
||||
Name: "show-settings",
|
||||
ShortDescription: "Print the current values of the desktop settings",
|
||||
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
|
||||
if len(args) != 0 {
|
||||
cmd.ShowHelp()
|
||||
return 1, fmt.Errorf("no arguments allowed")
|
||||
}
|
||||
opts := ShowSettingsOptions{}
|
||||
err = cmd.GetOptionValues(&opts)
|
||||
if err == nil {
|
||||
err = show_settings(&opts)
|
||||
}
|
||||
return utils.IfElse(err == nil, 0, 1), err
|
||||
},
|
||||
})
|
||||
ss.Add(cli.OptionSpec{
|
||||
Name: "--as-json",
|
||||
Help: "Show the settings as JSON for machine consumption",
|
||||
Type: "bool-set",
|
||||
})
|
||||
ss.Add(cli.OptionSpec{
|
||||
Name: "--in-namespace",
|
||||
Help: "Show only settings in the specified names. Can be specified multiple times. When unspecified all namespaces are returned.",
|
||||
Type: "list",
|
||||
})
|
||||
ss.Add(cli.OptionSpec{
|
||||
Name: "--allow-other-backends",
|
||||
Help: "Normally, after printing the settings, if the settings did not come from the desktop-ui kitten the command prints an error and exits. This prevents that.",
|
||||
Type: "bool-set",
|
||||
})
|
||||
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# License: GPLv3 Copyright: 2025, Kovid Goyal <kovid at kovidgoyal.net>
|
||||
|
||||
|
||||
@@ -1,601 +0,0 @@
|
||||
package desktop_ui
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"maps"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/dbus"
|
||||
"github.com/kovidgoyal/dbus/introspect"
|
||||
"github.com/kovidgoyal/dbus/prop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/style"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
const PORTAL_APPEARANCE_NAMESPACE = "org.freedesktop.appearance"
|
||||
const PORTAL_COLOR_SCHEME_KEY = "color-scheme"
|
||||
const PORTAL_ACCENT_COLOR_KEY = "accent-color"
|
||||
const PORTAL_CONTRAST_KEY = "contrast"
|
||||
const PORTAL_BUS_NAME = "org.freedesktop.impl.portal.desktop.kitty"
|
||||
const SETTINGS_OBJECT_PATH = "/org/freedesktop/portal/desktop"
|
||||
const SETTINGS_INTERFACE = "org.freedesktop.impl.portal.Settings"
|
||||
const CHANGE_SETTINGS_OBJECT_PATH = "/net/kovidgoyal/kitty/portal"
|
||||
const CHANGE_SETTINGS_INTERFACE = "net.kovidgoyal.kitty.settings"
|
||||
const DESKTOP_PORTAL_NAME = "org.freedesktop.portal.Desktop"
|
||||
|
||||
// Special portal setting used to check if we are being called by xdg-desktop-portal
|
||||
const SETTINGS_CANARY_NAMESPACE = "net.kovidgoyal.kitty"
|
||||
const SETTINGS_CANARY_KEY = "status"
|
||||
|
||||
type ColorScheme uint32
|
||||
|
||||
const (
|
||||
NO_PREFERENCE ColorScheme = iota
|
||||
DARK
|
||||
LIGHT
|
||||
)
|
||||
|
||||
type SettingsMap map[string]map[string]dbus.Variant
|
||||
|
||||
type Portal struct {
|
||||
bus *dbus.Conn
|
||||
settings SettingsMap
|
||||
lock sync.Mutex
|
||||
}
|
||||
|
||||
func to_color(spec string) (v dbus.Variant, err error) {
|
||||
if col, err := style.ParseColor(spec); err == nil {
|
||||
return dbus.MakeVariant([]float64{float64(col.Red) / 255., float64(col.Green) / 255., float64(col.Blue) / 255.}), nil
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func NewPortal(opts *Options) (p *Portal, err error) {
|
||||
ans := Portal{}
|
||||
ans.settings = SettingsMap{
|
||||
SETTINGS_CANARY_NAMESPACE: map[string]dbus.Variant{
|
||||
SETTINGS_CANARY_KEY: dbus.MakeVariant("running"),
|
||||
},
|
||||
}
|
||||
ans.settings[PORTAL_APPEARANCE_NAMESPACE] = map[string]dbus.Variant{}
|
||||
switch opts.Color_scheme {
|
||||
case "dark":
|
||||
ans.settings[PORTAL_APPEARANCE_NAMESPACE][PORTAL_COLOR_SCHEME_KEY] = dbus.MakeVariant(uint32(DARK))
|
||||
case "light":
|
||||
ans.settings[PORTAL_APPEARANCE_NAMESPACE][PORTAL_COLOR_SCHEME_KEY] = dbus.MakeVariant(uint32(LIGHT))
|
||||
default:
|
||||
ans.settings[PORTAL_APPEARANCE_NAMESPACE][PORTAL_COLOR_SCHEME_KEY] = dbus.MakeVariant(uint32(NO_PREFERENCE))
|
||||
}
|
||||
ans.settings[PORTAL_APPEARANCE_NAMESPACE][PORTAL_ACCENT_COLOR_KEY], err = to_color(opts.AccentColor)
|
||||
var contrast uint32
|
||||
if opts.Contrast == "high" {
|
||||
contrast = 1
|
||||
}
|
||||
ans.settings[PORTAL_APPEARANCE_NAMESPACE][PORTAL_CONTRAST_KEY] = dbus.MakeVariant(contrast)
|
||||
return &ans, nil
|
||||
}
|
||||
|
||||
type PropSpec map[string]*prop.Prop
|
||||
type SignalSpec map[string][]struct {
|
||||
Name, Type string
|
||||
}
|
||||
type MethodSpec map[string][]struct {
|
||||
Name, Type string
|
||||
Out bool
|
||||
}
|
||||
|
||||
func ExportInterface(conn *dbus.Conn, object any, interface_name, object_path string, method_spec MethodSpec, prop_spec PropSpec, signal_spec SignalSpec) (err error) {
|
||||
op := dbus.ObjectPath(object_path)
|
||||
method_map := make(map[string]string, len(method_spec))
|
||||
methods := []introspect.Method{}
|
||||
if len(method_spec) > 0 {
|
||||
for method_name, args := range method_spec {
|
||||
method_map[method_name] = method_name
|
||||
meth_args := make([]introspect.Arg, len(args))
|
||||
for i, a := range args {
|
||||
meth_args[i] = introspect.Arg{
|
||||
Name: a.Name,
|
||||
Type: a.Type,
|
||||
Direction: utils.IfElse(a.Out, "out", "in"),
|
||||
}
|
||||
}
|
||||
methods = append(methods, introspect.Method{
|
||||
Name: method_name,
|
||||
Args: meth_args,
|
||||
})
|
||||
}
|
||||
}
|
||||
if err = conn.ExportWithMap(object, method_map, op, interface_name); err != nil {
|
||||
return fmt.Errorf("failed to export interface: %s at object path: %s with error: %w", interface_name, object_path, err)
|
||||
}
|
||||
var properties []introspect.Property
|
||||
p := prop.Map{interface_name: prop_spec}
|
||||
if len(prop_spec) > 0 {
|
||||
if props, err := prop.Export(conn, op, p); err != nil {
|
||||
return fmt.Errorf("failed to export properties with error: %w", err)
|
||||
} else {
|
||||
properties = props.Introspection(interface_name)
|
||||
}
|
||||
}
|
||||
var signals []introspect.Signal
|
||||
if len(signal_spec) > 0 {
|
||||
for signal_name, args := range signal_spec {
|
||||
sig_args := make([]introspect.Arg, len(args))
|
||||
for i, a := range args {
|
||||
sig_args[i] = introspect.Arg{
|
||||
Name: a.Name,
|
||||
Type: a.Type,
|
||||
Direction: "out",
|
||||
}
|
||||
}
|
||||
signals = append(signals, introspect.Signal{
|
||||
Name: signal_name,
|
||||
Args: sig_args,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
interface_data := introspect.Interface{
|
||||
Name: interface_name,
|
||||
Methods: methods,
|
||||
Properties: properties,
|
||||
Signals: signals,
|
||||
}
|
||||
interfaces := []introspect.Interface{
|
||||
introspect.IntrospectData, interface_data,
|
||||
}
|
||||
if len(properties) > 0 {
|
||||
interfaces = append(interfaces, prop.IntrospectData)
|
||||
}
|
||||
n := &introspect.Node{Name: object_path, Interfaces: interfaces}
|
||||
if err = conn.Export(introspect.NewIntrospectable(n), op, introspect.IntrospectData.Name); err != nil {
|
||||
return fmt.Errorf("failed to export introspected methods with error: %w", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (self *Portal) Start() (err error) {
|
||||
if self.bus, err = dbus.SessionBus(); err != nil {
|
||||
return fmt.Errorf("could not connect to session D-Bus: %s", err)
|
||||
}
|
||||
reply, err := self.bus.RequestName(PORTAL_BUS_NAME, dbus.NameFlagDoNotQueue)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to register dbus name: %v", err)
|
||||
}
|
||||
if reply != dbus.RequestNameReplyPrimaryOwner {
|
||||
return fmt.Errorf("can't register D-Bus name: name already taken")
|
||||
}
|
||||
props := PropSpec{
|
||||
"version": {Value: uint32(1), Writable: false, Emit: prop.EmitFalse},
|
||||
}
|
||||
signals := SignalSpec{
|
||||
"SettingChanged": {{"namespace", "s"}, {"key", "s"}, {"value", "v"}},
|
||||
}
|
||||
methods := MethodSpec{
|
||||
"Read": {{"namespace", "s", false}, {"key", "s", false}, {"value", "v", true}},
|
||||
"ReadAll": {{"namespaces", "as", false}, {"value", "a{sa{sv}}", true}},
|
||||
}
|
||||
if err = ExportInterface(self.bus, self, SETTINGS_INTERFACE, SETTINGS_OBJECT_PATH, methods, props, signals); err != nil {
|
||||
return
|
||||
}
|
||||
methods = MethodSpec{
|
||||
"ChangeSetting": {{"namespace", "s", false}, {"key", "s", false}, {"value", "v", false}},
|
||||
"RemoveSetting": {{"namespace", "s", false}, {"key", "s", false}},
|
||||
}
|
||||
props["version"].Value = uint32(1)
|
||||
if err = ExportInterface(self.bus, self, CHANGE_SETTINGS_INTERFACE, CHANGE_SETTINGS_OBJECT_PATH, methods, props, nil); err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func ParseValueWithSignature(value, value_type_signature string) (v dbus.Variant, err error) {
|
||||
var s dbus.Signature
|
||||
if value_type_signature != "" {
|
||||
if value_type_signature[0] == '@' {
|
||||
value_type_signature = value_type_signature[1:]
|
||||
}
|
||||
s, err = dbus.ParseSignature(value_type_signature)
|
||||
if err != nil {
|
||||
return dbus.Variant{}, fmt.Errorf("%s is not a valid type signature: %w", value_type_signature, err)
|
||||
}
|
||||
}
|
||||
v, err = dbus.ParseVariant(value, s)
|
||||
if err != nil {
|
||||
if value_type_signature == "" {
|
||||
return dbus.Variant{}, fmt.Errorf("could not guess the data type of: %s with error: %w", value, err)
|
||||
}
|
||||
return dbus.Variant{}, fmt.Errorf("%s is not a valid value for signature: %#v with error: %w", value, value_type_signature, err)
|
||||
}
|
||||
return v, nil
|
||||
}
|
||||
|
||||
func ParseValue(value string) (dbus.Variant, error) {
|
||||
return ParseValueWithSignature(value, "")
|
||||
}
|
||||
|
||||
type ShowSettingsOptions struct {
|
||||
AsJson bool
|
||||
AllowOtherBackends bool
|
||||
InNamespace []string
|
||||
}
|
||||
|
||||
func fetch_settings(conn *dbus.Conn, namespaces ...string) (ans ReadAllType, err error) {
|
||||
path := "/" + strings.ToLower(strings.ReplaceAll(DESKTOP_PORTAL_NAME, ".", "/"))
|
||||
obj := conn.Object(DESKTOP_PORTAL_NAME, dbus.ObjectPath(path))
|
||||
interface_name := strings.ReplaceAll(DESKTOP_PORTAL_NAME, "Desktop", "Settings")
|
||||
if len(namespaces) == 0 {
|
||||
namespaces = append(namespaces, "")
|
||||
}
|
||||
call := obj.Call(interface_name+".ReadAll", dbus.FlagNoAutoStart, namespaces)
|
||||
if err = call.Store(&ans); err != nil {
|
||||
return nil, fmt.Errorf("Failed to read response from ReadAll with error: %w", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func show_settings(opts *ShowSettingsOptions) (err error) {
|
||||
conn, err := dbus.SessionBus()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to connect to system bus with error: %w", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
var response ReadAllType
|
||||
response, err = fetch_settings(conn, opts.InNamespace...)
|
||||
if opts.AsJson {
|
||||
unwrapped := make(map[string]map[string]any, len(response))
|
||||
for ns, m := range response {
|
||||
w := make(map[string]any, len(m))
|
||||
for k, a := range m {
|
||||
w[k] = a.Value()
|
||||
}
|
||||
unwrapped[ns] = w
|
||||
}
|
||||
j, err := json.MarshalIndent(unwrapped, "", " ")
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to format the response as JSON: %w", err)
|
||||
}
|
||||
fmt.Println(string(j))
|
||||
} else {
|
||||
for ns, m := range response {
|
||||
fmt.Println(ns + ":")
|
||||
for key, v := range m {
|
||||
fmt.Printf("\t%s: %s\n", key, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
if !opts.AllowOtherBackends {
|
||||
is_running_self := false
|
||||
if m, found := response[SETTINGS_CANARY_NAMESPACE]; found {
|
||||
_, is_running_self = m[SETTINGS_CANARY_KEY]
|
||||
}
|
||||
if !is_running_self {
|
||||
err = fmt.Errorf("the settings did not come from the desktop-ui kitten. Some other portal backend is providing the service.")
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
var DataDirs = sync.OnceValue(func() (ans []string) {
|
||||
d := os.Getenv("XDG_DATA_DIRS")
|
||||
if d == "" {
|
||||
d = "/usr/local/share/:/usr/share/"
|
||||
}
|
||||
all := []string{os.Getenv("XDG_DATA_HOME")}
|
||||
all = append(all, strings.Split(d, ":")...)
|
||||
seen := map[string]bool{}
|
||||
for _, x := range all {
|
||||
if !seen[x] {
|
||||
seen[x] = true
|
||||
ans = append(ans, x)
|
||||
}
|
||||
}
|
||||
return
|
||||
})
|
||||
|
||||
func IsDir(x string) bool {
|
||||
s, err := os.Stat(x)
|
||||
return err == nil && s.IsDir()
|
||||
}
|
||||
|
||||
var WritableDataDirs = sync.OnceValue(func() (ans []string) {
|
||||
for _, x := range DataDirs() {
|
||||
if err := os.MkdirAll(x, 0o755); err == nil && unix.Access(x, unix.W_OK) == nil {
|
||||
ans = append(ans, x)
|
||||
}
|
||||
}
|
||||
return
|
||||
})
|
||||
|
||||
var AllPortalInterfaces = sync.OnceValue(func() (ans []string) {
|
||||
return []string{SETTINGS_INTERFACE}
|
||||
})
|
||||
|
||||
// enable-portal {{{
|
||||
func patch_portals_conf(text []byte) []byte {
|
||||
lines := []string{}
|
||||
in_preferred := false
|
||||
for _, line := range utils.Splitlines(utils.UnsafeBytesToString(text)) {
|
||||
sl := strings.TrimSpace(line)
|
||||
if strings.HasPrefix(sl, "[") {
|
||||
in_preferred = sl == "[preferred]"
|
||||
lines = append(lines, line)
|
||||
for _, iface := range AllPortalInterfaces() {
|
||||
lines = append(lines, iface+"=kitty")
|
||||
}
|
||||
} else if in_preferred {
|
||||
remove := false
|
||||
for _, iface := range AllPortalInterfaces() {
|
||||
if strings.HasPrefix(sl, iface) {
|
||||
remove = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !remove {
|
||||
lines = append(lines, line)
|
||||
}
|
||||
}
|
||||
}
|
||||
return utils.UnsafeStringToBytes(strings.Join(lines, "\n"))
|
||||
}
|
||||
|
||||
func enable_portal() (err error) {
|
||||
if len(WritableDataDirs()) == 0 {
|
||||
return fmt.Errorf("Could not find any writable data directories. Make sure XDG_DATA_DIRS is set and contains at least one directory for which you have write permission")
|
||||
}
|
||||
portals_dir := ""
|
||||
for _, x := range WritableDataDirs() {
|
||||
q := filepath.Join(x, "xdg-desktop-portal", "portals")
|
||||
if unix.Access(q, unix.W_OK) == nil && IsDir(q) {
|
||||
portals_dir = q
|
||||
break
|
||||
}
|
||||
}
|
||||
if portals_dir == "" {
|
||||
for _, x := range WritableDataDirs() {
|
||||
q := filepath.Join(x, "xdg-desktop-portal", "portals")
|
||||
if err := os.MkdirAll(q, 0o755); err == nil {
|
||||
portals_dir = q
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if portals_dir == "" {
|
||||
return fmt.Errorf("Could not find any writable portals directories. Make sure XDG_DATA_HOME is set and point to a directory for which you have write permission.")
|
||||
}
|
||||
portals_defn := filepath.Join(portals_dir, "kitty.portal")
|
||||
if err = os.WriteFile(portals_defn, utils.UnsafeStringToBytes(fmt.Sprintf(
|
||||
`[portal]
|
||||
DBusName=%s
|
||||
Interfaces=%s;
|
||||
`, PORTAL_BUS_NAME, strings.Join(AllPortalInterfaces(), ";"))), 0o644); err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println("Wrote kitty portal definition to:", portals_defn)
|
||||
dbus_service_dir := ""
|
||||
for _, x := range WritableDataDirs() {
|
||||
q := filepath.Join(x, "dbus-1", "services")
|
||||
if err := os.MkdirAll(q, 0o755); err == nil {
|
||||
dbus_service_dir = q
|
||||
break
|
||||
}
|
||||
}
|
||||
if dbus_service_dir == "" {
|
||||
return fmt.Errorf("Could not find any writable portals directories. Make sure XDG_DATA_HOME is set and point to a directory for which you have write permission.")
|
||||
}
|
||||
dbus_service_defn := filepath.Join(dbus_service_dir, PORTAL_BUS_NAME+".desktop")
|
||||
if err = os.WriteFile(dbus_service_defn, utils.UnsafeStringToBytes(fmt.Sprintf(
|
||||
`[D-BUS Service]
|
||||
Name=%s
|
||||
Exec=kitten run-server
|
||||
`, PORTAL_BUS_NAME)), 0o644); err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println("Wrote kitty DBUS activation service file to:", dbus_service_defn)
|
||||
|
||||
d := os.Getenv("XDG_CURRENT_DESKTOP")
|
||||
cf := os.Getenv("XDG_CONFIG_HOME")
|
||||
if cf == "" {
|
||||
cf = utils.Expanduser("~/.config")
|
||||
}
|
||||
cf = filepath.Join(cf, "xdg-desktop-portal")
|
||||
if err = os.MkdirAll(cf, 0o755); err != nil {
|
||||
return fmt.Errorf("failed to create %s to store the portals.conf file with error: %w", cf, err)
|
||||
}
|
||||
patched_file := ""
|
||||
desktops := utils.Filter(strings.Split(d, ":"), func(x string) bool { return x != "" })
|
||||
desktops = append(desktops, "")
|
||||
for _, x := range strings.Split(d, ":") {
|
||||
q := filepath.Join(cf, utils.IfElse(x == "", "portals.conf", fmt.Sprintf("%s-portals.conf", strings.ToLower(x))))
|
||||
if text, err := os.ReadFile(q); err == nil {
|
||||
text := patch_portals_conf(text)
|
||||
if err = os.WriteFile(q, text, 0o644); err == nil {
|
||||
patched_file = q
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if patched_file == "" {
|
||||
x := desktops[0]
|
||||
q := filepath.Join(cf, utils.IfElse(x == "", "portals.conf", fmt.Sprintf("%s-portals.conf", strings.ToLower(x))))
|
||||
text := patch_portals_conf([]byte{})
|
||||
if err = os.WriteFile(q, text, 0o644); err != nil {
|
||||
return err
|
||||
}
|
||||
patched_file = q
|
||||
}
|
||||
fmt.Printf("Patched %s to use the kitty portals\n", patched_file)
|
||||
return
|
||||
}
|
||||
|
||||
// }}}
|
||||
|
||||
type SetOptions struct {
|
||||
Namespace, DataType string
|
||||
}
|
||||
|
||||
func set_variant_setting(namespace, key string, v dbus.Variant, remove_setting bool) (err error) {
|
||||
conn, err := dbus.SessionBus()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to connect to system bus with error: %w", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
method := "ChangeSetting"
|
||||
var vals = []any{namespace, key}
|
||||
if remove_setting {
|
||||
method = "RemoveSetting"
|
||||
} else {
|
||||
vals = append(vals, v)
|
||||
}
|
||||
obj := conn.Object(PORTAL_BUS_NAME, dbus.ObjectPath(CHANGE_SETTINGS_OBJECT_PATH))
|
||||
call := obj.Call(CHANGE_SETTINGS_INTERFACE+"."+method, dbus.FlagNoAutoStart, vals...)
|
||||
if err = call.Store(); err != nil {
|
||||
return fmt.Errorf("failed to call %s with error: %w", method, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func set_setting(key, value string, opts *SetOptions) (err error) {
|
||||
remove_setting := false
|
||||
var v dbus.Variant
|
||||
if value == "" {
|
||||
remove_setting = true
|
||||
} else {
|
||||
if v, err = ParseValueWithSignature(value, opts.DataType); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return set_variant_setting(opts.Namespace, key, v, remove_setting)
|
||||
}
|
||||
|
||||
func set_color_scheme(which string) (err error) {
|
||||
conn, err := dbus.SessionBus()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to connect to system bus with error: %w", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
val := NO_PREFERENCE
|
||||
var res ReadAllType
|
||||
if res, err = fetch_settings(conn, PORTAL_APPEARANCE_NAMESPACE); err != nil {
|
||||
return fmt.Errorf("failed to read existing color scheme setting with error: %w", err)
|
||||
}
|
||||
if m, found := res[PORTAL_APPEARANCE_NAMESPACE]; found {
|
||||
if v, found := m[PORTAL_COLOR_SCHEME_KEY]; found {
|
||||
v.Store(&val)
|
||||
}
|
||||
}
|
||||
nval := val
|
||||
switch which {
|
||||
case "toggle":
|
||||
switch val {
|
||||
case LIGHT:
|
||||
nval = DARK
|
||||
case DARK:
|
||||
nval = LIGHT
|
||||
}
|
||||
case "no-preference":
|
||||
nval = NO_PREFERENCE
|
||||
case "light":
|
||||
nval = LIGHT
|
||||
case "dark":
|
||||
nval = DARK
|
||||
default:
|
||||
return fmt.Errorf("%s is not a valid value of the color-scheme", which)
|
||||
}
|
||||
if val == nval {
|
||||
return
|
||||
}
|
||||
obj := conn.Object(PORTAL_BUS_NAME, dbus.ObjectPath(CHANGE_SETTINGS_OBJECT_PATH))
|
||||
call := obj.Call(CHANGE_SETTINGS_INTERFACE+".ChangeSetting", dbus.FlagNoAutoStart, PORTAL_APPEARANCE_NAMESPACE, PORTAL_COLOR_SCHEME_KEY, dbus.MakeVariant(nval))
|
||||
if err = call.Store(); err != nil {
|
||||
return fmt.Errorf("failed to call ChangeSetting with error: %w", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (self *Portal) ChangeSetting(namespace, key string, value dbus.Variant) *dbus.Error {
|
||||
self.lock.Lock()
|
||||
defer self.lock.Unlock()
|
||||
if self.settings[namespace] == nil {
|
||||
self.settings[namespace] = map[string]dbus.Variant{}
|
||||
}
|
||||
self.settings[namespace][key] = value
|
||||
|
||||
if e := self.bus.Emit(
|
||||
SETTINGS_OBJECT_PATH,
|
||||
SETTINGS_INTERFACE+".SettingChanged",
|
||||
namespace,
|
||||
key,
|
||||
value,
|
||||
); e != nil {
|
||||
fmt.Fprintf(os.Stderr, "Couldn't emit signal: %s", e)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *Portal) RemoveSetting(namespace, key string) *dbus.Error {
|
||||
self.lock.Lock()
|
||||
defer self.lock.Unlock()
|
||||
existed := false
|
||||
if m := self.settings[namespace]; m != nil {
|
||||
_, existed = m[key]
|
||||
}
|
||||
if !existed {
|
||||
return nil
|
||||
}
|
||||
delete(self.settings[namespace], key)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *Portal) Read(namespace, key string) (dbus.Variant, *dbus.Error) {
|
||||
self.lock.Lock()
|
||||
defer self.lock.Unlock()
|
||||
if m, found := self.settings[namespace]; found {
|
||||
if v, found := m[key]; found {
|
||||
return v, nil
|
||||
}
|
||||
}
|
||||
return dbus.Variant{}, dbus.NewError("org.freedesktop.portal.Error.NotFound", []any{fmt.Sprintf("the setting %s in the namespace %s is not supported", key, namespace)})
|
||||
}
|
||||
|
||||
type ReadAllType map[string]map[string]dbus.Variant
|
||||
|
||||
func (self *Portal) ReadAll(namespaces []string) (ReadAllType, *dbus.Error) {
|
||||
self.lock.Lock()
|
||||
defer self.lock.Unlock()
|
||||
var matched_namespaces = SettingsMap{}
|
||||
if len(namespaces) == 0 {
|
||||
matched_namespaces = self.settings
|
||||
} else {
|
||||
for _, namespace := range namespaces {
|
||||
if namespace == "" {
|
||||
matched_namespaces = self.settings
|
||||
break
|
||||
} else {
|
||||
if strings.HasSuffix(namespace, ".*") {
|
||||
namespace = namespace[:len(namespace)-1]
|
||||
for candidate := range self.settings {
|
||||
if strings.HasPrefix(candidate, namespace) {
|
||||
matched_namespaces[candidate] = map[string]dbus.Variant{}
|
||||
}
|
||||
}
|
||||
} else if _, found := self.settings[namespace]; found {
|
||||
matched_namespaces[namespace] = map[string]dbus.Variant{}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
values := map[string]map[string]dbus.Variant{}
|
||||
for namespace := range matched_namespaces {
|
||||
values[namespace] = make(map[string]dbus.Variant, len(self.settings[namespace]))
|
||||
maps.Copy(values[namespace], self.settings[namespace])
|
||||
}
|
||||
return values, nil
|
||||
}
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/utils"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
)
|
||||
|
||||
@@ -11,8 +11,8 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
|
||||
"github.com/alecthomas/chroma/v2"
|
||||
"github.com/alecthomas/chroma/v2/lexers"
|
||||
|
||||
@@ -13,11 +13,11 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/kittens/ssh"
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/kittens/ssh"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/config"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -8,13 +8,13 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty"
|
||||
"kitty/tools/config"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -6,9 +6,9 @@ import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shlex"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
"kitty/tools/utils/shlex"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
|
||||
@@ -10,12 +10,12 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/sgr"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/style"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/tui/sgr"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/style"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -9,10 +9,10 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -8,13 +8,13 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/readline"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/config"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/tui/readline"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -11,13 +11,13 @@ import (
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/style"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/style"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -19,10 +19,10 @@ import (
|
||||
"github.com/dlclark/regexp2"
|
||||
"github.com/seancfoley/ipaddress-go/ipaddr"
|
||||
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty"
|
||||
"kitty/tools/config"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -5,8 +5,8 @@ package hints
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty"
|
||||
"kitty/tools/utils"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
|
||||
@@ -15,8 +15,8 @@ import (
|
||||
"sync"
|
||||
"unicode"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/utils"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -4,7 +4,7 @@ package hyperlinked_grep
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shlex"
|
||||
"kitty/tools/utils/shlex"
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
|
||||
@@ -8,11 +8,11 @@ import (
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shm"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
"kitty/tools/utils/shm"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -5,8 +5,8 @@ package icat
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/utils/images"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -11,13 +11,13 @@ import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/style"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
"kitty/tools/utils/style"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -4,13 +4,13 @@ package icat
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shm"
|
||||
"image"
|
||||
"image/gif"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
"kitty/tools/utils/shm"
|
||||
|
||||
"github.com/edwvee/exiffix"
|
||||
"github.com/kovidgoyal/imaging"
|
||||
|
||||
@@ -15,11 +15,11 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shm"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
"kitty/tools/utils/shm"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -8,20 +8,20 @@ import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"io"
|
||||
"kitty"
|
||||
"math"
|
||||
not_rand "math/rand/v2"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/graphics"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/images"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shm"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/graphics"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/images"
|
||||
"kitty/tools/utils/shm"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -12,10 +12,10 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/simdstring"
|
||||
"kitty/tools/simdstring"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -16,8 +16,8 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/tty"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/utils"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -13,7 +13,6 @@ from kitty.constants import is_macos, kitten_exe
|
||||
from kitty.fast_data_types import (
|
||||
GLFW_EDGE_BOTTOM,
|
||||
GLFW_EDGE_CENTER,
|
||||
GLFW_EDGE_CENTER_SIZED,
|
||||
GLFW_EDGE_LEFT,
|
||||
GLFW_EDGE_NONE,
|
||||
GLFW_EDGE_RIGHT,
|
||||
@@ -67,8 +66,7 @@ def layer_shell_config(opts: PanelCLIOptions) -> LayerShellConfig:
|
||||
}.get(opts.layer, GLFW_LAYER_SHELL_PANEL)
|
||||
ltype = GLFW_LAYER_SHELL_BACKGROUND if opts.edge == 'background' else ltype
|
||||
edge = {
|
||||
'top': GLFW_EDGE_TOP, 'bottom': GLFW_EDGE_BOTTOM, 'left': GLFW_EDGE_LEFT, 'right': GLFW_EDGE_RIGHT,
|
||||
'center': GLFW_EDGE_CENTER, 'none': GLFW_EDGE_NONE, 'center-sized': GLFW_EDGE_CENTER_SIZED,
|
||||
'top': GLFW_EDGE_TOP, 'bottom': GLFW_EDGE_BOTTOM, 'left': GLFW_EDGE_LEFT, 'right': GLFW_EDGE_RIGHT, 'center': GLFW_EDGE_CENTER, 'none': GLFW_EDGE_NONE
|
||||
}.get(opts.edge, GLFW_EDGE_TOP)
|
||||
focus_policy = {
|
||||
'not-allowed': GLFW_FOCUS_NOT_ALLOWED, 'exclusive': GLFW_FOCUS_EXCLUSIVE, 'on-demand': GLFW_FOCUS_ON_DEMAND
|
||||
@@ -161,8 +159,6 @@ def actual_main(sys_args: list[str]) -> None:
|
||||
sys.argv.extend(('--name', args.name))
|
||||
if args.start_as_hidden:
|
||||
sys.argv.append('--start-as=hidden')
|
||||
if args.grab_keyboard:
|
||||
sys.argv.append('--grab-keyboard')
|
||||
for override in args.override:
|
||||
sys.argv.extend(('--override', override))
|
||||
sys.argv.append('--override=linux_display_server=auto')
|
||||
|
||||
@@ -3,14 +3,14 @@ package query_terminal
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"kitty"
|
||||
"os"
|
||||
"slices"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/tui/loop"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -6,9 +6,9 @@ import (
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
|
||||
"github.com/kovidgoyal/kitty/kittens/panel"
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"kitty/kittens/panel"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/config"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
@@ -67,16 +67,10 @@ func main(cmd *cli.Command, opts *Options, args []string) (rc int, err error) {
|
||||
if runtime.GOOS != "darwin" {
|
||||
argv = append(argv, fmt.Sprintf("--app-id=%s", conf.App_id))
|
||||
}
|
||||
if conf.Output_name != "" {
|
||||
argv = append(argv, fmt.Sprintf("--output-name=%s", conf.Output_name))
|
||||
}
|
||||
argv = append(argv, fmt.Sprintf("--focus-policy=%s", conf.Focus_policy))
|
||||
if conf.Start_as_hidden {
|
||||
argv = append(argv, `--start-as-hidden`)
|
||||
}
|
||||
if conf.Grab_keyboard {
|
||||
argv = append(argv, `--grab-keyboard`)
|
||||
}
|
||||
if conf.Hide_on_focus_loss {
|
||||
argv = append(argv, `--hide-on-focus-loss`)
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import sys
|
||||
|
||||
from kitty.conf.types import Definition
|
||||
from kitty.constants import appname
|
||||
from kitty.simple_cli_definitions import CONFIG_HELP, grab_keyboard_docs
|
||||
from kitty.simple_cli_definitions import CONFIG_HELP
|
||||
|
||||
help_text = 'A quick access terminal window that you can bring up instantly with a keypress or a command.'
|
||||
|
||||
@@ -45,8 +45,6 @@ Hide the window when it loses keyboard focus automatically. Using this option
|
||||
will force :opt:`focus_policy` to :code:`on-demand`.
|
||||
''')
|
||||
|
||||
opt('grab_keyboard', 'no', option_type='to_bool', long_text=grab_keyboard_docs)
|
||||
|
||||
opt('margin_left', '0', option_type='int',
|
||||
long_text='Set the left margin for the window, in pixels. Has no effect for windows on the right edge of the screen.')
|
||||
|
||||
@@ -69,16 +67,7 @@ opt('+kitty_override', '', long_text='Override individual kitty configuration op
|
||||
)
|
||||
|
||||
opt('app_id', f'{appname}-quick-access',
|
||||
long_text='On Wayland set the :italic:`namespace` of the layer shell surface.'
|
||||
' On X11 set the WM_CLASS assigned to the quick access window. (Linux only)')
|
||||
|
||||
|
||||
opt('output_name', '', long_text='''
|
||||
The panel can only be displayed on a single monitor (output) at a time. This allows
|
||||
you to specify which output is used, by name. If not specified the compositor will choose an
|
||||
output automatically, typically the last output the user interacted with or the primary monitor.
|
||||
You can get a list of available outputs by running: :code:`kitten panel --output-name list`.
|
||||
''')
|
||||
long_text='The Wayland APP_ID assigned to the quick access window (Linux only)')
|
||||
|
||||
opt('start_as_hidden', 'no', option_type='to_bool',
|
||||
long_text='Whether to start the quick access terminal hidden. Useful if you are starting it as part of system startup.')
|
||||
|
||||
@@ -6,8 +6,8 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli/markup"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"kitty/tools/cli/markup"
|
||||
"kitty/tools/tui/loop"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -5,9 +5,9 @@ package show_key
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty/tools/cli/markup"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"io"
|
||||
"kitty/tools/cli/markup"
|
||||
"kitty/tools/tty"
|
||||
"os"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
|
||||
@@ -5,7 +5,7 @@ package show_key
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"kitty/tools/cli"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -9,9 +9,9 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shm"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/utils/shm"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -13,10 +13,10 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/paths"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shlex"
|
||||
"kitty/tools/config"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/paths"
|
||||
"kitty/tools/utils/shlex"
|
||||
|
||||
"github.com/bmatcuk/doublestar/v4"
|
||||
"golang.org/x/sys/unix"
|
||||
|
||||
@@ -4,7 +4,7 @@ package ssh
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/utils"
|
||||
"os"
|
||||
"os/user"
|
||||
"path/filepath"
|
||||
|
||||
@@ -10,9 +10,9 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"io"
|
||||
"io/fs"
|
||||
"kitty"
|
||||
"maps"
|
||||
"net/url"
|
||||
"os"
|
||||
@@ -28,16 +28,16 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/themes"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/shell_integration"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/secrets"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shlex"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shm"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/themes"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/tui/shell_integration"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/secrets"
|
||||
"kitty/tools/utils/shlex"
|
||||
"kitty/tools/utils/shm"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -6,9 +6,9 @@ import (
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shm"
|
||||
"io/fs"
|
||||
"kitty"
|
||||
"kitty/tools/utils/shm"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
|
||||
@@ -11,9 +11,9 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty"
|
||||
"kitty/tools/config"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/utils/shlex"
|
||||
"kitty/tools/utils/shlex"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
)
|
||||
|
||||
@@ -5,9 +5,9 @@ package themes
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/themes"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/themes"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -11,10 +11,10 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/themes"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/themes"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -4,20 +4,20 @@ package themes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"io"
|
||||
"kitty"
|
||||
"maps"
|
||||
"regexp"
|
||||
"slices"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/config"
|
||||
"github.com/kovidgoyal/kitty/tools/themes"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/readline"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/config"
|
||||
"kitty/tools/themes"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/tui/readline"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -14,8 +14,8 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -9,8 +9,8 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/utils"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -16,15 +16,15 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"github.com/kovidgoyal/kitty/kittens/unicode_input"
|
||||
"github.com/kovidgoyal/kitty/tools/cli/markup"
|
||||
"github.com/kovidgoyal/kitty/tools/rsync"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/humanize"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty"
|
||||
"kitty/kittens/unicode_input"
|
||||
"kitty/tools/cli/markup"
|
||||
"kitty/tools/rsync"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/humanize"
|
||||
"kitty/tools/wcswidth"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -20,14 +20,14 @@ import (
|
||||
|
||||
"golang.org/x/exp/constraints"
|
||||
|
||||
"github.com/kovidgoyal/kitty"
|
||||
"github.com/kovidgoyal/kitty/tools/cli/markup"
|
||||
"github.com/kovidgoyal/kitty/tools/rsync"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/humanize"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty"
|
||||
"kitty/tools/cli/markup"
|
||||
"kitty/tools/rsync"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/humanize"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -10,9 +10,9 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/crypto"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/humanize"
|
||||
"kitty/tools/crypto"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/humanize"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -16,15 +16,15 @@ import (
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/cli"
|
||||
"github.com/kovidgoyal/kitty/tools/tty"
|
||||
"github.com/kovidgoyal/kitty/tools/tui"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/loop"
|
||||
"github.com/kovidgoyal/kitty/tools/tui/readline"
|
||||
"github.com/kovidgoyal/kitty/tools/unicode_names"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/style"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/cli"
|
||||
"kitty/tools/tty"
|
||||
"kitty/tools/tui"
|
||||
"kitty/tools/tui/loop"
|
||||
"kitty/tools/tui/readline"
|
||||
"kitty/tools/unicode_names"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/style"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -8,10 +8,10 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/kovidgoyal/kitty/tools/unicode_names"
|
||||
"github.com/kovidgoyal/kitty/tools/utils"
|
||||
"github.com/kovidgoyal/kitty/tools/utils/style"
|
||||
"github.com/kovidgoyal/kitty/tools/wcswidth"
|
||||
"kitty/tools/unicode_names"
|
||||
"kitty/tools/utils"
|
||||
"kitty/tools/utils/style"
|
||||
"kitty/tools/wcswidth"
|
||||
)
|
||||
|
||||
var _ = fmt.Print
|
||||
|
||||
@@ -91,7 +91,7 @@ class Borders:
|
||||
for tbr in tab_bar_rects:
|
||||
add_borders_rect(self.os_window_id, self.tab_id, *tbr)
|
||||
bw = 0
|
||||
groups = tuple(all_windows.iter_all_layoutable_groups(only_visible=True))
|
||||
groups = tuple(all_windows.iter_all_layoutable_groups())
|
||||
if groups:
|
||||
bw = groups[0].effective_border()
|
||||
draw_borders = bw > 0 and draw_window_borders
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user