Mercurial > geeqie.yaz
diff src/lirc.c @ 528:bf9c9e37adf4
Added LIRC patch written by Matteo Beniamino
author | nadvornik |
---|---|
date | Sun, 27 Apr 2008 20:05:11 +0000 |
parents | |
children | e8b28413ffbf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lirc.c Sun Apr 27 20:05:11 2008 +0000 @@ -0,0 +1,219 @@ +#include "lirc.h" + +#ifdef HAVE_LIRC +#include <lirc/lirc_client.h> +#include "layout_image.h" +#include "debug.h" + +gint lirc_fd = -1; +struct lirc_config *config = NULL; +guint input_tag; +GIOChannel *gio_chan; + +/* + *----------------------------------------------------------------------------- + * LIRC callback + *----------------------------------------------------------------------------- + */ + +void lirc_cleanup() +{ + if (config) + { + gtk_input_remove(input_tag); + lirc_freeconfig(config); + config = NULL; + } + if (lirc_fd != -1) + { + lirc_deinit(); + lirc_fd = -1; + } + if (gio_chan) + { + g_io_channel_close(gio_chan); + } +} + +gboolean lirc_input_callback(GIOChannel *source, GIOCondition condition, + gpointer data) +{ + LayoutWindow *lw = data; + gchar *ptr; + gint ret; + gint x = 0; + gint y = 0; + + /* LIRC code and corresponding geeqie command (and parameters)*/ + gchar *code; + gchar *cmd; + + /* parameters for geeqie command */ + gint i_parm; + gfloat fl_parm; + + while ((ret = lirc_nextcode(&code)) == 0 && code) + { + while ((ret = lirc_code2char(config, code, &cmd)) == 0 && cmd) + { + if (g_strncasecmp("LEFT", cmd, 4) == 0) + { + ptr = cmd + 4; + while (g_ascii_isspace(*ptr)) ptr++; + i_parm = atoi(ptr); + + if (i_parm <= 0) i_parm = 1; + x -= i_parm; + } + else if (g_strncasecmp("RIGHT", cmd, 5) == 0) + { + ptr = cmd + 5; + while (g_ascii_isspace(*ptr)) ptr++; + i_parm = atoi(ptr); + + if (i_parm <= 0) i_parm = 1; + x += i_parm; + } + else if (g_strncasecmp("UP", cmd, 2) == 0) + { + ptr = cmd + 2; + while (g_ascii_isspace(*ptr)) ptr++; + i_parm = atoi(ptr); + + if (i_parm <= 0) i_parm = 1; + y -= i_parm; + } + else if (g_strncasecmp("DOWN", cmd, 4) == 0) + { + ptr = cmd + 4; + while (g_ascii_isspace(*ptr)) ptr++; + i_parm = atoi(ptr); + + if (i_parm <= 0) i_parm = 1; + y += i_parm; + } + else if (g_strcasecmp("PREV", cmd) == 0) + { + layout_image_prev(lw); + } + else if (g_strcasecmp("NEXT", cmd) == 0) + { + layout_image_next(lw); + } + else if (g_strncasecmp("ZOOM_IN", cmd, 7) == 0) + { + ptr = cmd + 7; + while (g_ascii_isspace(*ptr)) ptr++; + fl_parm = atoi(ptr) / 10.0; + + if (fl_parm <= 0.01) fl_parm = get_zoom_increment(); + layout_image_zoom_adjust(lw, fl_parm); + } + else if (g_strncasecmp("ZOOM_OUT", cmd, 8) == 0) + { + ptr = cmd + 8; + while (g_ascii_isspace(*ptr)) ptr++; + fl_parm = atoi(ptr) / 10.0; + + if (fl_parm <= 0.01) fl_parm = get_zoom_increment(); + layout_image_zoom_adjust(lw, -fl_parm); + } + else if (g_strcasecmp("ZOOM_MAX", cmd) == 0) + { + layout_image_zoom_set(lw, 0.0); + } + else if (g_strncasecmp("SET_ZOOM", cmd, 8) == 0) + { + ptr = cmd + 8; + while (g_ascii_isspace(*ptr)) ptr++; + i_parm = atoi(ptr); + + if (i_parm <= 0) i_parm = 1; + layout_image_zoom_set(lw, 1.0); + } + else if (g_strncasecmp("SET_INV_ZOOM", cmd, 12) == 0) + { + ptr = cmd + 12; + while (g_ascii_isspace(*ptr)) ptr++; + i_parm = atoi(ptr); + + if (i_parm <= 0) i_parm = 1; + layout_image_zoom_set(lw, -i_parm); + } + else if (g_strcasecmp("FIRST", cmd) == 0) + { + layout_image_first(lw); + } + else if (g_strcasecmp("LAST", cmd) == 0) + { + layout_image_last(lw); + } + else if (g_strcasecmp("PAUSE", cmd) == 0) + { + layout_image_slideshow_pause_toggle(lw); + } + else if (g_strcasecmp("ROTATE_90", cmd) == 0) + { + layout_image_alter(lw, ALTER_ROTATE_90); + } + else if (g_strcasecmp("ROTATE_90_CC", cmd) == 0) + { + layout_image_alter(lw, ALTER_ROTATE_90_CC); + } + else if (g_strcasecmp("INFO", cmd) == 0) + { + layout_image_overlay_toggle(lw); + } + else if (g_strcasecmp("EXIT", cmd) == 0) + { + exit_program(); + } + } + free(code); + if (ret == -1) break; + } + if (x != 0 || y!= 0) + { + layout_image_scroll(lw, x, y); + } + + if (ret == -1) + { + /* something went badly wrong */ + fprintf(stderr, _("disconnected from LIRC\n")); + lirc_cleanup(); + return (gboolean)FALSE; + } + return (gboolean)TRUE; +} + +void layout_image_lirc_init(LayoutWindow *lw) +{ + int flags; + + DEBUG_1("Initializing LIRC..."); + lirc_fd = lirc_init(GQ_APPNAME_LC, get_debug_level() > 0); + if (lirc_fd == -1) + { + fprintf(stderr, _("Could not init LIRC support\n")); + return; + } + if (lirc_readconfig(NULL, &config, NULL) == -1) + { + lirc_deinit(); + fprintf(stderr, + _("could not read LIRC config file\n" + "please read the documentation of LIRC to \n" + "know how to create a proper config file\n")); + return; + } + gio_chan = g_io_channel_unix_new(lirc_fd); + input_tag = g_io_add_watch(gio_chan, G_IO_IN, + lirc_input_callback, lw); + fcntl(lirc_fd, F_SETOWN, getpid()); + flags = fcntl(lirc_fd, F_GETFL, 0); + if (flags != -1) fcntl(lirc_fd, F_SETFL, flags|O_NONBLOCK); + fflush(stderr); +} + +#endif /* HAVE_LIRC */