diff options
| author | kj_sh604 | 2026-05-30 00:52:10 -0400 |
|---|---|---|
| committer | kj_sh604 | 2026-05-30 00:52:10 -0400 |
| commit | 8c6b8dc22a616d578824ae2033cbdd7c60063968 (patch) | |
| tree | 5d49447963a08e660fe43038f7de22ec2742135f | |
| parent | 354df320af5a54db66699aaed409f64bd235608f (diff) | |
refactor: try to force hand cursor for selectionrefactor/cursor-changes
| -rw-r--r-- | src/dapp.c | 66 |
1 files changed, 60 insertions, 6 deletions
@@ -19,6 +19,8 @@ typedef struct { typedef struct { GPtrArray *entries; GHashTable *seen_paths; + GdkCursor *cursor_default; + GdkCursor *cursor_hand; GtkWidget *window; GtkWidget *list; GtkWidget *status_label; @@ -46,6 +48,9 @@ static void launcher_state_cleanup(LauncherState *state) { g_hash_table_destroy(state->seen_paths); state->seen_paths = NULL; } + + g_clear_object(&state->cursor_default); + g_clear_object(&state->cursor_hand); } static void app_entry_free(gpointer data) { @@ -323,6 +328,51 @@ static void set_status(LauncherState *state, const char *message) { gtk_label_set_text(GTK_LABEL(state->status_label), message != NULL ? message : ""); } +// nav: cursor helpers +static void initialize_cursors(LauncherState *state) { + GdkDisplay *display = NULL; + + if (state == NULL) { + return; + } + + display = gdk_display_get_default(); + if (display == NULL) { + return; + } + + state->cursor_default = gdk_cursor_new_from_name(display, "default"); + if (state->cursor_default == NULL) { + state->cursor_default = gdk_cursor_new_from_name(display, "left_ptr"); + } + + state->cursor_hand = gdk_cursor_new_from_name(display, "pointer"); + if (state->cursor_hand == NULL) { + state->cursor_hand = gdk_cursor_new_from_name(display, "hand2"); + } +} + +static void set_list_cursor(LauncherState *state, gboolean use_hand) { + GdkWindow *window = NULL; + GdkCursor *cursor = NULL; + + if (state == NULL || state->list == NULL) { + return; + } + + if (!gtk_widget_get_realized(state->list)) { + return; + } + + window = gtk_widget_get_window(state->list); + if (window == NULL) { + return; + } + + cursor = use_hand ? state->cursor_hand : state->cursor_default; + gdk_window_set_cursor(window, cursor); +} + static void launch_entry(LauncherState *state, AppEntry *entry) { GError *error = NULL; @@ -380,6 +430,7 @@ static void move_selection(LauncherState *state, gint delta) { if (next_row != NULL) { gtk_list_box_select_row(list, next_row); gtk_widget_grab_focus(GTK_WIDGET(list)); + set_list_cursor(state, TRUE); } } @@ -431,11 +482,10 @@ static void on_row_activated(GtkListBox *box, GtkListBoxRow *row, gpointer user_ static gboolean on_list_motion(GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { GtkListBox *list = GTK_LIST_BOX(widget); + LauncherState *state = (LauncherState *)user_data; GtkListBoxRow *row = NULL; GtkListBoxRow *current = NULL; - (void)user_data; - row = gtk_list_box_get_row_at_y(list, (gint)event->y); current = gtk_list_box_get_selected_row(list); @@ -443,16 +493,18 @@ static gboolean on_list_motion(GtkWidget *widget, GdkEventMotion *event, gpointe gtk_list_box_select_row(list, row); } + set_list_cursor(state, row != NULL); + return FALSE; } static gboolean on_list_leave(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data) { GtkListBox *list = GTK_LIST_BOX(widget); - - (void)user_data; + LauncherState *state = (LauncherState *)user_data; if (event->detail != GDK_NOTIFY_INFERIOR) { gtk_list_box_unselect_all(list); + set_list_cursor(state, FALSE); } (void)event; @@ -596,6 +648,7 @@ int main(int argc, char **argv) { } gtk_init(&argc, &argv); + initialize_cursors(&state); apply_css(); state.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -628,8 +681,8 @@ int main(int argc, char **argv) { gtk_list_box_set_selection_mode(GTK_LIST_BOX(state.list), GTK_SELECTION_SINGLE); gtk_widget_add_events(state.list, GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(state.list, "row-activated", G_CALLBACK(on_row_activated), &state); - g_signal_connect(state.list, "motion-notify-event", G_CALLBACK(on_list_motion), NULL); - g_signal_connect(state.list, "leave-notify-event", G_CALLBACK(on_list_leave), NULL); + g_signal_connect(state.list, "motion-notify-event", G_CALLBACK(on_list_motion), &state); + g_signal_connect(state.list, "leave-notify-event", G_CALLBACK(on_list_leave), &state); for (i = 0; i < state.entries->len; i++) { AppEntry *entry = (AppEntry *)g_ptr_array_index(state.entries, i); @@ -646,6 +699,7 @@ int main(int argc, char **argv) { gtk_container_add(GTK_CONTAINER(state.window), root); gtk_widget_show_all(state.window); + set_list_cursor(&state, FALSE); gtk_main(); |
