Mercurial > geeqie.yaz
changeset 649:3097880d7d95
Move all remote stuff from main.c to remote.[ch].
author | zas_ |
---|---|
date | Tue, 13 May 2008 08:53:26 +0000 |
parents | e34c1002e553 |
children | 02e2c135ee0c |
files | src/main.c src/remote.c src/remote.h |
diffstat | 3 files changed, 528 insertions(+), 494 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main.c Tue May 13 08:02:46 2008 +0000 +++ b/src/main.c Tue May 13 08:53:26 2008 +0000 @@ -48,7 +48,6 @@ static RemoteConnection *remote_connection = NULL; -static CollectionData *command_collection = NULL; /* @@ -128,485 +127,6 @@ } -/* - *----------------------------------------------------------------------------- - * remote functions - *----------------------------------------------------------------------------- - */ - -static void gr_image_next(const gchar *text, gpointer data) -{ - layout_image_next(NULL); -} - -static void gr_image_prev(const gchar *text, gpointer data) -{ - layout_image_prev(NULL); -} - -static void gr_image_first(const gchar *text, gpointer data) -{ - layout_image_first(NULL); -} - -static void gr_image_last(const gchar *text, gpointer data) -{ - layout_image_last(NULL); -} - -static void gr_fullscreen_toggle(const gchar *text, gpointer data) -{ - layout_image_full_screen_toggle(NULL); -} - -static void gr_fullscreen_start(const gchar *text, gpointer data) -{ - layout_image_full_screen_start(NULL); -} - -static void gr_fullscreen_stop(const gchar *text, gpointer data) -{ - layout_image_full_screen_stop(NULL); -} - -static void gr_slideshow_start_rec(const gchar *text, gpointer data) -{ - GList *list; - - list = filelist_recursive(text); - if (!list) return; -//printf("length: %d\n", g_list_length(list)); - layout_image_slideshow_stop(NULL); - layout_image_slideshow_start_from_list(NULL, list); -} - -static void gr_slideshow_toggle(const gchar *text, gpointer data) -{ - layout_image_slideshow_toggle(NULL); -} - -static void gr_slideshow_start(const gchar *text, gpointer data) -{ - layout_image_slideshow_start(NULL); -} - -static void gr_slideshow_stop(const gchar *text, gpointer data) -{ - layout_image_slideshow_stop(NULL); -} - -static void gr_slideshow_delay(const gchar *text, gpointer data) -{ - gdouble n; - - n = strtod(text, NULL); - if (n < SLIDESHOW_MIN_SECONDS || n > SLIDESHOW_MAX_SECONDS) - { - printf_term("Remote slideshow delay out of range (%.1f to %.1f)\n", - SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS); - return; - } - options->slideshow.delay = (gint)(n * 10.0 + 0.01); -} - -static void gr_tools_show(const gchar *text, gpointer data) -{ - gint popped; - gint hidden; - - if (layout_tools_float_get(NULL, &popped, &hidden) && hidden) - { - layout_tools_float_set(NULL, popped, FALSE); - } -} - -static void gr_tools_hide(const gchar *text, gpointer data) -{ - gint popped; - gint hidden; - - if (layout_tools_float_get(NULL, &popped, &hidden) && !hidden) - { - layout_tools_float_set(NULL, popped, TRUE); - } -} - -static gint gr_quit_idle_cb(gpointer data) -{ - exit_program(); - - return FALSE; -} - -static void gr_quit(const gchar *text, gpointer data) -{ - /* schedule exit when idle, if done from within a - * remote handler remote_close will crash - */ - g_idle_add(gr_quit_idle_cb, NULL); -} - -static void gr_file_load(const gchar *text, gpointer data) -{ - if (isfile(text)) - { - if (file_extension_match(text, ".gqv")) - { - collection_window_new(text); - } - else - { - layout_set_path(NULL, text); - } - } - else if (isdir(text)) - { - layout_set_path(NULL, text); - } - else - { - printf("remote sent filename that does not exist:\"%s\"\n", text); - } -} - -static void gr_file_view(const gchar *text, gpointer data) -{ - view_window_new(file_data_new_simple(text)); -} - -static void gr_list_clear(const gchar *text, gpointer data) -{ - if (command_collection) collection_unref(command_collection); - command_collection = NULL; -} - -static void gr_list_add(const gchar *text, gpointer data) -{ - gint new = TRUE; - - if (!command_collection) - { - CollectionData *cd; - - cd = collection_new(""); - - g_free(cd->path); - cd->path = NULL; - g_free(cd->name); - cd->name = g_strdup(_("Command line")); - - command_collection = cd; - } - else - { - new = (!collection_get_first(command_collection)); - } - - if (collection_add(command_collection, file_data_new_simple(text), FALSE) && new) - { - layout_image_set_collection(NULL, command_collection, - collection_get_first(command_collection)); - } -} - -static void gr_raise(const gchar *text, gpointer data) -{ - LayoutWindow *lw = NULL; - - if (layout_valid(&lw)) - { - gtk_window_present(GTK_WINDOW(lw->window)); - } -} - -typedef struct _RemoteCommandEntry RemoteCommandEntry; -struct _RemoteCommandEntry { - gchar *opt_s; - gchar *opt_l; - void (*func)(const gchar *text, gpointer data); - gint needs_extra; - gint prefer_command_line; - gchar *description; -}; - -static RemoteCommandEntry remote_commands[] = { - /* short, long callback, extra, prefer,description */ - { "-n", "--next", gr_image_next, FALSE, FALSE, N_("next image") }, - { "-b", "--back", gr_image_prev, FALSE, FALSE, N_("previous image") }, - { NULL, "--first", gr_image_first, FALSE, FALSE, N_("first image") }, - { NULL, "--last", gr_image_last, FALSE, FALSE, N_("last image") }, - { "-f", "--fullscreen", gr_fullscreen_toggle, FALSE, TRUE, N_("toggle full screen") }, - { "-fs","--fullscreen-start", gr_fullscreen_start, FALSE, FALSE, N_("start full screen") }, - { "-fS","--fullscreen-stop", gr_fullscreen_stop, FALSE, FALSE, N_("stop full screen") }, - { "-s", "--slideshow", gr_slideshow_toggle, FALSE, TRUE, N_("toggle slide show") }, - { "-ss","--slideshow-start", gr_slideshow_start, FALSE, FALSE, N_("start slide show") }, - { "-sS","--slideshow-stop", gr_slideshow_stop, FALSE, FALSE, N_("stop slide show") }, - { "-sr","--slideshow-recurse", gr_slideshow_start_rec, TRUE, FALSE, N_("start recursive slide show") }, - { "-d", "--delay=", gr_slideshow_delay, TRUE, FALSE, N_("set slide show delay in seconds") }, - { "+t", "--tools-show", gr_tools_show, FALSE, TRUE, N_("show tools") }, - { "-t", "--tools-hide", gr_tools_hide, FALSE, TRUE, N_("hide tools") }, - { "-q", "--quit", gr_quit, FALSE, FALSE, N_("quit") }, - { NULL, "file:", gr_file_load, TRUE, FALSE, N_("open file") }, - { NULL, "view:", gr_file_view, TRUE, FALSE, N_("open file in new window") }, - { NULL, "--list-clear", gr_list_clear, FALSE, FALSE, NULL }, - { NULL, "--list-add:", gr_list_add, TRUE, FALSE, NULL }, - { NULL, "raise", gr_raise, FALSE, FALSE, NULL }, - { NULL, NULL, NULL, FALSE, FALSE, NULL } -}; - -static RemoteCommandEntry *remote_command_find(const gchar *text, const gchar **offset) -{ - gint match = FALSE; - gint i; - - i = 0; - while (!match && remote_commands[i].func != NULL) - { - if (remote_commands[i].needs_extra) - { - if (remote_commands[i].opt_s && - strncmp(remote_commands[i].opt_s, text, strlen(remote_commands[i].opt_s)) == 0) - { - if (offset) *offset = text + strlen(remote_commands[i].opt_s); - return &remote_commands[i]; - } - else if (remote_commands[i].opt_l && - strncmp(remote_commands[i].opt_l, text, strlen(remote_commands[i].opt_l)) == 0) - { - if (offset) *offset = text + strlen(remote_commands[i].opt_l); - return &remote_commands[i]; - } - } - else - { - if ((remote_commands[i].opt_s && strcmp(remote_commands[i].opt_s, text) == 0) || - (remote_commands[i].opt_l && strcmp(remote_commands[i].opt_l, text) == 0)) - { - if (offset) *offset = text; - return &remote_commands[i]; - } - } - - i++; - } - - return NULL; -} - -static void remote_cb(RemoteConnection *rc, const gchar *text, gpointer data) -{ - RemoteCommandEntry *entry; - const gchar *offset; - - entry = remote_command_find(text, &offset); - if (entry && entry->func) - { - entry->func(offset, data); - } - else - { - printf("unknown remote command:%s\n", text); - } -} - -static void remote_help(void) -{ - gint i; - - print_term(_("Remote command list:\n")); - - i = 0; - while (remote_commands[i].func != NULL) - { - if (remote_commands[i].description) - { - printf_term(" %-3s%s %-20s %s\n", - (remote_commands[i].opt_s) ? remote_commands[i].opt_s : "", - (remote_commands[i].opt_s && remote_commands[i].opt_l) ? "," : " ", - (remote_commands[i].opt_l) ? remote_commands[i].opt_l : "", - _(remote_commands[i].description)); - } - i++; - } -} - -static GList *remote_build_list(GList *list, int argc, char *argv[]) -{ - gint i; - - i = 1; - while (i < argc) - { - RemoteCommandEntry *entry; - - entry = remote_command_find(argv[i], NULL); - if (entry) - { - list = g_list_append(list, argv[i]); - } - i++; - } - - return list; -} - -static void remote_control(const gchar *arg_exec, GList *remote_list, const gchar *path, - GList *cmd_list, GList *collection_list) -{ - RemoteConnection *rc; - gint started = FALSE; - gchar *buf; - - buf = g_strconcat(homedir(), "/", GQ_RC_DIR, "/.command", NULL); - rc = remote_client_open(buf); - if (!rc) - { - GString *command; - GList *work; - gint retry_count = 12; - gint blank = FALSE; - - printf_term(_("Remote %s not running, starting..."), GQ_APPNAME); - - command = g_string_new(arg_exec); - - work = remote_list; - while (work) - { - gchar *text; - RemoteCommandEntry *entry; - - text = work->data; - work = work->next; - - entry = remote_command_find(text, NULL); - if (entry) - { - if (entry->prefer_command_line) - { - remote_list = g_list_remove(remote_list, text); - g_string_append(command, " "); - g_string_append(command, text); - } - if (entry->opt_l && strcmp(entry->opt_l, "file:") == 0) - { - blank = TRUE; - } - } - } - - if (blank || cmd_list || path) g_string_append(command, " --blank"); - if (get_debug_level()) g_string_append(command, " --debug"); - - g_string_append(command, " &"); - system(command->str); - g_string_free(command, TRUE); - - while (!rc && retry_count > 0) - { - usleep((retry_count > 10) ? 500000 : 1000000); - rc = remote_client_open(buf); - if (!rc) print_term("."); - retry_count--; - } - - print_term("\n"); - - started = TRUE; - } - g_free(buf); - - if (rc) - { - GList *work; - const gchar *prefix; - gint use_path = TRUE; - gint sent = FALSE; - - work = remote_list; - while (work) - { - gchar *text; - RemoteCommandEntry *entry; - - text = work->data; - work = work->next; - - entry = remote_command_find(text, NULL); - if (entry && - entry->opt_l && - strcmp(entry->opt_l, "file:") == 0) use_path = FALSE; - - remote_client_send(rc, text); - - sent = TRUE; - } - - if (cmd_list && cmd_list->next) - { - prefix = "--list-add:"; - remote_client_send(rc, "--list-clear"); - } - else - { - prefix = "file:"; - } - - work = cmd_list; - while (work) - { - FileData *fd; - gchar *text; - - fd = work->data; - work = work->next; - - text = g_strconcat(prefix, fd->path, NULL); - remote_client_send(rc, text); - g_free(text); - - sent = TRUE; - } - - if (path && !cmd_list && use_path) - { - gchar *text; - - text = g_strdup_printf("file:%s", path); - remote_client_send(rc, text); - g_free(text); - - sent = TRUE; - } - - work = collection_list; - while (work) - { - const gchar *name; - gchar *text; - - name = work->data; - work = work->next; - - text = g_strdup_printf("file:%s", name); - remote_client_send(rc, text); - g_free(text); - - sent = TRUE; - } - - if (!started && !sent) - { - remote_client_send(rc, "raise"); - } - } - else - { - print_term(_("Remote not available\n")); - } - - _exit(0); -} /* *----------------------------------------------------------------------------- @@ -1126,6 +646,7 @@ gchar *geometry = NULL; gchar *buf; gchar *bufl; + CollectionData *cd = NULL; /* init execution time counter (debug only) */ init_exec_time(); @@ -1227,7 +748,6 @@ if (cmd_list || (startup_command_line_collection && collection_list)) { - CollectionData *cd; GList *work; if (startup_command_line_collection) @@ -1240,7 +760,6 @@ else { cd = collection_new(""); /* if we pass NULL, untitled counter is falsely increm. */ - command_collection = cd; } g_free(cd->path); @@ -1303,8 +822,7 @@ if (startup_in_slideshow) layout_image_slideshow_start(lw); buf = g_strconcat(homedir(), "/", GQ_RC_DIR, "/.command", NULL); - remote_connection = remote_server_open(buf); - remote_server_subscribe(remote_connection, remote_cb, NULL); + remote_connection = remote_server_init(buf, cd); g_free(buf); gtk_main();
--- a/src/remote.c Tue May 13 08:02:46 2008 +0000 +++ b/src/remote.c Tue May 13 08:53:26 2008 +0000 @@ -14,7 +14,14 @@ #include "main.h" #include "remote.h" +#include "collect.h" #include "debug.h" +#include "filedata.h" +#include "img-view.h" +#include "layout.h" +#include "layout_image.h" +#include "slideshow.h" +#include "ui_fileops.h" #include <sys/types.h> #include <sys/socket.h> @@ -33,6 +40,10 @@ #endif +static RemoteConnection *remote_client_open(const gchar *path); +static gint remote_client_send(RemoteConnection *rc, const gchar *text); + + typedef struct _RemoteClient RemoteClient; struct _RemoteClient { gint fd; @@ -40,6 +51,11 @@ RemoteConnection *rc; }; +typedef struct _RemoteData RemoteData; +struct _RemoteData { + CollectionData *command_collection; +}; + static gboolean remote_server_client_cb(GIOChannel *source, GIOCondition condition, gpointer data) { @@ -181,7 +197,7 @@ return FALSE; } -RemoteConnection *remote_server_open(const gchar *path) +static RemoteConnection *remote_server_open(const gchar *path) { RemoteConnection *rc; struct sockaddr_un addr; @@ -227,7 +243,7 @@ return rc; } -void remote_server_subscribe(RemoteConnection *rc, RemoteReadFunc *func, gpointer data) +static void remote_server_subscribe(RemoteConnection *rc, RemoteReadFunc *func, gpointer data) { if (!rc || !rc->server) return; @@ -236,7 +252,7 @@ } -RemoteConnection *remote_client_open(const gchar *path) +static RemoteConnection *remote_client_open(const gchar *path) { RemoteConnection *rc; struct stat st; @@ -277,7 +293,7 @@ sigpipe_occured = TRUE; } -gint remote_client_send(RemoteConnection *rc, const gchar *text) +static gint remote_client_send(RemoteConnection *rc, const gchar *text) { struct sigaction new_action, old_action; gint ret = FALSE; @@ -330,8 +346,508 @@ unlink(rc->path); } + if (rc->read_data) + g_free(rc->read_data); + close(rc->fd); g_free(rc->path); g_free(rc); } + +/* + *----------------------------------------------------------------------------- + * remote functions + *----------------------------------------------------------------------------- + */ + +static void gr_image_next(const gchar *text, gpointer data) +{ + layout_image_next(NULL); +} + +static void gr_image_prev(const gchar *text, gpointer data) +{ + layout_image_prev(NULL); +} + +static void gr_image_first(const gchar *text, gpointer data) +{ + layout_image_first(NULL); +} + +static void gr_image_last(const gchar *text, gpointer data) +{ + layout_image_last(NULL); +} + +static void gr_fullscreen_toggle(const gchar *text, gpointer data) +{ + layout_image_full_screen_toggle(NULL); +} + +static void gr_fullscreen_start(const gchar *text, gpointer data) +{ + layout_image_full_screen_start(NULL); +} + +static void gr_fullscreen_stop(const gchar *text, gpointer data) +{ + layout_image_full_screen_stop(NULL); +} + +static void gr_slideshow_start_rec(const gchar *text, gpointer data) +{ + GList *list; + + list = filelist_recursive(text); + if (!list) return; +//printf("length: %d\n", g_list_length(list)); + layout_image_slideshow_stop(NULL); + layout_image_slideshow_start_from_list(NULL, list); +} + +static void gr_slideshow_toggle(const gchar *text, gpointer data) +{ + layout_image_slideshow_toggle(NULL); +} + +static void gr_slideshow_start(const gchar *text, gpointer data) +{ + layout_image_slideshow_start(NULL); +} + +static void gr_slideshow_stop(const gchar *text, gpointer data) +{ + layout_image_slideshow_stop(NULL); +} + +static void gr_slideshow_delay(const gchar *text, gpointer data) +{ + gdouble n; + + n = strtod(text, NULL); + if (n < SLIDESHOW_MIN_SECONDS || n > SLIDESHOW_MAX_SECONDS) + { + printf_term("Remote slideshow delay out of range (%.1f to %.1f)\n", + SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS); + return; + } + options->slideshow.delay = (gint)(n * 10.0 + 0.01); +} + +static void gr_tools_show(const gchar *text, gpointer data) +{ + gint popped; + gint hidden; + + if (layout_tools_float_get(NULL, &popped, &hidden) && hidden) + { + layout_tools_float_set(NULL, popped, FALSE); + } +} + +static void gr_tools_hide(const gchar *text, gpointer data) +{ + gint popped; + gint hidden; + + if (layout_tools_float_get(NULL, &popped, &hidden) && !hidden) + { + layout_tools_float_set(NULL, popped, TRUE); + } +} + +static gint gr_quit_idle_cb(gpointer data) +{ + exit_program(); + + return FALSE; +} + +static void gr_quit(const gchar *text, gpointer data) +{ + /* schedule exit when idle, if done from within a + * remote handler remote_close will crash + */ + g_idle_add(gr_quit_idle_cb, NULL); +} + +static void gr_file_load(const gchar *text, gpointer data) +{ + if (isfile(text)) + { + if (file_extension_match(text, ".gqv")) + { + collection_window_new(text); + } + else + { + layout_set_path(NULL, text); + } + } + else if (isdir(text)) + { + layout_set_path(NULL, text); + } + else + { + printf("remote sent filename that does not exist:\"%s\"\n", text); + } +} + +static void gr_file_view(const gchar *text, gpointer data) +{ + view_window_new(file_data_new_simple(text)); +} + +static void gr_list_clear(const gchar *text, gpointer data) +{ + RemoteData *remote_data = data; + + if (remote_data->command_collection) + { + collection_unref(remote_data->command_collection); + remote_data->command_collection = NULL; + } +} + +static void gr_list_add(const gchar *text, gpointer data) +{ + RemoteData *remote_data = data; + gint new = TRUE; + + if (!remote_data->command_collection) + { + CollectionData *cd; + + cd = collection_new(""); + + g_free(cd->path); + cd->path = NULL; + g_free(cd->name); + cd->name = g_strdup(_("Command line")); + + remote_data->command_collection = cd; + } + else + { + new = (!collection_get_first(remote_data->command_collection)); + } + + if (collection_add(remote_data->command_collection, file_data_new_simple(text), FALSE) && new) + { + layout_image_set_collection(NULL, remote_data->command_collection, + collection_get_first(remote_data->command_collection)); + } +} + +static void gr_raise(const gchar *text, gpointer data) +{ + LayoutWindow *lw = NULL; + + if (layout_valid(&lw)) + { + gtk_window_present(GTK_WINDOW(lw->window)); + } +} + +typedef struct _RemoteCommandEntry RemoteCommandEntry; +struct _RemoteCommandEntry { + gchar *opt_s; + gchar *opt_l; + void (*func)(const gchar *text, gpointer data); + gint needs_extra; + gint prefer_command_line; + gchar *description; +}; + +static RemoteCommandEntry remote_commands[] = { + /* short, long callback, extra, prefer,description */ + { "-n", "--next", gr_image_next, FALSE, FALSE, N_("next image") }, + { "-b", "--back", gr_image_prev, FALSE, FALSE, N_("previous image") }, + { NULL, "--first", gr_image_first, FALSE, FALSE, N_("first image") }, + { NULL, "--last", gr_image_last, FALSE, FALSE, N_("last image") }, + { "-f", "--fullscreen", gr_fullscreen_toggle, FALSE, TRUE, N_("toggle full screen") }, + { "-fs","--fullscreen-start", gr_fullscreen_start, FALSE, FALSE, N_("start full screen") }, + { "-fS","--fullscreen-stop", gr_fullscreen_stop, FALSE, FALSE, N_("stop full screen") }, + { "-s", "--slideshow", gr_slideshow_toggle, FALSE, TRUE, N_("toggle slide show") }, + { "-ss","--slideshow-start", gr_slideshow_start, FALSE, FALSE, N_("start slide show") }, + { "-sS","--slideshow-stop", gr_slideshow_stop, FALSE, FALSE, N_("stop slide show") }, + { "-sr","--slideshow-recurse", gr_slideshow_start_rec, TRUE, FALSE, N_("start recursive slide show") }, + { "-d", "--delay=", gr_slideshow_delay, TRUE, FALSE, N_("set slide show delay in seconds") }, + { "+t", "--tools-show", gr_tools_show, FALSE, TRUE, N_("show tools") }, + { "-t", "--tools-hide", gr_tools_hide, FALSE, TRUE, N_("hide tools") }, + { "-q", "--quit", gr_quit, FALSE, FALSE, N_("quit") }, + { NULL, "file:", gr_file_load, TRUE, FALSE, N_("open file") }, + { NULL, "view:", gr_file_view, TRUE, FALSE, N_("open file in new window") }, + { NULL, "--list-clear", gr_list_clear, FALSE, FALSE, NULL }, + { NULL, "--list-add:", gr_list_add, TRUE, FALSE, NULL }, + { NULL, "raise", gr_raise, FALSE, FALSE, NULL }, + { NULL, NULL, NULL, FALSE, FALSE, NULL } +}; + +static RemoteCommandEntry *remote_command_find(const gchar *text, const gchar **offset) +{ + gint match = FALSE; + gint i; + + i = 0; + while (!match && remote_commands[i].func != NULL) + { + if (remote_commands[i].needs_extra) + { + if (remote_commands[i].opt_s && + strncmp(remote_commands[i].opt_s, text, strlen(remote_commands[i].opt_s)) == 0) + { + if (offset) *offset = text + strlen(remote_commands[i].opt_s); + return &remote_commands[i]; + } + else if (remote_commands[i].opt_l && + strncmp(remote_commands[i].opt_l, text, strlen(remote_commands[i].opt_l)) == 0) + { + if (offset) *offset = text + strlen(remote_commands[i].opt_l); + return &remote_commands[i]; + } + } + else + { + if ((remote_commands[i].opt_s && strcmp(remote_commands[i].opt_s, text) == 0) || + (remote_commands[i].opt_l && strcmp(remote_commands[i].opt_l, text) == 0)) + { + if (offset) *offset = text; + return &remote_commands[i]; + } + } + + i++; + } + + return NULL; +} + +static void remote_cb(RemoteConnection *rc, const gchar *text, gpointer data) +{ + RemoteCommandEntry *entry; + const gchar *offset; + + entry = remote_command_find(text, &offset); + if (entry && entry->func) + { + entry->func(offset, data); + } + else + { + printf("unknown remote command:%s\n", text); + } +} + +void remote_help(void) +{ + gint i; + + print_term(_("Remote command list:\n")); + + i = 0; + while (remote_commands[i].func != NULL) + { + if (remote_commands[i].description) + { + printf_term(" %-3s%s %-20s %s\n", + (remote_commands[i].opt_s) ? remote_commands[i].opt_s : "", + (remote_commands[i].opt_s && remote_commands[i].opt_l) ? "," : " ", + (remote_commands[i].opt_l) ? remote_commands[i].opt_l : "", + _(remote_commands[i].description)); + } + i++; + } +} + +GList *remote_build_list(GList *list, int argc, char *argv[]) +{ + gint i; + + i = 1; + while (i < argc) + { + RemoteCommandEntry *entry; + + entry = remote_command_find(argv[i], NULL); + if (entry) + { + list = g_list_append(list, argv[i]); + } + i++; + } + + return list; +} + +void remote_control(const gchar *arg_exec, GList *remote_list, const gchar *path, + GList *cmd_list, GList *collection_list) +{ + RemoteConnection *rc; + gint started = FALSE; + gchar *buf; + + buf = g_strconcat(homedir(), "/", GQ_RC_DIR, "/.command", NULL); + rc = remote_client_open(buf); + if (!rc) + { + GString *command; + GList *work; + gint retry_count = 12; + gint blank = FALSE; + + printf_term(_("Remote %s not running, starting..."), GQ_APPNAME); + + command = g_string_new(arg_exec); + + work = remote_list; + while (work) + { + gchar *text; + RemoteCommandEntry *entry; + + text = work->data; + work = work->next; + + entry = remote_command_find(text, NULL); + if (entry) + { + if (entry->prefer_command_line) + { + remote_list = g_list_remove(remote_list, text); + g_string_append(command, " "); + g_string_append(command, text); + } + if (entry->opt_l && strcmp(entry->opt_l, "file:") == 0) + { + blank = TRUE; + } + } + } + + if (blank || cmd_list || path) g_string_append(command, " --blank"); + if (get_debug_level()) g_string_append(command, " --debug"); + + g_string_append(command, " &"); + system(command->str); + g_string_free(command, TRUE); + + while (!rc && retry_count > 0) + { + usleep((retry_count > 10) ? 500000 : 1000000); + rc = remote_client_open(buf); + if (!rc) print_term("."); + retry_count--; + } + + print_term("\n"); + + started = TRUE; + } + g_free(buf); + + if (rc) + { + GList *work; + const gchar *prefix; + gint use_path = TRUE; + gint sent = FALSE; + + work = remote_list; + while (work) + { + gchar *text; + RemoteCommandEntry *entry; + + text = work->data; + work = work->next; + + entry = remote_command_find(text, NULL); + if (entry && + entry->opt_l && + strcmp(entry->opt_l, "file:") == 0) use_path = FALSE; + + remote_client_send(rc, text); + + sent = TRUE; + } + + if (cmd_list && cmd_list->next) + { + prefix = "--list-add:"; + remote_client_send(rc, "--list-clear"); + } + else + { + prefix = "file:"; + } + + work = cmd_list; + while (work) + { + FileData *fd; + gchar *text; + + fd = work->data; + work = work->next; + + text = g_strconcat(prefix, fd->path, NULL); + remote_client_send(rc, text); + g_free(text); + + sent = TRUE; + } + + if (path && !cmd_list && use_path) + { + gchar *text; + + text = g_strdup_printf("file:%s", path); + remote_client_send(rc, text); + g_free(text); + + sent = TRUE; + } + + work = collection_list; + while (work) + { + const gchar *name; + gchar *text; + + name = work->data; + work = work->next; + + text = g_strdup_printf("file:%s", name); + remote_client_send(rc, text); + g_free(text); + + sent = TRUE; + } + + if (!started && !sent) + { + remote_client_send(rc, "raise"); + } + } + else + { + print_term(_("Remote not available\n")); + } + + _exit(0); +} + +RemoteConnection *remote_server_init(gchar *path, CollectionData *command_collection) +{ + RemoteConnection *remote_connection = remote_server_open(path); + RemoteData *remote_data = g_new(RemoteData, 1); + + remote_data->command_collection = command_collection; + + remote_server_subscribe(remote_connection, remote_cb, remote_data); + return remote_connection; +}
--- a/src/remote.h Tue May 13 08:02:46 2008 +0000 +++ b/src/remote.h Tue May 13 08:53:26 2008 +0000 @@ -32,13 +32,13 @@ }; -RemoteConnection *remote_server_open(const gchar *path); -void remote_server_subscribe(RemoteConnection *rc, RemoteReadFunc *func, gpointer data); +void remote_close(RemoteConnection *rc); +GList *remote_build_list(GList *list, int argc, char *argv[]); +void remote_help(void); +void remote_control(const gchar *arg_exec, GList *remote_list, const gchar *path, + GList *cmd_list, GList *collection_list); -RemoteConnection *remote_client_open(const gchar *path); -gint remote_client_send(RemoteConnection *rc, const gchar *text); - -void remote_close(RemoteConnection *rc); +RemoteConnection *remote_server_init(gchar *path, CollectionData *command_collection); #endif