From d47e3a455da66cc7b39419e3b8923aa146941ede Mon Sep 17 00:00:00 2001 From: DevHyperCoder Date: Mon, 30 May 2022 09:26:29 +0530 Subject: [PATCH 1/5] add individual exit option --- dragon.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/dragon.c b/dragon.c index cf2ecf4..ae3bac0 100644 --- a/dragon.c +++ b/dragon.c @@ -36,6 +36,7 @@ bool verbose = false; int mode = 0; int thumb_size = 96; bool and_exit; +bool individual_exit; // TODO docs ; man bool keep; bool print_path = false; bool icons_only = false; @@ -67,6 +68,7 @@ GtkWidget *all_button; // --- void add_target_button(); +GtkWidget* find_child(GtkWidget* parent, const gchar* name); void do_quit(GtkWidget *widget, gpointer data) { exit(0); @@ -115,6 +117,8 @@ void drag_data_get(GtkWidget *widget, } void drag_end(GtkWidget *widget, GdkDragContext *context, gpointer user_data) { + uri_count--; + struct draggable_thing *dd = (struct draggable_thing *)user_data; if (verbose) { gboolean succeeded = gdk_drag_drop_succeeded(context); GdkDragAction action = gdk_drag_context_get_selected_action (context); @@ -137,10 +141,58 @@ void drag_end(GtkWidget *widget, GdkDragContext *context, gpointer user_data) { if (action_str[0] == 'i') free(action_str); } - if (and_exit) + + if (and_exit){ gtk_main_quit(); + } + + if(individual_exit) { + if (uri_count == 0) { + gtk_main_quit(); + return; + } + + GtkWidget* button = find_child(vbox,dd->text); + if(button != NULL) { + gtk_container_remove(GTK_CONTAINER(vbox), button); + } else { + fprintf(stderr, "Could not find button with label: %s",dd->text); + } + } } +// https://stackoverflow.com/a/23497087 + GtkWidget* + find_child(GtkWidget* parent, const gchar* name) + { + + if (GTK_IS_BUTTON(parent)) { + + if (g_ascii_strcasecmp(gtk_button_get_label(GTK_BUTTON(parent)), (gchar*)name) == 0) { + return parent; + } + } + + if (GTK_IS_BIN(parent)) { + GtkWidget *child = gtk_bin_get_child(GTK_BIN(parent)); + return find_child(child, name); + } + + if (GTK_IS_CONTAINER(parent)) { + GList *children = gtk_container_get_children(GTK_CONTAINER(parent)); + do { + GtkWidget* widget = find_child(children->data, name); + if (widget != NULL) { + return widget; + } + } + while ((children = g_list_next(children)) != NULL); + + } + + return NULL; + } + void add_uri(char *uri) { if (uri_count < MAX_SIZE) { uri_collection[uri_count] = uri; @@ -151,6 +203,7 @@ void add_uri(char *uri) { } GtkButton *add_button(char *label, struct draggable_thing *dragdata, int type) { + GtkWidget *button; if (icons_only) { @@ -486,6 +539,9 @@ int main (int argc, char **argv) { } else if (strcmp(argv[i], "-x") == 0 || strcmp(argv[i], "--and-exit") == 0) { and_exit = true; + } else if (strcmp(argv[i], "-X") == 0 + || strcmp(argv[i], "--individual-exit") == 0) { + individual_exit = true; } else if (strcmp(argv[i], "-k") == 0 || strcmp(argv[i], "--keep") == 0) { keep = true; From 6d453e89ea01f3a52724abd9f1a085039431df73 Mon Sep 17 00:00:00 2001 From: DevHyperCoder Date: Mon, 30 May 2022 09:27:11 +0530 Subject: [PATCH 2/5] Add clangd files to .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 8e045db..ad88ed2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ dragon + +# clangd +compile_commands.json +.cache/ From 4af8dd9423096e6019c60f20de469d27683e7d2e Mon Sep 17 00:00:00 2001 From: DevHyperCoder Date: Mon, 30 May 2022 09:42:16 +0530 Subject: [PATCH 3/5] Update manpage --- dragon.1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dragon.1 b/dragon.1 index 31bcfb1..4b9d30f 100644 --- a/dragon.1 +++ b/dragon.1 @@ -32,6 +32,9 @@ to drag out or drop files into, instead. .B -x --and-exit exit after a single completed drop. .TP +.B -X --individual-exit +exit after all items are dropped off. (Use with multiple files) +.TP .B -t --target act as a target instead of source. .TP From aeb75d5521e47f8145b5e473da6910029c09a3bf Mon Sep 17 00:00:00 2001 From: DevHyperCoder Date: Sun, 5 Jun 2022 21:52:33 +0530 Subject: [PATCH 4/5] Refactor to quit_mode enum --- dragon.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dragon.c b/dragon.c index ae3bac0..51b930c 100644 --- a/dragon.c +++ b/dragon.c @@ -35,13 +35,13 @@ char *progname; bool verbose = false; int mode = 0; int thumb_size = 96; -bool and_exit; -bool individual_exit; // TODO docs ; man bool keep; bool print_path = false; bool icons_only = false; bool always_on_top = false; +static enum { QUIT_NONE, QUIT_ALL, QUIT_ITEM } quit_mode; + static char *stdin_files; #define MODE_HELP 1 @@ -142,11 +142,11 @@ void drag_end(GtkWidget *widget, GdkDragContext *context, gpointer user_data) { free(action_str); } - if (and_exit){ + if (quit_mode == QUIT_ALL){ gtk_main_quit(); } - if(individual_exit) { + if(quit_mode == QUIT_ITEM) { if (uri_count == 0) { gtk_main_quit(); return; @@ -412,7 +412,7 @@ drag_data_received (GtkWidget *widget, } else if (verbose) fputs("Received nothing\n", stderr); gtk_drag_finish (context, TRUE, FALSE, time); - if (and_exit) + if (quit_mode == QUIT_ALL) gtk_main_quit(); } @@ -538,10 +538,10 @@ int main (int argc, char **argv) { mode = MODE_TARGET; } else if (strcmp(argv[i], "-x") == 0 || strcmp(argv[i], "--and-exit") == 0) { - and_exit = true; + quit_mode = QUIT_ALL; } else if (strcmp(argv[i], "-X") == 0 || strcmp(argv[i], "--individual-exit") == 0) { - individual_exit = true; + quit_mode = QUIT_ITEM; } else if (strcmp(argv[i], "-k") == 0 || strcmp(argv[i], "--keep") == 0) { keep = true; From 9c5f7087149e6d2692f49254de44cf9b594c5656 Mon Sep 17 00:00:00 2001 From: DevHyperCoder Date: Sun, 5 Jun 2022 21:56:25 +0530 Subject: [PATCH 5/5] Format --- dragon.c | 49 ++++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/dragon.c b/dragon.c index 51b930c..b4f731f 100644 --- a/dragon.c +++ b/dragon.c @@ -146,14 +146,14 @@ void drag_end(GtkWidget *widget, GdkDragContext *context, gpointer user_data) { gtk_main_quit(); } - if(quit_mode == QUIT_ITEM) { + if (quit_mode == QUIT_ITEM) { if (uri_count == 0) { gtk_main_quit(); return; } GtkWidget* button = find_child(vbox,dd->text); - if(button != NULL) { + if (button != NULL) { gtk_container_remove(GTK_CONTAINER(vbox), button); } else { fprintf(stderr, "Could not find button with label: %s",dd->text); @@ -162,37 +162,32 @@ void drag_end(GtkWidget *widget, GdkDragContext *context, gpointer user_data) { } // https://stackoverflow.com/a/23497087 - GtkWidget* - find_child(GtkWidget* parent, const gchar* name) - { - - if (GTK_IS_BUTTON(parent)) { - - if (g_ascii_strcasecmp(gtk_button_get_label(GTK_BUTTON(parent)), (gchar*)name) == 0) { - return parent; - } +GtkWidget* find_child(GtkWidget* parent, const gchar* name) { + if (GTK_IS_BUTTON(parent)) { + if (g_ascii_strcasecmp(gtk_button_get_label(GTK_BUTTON(parent)), (gchar*)name) == 0) { + return parent; } + } - if (GTK_IS_BIN(parent)) { - GtkWidget *child = gtk_bin_get_child(GTK_BIN(parent)); - return find_child(child, name); - } + if (GTK_IS_BIN(parent)) { + GtkWidget *child = gtk_bin_get_child(GTK_BIN(parent)); + return find_child(child, name); + } - if (GTK_IS_CONTAINER(parent)) { - GList *children = gtk_container_get_children(GTK_CONTAINER(parent)); - do { - GtkWidget* widget = find_child(children->data, name); - if (widget != NULL) { - return widget; - } - } - while ((children = g_list_next(children)) != NULL); - + if (GTK_IS_CONTAINER(parent)) { + GList *children = gtk_container_get_children(GTK_CONTAINER(parent)); + do { + GtkWidget* widget = find_child(children->data, name); + if (widget != NULL) { + return widget; } - - return NULL; + } while ((children = g_list_next(children)) != NULL); + } + return NULL; +} + void add_uri(char *uri) { if (uri_count < MAX_SIZE) { uri_collection[uri_count] = uri;