aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkj_sh6042026-05-30 01:32:27 -0400
committerkj_sh6042026-05-30 01:32:27 -0400
commite69af0e85dcff679440a4bac013444c54dc2ffc0 (patch)
tree5d49447963a08e660fe43038f7de22ec2742135f
parent354df320af5a54db66699aaed409f64bd235608f (diff)
parent8c6b8dc22a616d578824ae2033cbdd7c60063968 (diff)
merge: branch 'refactor/cursor-changes' into 'main'HEADmain
-rw-r--r--src/dapp.c66
1 files changed, 60 insertions, 6 deletions
diff --git a/src/dapp.c b/src/dapp.c
index a277d1d..90c266d 100644
--- a/src/dapp.c
+++ b/src/dapp.c
@@ -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();