X-Git-Url: http://git.tdb.fi/?p=pmount-gui.git;a=blobdiff_plain;f=main.c;h=dd6957dc22f3c41a723fea0c9ff12e7e6035c149;hp=541354870f1ab131bf13ccbdb69d1e6f8ec5b22d;hb=55a7d4e8fe6b4cc1d02637f19e7245afbcbdb41b;hpb=dff5596f969ef4c46dc943c094642934c54bb179 diff --git a/main.c b/main.c index 5413548..dd6957d 100644 --- a/main.c +++ b/main.c @@ -34,7 +34,9 @@ typedef struct sDevice typedef struct sGuiContext { int manager; + int autohide; Device *devices; + GtkWidget *window; GtkWidget *list; GtkWidget *button; char *post_mount_command; @@ -45,6 +47,7 @@ typedef struct sGuiContext } GuiContext; int verbosity = 0; +char **pmount_argv = NULL; /** Parses a string of the form name=value and places the components in a Property @@ -688,12 +691,31 @@ int toggle_device(Device *device, char *out_buf, int out_size) if(pid==0) { /* Child process */ + + /* Complete construction of pmount call */ + int last; + + pmount_argv[0] = "pmount"; + + last = 0; + while(pmount_argv[++last]); + + pmount_argv[last] = device->node; + pmount_argv[last+1] = mount_point+7; + pmount_argv[last+2] = NULL; + if(verbosity>=1) { if(umount) printf("Running pumount %s\n", device->node); else - printf("Running pmount %s %s\n", device->node, mount_point+7); + { + int i = 0; + printf("Running pmount"); + while(pmount_argv[++i]) + printf(" %s", pmount_argv[i]); + printf("\n"); + } } close(pipe_fd[0]); @@ -703,7 +725,7 @@ int toggle_device(Device *device, char *out_buf, int out_size) if(umount) execl("/usr/bin/pumount", "pumount", device->node, NULL); else - execl("/usr/bin/pmount", "pmount", device->node, mount_point+7, NULL); + execvp("/usr/bin/pmount", pmount_argv); _exit(1); } else if(pid<0) @@ -832,10 +854,19 @@ Handles an automatic refresh of the device list in response to inotify events. gboolean refresh_devices_idle(gpointer data) { GuiContext *context = (GuiContext *)data; + int n_listed; - refresh_devices(context, -1); + n_listed = refresh_devices(context, -1); context->refresh_pending = 0; + if(context->autohide) + { + if(n_listed) + gtk_widget_show_all(context->window); + else + gtk_widget_hide(context->window); + } + return FALSE; } @@ -993,19 +1024,19 @@ void show_help(void) { printf("pmount-gui\n" "Copyright (c) 2011-2015 Mikko Rasa, Mikkosoft Productions\n\n" - "Usage: pmount-gui [-v] [-u] [-r ] [-h]\n\n" + "Usage: pmount-gui [-v] [-u] [-r ] [-m|-M] [-h] [-- ]\n\n" "Options:\n" " -v Increase verbosity\n" " -u Unmount a device (default is mount)\n" " -r Run a command after mounting\n" " -m Start a persistent mount manager\n" + " -M Like -m, but hide the window if there are no devices\n" " -h Display this help\n"); } int main(int argc, char **argv) { GuiContext context; - GtkWidget *window; GtkWidget *box; GtkWidget *viewport; GtkListStore *store; @@ -1016,6 +1047,7 @@ int main(int argc, char **argv) int n_listed; context.manager = 0; + context.autohide = 0; context.devices = NULL; context.post_mount_command = NULL; context.inotify_fd = -1; @@ -1025,7 +1057,7 @@ int main(int argc, char **argv) gtk_init(&argc, &argv); - while((opt = getopt(argc, argv, "vur:mh"))!=-1) switch(opt) + while((opt = getopt(argc, argv, "vur:mMh"))!=-1) switch(opt) { case 'v': ++verbosity; @@ -1038,19 +1070,33 @@ int main(int argc, char **argv) break; case 'm': context.manager = 1; + context.autohide = 0; + break; + case 'M': + context.manager = 1; + context.autohide = 1; break; case 'h': show_help(); return 0; } - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_container_set_border_width(GTK_CONTAINER(window), 5); - g_signal_connect(window, "destroy", G_CALLBACK(>k_main_quit), NULL); - g_signal_connect(window, "key-press-event", G_CALLBACK(&key_press), NULL); + /* argc - optind equals to number of options after "--" */ + /* One empty element at the beginning is for program name for execvp */ + /* Three empty elements at the end are required options for pmount + NULL */ + + pmount_argv = malloc(sizeof(char *)*(argc-optind+4)); + + for(i=0; i<(argc-optind); ++i) + pmount_argv[i+1] = argv[optind+i]; + pmount_argv[argc-optind+1] = NULL; + + context.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width(GTK_CONTAINER(context.window), 5); + g_signal_connect(context.window, "destroy", G_CALLBACK(>k_main_quit), NULL); box = gtk_vbox_new(FALSE, 5); - gtk_container_add(GTK_CONTAINER(window), box); + gtk_container_add(GTK_CONTAINER(context.window), box); viewport = gtk_viewport_new(NULL, NULL); gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_IN); @@ -1096,6 +1142,8 @@ int main(int argc, char **argv) umount = -1; } + else + g_signal_connect(context.window, "key-press-event", G_CALLBACK(&key_press), NULL); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context.list)); g_signal_connect(selection, "changed", G_CALLBACK(&selection_changed), &context); @@ -1106,9 +1154,9 @@ int main(int argc, char **argv) n_listed = refresh_devices(&context, umount); - if(n_listed || context.manager) - gtk_widget_show_all(window); - else + if(n_listed || (context.manager && !context.autohide)) + gtk_widget_show_all(context.window); + else if(!context.manager) { GtkWidget *dialog; @@ -1125,5 +1173,7 @@ int main(int argc, char **argv) if(context.inotify_fd>=0) close(context.inotify_fd); + free(pmount_argv); + return 0; }