6 #include <lirc/lirc_client.h>
7 #include "layout_image.h"
10 struct lirc_config *config = NULL;
15 *-----------------------------------------------------------------------------
17 *-----------------------------------------------------------------------------
20 static void lirc_cleanup(void)
24 g_source_remove(input_tag);
25 lirc_freeconfig(config);
35 g_io_channel_shutdown(gio_chan, TRUE, NULL);
36 g_io_channel_unref(gio_chan);
40 static gboolean lirc_input_callback(GIOChannel *source, GIOCondition condition,
43 LayoutWindow *lw = data;
49 /* LIRC code and corresponding geeqie command (and parameters)*/
53 /* parameters for geeqie command */
57 while ((ret = lirc_nextcode(&code)) == 0 && code)
59 while ((ret = lirc_code2char(config, code, &cmd)) == 0 && cmd)
61 if (g_ascii_strncasecmp("LEFT", cmd, 4) == 0)
64 while (g_ascii_isspace(*ptr)) ptr++;
67 if (i_parm <= 0) i_parm = 1;
70 else if (g_ascii_strncasecmp("RIGHT", cmd, 5) == 0)
73 while (g_ascii_isspace(*ptr)) ptr++;
76 if (i_parm <= 0) i_parm = 1;
79 else if (g_ascii_strncasecmp("UP", cmd, 2) == 0)
82 while (g_ascii_isspace(*ptr)) ptr++;
85 if (i_parm <= 0) i_parm = 1;
88 else if (g_ascii_strncasecmp("DOWN", cmd, 4) == 0)
91 while (g_ascii_isspace(*ptr)) ptr++;
94 if (i_parm <= 0) i_parm = 1;
97 else if (g_ascii_strcasecmp("PREV", cmd) == 0)
99 layout_image_prev(lw);
101 else if (g_ascii_strcasecmp("NEXT", cmd) == 0)
103 layout_image_next(lw);
105 else if (g_ascii_strncasecmp("ZOOM_IN", cmd, 7) == 0)
108 while (g_ascii_isspace(*ptr)) ptr++;
109 fl_parm = atoi(ptr) / 10.0;
111 if (fl_parm <= 0.01) fl_parm = get_zoom_increment();
112 layout_image_zoom_adjust(lw, fl_parm, FALSE);
114 else if (g_ascii_strncasecmp("ZOOM_OUT", cmd, 8) == 0)
117 while (g_ascii_isspace(*ptr)) ptr++;
118 fl_parm = atoi(ptr) / 10.0;
120 if (fl_parm <= 0.01) fl_parm = get_zoom_increment();
121 layout_image_zoom_adjust(lw, -fl_parm, FALSE);
123 else if (g_ascii_strcasecmp("ZOOM_MAX", cmd) == 0)
125 layout_image_zoom_set(lw, 0.0, FALSE);
127 else if (g_ascii_strncasecmp("SET_ZOOM", cmd, 8) == 0)
130 while (g_ascii_isspace(*ptr)) ptr++;
133 if (i_parm <= 0) i_parm = 1;
134 layout_image_zoom_set(lw, 1.0, FALSE);
136 else if (g_ascii_strncasecmp("SET_INV_ZOOM", cmd, 12) == 0)
139 while (g_ascii_isspace(*ptr)) ptr++;
142 if (i_parm <= 0) i_parm = 1;
143 layout_image_zoom_set(lw, -i_parm, FALSE);
145 else if (g_ascii_strcasecmp("FIRST", cmd) == 0)
147 layout_image_first(lw);
149 else if (g_ascii_strcasecmp("LAST", cmd) == 0)
151 layout_image_last(lw);
153 else if (g_ascii_strcasecmp("PAUSE", cmd) == 0)
155 layout_image_slideshow_pause_toggle(lw);
157 else if (g_ascii_strcasecmp("ROTATE_90", cmd) == 0)
159 layout_image_alter(lw, ALTER_ROTATE_90);
161 else if (g_ascii_strcasecmp("ROTATE_90_CC", cmd) == 0)
163 layout_image_alter(lw, ALTER_ROTATE_90_CC);
165 else if (g_ascii_strcasecmp("INFO", cmd) == 0)
167 layout_image_overlay_toggle(lw);
169 else if (g_ascii_strcasecmp("EXIT", cmd) == 0)
175 if (ret == -1) break;
177 if (x != 0 || y != 0)
179 layout_image_scroll(lw, x, y);
184 /* something went badly wrong */
185 fprintf(stderr, _("disconnected from LIRC\n"));
187 return (gboolean)FALSE;
189 return (gboolean)TRUE;
192 void layout_image_lirc_init(LayoutWindow *lw)
196 DEBUG_1("Initializing LIRC...");
197 lirc_fd = lirc_init(GQ_APPNAME_LC, get_debug_level() > 0);
200 fprintf(stderr, _("Could not init LIRC support\n"));
203 if (lirc_readconfig(NULL, &config, NULL) == -1)
207 _("could not read LIRC config file\n"
208 "please read the documentation of LIRC to \n"
209 "know how to create a proper config file\n"));
212 gio_chan = g_io_channel_unix_new(lirc_fd);
213 input_tag = g_io_add_watch(gio_chan, G_IO_IN,
214 lirc_input_callback, lw);
215 fcntl(lirc_fd, F_SETOWN, getpid());
216 flags = fcntl(lirc_fd, F_GETFL, 0);
217 if (flags != -1) fcntl(lirc_fd, F_SETFL, flags|O_NONBLOCK);
221 #endif /* HAVE_LIRC */
222 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */