mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 16:56:09 +03:00
Merge pull request #1821 from ghostty-org/gtk-mouse
gtk: various mouse-hide-while-typing fixes
This commit is contained in:
@ -1308,7 +1308,10 @@ pub fn keyCallback(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If this input event has text, then we hide the mouse if configured.
|
// If this input event has text, then we hide the mouse if configured.
|
||||||
|
// We only do this on pressed events to avoid hiding the mouse when we
|
||||||
|
// change focus due to a keybinding (i.e. switching tabs).
|
||||||
if (self.config.mouse_hide_while_typing and
|
if (self.config.mouse_hide_while_typing and
|
||||||
|
event.action == .press and
|
||||||
!self.mouse.hidden and
|
!self.mouse.hidden and
|
||||||
event.utf8.len > 0)
|
event.utf8.len > 0)
|
||||||
{
|
{
|
||||||
@ -1319,9 +1322,12 @@ pub fn keyCallback(
|
|||||||
// This handles the scenario where URL highlighting should be
|
// This handles the scenario where URL highlighting should be
|
||||||
// toggled for example.
|
// toggled for example.
|
||||||
if (!self.mouse.mods.equal(event.mods)) mouse_mods: {
|
if (!self.mouse.mods.equal(event.mods)) mouse_mods: {
|
||||||
// Usually moving the cursor unhides the mouse so we need
|
// This is a hacky way to prevent cursorPosCallback from
|
||||||
// to hide it again if it was hidden.
|
// showing our hidden mouse: we just pretend the mouse isn't hidden.
|
||||||
|
// We used to re-call `self.hideMouse()` but this causes flickering
|
||||||
|
// in some cases in GTK.
|
||||||
const rehide = self.mouse.hidden;
|
const rehide = self.mouse.hidden;
|
||||||
|
self.mouse.hidden = false;
|
||||||
|
|
||||||
// Update our modifiers, this will update mouse mods too
|
// Update our modifiers, this will update mouse mods too
|
||||||
self.modsChanged(event.mods);
|
self.modsChanged(event.mods);
|
||||||
@ -1331,7 +1337,7 @@ pub fn keyCallback(
|
|||||||
self.mouse.link_point = null;
|
self.mouse.link_point = null;
|
||||||
const pos = self.rt_surface.getCursorPos() catch break :mouse_mods;
|
const pos = self.rt_surface.getCursorPos() catch break :mouse_mods;
|
||||||
self.cursorPosCallback(pos) catch {};
|
self.cursorPosCallback(pos) catch {};
|
||||||
if (rehide) self.hideMouse();
|
if (rehide) self.mouse.hidden = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process the cursor state logic. This will update the cursor shape if
|
// Process the cursor state logic. This will update the cursor shape if
|
||||||
|
@ -741,7 +741,14 @@ fn updateTitleLabels(self: *Surface) void {
|
|||||||
// If we have a window and are focused, then we have to update the window title.
|
// If we have a window and are focused, then we have to update the window title.
|
||||||
if (self.container.window()) |window| {
|
if (self.container.window()) |window| {
|
||||||
const widget = @as(*c.GtkWidget, @ptrCast(self.gl_area));
|
const widget = @as(*c.GtkWidget, @ptrCast(self.gl_area));
|
||||||
if (c.gtk_widget_is_focus(widget) == 1) c.gtk_window_set_title(window.window, title.ptr);
|
if (c.gtk_widget_is_focus(widget) == 1) {
|
||||||
|
// Changing the title somehow unhides our cursor.
|
||||||
|
// https://github.com/ghostty-org/ghostty/issues/1419
|
||||||
|
// I don't know a way around this yet. I've tried re-hiding the
|
||||||
|
// cursor after setting the title but it doesn't work, I think
|
||||||
|
// due to some gtk event loop things...
|
||||||
|
c.gtk_window_set_title(window.window, title.ptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -803,8 +810,12 @@ pub fn setMouseShape(
|
|||||||
};
|
};
|
||||||
errdefer c.g_object_unref(cursor);
|
errdefer c.g_object_unref(cursor);
|
||||||
|
|
||||||
// Set our new cursor
|
// Set our new cursor. We only do this if the cursor we currently
|
||||||
c.gtk_widget_set_cursor(@ptrCast(self.gl_area), cursor);
|
// have is NOT set to "none" because setting the cursor causes it
|
||||||
|
// to become visible again.
|
||||||
|
if (c.gtk_widget_get_cursor(@ptrCast(self.gl_area)) != self.app.cursor_none) {
|
||||||
|
c.gtk_widget_set_cursor(@ptrCast(self.gl_area), cursor);
|
||||||
|
}
|
||||||
|
|
||||||
// Free our existing cursor
|
// Free our existing cursor
|
||||||
if (self.cursor) |old| c.g_object_unref(old);
|
if (self.cursor) |old| c.g_object_unref(old);
|
||||||
|
Reference in New Issue
Block a user