4 #include <lirc/lirc_client.h>
5 #include "layout_image.h"
9 struct lirc_config *config = NULL;
14 *-----------------------------------------------------------------------------
16 *-----------------------------------------------------------------------------
23 g_source_remove(input_tag);
24 lirc_freeconfig(config);
34 g_io_channel_shutdown(gio_chan, TRUE, NULL);
35 g_io_channel_unref(gio_chan);
39 gboolean lirc_input_callback(GIOChannel *source, GIOCondition condition,
42 LayoutWindow *lw = data;
48 /* LIRC code and corresponding geeqie command (and parameters)*/
52 /* parameters for geeqie command */
56 while ((ret = lirc_nextcode(&code)) == 0 && code)
58 while ((ret = lirc_code2char(config, code, &cmd)) == 0 && cmd)
60 if (g_ascii_strncasecmp("LEFT", cmd, 4) == 0)
63 while (g_ascii_isspace(*ptr)) ptr++;
66 if (i_parm <= 0) i_parm = 1;
69 else if (g_ascii_strncasecmp("RIGHT", cmd, 5) == 0)
72 while (g_ascii_isspace(*ptr)) ptr++;
75 if (i_parm <= 0) i_parm = 1;
78 else if (g_ascii_strncasecmp("UP", cmd, 2) == 0)
81 while (g_ascii_isspace(*ptr)) ptr++;
84 if (i_parm <= 0) i_parm = 1;
87 else if (g_ascii_strncasecmp("DOWN", cmd, 4) == 0)
90 while (g_ascii_isspace(*ptr)) ptr++;
93 if (i_parm <= 0) i_parm = 1;
96 else if (g_ascii_strcasecmp("PREV", cmd) == 0)
98 layout_image_prev(lw);
100 else if (g_ascii_strcasecmp("NEXT", cmd) == 0)
102 layout_image_next(lw);
104 else if (g_ascii_strncasecmp("ZOOM_IN", cmd, 7) == 0)
107 while (g_ascii_isspace(*ptr)) ptr++;
108 fl_parm = atoi(ptr) / 10.0;
110 if (fl_parm <= 0.01) fl_parm = get_zoom_increment();
111 layout_image_zoom_adjust(lw, fl_parm);
113 else if (g_ascii_strncasecmp("ZOOM_OUT", cmd, 8) == 0)
116 while (g_ascii_isspace(*ptr)) ptr++;
117 fl_parm = atoi(ptr) / 10.0;
119 if (fl_parm <= 0.01) fl_parm = get_zoom_increment();
120 layout_image_zoom_adjust(lw, -fl_parm);
122 else if (g_ascii_strcasecmp("ZOOM_MAX", cmd) == 0)
124 layout_image_zoom_set(lw, 0.0);
126 else if (g_ascii_strncasecmp("SET_ZOOM", cmd, 8) == 0)
129 while (g_ascii_isspace(*ptr)) ptr++;
132 if (i_parm <= 0) i_parm = 1;
133 layout_image_zoom_set(lw, 1.0);
135 else if (g_ascii_strncasecmp("SET_INV_ZOOM", cmd, 12) == 0)
138 while (g_ascii_isspace(*ptr)) ptr++;
141 if (i_parm <= 0) i_parm = 1;
142 layout_image_zoom_set(lw, -i_parm);
144 else if (g_ascii_strcasecmp("FIRST", cmd) == 0)
146 layout_image_first(lw);
148 else if (g_ascii_strcasecmp("LAST", cmd) == 0)
150 layout_image_last(lw);
152 else if (g_ascii_strcasecmp("PAUSE", cmd) == 0)
154 layout_image_slideshow_pause_toggle(lw);
156 else if (g_ascii_strcasecmp("ROTATE_90", cmd) == 0)
158 layout_image_alter(lw, ALTER_ROTATE_90);
160 else if (g_ascii_strcasecmp("ROTATE_90_CC", cmd) == 0)
162 layout_image_alter(lw, ALTER_ROTATE_90_CC);
164 else if (g_ascii_strcasecmp("INFO", cmd) == 0)
166 layout_image_overlay_toggle(lw);
168 else if (g_ascii_strcasecmp("EXIT", cmd) == 0)
174 if (ret == -1) break;
178 layout_image_scroll(lw, x, y);
183 /* something went badly wrong */
184 fprintf(stderr, _("disconnected from LIRC\n"));
186 return (gboolean)FALSE;
188 return (gboolean)TRUE;
191 void layout_image_lirc_init(LayoutWindow *lw)
195 DEBUG_1("Initializing LIRC...");
196 lirc_fd = lirc_init(GQ_APPNAME_LC, get_debug_level() > 0);
199 fprintf(stderr, _("Could not init LIRC support\n"));
202 if (lirc_readconfig(NULL, &config, NULL) == -1)
206 _("could not read LIRC config file\n"
207 "please read the documentation of LIRC to \n"
208 "know how to create a proper config file\n"));
211 gio_chan = g_io_channel_unix_new(lirc_fd);
212 input_tag = g_io_add_watch(gio_chan, G_IO_IN,
213 lirc_input_callback, lw);
214 fcntl(lirc_fd, F_SETOWN, getpid());
215 flags = fcntl(lirc_fd, F_GETFL, 0);
216 if (flags != -1) fcntl(lirc_fd, F_SETFL, flags|O_NONBLOCK);
220 #endif /* HAVE_LIRC */