X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fremote.cc;h=4ece932f0e6a414eb1ddccb2aa9689d1064eb4b5;hb=b31104586cfe5d81a217e3804e84024c16739aa3;hp=fdf03414fe5fa89ed2b9dfafe6cd9f54d98fddf5;hpb=fcf71d964f3739f6320ec0ee0d648bc7e205587f;p=geeqie.git diff --git a/src/remote.cc b/src/remote.cc index fdf03414..4ece932f 100644 --- a/src/remote.cc +++ b/src/remote.cc @@ -19,24 +19,32 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "main.h" #include "remote.h" +#include + #include "cache-maint.h" -#include "collect.h" #include "collect-io.h" +#include "collect.h" +#include "compat.h" +#include "debug.h" #include "exif.h" #include "filedata.h" #include "filefilter.h" #include "image.h" #include "img-view.h" +#include "intl.h" #include "layout-image.h" #include "layout-util.h" +#include "main-defines.h" +#include "main.h" #include "misc.h" #include "pixbuf-renderer.h" +#include "rcfile.h" #include "slideshow.h" #include "ui-fileops.h" -#include "rcfile.h" +#include "ui-misc.h" +#include "utilops.h" #include "view-file.h" #include @@ -45,9 +53,13 @@ #include "glua.h" -#define SERVER_MAX_CLIENTS 8 +enum { + SERVER_MAX_CLIENTS = 8 +}; -#define REMOTE_SERVER_BACKLOG 4 +enum { + REMOTE_SERVER_BACKLOG = 4 +}; #ifndef UNIX_PATH_MAX @@ -244,10 +256,15 @@ static RemoteConnection *remote_server_open(const gchar *path) { RemoteConnection *rc; struct sockaddr_un addr; - gint sun_path_len; gint fd; GIOChannel *channel; + if (strlen(path) >= sizeof(addr.sun_path)) + { + log_printf("Address is too long: %s\n", path); + return nullptr; + } + if (remote_server_exists(path)) { log_printf("Address already in use: %s\n", path); @@ -258,8 +275,10 @@ static RemoteConnection *remote_server_open(const gchar *path) if (fd == -1) return nullptr; addr.sun_family = AF_UNIX; - sun_path_len = MIN(strlen(path) + 1, UNIX_PATH_MAX); - strncpy(addr.sun_path, path, sun_path_len); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" + strncpy(addr.sun_path, path, sizeof(addr.sun_path)); +#pragma GCC diagnostic pop if (bind(fd, reinterpret_cast(&addr), sizeof(addr)) == -1 || listen(fd, REMOTE_SERVER_BACKLOG) == -1) { @@ -284,7 +303,7 @@ static RemoteConnection *remote_server_open(const gchar *path) return rc; } -static void remote_server_subscribe(RemoteConnection *rc, RemoteReadFunc *func, gpointer data) +static void remote_server_subscribe(RemoteConnection *rc, RemoteConnection::ReadFunc *func, gpointer data) { if (!rc || !rc->server) return; @@ -298,17 +317,20 @@ static RemoteConnection *remote_client_open(const gchar *path) RemoteConnection *rc; struct stat st; struct sockaddr_un addr; - gint sun_path_len; gint fd; + if (strlen(path) >= sizeof(addr.sun_path)) return nullptr; + if (stat(path, &st) != 0 || !S_ISSOCK(st.st_mode)) return nullptr; fd = socket(PF_UNIX, SOCK_STREAM, 0); if (fd == -1) return nullptr; addr.sun_family = AF_UNIX; - sun_path_len = MIN(strlen(path) + 1, UNIX_PATH_MAX); - strncpy(addr.sun_path, path, sun_path_len); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" + strncpy(addr.sun_path, path, sizeof(addr.sun_path)); +#pragma GCC diagnostic pop if (connect(fd, reinterpret_cast(&addr), sizeof(addr)) == -1) { DEBUG_1("error connecting to socket: %s", strerror(errno)); @@ -333,7 +355,8 @@ static void sighandler_sigpipe(gint) static gboolean remote_client_send(RemoteConnection *rc, const gchar *text) { - struct sigaction new_action, old_action; + struct sigaction new_action; + struct sigaction old_action; gboolean ret = FALSE; GError *error = nullptr; GIOChannel *channel; @@ -602,7 +625,10 @@ static void gr_slideshow_stop(const gchar *, GIOChannel *, gpointer) static void gr_slideshow_delay(const gchar *text, GIOChannel *, gpointer) { - gdouble t1, t2, t3, n; + gdouble t1; + gdouble t2; + gdouble t3; + gdouble n; gint res; res = sscanf(text, "%lf:%lf:%lf", &t1, &t2, &t3); @@ -729,9 +755,13 @@ static void gr_file_load(const gchar *text, GIOChannel *channel, gpointer data) static void gr_pixel_info(const gchar *, GIOChannel *channel, gpointer) { gchar *pixel_info; - gint x_pixel, y_pixel; - gint width, height; - gint r_mouse, g_mouse, b_mouse; + gint x_pixel; + gint y_pixel; + gint width; + gint height; + gint r_mouse; + gint g_mouse; + gint b_mouse; PixbufRenderer *pr; if (!layout_valid(&lw_id)) return; @@ -774,7 +804,10 @@ static void gr_rectangle(const gchar *, GIOChannel *channel, gpointer) { gchar *rectangle_info; PixbufRenderer *pr; - gint x1, y1, x2, y2; + gint x1; + gint y1; + gint x2; + gint y2; if (!options->draw_rectangle) return; if (!layout_valid(&lw_id)) return; @@ -875,7 +908,7 @@ static void get_filelist(const gchar *text, GIOChannel *channel, gboolean recurs while (work) { fd = static_cast(work->data); - g_string_append_printf(out_string, "%s", fd->path); + g_string_append(out_string, fd->path); format_class = filter_file_get_class(fd->path); switch (format_class) @@ -1146,7 +1179,7 @@ static void gr_collection_list(const gchar *, GIOChannel *channel, gpointer) while (work) { auto collection_name = static_cast(work->data); - out_string = g_string_append(out_string, g_strdup(collection_name)); + out_string = g_string_append(out_string, collection_name); out_string = g_string_append(out_string, "\n"); work = work->next; @@ -1165,7 +1198,7 @@ static gboolean wait_cb(gpointer data) gint x = position >> 16; gint y = position - (x << 16); - gtk_window_move(GTK_WINDOW(lw_id->window), x, y); + gq_gtk_window_move(GTK_WINDOW(lw_id->window), x, y); return G_SOURCE_REMOVE; } @@ -1184,7 +1217,7 @@ static void gr_geometry(const gchar *text, GIOChannel *, gpointer) geometry = g_strsplit_set(text, "+", 3); if (geometry[1] != nullptr && geometry[2] != nullptr ) { - gtk_window_move(GTK_WINDOW(lw_id->window), atoi(geometry[1]), atoi(geometry[2])); + gq_gtk_window_move(GTK_WINDOW(lw_id->window), atoi(geometry[1]), atoi(geometry[2])); } } else @@ -1528,6 +1561,73 @@ static void gr_list_add(const gchar *text, GIOChannel *, gpointer data) } } +static void gr_action(const gchar *text, GIOChannel *, gpointer) +{ + GtkAction *action; + + if (!layout_valid(&lw_id)) + { + return; + } + + if (g_strstr_len(text, -1, ".desktop") != nullptr) + { + file_util_start_editor_from_filelist(text, layout_selection_list(lw_id), layout_get_path(lw_id), lw_id->window); + } + else + { + action = gtk_action_group_get_action(lw_id->action_group, text); + if (action) + { + gtk_action_activate(action); + } + else + { + log_printf("Action %s unknown", text); + } + } +} + +static void gr_action_list(const gchar *, GIOChannel *channel, gpointer) +{ + ActionItem *action_item; + gint max_length = 0; + GList *list = nullptr; + GString *out_string = g_string_new(nullptr); + + if (!layout_valid(&lw_id)) + { + return; + } + + list = get_action_items(); + + /* Get the length required for padding */ + for (GList *work = list; work; work = work->next) + { + action_item = static_cast(work->data); + const auto length = g_utf8_strlen(action_item->name, -1); + max_length = MAX(length, max_length); + } + + /* Pad the action names to the same column for readable output */ + for (GList *work = list; work; work = work->next) + { + action_item = static_cast(work->data); + + g_string_append_printf(out_string, "%-*s", max_length + 4, action_item->name); + out_string = g_string_append(out_string, action_item->label); + out_string = g_string_append(out_string, "\n"); + } + + action_items_free(list); + + g_io_channel_write_chars(channel, out_string->str, -1, nullptr, nullptr); + g_io_channel_write_chars(channel, "", -1, nullptr, nullptr); + + g_string_free(out_string, TRUE); +} + static void gr_raise(const gchar *, GIOChannel *, gpointer) { if (layout_valid(&lw_id)) @@ -1598,6 +1698,8 @@ struct RemoteCommandEntry { static RemoteCommandEntry remote_commands[] = { /* short, long callback, extra, prefer, parameter, description */ + { nullptr, "--action:", gr_action, TRUE, FALSE, N_(""), N_("execute keyboard action (See Help/Reference/Remote Keyboard Actions)") }, + { nullptr, "--action-list", gr_action_list, FALSE, FALSE, nullptr, N_("list available keyboard actions (some are redundant)") }, { "-b", "--back", gr_image_prev, FALSE, FALSE, nullptr, N_("previous image") }, { nullptr, "--close-window", gr_close_window, FALSE, FALSE, nullptr, N_("close window") }, { nullptr, "--config-load:", gr_config_load, TRUE, FALSE, N_("|layout ID"), N_("load configuration from FILE") }, @@ -1674,7 +1776,8 @@ static RemoteCommandEntry *remote_command_find(const gchar *text, const gchar ** if (offset) *offset = text + strlen(remote_commands[i].opt_s); return &remote_commands[i]; } - else if (remote_commands[i].opt_l && + + 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); @@ -1728,10 +1831,11 @@ void remote_help() { s_opt_param = g_strdup(remote_commands[i].opt_s ? remote_commands[i].opt_s : "" ); l_opt_param = g_strconcat(remote_commands[i].opt_l, remote_commands[i].parameter, NULL); - printf_term(FALSE, " %-4s %-40s%-s\n", - s_opt_param, - l_opt_param, - _(remote_commands[i].description)); + + if (g_str_has_prefix(l_opt_param, "--")) + { + printf_term(FALSE, " %-4s %-40s%-s\n", s_opt_param, l_opt_param, _(remote_commands[i].description)); + } g_free(s_opt_param); g_free(l_opt_param); }