mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 08:46:08 +03:00
apprt/gtk: support set cursor shape
This commit is contained in:
@ -8,6 +8,7 @@ const glfw = @import("glfw");
|
|||||||
const apprt = @import("../apprt.zig");
|
const apprt = @import("../apprt.zig");
|
||||||
const font = @import("../font/main.zig");
|
const font = @import("../font/main.zig");
|
||||||
const input = @import("../input.zig");
|
const input = @import("../input.zig");
|
||||||
|
const terminal = @import("../terminal/main.zig");
|
||||||
const CoreApp = @import("../App.zig");
|
const CoreApp = @import("../App.zig");
|
||||||
const CoreSurface = @import("../Surface.zig");
|
const CoreSurface = @import("../Surface.zig");
|
||||||
const configpkg = @import("../config.zig");
|
const configpkg = @import("../config.zig");
|
||||||
@ -44,8 +45,8 @@ pub const App = struct {
|
|||||||
app: *c.GtkApplication,
|
app: *c.GtkApplication,
|
||||||
ctx: *c.GMainContext,
|
ctx: *c.GMainContext,
|
||||||
|
|
||||||
cursor_default: *c.GdkCursor,
|
/// Any active cursor we may have
|
||||||
cursor_ibeam: *c.GdkCursor,
|
cursor: ?*c.GdkCursor = null,
|
||||||
|
|
||||||
/// This is set to false when the main loop should exit.
|
/// This is set to false when the main loop should exit.
|
||||||
running: bool = true,
|
running: bool = true,
|
||||||
@ -125,19 +126,11 @@ pub const App = struct {
|
|||||||
// https://gitlab.gnome.org/GNOME/glib/-/blob/bd2ccc2f69ecfd78ca3f34ab59e42e2b462bad65/gio/gapplication.c#L2302
|
// https://gitlab.gnome.org/GNOME/glib/-/blob/bd2ccc2f69ecfd78ca3f34ab59e42e2b462bad65/gio/gapplication.c#L2302
|
||||||
c.g_application_activate(gapp);
|
c.g_application_activate(gapp);
|
||||||
|
|
||||||
// Get our cursors
|
|
||||||
const cursor_default = c.gdk_cursor_new_from_name("default", null).?;
|
|
||||||
errdefer c.g_object_unref(cursor_default);
|
|
||||||
const cursor_ibeam = c.gdk_cursor_new_from_name("text", cursor_default).?;
|
|
||||||
errdefer c.g_object_unref(cursor_ibeam);
|
|
||||||
|
|
||||||
return .{
|
return .{
|
||||||
.core_app = core_app,
|
.core_app = core_app,
|
||||||
.app = app,
|
.app = app,
|
||||||
.config = config,
|
.config = config,
|
||||||
.ctx = ctx,
|
.ctx = ctx,
|
||||||
.cursor_default = cursor_default,
|
|
||||||
.cursor_ibeam = cursor_ibeam,
|
|
||||||
|
|
||||||
// If we are NOT the primary instance, then we never want to run.
|
// If we are NOT the primary instance, then we never want to run.
|
||||||
// This means that another instance of the GTK app is running and
|
// This means that another instance of the GTK app is running and
|
||||||
@ -154,8 +147,7 @@ pub const App = struct {
|
|||||||
c.g_main_context_release(self.ctx);
|
c.g_main_context_release(self.ctx);
|
||||||
c.g_object_unref(self.app);
|
c.g_object_unref(self.app);
|
||||||
|
|
||||||
c.g_object_unref(self.cursor_ibeam);
|
if (self.cursor) |cursor| c.g_object_unref(cursor);
|
||||||
c.g_object_unref(self.cursor_default);
|
|
||||||
|
|
||||||
self.config.deinit();
|
self.config.deinit();
|
||||||
|
|
||||||
@ -998,6 +990,62 @@ pub const Surface = struct {
|
|||||||
// ));
|
// ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn setCursorShape(
|
||||||
|
self: *Surface,
|
||||||
|
shape: terminal.CursorShape,
|
||||||
|
) !void {
|
||||||
|
const name: [:0]const u8 = switch (shape) {
|
||||||
|
.default => "default",
|
||||||
|
.help => "help",
|
||||||
|
.pointer => "pointer",
|
||||||
|
.context_menu => "context-menu",
|
||||||
|
.progress => "progress",
|
||||||
|
.wait => "wait",
|
||||||
|
.cell => "cell",
|
||||||
|
.crosshair => "crosshair",
|
||||||
|
.text => "text",
|
||||||
|
.vertical_text => "vertical-text",
|
||||||
|
.alias => "alias",
|
||||||
|
.copy => "copy",
|
||||||
|
.no_drop => "no-drop",
|
||||||
|
.move => "move",
|
||||||
|
.not_allowed => "not-allowed",
|
||||||
|
.grab => "grab",
|
||||||
|
.grabbing => "grabbing",
|
||||||
|
.all_scroll => "all-scroll",
|
||||||
|
.col_resize => "col-resize",
|
||||||
|
.row_resize => "row-resize",
|
||||||
|
.n_resize => "n-resize",
|
||||||
|
.e_resize => "e-resize",
|
||||||
|
.s_resize => "s-resize",
|
||||||
|
.w_resize => "w-resize",
|
||||||
|
.ne_resize => "ne-resize",
|
||||||
|
.nw_resize => "nw-resize",
|
||||||
|
.se_resize => "se-resize",
|
||||||
|
.sw_resize => "sw-resize",
|
||||||
|
.ew_resize => "ew-resize",
|
||||||
|
.ns_resize => "ns-resize",
|
||||||
|
.nesw_resize => "nesw-resize",
|
||||||
|
.nwse_resize => "nwse-resize",
|
||||||
|
.zoom_in => "zoom-in",
|
||||||
|
.zoom_out => "zoom-out",
|
||||||
|
else => return,
|
||||||
|
};
|
||||||
|
|
||||||
|
const cursor = c.gdk_cursor_new_from_name(name.ptr, null) orelse {
|
||||||
|
log.warn("unsupported cursor name={s}", .{name});
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
errdefer c.g_object_unref(cursor);
|
||||||
|
|
||||||
|
// Set our new cursor
|
||||||
|
c.gtk_widget_set_cursor(@ptrCast(self.gl_area), cursor);
|
||||||
|
|
||||||
|
// Free our existing cursor
|
||||||
|
if (self.cursor) |old| c.g_object_unref(old);
|
||||||
|
self.cursor = cursor;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn getClipboardString(
|
pub fn getClipboardString(
|
||||||
self: *Surface,
|
self: *Surface,
|
||||||
clipboard_type: apprt.Clipboard,
|
clipboard_type: apprt.Clipboard,
|
||||||
|
Reference in New Issue
Block a user