Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90ed5959de | ||
|
|
d999cc4143 | ||
|
|
6c1d8d5c63 | ||
|
|
a316242a4b | ||
|
|
a4ae090c37 | ||
|
|
abdcc64053 | ||
|
|
ac407d42de | ||
|
|
19c4a3f0a8 | ||
|
|
3afd96d421 | ||
|
|
f421666a27 | ||
|
|
af6baa33be | ||
|
|
1096cbe236 | ||
|
|
998be9b90c | ||
|
|
854cb8f27e | ||
|
|
e359094cff | ||
|
|
db57230987 | ||
|
|
4de3cecbbe | ||
|
|
c37a8bd3b1 | ||
|
|
e103b280fd | ||
|
|
2235ea67e2 | ||
|
|
1f6a4f7bd4 | ||
|
|
8c7ffc90f3 | ||
|
|
29d85833f1 | ||
|
|
74c56d69ac | ||
|
|
cf520646a9 | ||
|
|
da5213346a | ||
|
|
bdcb98eafc | ||
|
|
ef637cd7d3 | ||
|
|
dbbabd73c5 | ||
|
|
436ef0074a | ||
|
|
0904dec810 | ||
|
|
0aa07ead7e |
@@ -31,6 +31,7 @@ def runpy(args: List[str]) -> None:
|
|||||||
|
|
||||||
def hold(args: List[str]) -> None:
|
def hold(args: List[str]) -> None:
|
||||||
import subprocess
|
import subprocess
|
||||||
|
ret = 1
|
||||||
try:
|
try:
|
||||||
ret = subprocess.Popen(args[1:]).wait()
|
ret = subprocess.Popen(args[1:]).wait()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ def binary_includes():
|
|||||||
'expat', 'sqlite3', 'ffi', 'z', 'lzma', 'png16', 'lcms2', 'crypt',
|
'expat', 'sqlite3', 'ffi', 'z', 'lzma', 'png16', 'lcms2', 'crypt',
|
||||||
'iconv', 'pcre', 'graphite2', 'glib-2.0', 'freetype', 'rsync',
|
'iconv', 'pcre', 'graphite2', 'glib-2.0', 'freetype', 'rsync',
|
||||||
'harfbuzz', 'xkbcommon', 'xkbcommon-x11',
|
'harfbuzz', 'xkbcommon', 'xkbcommon-x11',
|
||||||
'ncursesw', 'readline', 'brotlicommon', 'brotlienc', 'brotlidec'
|
'ncursesw', 'readline', 'brotlicommon', 'brotlienc', 'brotlidec',
|
||||||
|
'wayland-client', 'wayland-cursor',
|
||||||
))) + (
|
))) + (
|
||||||
get_dll_path('bz2', 2), get_dll_path('ssl', 2), get_dll_path('crypto', 2),
|
get_dll_path('bz2', 2), get_dll_path('ssl', 2), get_dll_path('crypto', 2),
|
||||||
get_dll_path(f'python{py_ver}', 2),
|
get_dll_path(f'python{py_ver}', 2),
|
||||||
|
|||||||
@@ -75,6 +75,19 @@ command.
|
|||||||
Detailed list of changes
|
Detailed list of changes
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
|
0.24.4 [2022-03-03]
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
- Shell integration: Fix the default Bash :code:`$HISTFILE` changing to :file:`~/.sh_history` instead of :file:`~/.bash_history` (:iss:`4765`)
|
||||||
|
|
||||||
|
- Linux binaries: Fix binaries not working on systems with older Wayland client libraries (:iss:`4760`)
|
||||||
|
|
||||||
|
- Fix a regression in the previous release that broke kittens launched with :code:`STDIN` not connected to a terminal (:iss:`4763`)
|
||||||
|
|
||||||
|
- Wayland: Fix surface configure events not being acknowledged before commit
|
||||||
|
the resized buffer (:pull:`4768`)
|
||||||
|
|
||||||
|
|
||||||
0.24.3 [2022-02-28]
|
0.24.3 [2022-02-28]
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -203,11 +203,12 @@ bitmapped fonts.
|
|||||||
.. note::
|
.. note::
|
||||||
If you are trying to use a font patched with NERD font symbols, dont do that
|
If you are trying to use a font patched with NERD font symbols, dont do that
|
||||||
as patching destroys fonts. There is no need, simply install the standalone
|
as patching destroys fonts. There is no need, simply install the standalone
|
||||||
NERD font, kitty should pick up symbols from it automatically, and you can
|
NERD font (the file :file:`NerdFontsSymbolsOnly.zip` from the `NERD font
|
||||||
tell it to do so explicitly in case it doesnt with the :opt:`symbol_map`
|
releases page <https://github.com/ryanoasis/nerd-fonts/releases>`__). kitty
|
||||||
directive::
|
should pick up symbols from it automatically, and you can tell it to do so
|
||||||
|
explicitly in case it doesnt with the :opt:`symbol_map` directive::
|
||||||
|
|
||||||
symbol_map U+23FB-U+23FE,U+2B58,U+E200-U+E2A9,U+E0A0-U+E0A3,U+E0B0-U+E0BF,U+E0C0-U+E0C8,U+E0CC-U+E0CF,U+E0D0-U+E0D2,U+E0D4,U+E700-U+E7C5,U+F000-U+F2E0,U+2665,U+26A1,U+F400-U+F4A8,U+F67C,U+E000-U+E00A,U+F300-U+F313,U+E5FA-U+E62B Symbols Nerd Font
|
symbol_map U+23FB-U+23FE,U+2665,U+26A1,U+2B58,U+E000-U+E00A,U+E0A0-U+E0A3,U+E0B0-U+E0C8,U+E0CA,U+E0CC-U+E0D2,U+E0D4,U+E200-U+E2A9,U+E300-U+E3E3,U+E5FA-U+E62F,U+E700-U+E7C5,U+F000-U+F2E0,U+F300-U+F31C,U+F400-U+F4A9,U+F500-U+F8FF Symbols Nerd Font
|
||||||
|
|
||||||
If your font is not listed in ``kitty +list-fonts`` it means that it is not
|
If your font is not listed in ``kitty +list-fonts`` it means that it is not
|
||||||
monospace or is a bitmapped font. On Linux you can list all monospace fonts with::
|
monospace or is a bitmapped font. On Linux you can list all monospace fonts with::
|
||||||
|
|||||||
20
glfw/wl_client_side_decorations.c
vendored
20
glfw/wl_client_side_decorations.c
vendored
@@ -263,11 +263,11 @@ static bool
|
|||||||
create_shm_buffers(_GLFWwindow* window) {
|
create_shm_buffers(_GLFWwindow* window) {
|
||||||
const unsigned scale = window->wl.scale >= 1 ? window->wl.scale : 1;
|
const unsigned scale = window->wl.scale >= 1 ? window->wl.scale : 1;
|
||||||
|
|
||||||
const size_t vertical_width = decs.metrics.width, vertical_height = window->wl.height + decs.metrics.top;
|
const size_t vertical_width = decs.metrics.width, vertical_height = window->wl.current.height + decs.metrics.top;
|
||||||
const size_t horizontal_height = decs.metrics.width, horizontal_width = window->wl.width + 2 * decs.metrics.width;
|
const size_t horizontal_height = decs.metrics.width, horizontal_width = window->wl.current.width + 2 * decs.metrics.width;
|
||||||
|
|
||||||
decs.mapping.size = 0;
|
decs.mapping.size = 0;
|
||||||
decs.mapping.size += init_buffer_pair(&decs.top.buffer, window->wl.width, decs.metrics.top, scale);
|
decs.mapping.size += init_buffer_pair(&decs.top.buffer, window->wl.current.width, decs.metrics.top, scale);
|
||||||
decs.mapping.size += init_buffer_pair(&decs.left.buffer, vertical_width, vertical_height, scale);
|
decs.mapping.size += init_buffer_pair(&decs.left.buffer, vertical_width, vertical_height, scale);
|
||||||
decs.mapping.size += init_buffer_pair(&decs.bottom.buffer, horizontal_width, horizontal_height, scale);
|
decs.mapping.size += init_buffer_pair(&decs.bottom.buffer, horizontal_width, horizontal_height, scale);
|
||||||
decs.mapping.size += init_buffer_pair(&decs.right.buffer, vertical_width, vertical_height, scale);
|
decs.mapping.size += init_buffer_pair(&decs.right.buffer, vertical_width, vertical_height, scale);
|
||||||
@@ -347,8 +347,8 @@ ensure_csd_resources(_GLFWwindow *window) {
|
|||||||
const bool is_focused = window->id == _glfw.focusedWindowId;
|
const bool is_focused = window->id == _glfw.focusedWindowId;
|
||||||
const bool focus_changed = is_focused != decs.for_window_state.focused;
|
const bool focus_changed = is_focused != decs.for_window_state.focused;
|
||||||
const bool size_changed = (
|
const bool size_changed = (
|
||||||
decs.for_window_state.width != window->wl.width ||
|
decs.for_window_state.width != window->wl.current.width ||
|
||||||
decs.for_window_state.height != window->wl.height ||
|
decs.for_window_state.height != window->wl.current.height ||
|
||||||
decs.for_window_state.scale != window->wl.scale ||
|
decs.for_window_state.scale != window->wl.scale ||
|
||||||
!decs.mapping.data
|
!decs.mapping.data
|
||||||
);
|
);
|
||||||
@@ -368,11 +368,11 @@ ensure_csd_resources(_GLFWwindow *window) {
|
|||||||
if (!decs.left.surface) create_csd_surfaces(window, &decs.left);
|
if (!decs.left.surface) create_csd_surfaces(window, &decs.left);
|
||||||
position_csd_surface(&decs.left, x, y, scale);
|
position_csd_surface(&decs.left, x, y, scale);
|
||||||
|
|
||||||
x = -decs.metrics.width; y = window->wl.height;
|
x = -decs.metrics.width; y = window->wl.current.height;
|
||||||
if (!decs.bottom.surface) create_csd_surfaces(window, &decs.bottom);
|
if (!decs.bottom.surface) create_csd_surfaces(window, &decs.bottom);
|
||||||
position_csd_surface(&decs.bottom, x, y, scale);
|
position_csd_surface(&decs.bottom, x, y, scale);
|
||||||
|
|
||||||
x = window->wl.width; y = -decs.metrics.top;
|
x = window->wl.current.width; y = -decs.metrics.top;
|
||||||
if (!decs.right.surface) create_csd_surfaces(window, &decs.right);
|
if (!decs.right.surface) create_csd_surfaces(window, &decs.right);
|
||||||
position_csd_surface(&decs.right, x, y, scale);
|
position_csd_surface(&decs.right, x, y, scale);
|
||||||
|
|
||||||
@@ -382,8 +382,8 @@ ensure_csd_resources(_GLFWwindow *window) {
|
|||||||
damage_csd(bottom, is_focused ? decs.bottom.buffer.front : decs.bottom.buffer.back);
|
damage_csd(bottom, is_focused ? decs.bottom.buffer.front : decs.bottom.buffer.back);
|
||||||
damage_csd(right, is_focused ? decs.right.buffer.front : decs.right.buffer.back);
|
damage_csd(right, is_focused ? decs.right.buffer.front : decs.right.buffer.back);
|
||||||
|
|
||||||
decs.for_window_state.width = window->wl.width;
|
decs.for_window_state.width = window->wl.current.width;
|
||||||
decs.for_window_state.height = window->wl.height;
|
decs.for_window_state.height = window->wl.current.height;
|
||||||
decs.for_window_state.scale = window->wl.scale;
|
decs.for_window_state.scale = window->wl.scale;
|
||||||
decs.for_window_state.focused = is_focused;
|
decs.for_window_state.focused = is_focused;
|
||||||
return true;
|
return true;
|
||||||
@@ -409,7 +409,7 @@ change_csd_title(_GLFWwindow *window) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
set_csd_window_geometry(_GLFWwindow *window, int32_t *width, int32_t *height) {
|
set_csd_window_geometry(_GLFWwindow *window, int32_t *width, int32_t *height) {
|
||||||
bool has_csd = window->decorated && !window->wl.decorations.serverSide && window->wl.decorations.left.surface && !(window->wl.toplevel_states & TOPLEVEL_STATE_FULLSCREEN);
|
bool has_csd = window->decorated && !window->wl.decorations.serverSide && window->wl.decorations.left.surface && !(window->wl.current.toplevel_states & TOPLEVEL_STATE_FULLSCREEN);
|
||||||
bool size_specified_by_compositor = *width > 0 && *height > 0;
|
bool size_specified_by_compositor = *width > 0 && *height > 0;
|
||||||
if (!size_specified_by_compositor) {
|
if (!size_specified_by_compositor) {
|
||||||
*width = window->wl.user_requested_content_size.width;
|
*width = window->wl.user_requested_content_size.width;
|
||||||
|
|||||||
6
glfw/wl_init.c
vendored
6
glfw/wl_init.c
vendored
@@ -206,7 +206,7 @@ static void pointerHandleMotion(void* data UNUSED,
|
|||||||
case BOTTOM_DECORATION:
|
case BOTTOM_DECORATION:
|
||||||
if (x < window->wl.decorations.metrics.width)
|
if (x < window->wl.decorations.metrics.width)
|
||||||
cursorShape = GLFW_SW_RESIZE_CURSOR;
|
cursorShape = GLFW_SW_RESIZE_CURSOR;
|
||||||
else if (x > window->wl.width + window->wl.decorations.metrics.width)
|
else if (x > window->wl.current.width + window->wl.decorations.metrics.width)
|
||||||
cursorShape = GLFW_SE_RESIZE_CURSOR;
|
cursorShape = GLFW_SE_RESIZE_CURSOR;
|
||||||
else
|
else
|
||||||
cursorShape = GLFW_VRESIZE_CURSOR;
|
cursorShape = GLFW_VRESIZE_CURSOR;
|
||||||
@@ -243,7 +243,7 @@ static void pointerHandleButton(void* data UNUSED,
|
|||||||
window->wl.decorations.last_click_on_top_decoration_at = monotonic();
|
window->wl.decorations.last_click_on_top_decoration_at = monotonic();
|
||||||
if (window->wl.decorations.last_click_on_top_decoration_at - last_click_at <= _glfwPlatformGetDoubleClickInterval(window)) {
|
if (window->wl.decorations.last_click_on_top_decoration_at - last_click_at <= _glfwPlatformGetDoubleClickInterval(window)) {
|
||||||
window->wl.decorations.last_click_on_top_decoration_at = 0;
|
window->wl.decorations.last_click_on_top_decoration_at = 0;
|
||||||
if (window->wl.toplevel_states & TOPLEVEL_STATE_MAXIMIZED)
|
if (window->wl.current.toplevel_states & TOPLEVEL_STATE_MAXIMIZED)
|
||||||
xdg_toplevel_unset_maximized(window->wl.xdg.toplevel);
|
xdg_toplevel_unset_maximized(window->wl.xdg.toplevel);
|
||||||
else
|
else
|
||||||
xdg_toplevel_set_maximized(window->wl.xdg.toplevel);
|
xdg_toplevel_set_maximized(window->wl.xdg.toplevel);
|
||||||
@@ -274,7 +274,7 @@ static void pointerHandleButton(void* data UNUSED,
|
|||||||
case BOTTOM_DECORATION:
|
case BOTTOM_DECORATION:
|
||||||
if (x < window->wl.decorations.metrics.width)
|
if (x < window->wl.decorations.metrics.width)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT;
|
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT;
|
||||||
else if (x > window->wl.width + window->wl.decorations.metrics.width)
|
else if (x > window->wl.current.width + window->wl.decorations.metrics.width)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT;
|
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT;
|
||||||
else
|
else
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM;
|
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM;
|
||||||
|
|||||||
7
glfw/wl_platform.h
vendored
7
glfw/wl_platform.h
vendored
@@ -132,7 +132,6 @@ static const WaylandWindowState TOPLEVEL_STATE_DOCKED = TOPLEVEL_STATE_MAXIMIZED
|
|||||||
//
|
//
|
||||||
typedef struct _GLFWwindowWayland
|
typedef struct _GLFWwindowWayland
|
||||||
{
|
{
|
||||||
int width, height;
|
|
||||||
bool visible;
|
bool visible;
|
||||||
bool hovered;
|
bool hovered;
|
||||||
bool transparent;
|
bool transparent;
|
||||||
@@ -210,7 +209,6 @@ typedef struct _GLFWwindowWayland
|
|||||||
int32_t width, height;
|
int32_t width, height;
|
||||||
} user_requested_content_size;
|
} user_requested_content_size;
|
||||||
|
|
||||||
uint32_t toplevel_states;
|
|
||||||
bool maximize_on_first_show;
|
bool maximize_on_first_show;
|
||||||
// counters for ignoring axis events following axis_discrete events in the
|
// counters for ignoring axis events following axis_discrete events in the
|
||||||
// same frame along the same axis
|
// same frame along the same axis
|
||||||
@@ -218,6 +216,11 @@ typedef struct _GLFWwindowWayland
|
|||||||
unsigned int x, y;
|
unsigned int x, y;
|
||||||
} axis_discrete_count;
|
} axis_discrete_count;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int width, height;
|
||||||
|
uint32_t toplevel_states;
|
||||||
|
bool set;
|
||||||
|
} current, pending;
|
||||||
} _GLFWwindowWayland;
|
} _GLFWwindowWayland;
|
||||||
|
|
||||||
typedef enum _GLFWWaylandOfferType
|
typedef enum _GLFWWaylandOfferType
|
||||||
|
|||||||
76
glfw/wl_window.c
vendored
76
glfw/wl_window.c
vendored
@@ -206,7 +206,7 @@ static void setOpaqueRegion(_GLFWwindow* window)
|
|||||||
if (!region)
|
if (!region)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wl_region_add(region, 0, 0, window->wl.width, window->wl.height);
|
wl_region_add(region, 0, 0, window->wl.current.width, window->wl.current.height);
|
||||||
wl_surface_set_opaque_region(window->wl.surface, region);
|
wl_surface_set_opaque_region(window->wl.surface, region);
|
||||||
wl_surface_commit(window->wl.surface);
|
wl_surface_commit(window->wl.surface);
|
||||||
wl_region_destroy(region);
|
wl_region_destroy(region);
|
||||||
@@ -216,9 +216,9 @@ static void setOpaqueRegion(_GLFWwindow* window)
|
|||||||
static void
|
static void
|
||||||
resizeFramebuffer(_GLFWwindow* window) {
|
resizeFramebuffer(_GLFWwindow* window) {
|
||||||
int scale = window->wl.scale;
|
int scale = window->wl.scale;
|
||||||
int scaledWidth = window->wl.width * scale;
|
int scaledWidth = window->wl.current.width * scale;
|
||||||
int scaledHeight = window->wl.height * scale;
|
int scaledHeight = window->wl.current.height * scale;
|
||||||
debug("Resizing framebuffer to: %dx%d at scale: %d\n", window->wl.width, window->wl.height, scale);
|
debug("Resizing framebuffer to: %dx%d at scale: %d\n", window->wl.current.width, window->wl.current.height, scale);
|
||||||
wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0);
|
wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0);
|
||||||
if (!window->wl.transparent) setOpaqueRegion(window);
|
if (!window->wl.transparent) setOpaqueRegion(window);
|
||||||
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight);
|
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight);
|
||||||
@@ -236,12 +236,12 @@ clipboard_mime(void) {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
dispatchChangesAfterConfigure(_GLFWwindow *window, int32_t width, int32_t height) {
|
dispatchChangesAfterConfigure(_GLFWwindow *window, int32_t width, int32_t height) {
|
||||||
bool size_changed = width != window->wl.width || height != window->wl.height;
|
bool size_changed = width != window->wl.current.width || height != window->wl.current.height;
|
||||||
bool scale_changed = checkScaleChange(window);
|
bool scale_changed = checkScaleChange(window);
|
||||||
|
|
||||||
if (size_changed) {
|
if (size_changed) {
|
||||||
_glfwInputWindowSize(window, width, height);
|
_glfwInputWindowSize(window, width, height);
|
||||||
window->wl.width = width; window->wl.height = height;
|
window->wl.current.width = width; window->wl.current.height = height;
|
||||||
resizeFramebuffer(window);
|
resizeFramebuffer(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,7 +274,7 @@ xdgDecorationHandleConfigure(void* data,
|
|||||||
debug("XDG decoration configure event received: has_server_side_decorations: %d\n", has_server_side_decorations);
|
debug("XDG decoration configure event received: has_server_side_decorations: %d\n", has_server_side_decorations);
|
||||||
if (has_server_side_decorations == window->wl.decorations.serverSide) return;
|
if (has_server_side_decorations == window->wl.decorations.serverSide) return;
|
||||||
window->wl.decorations.serverSide = has_server_side_decorations;
|
window->wl.decorations.serverSide = has_server_side_decorations;
|
||||||
int width = window->wl.width, height = window->wl.height;
|
int width = window->wl.current.width, height = window->wl.current.height;
|
||||||
if (window->wl.decorations.serverSide) {
|
if (window->wl.decorations.serverSide) {
|
||||||
free_csd_surfaces(window);
|
free_csd_surfaces(window);
|
||||||
height += window->wl.decorations.metrics.visible_titlebar_height;
|
height += window->wl.decorations.metrics.visible_titlebar_height;
|
||||||
@@ -285,7 +285,7 @@ xdgDecorationHandleConfigure(void* data,
|
|||||||
dispatchChangesAfterConfigure(window, width, height);
|
dispatchChangesAfterConfigure(window, width, height);
|
||||||
ensure_csd_resources(window);
|
ensure_csd_resources(window);
|
||||||
wl_surface_commit(window->wl.surface);
|
wl_surface_commit(window->wl.surface);
|
||||||
debug("final window content size: %dx%d\n", window->wl.width, window->wl.height);
|
debug("final window content size: %dx%d\n", window->wl.current.width, window->wl.current.height);
|
||||||
inform_compositor_of_window_geometry(window, "configure-decorations");
|
inform_compositor_of_window_geometry(window, "configure-decorations");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,8 +384,8 @@ static bool createSurface(_GLFWwindow* window,
|
|||||||
if (!window->wl.native)
|
if (!window->wl.native)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
window->wl.width = wndconfig->width;
|
window->wl.current.width = wndconfig->width;
|
||||||
window->wl.height = wndconfig->height;
|
window->wl.current.height = wndconfig->height;
|
||||||
window->wl.user_requested_content_size.width = wndconfig->width;
|
window->wl.user_requested_content_size.width = wndconfig->width;
|
||||||
window->wl.user_requested_content_size.height = wndconfig->height;
|
window->wl.user_requested_content_size.height = wndconfig->height;
|
||||||
window->wl.scale = 1;
|
window->wl.scale = 1;
|
||||||
@@ -416,7 +416,7 @@ static void setFullscreen(_GLFWwindow* window, _GLFWmonitor* monitor, bool on)
|
|||||||
|
|
||||||
bool
|
bool
|
||||||
_glfwPlatformIsFullscreen(_GLFWwindow *window, unsigned int flags UNUSED) {
|
_glfwPlatformIsFullscreen(_GLFWwindow *window, unsigned int flags UNUSED) {
|
||||||
return window->wl.toplevel_states & TOPLEVEL_STATE_FULLSCREEN;
|
return window->wl.current.toplevel_states & TOPLEVEL_STATE_FULLSCREEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -458,7 +458,7 @@ xdgToplevelHandleConfigure(void* data,
|
|||||||
if (new_states & TOPLEVEL_STATE_RESIZING) {
|
if (new_states & TOPLEVEL_STATE_RESIZING) {
|
||||||
if (width) window->wl.user_requested_content_size.width = width;
|
if (width) window->wl.user_requested_content_size.width = width;
|
||||||
if (height) window->wl.user_requested_content_size.height = height;
|
if (height) window->wl.user_requested_content_size.height = height;
|
||||||
if (!(window->wl.toplevel_states & TOPLEVEL_STATE_RESIZING)) _glfwInputLiveResize(window, true);
|
if (!(window->wl.current.toplevel_states & TOPLEVEL_STATE_RESIZING)) _glfwInputLiveResize(window, true);
|
||||||
}
|
}
|
||||||
if (width != 0 && height != 0)
|
if (width != 0 && height != 0)
|
||||||
{
|
{
|
||||||
@@ -475,16 +475,11 @@ xdgToplevelHandleConfigure(void* data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool live_resize_done = !(new_states & TOPLEVEL_STATE_RESIZING) && (window->wl.toplevel_states & TOPLEVEL_STATE_RESIZING);
|
|
||||||
window->wl.toplevel_states = new_states;
|
window->wl.pending.toplevel_states = new_states;
|
||||||
set_csd_window_geometry(window, &width, &height);
|
window->wl.pending.width = width;
|
||||||
dispatchChangesAfterConfigure(window, width, height);
|
window->wl.pending.height = height;
|
||||||
debug("final window content size: %dx%d\n", window->wl.width, window->wl.height);
|
window->wl.pending.set = true;
|
||||||
_glfwInputWindowFocus(window, window->wl.toplevel_states & TOPLEVEL_STATE_ACTIVATED);
|
|
||||||
ensure_csd_resources(window);
|
|
||||||
wl_surface_commit(window->wl.surface);
|
|
||||||
inform_compositor_of_window_geometry(window, "configure");
|
|
||||||
if (live_resize_done) _glfwInputLiveResize(window, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xdgToplevelHandleClose(void* data,
|
static void xdgToplevelHandleClose(void* data,
|
||||||
@@ -499,11 +494,34 @@ static const struct xdg_toplevel_listener xdgToplevelListener = {
|
|||||||
xdgToplevelHandleClose
|
xdgToplevelHandleClose
|
||||||
};
|
};
|
||||||
|
|
||||||
static void xdgSurfaceHandleConfigure(void* data UNUSED,
|
static void xdgSurfaceHandleConfigure(void* data,
|
||||||
struct xdg_surface* surface,
|
struct xdg_surface* surface,
|
||||||
uint32_t serial)
|
uint32_t serial)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = data;
|
||||||
xdg_surface_ack_configure(surface, serial);
|
xdg_surface_ack_configure(surface, serial);
|
||||||
|
if (window->wl.pending.set) {
|
||||||
|
uint32_t new_states = window->wl.pending.toplevel_states;
|
||||||
|
int width = window->wl.pending.width;
|
||||||
|
int height = window->wl.pending.height;
|
||||||
|
window->wl.pending.set = false;
|
||||||
|
|
||||||
|
if (new_states != window->wl.current.toplevel_states ||
|
||||||
|
width != window->wl.current.width ||
|
||||||
|
height != window->wl.current.height) {
|
||||||
|
|
||||||
|
bool live_resize_done = !(new_states & TOPLEVEL_STATE_RESIZING) && (window->wl.current.toplevel_states & TOPLEVEL_STATE_RESIZING);
|
||||||
|
window->wl.current.toplevel_states = new_states;
|
||||||
|
set_csd_window_geometry(window, &width, &height);
|
||||||
|
dispatchChangesAfterConfigure(window, width, height);
|
||||||
|
debug("final window content size: %dx%d\n", window->wl.current.width, window->wl.current.height);
|
||||||
|
_glfwInputWindowFocus(window, window->wl.current.toplevel_states & TOPLEVEL_STATE_ACTIVATED);
|
||||||
|
ensure_csd_resources(window);
|
||||||
|
inform_compositor_of_window_geometry(window, "configure");
|
||||||
|
if (live_resize_done) _glfwInputLiveResize(window, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wl_surface_commit(window->wl.surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct xdg_surface_listener xdgSurfaceListener = {
|
static const struct xdg_surface_listener xdgSurfaceListener = {
|
||||||
@@ -886,19 +904,19 @@ void _glfwPlatformSetWindowPos(_GLFWwindow* window UNUSED, int xpos UNUSED, int
|
|||||||
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
||||||
{
|
{
|
||||||
if (width)
|
if (width)
|
||||||
*width = window->wl.width;
|
*width = window->wl.current.width;
|
||||||
if (height)
|
if (height)
|
||||||
*height = window->wl.height;
|
*height = window->wl.current.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
if (width != window->wl.width || height != window->wl.height) {
|
if (width != window->wl.current.width || height != window->wl.current.height) {
|
||||||
window->wl.user_requested_content_size.width = width;
|
window->wl.user_requested_content_size.width = width;
|
||||||
window->wl.user_requested_content_size.height = height;
|
window->wl.user_requested_content_size.height = height;
|
||||||
int32_t w = 0, h = 0;
|
int32_t w = 0, h = 0;
|
||||||
set_csd_window_geometry(window, &w, &h);
|
set_csd_window_geometry(window, &w, &h);
|
||||||
window->wl.width = w; window->wl.height = h;
|
window->wl.current.width = w; window->wl.current.height = h;
|
||||||
resizeFramebuffer(window);
|
resizeFramebuffer(window);
|
||||||
ensure_csd_resources(window);
|
ensure_csd_resources(window);
|
||||||
wl_surface_commit(window->wl.surface);
|
wl_surface_commit(window->wl.surface);
|
||||||
@@ -991,7 +1009,7 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel);
|
xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel);
|
||||||
if (window->wl.toplevel_states & TOPLEVEL_STATE_MAXIMIZED)
|
if (window->wl.current.toplevel_states & TOPLEVEL_STATE_MAXIMIZED)
|
||||||
xdg_toplevel_unset_maximized(window->wl.xdg.toplevel);
|
xdg_toplevel_unset_maximized(window->wl.xdg.toplevel);
|
||||||
// There is no way to unset minimized, or even to know if we are
|
// There is no way to unset minimized, or even to know if we are
|
||||||
// minimized, so there is nothing to do in this case.
|
// minimized, so there is nothing to do in this case.
|
||||||
@@ -1092,7 +1110,7 @@ int _glfwPlatformWindowVisible(_GLFWwindow* window)
|
|||||||
|
|
||||||
int _glfwPlatformWindowMaximized(_GLFWwindow* window)
|
int _glfwPlatformWindowMaximized(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return window->wl.toplevel_states & TOPLEVEL_STATE_MAXIMIZED;
|
return window->wl.current.toplevel_states & TOPLEVEL_STATE_MAXIMIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowHovered(_GLFWwindow* window)
|
int _glfwPlatformWindowHovered(_GLFWwindow* window)
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ from contextlib import contextmanager
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
from typing import TYPE_CHECKING, Any, Dict, FrozenSet, Generator, List, cast
|
from typing import TYPE_CHECKING, Any, Dict, FrozenSet, Generator, List, cast
|
||||||
|
|
||||||
|
from kitty.constants import list_kitty_resources
|
||||||
from kitty.types import run_once
|
from kitty.types import run_once
|
||||||
from kitty.utils import resolve_abs_or_config_path
|
from kitty.utils import resolve_abs_or_config_path
|
||||||
|
|
||||||
|
|
||||||
aliases = {'url_hints': 'hints'}
|
aliases = {'url_hints': 'hints'}
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from kitty.conf.types import Definition
|
from kitty.conf.types import Definition
|
||||||
@@ -85,7 +85,7 @@ def launch(args: List[str]) -> None:
|
|||||||
del args[:2]
|
del args[:2]
|
||||||
args = [kitten] + args
|
args = [kitten] + args
|
||||||
os.environ['KITTY_CONFIG_DIRECTORY'] = config_dir
|
os.environ['KITTY_CONFIG_DIRECTORY'] = config_dir
|
||||||
from kittens.tui.operations import clear_screen, reset_mode, Mode
|
from kittens.tui.operations import Mode, clear_screen, reset_mode
|
||||||
set_debug(kitten)
|
set_debug(kitten)
|
||||||
m = import_kitten_main_module(config_dir, kitten)
|
m = import_kitten_main_module(config_dir, kitten)
|
||||||
try:
|
try:
|
||||||
@@ -116,11 +116,9 @@ def run_kitten(kitten: str, run_name: str = '__main__') -> None:
|
|||||||
original_kitten_name = kitten
|
original_kitten_name = kitten
|
||||||
kitten = resolved_kitten(kitten)
|
kitten = resolved_kitten(kitten)
|
||||||
set_debug(kitten)
|
set_debug(kitten)
|
||||||
try:
|
if kitten in all_kitten_names():
|
||||||
runpy.run_module(f'kittens.{kitten}.main', run_name=run_name)
|
runpy.run_module(f'kittens.{kitten}.main', run_name=run_name)
|
||||||
return
|
return
|
||||||
except ImportError:
|
|
||||||
pass
|
|
||||||
# Look for a custom kitten
|
# Look for a custom kitten
|
||||||
if not kitten.endswith('.py'):
|
if not kitten.endswith('.py'):
|
||||||
kitten += '.py'
|
kitten += '.py'
|
||||||
@@ -137,7 +135,6 @@ def run_kitten(kitten: str, run_name: str = '__main__') -> None:
|
|||||||
|
|
||||||
@run_once
|
@run_once
|
||||||
def all_kitten_names() -> FrozenSet[str]:
|
def all_kitten_names() -> FrozenSet[str]:
|
||||||
from kitty.constants import list_kitty_resources
|
|
||||||
ans = []
|
ans = []
|
||||||
for name in list_kitty_resources('kittens'):
|
for name in list_kitty_resources('kittens'):
|
||||||
if '__' not in name and '.' not in name and name != 'tui':
|
if '__' not in name and '.' not in name and name != 'tui':
|
||||||
|
|||||||
@@ -23,11 +23,12 @@ def real_main(args: List[str]) -> None:
|
|||||||
cli_opts, items = parse_args(args[1:], OPTIONS, '', msg, 'hints', result_class=ErrorCLIOptions)
|
cli_opts, items = parse_args(args[1:], OPTIONS, '', msg, 'hints', result_class=ErrorCLIOptions)
|
||||||
error_message = sys.stdin.buffer.read().decode('utf-8')
|
error_message = sys.stdin.buffer.read().decode('utf-8')
|
||||||
sys.stdin = open(os.ctermid())
|
sys.stdin = open(os.ctermid())
|
||||||
print(styled(cli_opts.title, fg_intense=True, fg='red', bold=True))
|
if cli_opts.title:
|
||||||
print()
|
print(styled(cli_opts.title, fg_intense=True, fg='red', bold=True))
|
||||||
|
print()
|
||||||
print(error_message)
|
print(error_message)
|
||||||
print()
|
print()
|
||||||
input('Press Enter to close.')
|
input('\x1b[1;32mPress Enter to close\x1b[m')
|
||||||
|
|
||||||
|
|
||||||
def main(args: List[str]) -> None:
|
def main(args: List[str]) -> None:
|
||||||
|
|||||||
@@ -2278,10 +2278,14 @@ class Boss:
|
|||||||
tab.remove_window(w)
|
tab.remove_window(w)
|
||||||
|
|
||||||
if failures:
|
if failures:
|
||||||
with force_window_launch(needs_window_replaced):
|
from kittens.tui.operations import styled
|
||||||
from kittens.tui.operations import styled
|
spec = '\n '.join(styled(u, fg='red') for u in failures)
|
||||||
spec = '\n '.join(styled(u, fg='red') for u in failures)
|
bdata = f"Unknown URL type, cannot open:\n\n {spec}".encode('utf-8')
|
||||||
self.launch('--hold', '--type=os-window', kitty_exe(), '+runpy', fr'print("Unknown URL type, cannot open:\n\n ", {spec!r});')
|
special_window = SpecialWindow([kitty_exe(), '+kitten', 'show_error', '--title', 'Open URL Error'], bdata, 'Open URL Error')
|
||||||
|
if needs_window_replaced and tab is not None:
|
||||||
|
tab.new_special_window(special_window)
|
||||||
|
else:
|
||||||
|
self._new_os_window(special_window)
|
||||||
clear_initial_window()
|
clear_initial_window()
|
||||||
needs_window_replaced = False
|
needs_window_replaced = False
|
||||||
if actions:
|
if actions:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class Version(NamedTuple):
|
|||||||
|
|
||||||
appname: str = 'kitty'
|
appname: str = 'kitty'
|
||||||
kitty_face = '🐱'
|
kitty_face = '🐱'
|
||||||
version: Version = Version(0, 24, 3)
|
version: Version = Version(0, 24, 4)
|
||||||
str_version: str = '.'.join(map(str, version))
|
str_version: str = '.'.join(map(str, version))
|
||||||
_plat = sys.platform.lower()
|
_plat = sys.platform.lower()
|
||||||
is_macos: bool = 'darwin' in _plat
|
is_macos: bool = 'darwin' in _plat
|
||||||
|
|||||||
@@ -93,6 +93,10 @@ def setup_bash_env(env: Dict[str, str], argv: List[str]) -> None:
|
|||||||
env['KITTY_BASH_RCFILE'] = rcfile
|
env['KITTY_BASH_RCFILE'] = rcfile
|
||||||
for i in sorted(remove_args, reverse=True):
|
for i in sorted(remove_args, reverse=True):
|
||||||
del argv[i]
|
del argv[i]
|
||||||
|
if 'HISTFILE' not in env and 'posix' not in inject:
|
||||||
|
# In POSIX mode the default history file is ~/.sh_history instead of ~/.bash_history
|
||||||
|
env['HISTFILE'] = os.path.expanduser('~/.bash_history')
|
||||||
|
env['KITTY_BASH_UNEXPORT_HISTFILE'] = '1'
|
||||||
argv.insert(1, '--posix')
|
argv.insert(1, '--posix')
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ class ScreenSizeGetter:
|
|||||||
|
|
||||||
def __call__(self) -> ScreenSize:
|
def __call__(self) -> ScreenSize:
|
||||||
if self.changed:
|
if self.changed:
|
||||||
self.ans = read_screen_size()
|
self.ans = read_screen_size(self.fd)
|
||||||
self.changed = False
|
self.changed = False
|
||||||
return cast(ScreenSize, self.ans)
|
return cast(ScreenSize, self.ans)
|
||||||
|
|
||||||
@@ -892,20 +892,17 @@ def hold_till_enter() -> None:
|
|||||||
|
|
||||||
from kittens.tui.operations import init_state, set_cursor_visible
|
from kittens.tui.operations import init_state, set_cursor_visible
|
||||||
fd, original_termios = open_tty()
|
fd, original_termios = open_tty()
|
||||||
write_all(fd, '\n\x1b[1;32mPress Enter or Esc to exit')
|
msg = '\n\r\x1b[1;32mPress Enter or Esc to exit\x1b[m'
|
||||||
|
write_all(fd, msg)
|
||||||
write_all(fd, init_state(alternate_screen=False, kitty_keyboard_mode=False) + set_cursor_visible(False))
|
write_all(fd, init_state(alternate_screen=False, kitty_keyboard_mode=False) + set_cursor_visible(False))
|
||||||
old = termios.tcgetattr(fd)
|
with no_echo(fd):
|
||||||
new = old[:]
|
termios.tcdrain(fd)
|
||||||
new[3] &= ~termios.ECHO # 3 == 'lflags'
|
while True:
|
||||||
tcsetattr_flags = termios.TCSAFLUSH
|
rd = select.select([fd], [], [])[0]
|
||||||
if hasattr(termios, 'TCSASOFT'):
|
if not rd:
|
||||||
tcsetattr_flags |= getattr(termios, 'TCSASOFT')
|
break
|
||||||
termios.tcsetattr(fd, tcsetattr_flags, new)
|
q = os.read(fd, 1)
|
||||||
termios.tcdrain(fd)
|
if q in b'\n\r\x1b':
|
||||||
while True:
|
break
|
||||||
rd = select.select([fd], [], [])[0]
|
if q in b'\x03\x04':
|
||||||
if not rd:
|
write_all(fd, msg)
|
||||||
break
|
|
||||||
q = os.read(fd, 1)
|
|
||||||
if q in b'\n\r\x1b\x03':
|
|
||||||
break
|
|
||||||
|
|||||||
@@ -278,6 +278,8 @@ PS1="{ps1}"
|
|||||||
pty.send_cmd_to_child('printf "%s\x16\a%s" "a" "b"')
|
pty.send_cmd_to_child('printf "%s\x16\a%s" "a" "b"')
|
||||||
pty.wait_till(lambda: pty.screen_contents().count(ps1) == 2)
|
pty.wait_till(lambda: pty.screen_contents().count(ps1) == 2)
|
||||||
self.ae(pty.screen_contents(), f'{ps1}printf "%s^G%s" "a" "b"\nab{ps1}')
|
self.ae(pty.screen_contents(), f'{ps1}printf "%s^G%s" "a" "b"\nab{ps1}')
|
||||||
|
pty.send_cmd_to_child('echo $HISTFILE')
|
||||||
|
pty.wait_till(lambda: '.bash_history' in pty.screen_contents())
|
||||||
|
|
||||||
for ps1 in ('line1\\nline\\2\\prompt> ', 'line1\nprompt> ', 'line1\\nprompt> ',):
|
for ps1 in ('line1\\nline\\2\\prompt> ', 'line1\nprompt> ', 'line1\\nprompt> ',):
|
||||||
with self.subTest(ps1=ps1), self.run_shell(
|
with self.subTest(ps1=ps1), self.run_shell(
|
||||||
|
|||||||
@@ -41,6 +41,11 @@ _ksi_main() {
|
|||||||
_ksi_safe_source "$KITTY_BASH_POSIX_ENV" && builtin export ENV="$KITTY_BASH_POSIX_ENV";
|
_ksi_safe_source "$KITTY_BASH_POSIX_ENV" && builtin export ENV="$KITTY_BASH_POSIX_ENV";
|
||||||
else
|
else
|
||||||
builtin set +o posix;
|
builtin set +o posix;
|
||||||
|
if [[ -n "$KITTY_BASH_UNEXPORT_HISTFILE" ]]; then
|
||||||
|
export -n HISTFILE;
|
||||||
|
unset KITTY_BASH_UNEXPORT_HISTFILE;
|
||||||
|
fi
|
||||||
|
|
||||||
# See run_startup_files() in shell.c in the Bash source code
|
# See run_startup_files() in shell.c in the Bash source code
|
||||||
if builtin shopt -q login_shell; then
|
if builtin shopt -q login_shell; then
|
||||||
if [[ "$KITTY_BASH_INJECT" != *"no-profile"* ]]; then
|
if [[ "$KITTY_BASH_INJECT" != *"no-profile"* ]]; then
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ end
|
|||||||
|
|
||||||
status is-interactive || exit 0
|
status is-interactive || exit 0
|
||||||
not functions -q __ksi_schedule || exit 0
|
not functions -q __ksi_schedule || exit 0
|
||||||
# Check fish version 3.3.0+ efficiently and exit on outdated versions
|
# Check fish version 3.3.0+ efficiently and fallback to check the last working version 3.2.0, exit on outdated versions.
|
||||||
# "Warning: Update fish to version 3.3.0+ to enable kitty shell integration.\n"
|
# "Warning: Update fish to version 3.3.0+ to enable kitty shell integration.\n"
|
||||||
set -q fish_killring
|
set -q fish_killring || set -q status_generation || string match -qnv "3.1.*" "$version"
|
||||||
or echo -en "\eP@kitty-print|V2FybmluZzogVXBkYXRlIGZpc2ggdG8gdmVyc2lvbiAzLjMuMCsgdG8gZW5hYmxlIGtpdHR5IHNoZWxsIGludGVncmF0aW9uLgo=\e\\" && exit 0
|
or echo -en "\eP@kitty-print|V2FybmluZzogVXBkYXRlIGZpc2ggdG8gdmVyc2lvbiAzLjMuMCsgdG8gZW5hYmxlIGtpdHR5IHNoZWxsIGludGVncmF0aW9uLgo=\e\\" && exit 0 || exit 0
|
||||||
|
|
||||||
function __ksi_schedule --on-event fish_prompt -d "Setup kitty integration after other scripts have run, we hope"
|
function __ksi_schedule --on-event fish_prompt -d "Setup kitty integration after other scripts have run, we hope"
|
||||||
functions --erase __ksi_schedule
|
functions --erase __ksi_schedule
|
||||||
|
|||||||
Reference in New Issue
Block a user