156
|
1 /* Lirc plugin
|
|
2
|
|
3 Copyright (C) 2005 Audacious development team
|
|
4
|
|
5 Copyright (c) 1998-1999 Carl van Schaik (carl@leg.uct.ac.za)
|
|
6
|
|
7 Copyright (C) 2000 Christoph Bartelmus (xmms@bartelmus.de)
|
|
8
|
|
9 some code was stolen from:
|
|
10 IRman plugin for xmms by Charles Sielski (stray@teklabs.net)
|
|
11
|
|
12 This program is free software; you can redistribute it and/or modify
|
|
13 it under the terms of the GNU General Public License as published by
|
|
14 the Free Software Foundation; either version 2 of the License, or
|
|
15 (at your option) any later version.
|
|
16
|
|
17 This program is distributed in the hope that it will be useful,
|
|
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
20 GNU General Public License for more details.
|
|
21
|
|
22 You should have received a copy of the GNU General Public License
|
|
23 along with this program; if not, write to the Free Software
|
|
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
25 */
|
|
26
|
|
27 #ifdef HAVE_CONFIG_H
|
|
28 # include "config.h"
|
|
29 #endif
|
|
30
|
|
31 #include <stdio.h>
|
|
32 #include <unistd.h>
|
|
33 #include <fcntl.h>
|
|
34 #include <string.h>
|
|
35 #include <signal.h>
|
|
36 #include <stdlib.h>
|
|
37 #include <ctype.h>
|
|
38
|
|
39 #include <gtk/gtk.h>
|
|
40
|
|
41 #include <glib.h>
|
|
42
|
|
43 #include "audacious/plugin.h"
|
|
44 #include "libaudacious/configfile.h"
|
|
45 #include "libaudacious/beepctrl.h"
|
|
46
|
|
47 #include <lirc/lirc_client.h>
|
|
48
|
|
49 #include "lirc.h"
|
|
50
|
|
51 const char *plugin_name="LIRC Plugin " VERSION;
|
|
52
|
|
53 GeneralPlugin lirc_plugin = {
|
|
54 NULL,
|
|
55 NULL,
|
|
56 -1,
|
|
57 NULL,
|
|
58 init,
|
|
59 about,
|
|
60 configure,
|
|
61 cleanup,
|
|
62 };
|
|
63
|
|
64 GeneralPlugin *get_gplugin_info(void)
|
|
65 {
|
|
66 lirc_plugin.description = g_strdup_printf("LIRC Plugin");
|
|
67 return(&lirc_plugin);
|
|
68 }
|
|
69
|
|
70 int lirc_fd=-1;
|
|
71 struct lirc_config *config=NULL;
|
|
72 gint tracknr=0;
|
|
73 gint mute=0; /* mute flag */
|
|
74 gint mute_vol=0; /* holds volume before mute */
|
|
75
|
|
76 gint input_tag;
|
|
77
|
|
78 int select_tag=0;
|
|
79 GtkWidget *select_popup=NULL;
|
|
80 GtkStyle *popup_style=NULL;
|
|
81 GList *select_list=NULL;
|
|
82 GtkWidget *fsd;
|
|
83 gchar *fontname;
|
|
84
|
|
85 struct select_info
|
|
86 {
|
|
87 char *s;
|
|
88 size_t common;
|
|
89 };
|
|
90
|
|
91 struct title_info
|
|
92 {
|
|
93 char *s;
|
|
94 int pos;
|
|
95 };
|
|
96
|
|
97 void clear_select_list(GList **list)
|
|
98 {
|
|
99 GList *l;
|
|
100
|
|
101 l=*list;
|
|
102 while(l!=NULL)
|
|
103 {
|
|
104 free(((struct select_info *) (l->data))->s);
|
|
105 free(l->data);
|
|
106 l=g_list_remove_link(l,l);
|
|
107 }
|
|
108 *list=NULL;
|
|
109 }
|
|
110
|
|
111 void clear_title_list(GList **list)
|
|
112 {
|
|
113 GList *l;
|
|
114
|
|
115 l=*list;
|
|
116 while(l!=NULL)
|
|
117 {
|
|
118 free(((struct title_info *) (l->data))->s);
|
|
119 free(l->data);
|
|
120 l=g_list_remove_link(l,l);
|
|
121 }
|
|
122 *list=NULL;
|
|
123 }
|
|
124
|
|
125 gchar *get_title_postfix(gchar *title)
|
|
126 {
|
|
127 gchar *match;
|
|
128 GList *scan_list;
|
|
129 struct select_info *si;
|
|
130 size_t skip;
|
|
131
|
|
132 match=title;
|
|
133 scan_list=select_list;
|
|
134 si=(struct select_info *) (scan_list->data);
|
|
135 while(*match)
|
|
136 {
|
|
137 if(!isalnum(*match))
|
|
138 {
|
|
139 match++;
|
|
140 }
|
|
141 else
|
|
142 {
|
|
143 if(strchr(si->s,toupper(*match))!=NULL)
|
|
144 {
|
|
145 skip=si->common;
|
|
146 while(skip>0)
|
|
147 {
|
|
148 if(isalnum(*match))
|
|
149 {
|
|
150 skip--;
|
|
151 }
|
|
152 match++;
|
|
153 if(!*match)
|
|
154 {
|
|
155 break;
|
|
156 }
|
|
157 }
|
|
158 scan_list=g_list_next(scan_list);
|
|
159 if(scan_list==NULL)
|
|
160 {
|
|
161 while(!isalnum(*match) && *match)
|
|
162 {
|
|
163 match++;
|
|
164 }
|
|
165 return(match);
|
|
166 }
|
|
167 si=(struct select_info *) (scan_list->data);
|
|
168 }
|
|
169 else
|
|
170 {
|
|
171 break;
|
|
172 }
|
|
173 }
|
|
174 }
|
|
175 return(NULL);
|
|
176 }
|
|
177
|
|
178 #define SELECT_BORDER 8
|
|
179
|
|
180 gint remove_select_popup(GtkWidget **select_popup)
|
|
181 {
|
|
182 gtk_widget_destroy(*select_popup);
|
|
183 *select_popup=NULL;
|
|
184 select_tag=0;
|
|
185 return(FALSE);
|
|
186 }
|
|
187
|
|
188 /*void select_title(char *s,int num)
|
|
189 {
|
|
190 GdkFont *font;
|
|
191 GtkStyle *style;
|
|
192 int gap,baseline_skip;
|
|
193 int width,height,x,y;
|
|
194 GList *new_list,*scan_list;
|
|
195 GList *title_list=NULL;
|
|
196 int length,i;
|
|
197 gchar *title;
|
|
198 struct select_info *si;
|
|
199 struct title_info *ti;
|
|
200
|
|
201 if(select_tag!=0)
|
|
202 {
|
|
203 gtk_timeout_remove(select_tag);
|
|
204 remove_select_popup(&select_popup);
|
|
205 }
|
|
206 if(s!=NULL)
|
|
207 {
|
|
208 si=malloc(sizeof(*si));
|
|
209 if(si==NULL)
|
|
210 {
|
|
211 return;
|
|
212 }
|
|
213 si->s=strdup(s);
|
|
214 si->common=1;
|
|
215 if(si->s==NULL)
|
|
216 {
|
|
217 free(si);
|
|
218 return;
|
|
219 }
|
|
220 new_list=g_list_append(select_list,si);
|
|
221 if(new_list==NULL)
|
|
222 {
|
|
223 free(si->s);
|
|
224 free(si);
|
|
225 return;
|
|
226 }
|
|
227
|
|
228 select_list=new_list;
|
|
229 }
|
|
230
|
|
231 scan_list=select_list;
|
|
232 while(scan_list)
|
|
233 {
|
|
234 scan_list=g_list_next(scan_list);
|
|
235 }
|
|
236
|
|
237 length=xmms_remote_get_playlist_length
|
|
238 (lirc_plugin.xmms_session);
|
|
239 for(i=0;i<length;i++)
|
|
240 {
|
|
241 title=xmms_remote_get_playlist_title
|
|
242 (lirc_plugin.xmms_session,i);
|
|
243 if(get_title_postfix(title)!=NULL)
|
|
244 {
|
|
245 ti=malloc(sizeof(*ti));
|
|
246 if(ti==NULL) break;
|
|
247 ti->s=strdup(title);
|
|
248 if(ti->s==NULL)
|
|
249 {
|
|
250 free(ti);
|
|
251 break;
|
|
252 }
|
|
253 ti->pos=i;
|
|
254 new_list=g_list_append(title_list,ti);
|
|
255 if(new_list==NULL)
|
|
256 {
|
|
257 free(ti->s);
|
|
258 free(ti);
|
|
259 break;
|
|
260 }
|
|
261 title_list=new_list;
|
|
262 }
|
|
263 }
|
|
264 select_popup=gtk_window_new(GTK_WINDOW_POPUP);
|
|
265 if(popup_style)
|
|
266 {
|
|
267 if(fontname!=NULL)
|
|
268 {
|
|
269 font=gdk_font_load(fontname);
|
|
270 }
|
|
271 else
|
|
272 {
|
|
273 font=gdk_font_load
|
|
274 ("-xxl-*-medium-r-semicondensed-*-*-*-75-75-*-*-*-*");
|
|
275 }
|
|
276 if(font) popup_style->font=font;
|
|
277 gtk_widget_set_style(select_popup,popup_style);
|
|
278 }
|
|
279 gtk_widget_set_app_paintable(select_popup,TRUE);
|
|
280 gtk_window_set_policy(GTK_WINDOW(select_popup),FALSE,FALSE,TRUE);
|
|
281 gtk_widget_set_name(select_popup,"LIRC select list");
|
|
282 style=select_popup->style;
|
|
283 font=style->font;
|
|
284 gap=(font->ascent+font->descent)/4;
|
|
285 if(gap<2) gap=2;
|
|
286 baseline_skip=font->ascent+font->descent+gap;
|
|
287
|
|
288 if(title_list==NULL)
|
|
289 {
|
|
290 gchar *text="No match.";
|
|
291
|
|
292 x=gdk_string_width(font,text);
|
|
293 width=SELECT_BORDER*2+x;
|
|
294 height=SELECT_BORDER*2+baseline_skip-gap;
|
|
295 gtk_widget_set_usize(select_popup,width,height);
|
|
296 x=(gdk_screen_width()-width)/2;
|
|
297 if(x<0) x=0;
|
|
298 y=(gdk_screen_height()-height)/2;
|
|
299 if(y<0) y=0;
|
|
300 gtk_widget_popup(select_popup,x,y);
|
|
301 gtk_paint_box(select_popup->style,select_popup->window,
|
|
302 GTK_STATE_NORMAL,GTK_SHADOW_OUT,
|
|
303 NULL,GTK_WIDGET(select_popup),
|
|
304 "LIRC select list",0,0,-1,-1);
|
|
305
|
|
306 gtk_paint_string(style,select_popup->window,
|
|
307 GTK_STATE_NORMAL,NULL,
|
|
308 GTK_WIDGET(select_popup),
|
|
309 "LIRC select item",
|
|
310 SELECT_BORDER,
|
|
311 SELECT_BORDER+font->ascent,
|
|
312 "No match.");
|
|
313
|
|
314 clear_select_list(&select_list);
|
|
315 }
|
|
316 else
|
|
317 {
|
|
318 int count;
|
|
319 int common;
|
|
320 int pass;
|
|
321 int x1,x2,x3;
|
|
322
|
|
323 if(s==NULL && num>0)
|
|
324 {
|
|
325 scan_list=title_list;
|
|
326 while(scan_list!=NULL)
|
|
327 {
|
|
328 num--;
|
|
329 if(num==0)
|
|
330 {
|
|
331 clear_select_list(&select_list);
|
|
332 xmms_remote_set_playlist_pos
|
|
333 (lirc_plugin.xmms_session,
|
|
334 ((struct title_info *) (scan_list->data))->pos);
|
|
335 break;
|
|
336 }
|
|
337 scan_list=g_list_next(scan_list);
|
|
338 }
|
|
339 clear_title_list(&title_list);
|
|
340 return;
|
|
341 }
|
|
342
|
|
343 check how many chars are common
|
|
344 scan_list=title_list;
|
|
345 title=get_title_postfix
|
|
346 (((struct title_info *) scan_list->data)->s);
|
|
347 common=0;
|
|
348 count=strlen(title);
|
|
349 for(i=0;i<count;i++)
|
|
350 {
|
|
351 if(isalnum(title[i])) common++;
|
|
352 }
|
|
353 scan_list=g_list_next(scan_list);
|
|
354 while(scan_list!=NULL)
|
|
355 {
|
|
356 gchar *title1,*title2;
|
|
357
|
|
358 count=0;
|
|
359 title1=title;
|
|
360 title2=get_title_postfix
|
|
361 (((struct title_info *) scan_list->data)->s);
|
|
362 while(*title1 && *title2)
|
|
363 {
|
|
364 if(!isalnum(*title1)) {title1++;continue;}
|
|
365 if(!isalnum(*title2)) {title2++;continue;}
|
|
366 if(toupper(*title1)==toupper(*title2))
|
|
367 {
|
|
368 count++;
|
|
369 title1++;
|
|
370 title2++;
|
|
371 }
|
|
372 else
|
|
373 {
|
|
374 break;
|
|
375 }
|
|
376 }
|
|
377 if(count<common) common=count;
|
|
378 scan_list=g_list_next(scan_list);
|
|
379 }
|
|
380 scan_list=select_list;
|
|
381 while(g_list_next(scan_list)!=NULL)
|
|
382 {
|
|
383 scan_list=g_list_next(scan_list);
|
|
384 }
|
|
385 ((struct select_info *) (scan_list->data))->common=common+1;
|
|
386
|
|
387 print out selected titles
|
|
388 x1=x2=x3=0;
|
|
389 count=0;
|
|
390 pass=1;
|
|
391 scan_list=title_list;
|
|
392 while(scan_list!=NULL || pass==1)
|
|
393 {
|
|
394 gchar *title,*postfix,help;
|
|
395 char buffer[20];
|
|
396
|
|
397 count++;
|
|
398 title=((struct title_info *) scan_list->data)->s;
|
|
399 postfix=get_title_postfix(title);
|
|
400 help=postfix[0];
|
|
401 postfix[0]=0;
|
|
402
|
|
403 snprintf(buffer,20,"%2d:",count);
|
|
404 if(pass==1)
|
|
405 {
|
|
406 x=gdk_string_width
|
|
407 (select_popup->style->font,buffer);
|
|
408 if(x>x1) x1=x;
|
|
409 x2=gdk_string_width
|
|
410 (select_popup->style->font,title);
|
|
411 postfix[0]=help;
|
|
412 x=gdk_string_width(select_popup->style->font,
|
|
413 postfix);
|
|
414 if(x>x3) x3=x;
|
|
415 }
|
|
416 else
|
|
417 {
|
|
418 gtk_paint_string(style,select_popup->window,
|
|
419 GTK_STATE_NORMAL,NULL,
|
|
420 GTK_WIDGET(select_popup),
|
|
421 "LIRC select item",
|
|
422 SELECT_BORDER,
|
|
423 SELECT_BORDER+font->ascent+
|
|
424 (count-1)*baseline_skip,
|
|
425 buffer);
|
|
426 gtk_paint_string(style,select_popup->window,
|
|
427 GTK_STATE_NORMAL,NULL,
|
|
428 GTK_WIDGET(select_popup),
|
|
429 "LIRC select item",
|
|
430 SELECT_BORDER+x1,
|
|
431 SELECT_BORDER+font->ascent+
|
|
432 (count-1)*baseline_skip,
|
|
433 title);
|
|
434 postfix[0]=help;
|
|
435 gtk_paint_string(style,select_popup->window,
|
|
436 GTK_STATE_NORMAL,NULL,
|
|
437 GTK_WIDGET(select_popup),
|
|
438 "LIRC select item",
|
|
439 SELECT_BORDER+x1+x2+10,
|
|
440 SELECT_BORDER+font->ascent+
|
|
441 (count-1)*baseline_skip,
|
|
442 postfix);
|
|
443
|
|
444 }
|
|
445 scan_list=g_list_next(scan_list);
|
|
446 if(scan_list==NULL)
|
|
447 {
|
|
448 if(pass==1)
|
|
449 {
|
|
450 int x,y;
|
|
451
|
|
452 width=SELECT_BORDER*2+x1+x2+10+x3;
|
|
453 height=SELECT_BORDER*2+count*baseline_skip-gap;
|
|
454
|
|
455 gtk_widget_set_usize(select_popup,
|
|
456 width,
|
|
457 height);
|
|
458 x=(gdk_screen_width()-width)/2;
|
|
459 if(x<0) x=0;
|
|
460 y=(gdk_screen_height()-height)/2;
|
|
461 if(y<0) y=0;
|
|
462 gtk_widget_popup(select_popup,x,y);
|
|
463 gtk_paint_box(style,select_popup->window,
|
|
464 GTK_STATE_NORMAL,
|
|
465 GTK_SHADOW_OUT,
|
|
466 NULL,GTK_WIDGET(select_popup),
|
|
467 "LIRC select list",
|
|
468 0,0,-1,-1);
|
|
469 scan_list=title_list;
|
|
470 count=0;
|
|
471 }
|
|
472 pass++;
|
|
473 }
|
|
474 }
|
|
475 if(count==1)
|
|
476 {
|
|
477 clear_select_list(&select_list);
|
|
478 xmms_remote_set_playlist_pos
|
|
479 (lirc_plugin.xmms_session,
|
|
480 ((struct title_info *) title_list->data)
|
|
481 ->pos);
|
|
482 }
|
|
483 clear_title_list(&title_list);
|
|
484
|
|
485 }
|
|
486 select_tag=gtk_timeout_add(3000,(GtkFunction) remove_select_popup,
|
|
487 (gpointer) &select_popup);
|
|
488 }
|
|
489 */
|
|
490 void init(void)
|
|
491 {
|
|
492 int flags;
|
|
493 ConfigFile *cfg;
|
|
494
|
|
495 if((lirc_fd=lirc_init("audacious",1))==-1)
|
|
496 {
|
|
497 fprintf(stderr,"%s: could not init LIRC support\n",
|
|
498 plugin_name);
|
|
499 return;
|
|
500 }
|
|
501 if(lirc_readconfig(NULL,&config,NULL)==-1)
|
|
502 {
|
|
503 lirc_deinit();
|
|
504 fprintf(stderr,
|
|
505 "%s: could not read LIRC config file\n"
|
|
506 "%s: please read the documentation of LIRC \n"
|
|
507 "%s: how to create a proper config file\n",
|
|
508 plugin_name,plugin_name,plugin_name);
|
|
509 return;
|
|
510 }
|
|
511 input_tag=gdk_input_add(lirc_fd,GDK_INPUT_READ,
|
|
512 lirc_input_callback,NULL);
|
|
513 fcntl(lirc_fd,F_SETOWN,getpid());
|
|
514 flags=fcntl(lirc_fd,F_GETFL,0);
|
|
515 if(flags!=-1)
|
|
516 {
|
|
517 fcntl(lirc_fd,F_SETFL,flags|O_NONBLOCK);
|
|
518 }
|
|
519 fflush(stdout);
|
|
520 cfg=xmms_cfg_open_default_file();
|
|
521 if(cfg)
|
|
522 {
|
|
523 xmms_cfg_read_string(cfg,"LIRC","font",&fontname);
|
|
524 xmms_cfg_free(cfg);
|
|
525 }
|
|
526 popup_style=gtk_style_new();
|
|
527 }
|
|
528
|
|
529 void lirc_input_callback(gpointer data,gint source,
|
|
530 GdkInputCondition condition)
|
|
531 {
|
|
532 char *code;
|
|
533 char *c;
|
|
534 gint playlist_time,playlist_pos,output_time,v;
|
|
535 int ret;
|
|
536 char *ptr;
|
|
537 gint balance;
|
|
538 gboolean show_pl;
|
|
539 int n;
|
|
540
|
|
541 while((ret=lirc_nextcode(&code))==0 && code!=NULL)
|
|
542 {
|
|
543 while((ret=lirc_code2char(config,code,&c))==0 && c!=NULL)
|
|
544 {
|
|
545 if(strcasecmp("PLAY",c)==0)
|
|
546 {
|
|
547 xmms_remote_play(lirc_plugin.xmms_session);
|
|
548 }
|
|
549 else if(strcasecmp("STOP",c)==0)
|
|
550 {
|
|
551 xmms_remote_stop(lirc_plugin.xmms_session);
|
|
552 }
|
|
553 else if(strcasecmp("PAUSE",c)==0)
|
|
554 {
|
|
555 xmms_remote_pause(lirc_plugin.xmms_session);
|
|
556 }
|
|
557 else if(strcasecmp("PLAYPAUSE",c) == 0)
|
|
558 {
|
|
559 if(xmms_remote_is_playing(lirc_plugin.
|
|
560 xmms_session))
|
|
561 xmms_remote_pause
|
|
562 (lirc_plugin.xmms_session);
|
|
563 else
|
|
564 xmms_remote_play
|
|
565 (lirc_plugin.xmms_session);
|
|
566 }
|
|
567 else if(strncasecmp("NEXT",c,4)==0)
|
|
568 {
|
|
569 ptr=c+4;
|
|
570 while(isspace(*ptr)) ptr++;
|
|
571 n=atoi(ptr);
|
|
572
|
|
573 if(n<=0) n=1;
|
|
574 for(;n>0;n--)
|
|
575 {
|
|
576 xmms_remote_playlist_next
|
|
577 (lirc_plugin.xmms_session);
|
|
578 }
|
|
579 }
|
|
580 else if(strncasecmp("PREV",c,4)==0)
|
|
581 {
|
|
582 ptr=c+4;
|
|
583 while(isspace(*ptr)) ptr++;
|
|
584 n=atoi(ptr);
|
|
585
|
|
586 if(n<=0) n=1;
|
|
587 for(;n>0;n--)
|
|
588 {
|
|
589 xmms_remote_playlist_prev
|
|
590 (lirc_plugin.xmms_session);
|
|
591 }
|
|
592 }
|
|
593 else if(strcasecmp("SHUFFLE",c)==0)
|
|
594 {
|
|
595 xmms_remote_toggle_shuffle(lirc_plugin.xmms_session);
|
|
596 }
|
|
597 else if(strcasecmp("REPEAT",c)==0)
|
|
598 {
|
|
599 xmms_remote_toggle_repeat(lirc_plugin.xmms_session);
|
|
600 }
|
|
601 else if(strncasecmp("FWD",c,3)==0)
|
|
602 {
|
|
603 ptr=c+3;
|
|
604 while(isspace(*ptr)) ptr++;
|
|
605 n=atoi(ptr)*1000;
|
|
606
|
|
607 if(n<=0) n=5000;
|
|
608 output_time=xmms_remote_get_output_time
|
|
609 (lirc_plugin.xmms_session);
|
|
610 playlist_pos=xmms_remote_get_playlist_pos
|
|
611 (lirc_plugin.xmms_session);
|
|
612 playlist_time=xmms_remote_get_playlist_time
|
|
613 (lirc_plugin.xmms_session,
|
|
614 playlist_pos);
|
|
615 if(playlist_time-output_time<n)
|
|
616 output_time=playlist_time-n;
|
|
617 xmms_remote_jump_to_time
|
|
618 (lirc_plugin.xmms_session,
|
|
619 output_time+n);
|
|
620 }
|
|
621 else if(strncasecmp("BWD",c,3)==0)
|
|
622 {
|
|
623 ptr=c+3;
|
|
624 while(isspace(*ptr)) ptr++;
|
|
625 n=atoi(ptr)*1000;
|
|
626
|
|
627 if(n<=0) n=5000;
|
|
628 output_time=xmms_remote_get_output_time
|
|
629 (lirc_plugin.xmms_session);
|
|
630 if(output_time<n)
|
|
631 output_time=n;
|
|
632 xmms_remote_jump_to_time
|
|
633 (lirc_plugin.xmms_session,
|
|
634 output_time-n);
|
|
635 }
|
|
636 else if(strncasecmp("VOL_UP",c,6)==0)
|
|
637 {
|
|
638 ptr=c+6;
|
|
639 while(isspace(*ptr)) ptr++;
|
|
640 n=atoi(ptr);
|
|
641 if(n<=0) n=5;
|
|
642
|
|
643 v = xmms_remote_get_main_volume
|
|
644 (lirc_plugin.xmms_session);
|
|
645 if(v > (100-n)) v=100-n;
|
|
646 xmms_remote_set_main_volume
|
|
647 (lirc_plugin.xmms_session,v+n);
|
|
648 }
|
|
649 else if(strncasecmp("VOL_DOWN",c,8)==0)
|
|
650 {
|
|
651 ptr=c+8;
|
|
652 while (isspace(*ptr)) ptr++;
|
|
653 n=atoi(ptr);
|
|
654 if(n<=0) n=5;
|
|
655
|
|
656 v = xmms_remote_get_main_volume
|
|
657 (lirc_plugin.xmms_session);
|
|
658 if(v<n) v=n;
|
|
659 xmms_remote_set_main_volume
|
|
660 (lirc_plugin.xmms_session,v-n);
|
|
661 }
|
|
662 else if(strcasecmp("QUIT",c)==0)
|
|
663 {
|
|
664 #ifdef HAVE_XMMS_REMOTE_QUIT
|
|
665 xmms_remote_quit(lirc_plugin.xmms_session);
|
|
666 #else
|
|
667 raise(SIGTERM);
|
|
668 #endif
|
|
669 }
|
|
670 else if(strcasecmp("SETPOS",c)==0)
|
|
671 {
|
|
672 xmms_remote_set_playlist_pos(lirc_plugin.xmms_session,tracknr-1);
|
|
673 xmms_remote_play(lirc_plugin.xmms_session);
|
|
674 tracknr=0;
|
|
675 }
|
|
676 else if(strcasecmp("ONE",c)==0)
|
|
677 {
|
|
678 if(select_list!=NULL)
|
|
679 {
|
|
680 /* select_title(NULL,1); */
|
|
681 }
|
|
682 else
|
|
683 {
|
|
684 tracknr=tracknr*10+1;
|
|
685 }
|
|
686 }
|
|
687 else if(strcasecmp("TWO",c)==0)
|
|
688 {
|
|
689 if(select_list!=NULL)
|
|
690 {
|
|
691 /* select_title(NULL,2); */
|
|
692 }
|
|
693 else
|
|
694 {
|
|
695 tracknr=tracknr*10+2;
|
|
696 }
|
|
697 }
|
|
698 else if(strcasecmp("THREE",c)==0)
|
|
699 {
|
|
700 if(select_list!=NULL)
|
|
701 {
|
|
702 /* select_title(NULL,3);*/
|
|
703 }
|
|
704 else
|
|
705 {
|
|
706 tracknr=tracknr*10+3;
|
|
707 }
|
|
708 }
|
|
709 else if(strcasecmp("FOUR",c)==0)
|
|
710 {
|
|
711 if(select_list!=NULL)
|
|
712 {
|
|
713 /* select_title(NULL,4);*/
|
|
714 }
|
|
715 else
|
|
716 {
|
|
717 tracknr=tracknr*10+4;
|
|
718 }
|
|
719 }
|
|
720 else if(strcasecmp("FIVE",c)==0)
|
|
721 {
|
|
722 if(select_list!=NULL)
|
|
723 {
|
|
724 /*select_title(NULL,5);*/
|
|
725 }
|
|
726 else
|
|
727 {
|
|
728 tracknr=tracknr*10+5;
|
|
729 }
|
|
730 }
|
|
731 else if(strcasecmp("SIX",c)==0)
|
|
732 {
|
|
733 if(select_list!=NULL)
|
|
734 {
|
|
735 /*select_title(NULL,6);*/
|
|
736 }
|
|
737 else
|
|
738 {
|
|
739 tracknr=tracknr*10+6;
|
|
740 }
|
|
741 }
|
|
742 else if(strcasecmp("SEVEN",c)==0)
|
|
743 {
|
|
744 if(select_list!=NULL)
|
|
745 {
|
|
746 /*select_title(NULL,7);*/
|
|
747 }
|
|
748 else
|
|
749 {
|
|
750 tracknr=tracknr*10+7;
|
|
751 }
|
|
752 }
|
|
753 else if(strcasecmp("EIGHT",c)==0)
|
|
754 {
|
|
755 if(select_list!=NULL)
|
|
756 {
|
|
757 /*select_title(NULL,8);*/
|
|
758 }
|
|
759 else
|
|
760 {
|
|
761 tracknr=tracknr*10+8;
|
|
762 }
|
|
763 }
|
|
764 else if(strcasecmp("NINE",c)==0)
|
|
765 {
|
|
766 if(select_list!=NULL)
|
|
767 {
|
|
768 /*select_title(NULL,9);*/
|
|
769 }
|
|
770 else
|
|
771 {
|
|
772 tracknr=tracknr*10+9;
|
|
773 }
|
|
774 }
|
|
775 else if(strcasecmp("ZERO",c)==0)
|
|
776 {
|
|
777 if(select_list!=NULL)
|
|
778 {
|
|
779 /*select_title(NULL,10);*/
|
|
780 }
|
|
781 else
|
|
782 {
|
|
783 tracknr=tracknr*10;
|
|
784 }
|
|
785 }
|
|
786 else if(strcasecmp("MUTE",c)==0)
|
|
787 {
|
|
788 if(mute==0)
|
|
789 {
|
|
790 mute=1;
|
|
791 /* store the master volume so
|
|
792 we can restore it on unmute. */
|
|
793 mute_vol = xmms_remote_get_main_volume
|
|
794 (lirc_plugin.xmms_session);
|
|
795 xmms_remote_set_main_volume
|
|
796 (lirc_plugin.xmms_session, 0);
|
|
797 }
|
|
798 else
|
|
799 {
|
|
800 mute=0;
|
|
801 xmms_remote_set_main_volume
|
|
802 (lirc_plugin.xmms_session,
|
|
803 mute_vol);
|
|
804 }
|
|
805 }
|
|
806 else if(strncasecmp("BAL_LEFT",c,8)==0)
|
|
807 {
|
|
808 ptr=c+8;
|
|
809 while(isspace(*ptr)) ptr++;
|
|
810 n=atoi(ptr);
|
|
811 if(n<=0) n=5;
|
|
812
|
|
813 balance=xmms_remote_get_balance
|
|
814 (lirc_plugin.xmms_session);
|
|
815 balance-=n;
|
|
816 if(balance<-100) balance=-100;
|
|
817 xmms_remote_set_balance
|
|
818 (lirc_plugin.xmms_session,balance);
|
|
819 }
|
|
820 else if(strncasecmp("BAL_RIGHT",c,9)==0)
|
|
821 {
|
|
822 ptr=c+9;
|
|
823 while(isspace(*ptr)) ptr++;
|
|
824 n=atoi(ptr);
|
|
825 if(n<=0) n=5;
|
|
826
|
|
827 balance=xmms_remote_get_balance
|
|
828 (lirc_plugin.xmms_session);
|
|
829 balance+=n;
|
|
830 if(balance>100) balance=100;
|
|
831 xmms_remote_set_balance
|
|
832 (lirc_plugin.xmms_session,balance);
|
|
833 }
|
|
834 else if(strcasecmp("BAL_CENTER",c)==0)
|
|
835 {
|
|
836 balance=0;
|
|
837 xmms_remote_set_balance
|
|
838 (lirc_plugin.xmms_session,balance);
|
|
839 }
|
|
840 else if(strcasecmp("LIST",c)==0)
|
|
841 {
|
|
842 show_pl=xmms_remote_is_pl_win
|
|
843 (lirc_plugin.xmms_session);
|
|
844 show_pl=(show_pl) ? 0:1;
|
|
845 xmms_remote_pl_win_toggle
|
|
846 (lirc_plugin.xmms_session,show_pl);
|
|
847 }
|
|
848 else if(strcasecmp("PLAYLIST_CLEAR",c)==0)
|
|
849 {
|
|
850 gboolean pl_visible;
|
|
851
|
|
852 pl_visible=xmms_remote_is_pl_win
|
|
853 (lirc_plugin.xmms_session);
|
|
854 xmms_remote_stop(lirc_plugin.xmms_session);
|
|
855 xmms_remote_playlist_clear
|
|
856 (lirc_plugin.xmms_session);
|
|
857 /* This is to refresh window content */
|
|
858 xmms_remote_pl_win_toggle
|
|
859 (lirc_plugin.xmms_session,pl_visible);
|
|
860 }
|
|
861 else if(strncasecmp("PLAYLIST_ADD ",c,13)==0)
|
|
862 {
|
|
863 gboolean pl_visible;
|
|
864 GList list;
|
|
865
|
|
866 pl_visible=xmms_remote_is_pl_win
|
|
867 (lirc_plugin.xmms_session);
|
|
868 list.prev=list.next=NULL;
|
|
869 list.data=c+13;
|
|
870 xmms_remote_playlist_add
|
|
871 (lirc_plugin.xmms_session,&list);
|
|
872 /* This is to refresh window content */
|
|
873 xmms_remote_pl_win_toggle
|
|
874 (lirc_plugin.xmms_session,pl_visible);
|
|
875 }
|
|
876 else if(strncasecmp("SELECT",c,6)==0)
|
|
877 {
|
|
878 char *sel;
|
|
879 int i;
|
|
880
|
|
881 ptr=c+6;
|
|
882 while(isspace(*ptr)) ptr++;
|
|
883
|
|
884 sel=ptr;
|
|
885 for(i=0;*ptr;ptr++)
|
|
886 {
|
|
887 if(isalnum(*ptr))
|
|
888 {
|
|
889 sel[i]=toupper(*ptr);
|
|
890 i++;
|
|
891 }
|
|
892 }
|
|
893 sel[i]=0;
|
|
894
|
|
895 if(strlen(sel)>0)
|
|
896 {
|
|
897 /*select_title(sel,0);*/
|
|
898 }
|
|
899 }
|
|
900 else
|
|
901 {
|
|
902 fprintf(stderr,"%s: unknown command \"%s\"\n",
|
|
903 plugin_name,c);
|
|
904 }
|
|
905 }
|
|
906 free(code);
|
|
907 if(ret==-1) break;
|
|
908 }
|
|
909 if(ret==-1)
|
|
910 {
|
|
911 /* something went badly wrong */
|
|
912 fprintf(stderr,"%s: disconnected from LIRC\n",plugin_name);
|
|
913 cleanup();
|
|
914 return;
|
|
915 }
|
|
916 }
|
|
917
|
|
918 void configure(void)
|
|
919 {
|
|
920 if(!fsd)
|
|
921 {
|
|
922 GtkWidget *window;
|
|
923
|
|
924 window=gtk_font_selection_dialog_new
|
|
925 ("Please choose font for SELECT popup.");
|
|
926 g_return_if_fail(GTK_IS_FONT_SELECTION_DIALOG(window));
|
|
927
|
|
928 fsd=window;
|
|
929 gtk_window_position(GTK_WINDOW(fsd),GTK_WIN_POS_MOUSE);
|
|
930 gtk_signal_connect(GTK_OBJECT(fsd), "destroy",
|
|
931 GTK_SIGNAL_FUNC(gtk_widget_destroyed),
|
|
932 &fsd);
|
|
933 gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG
|
|
934 (fsd)->ok_button),
|
|
935 "clicked",
|
|
936 GTK_SIGNAL_FUNC(font_selection_ok),
|
|
937 NULL);
|
|
938 gtk_signal_connect_object(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fsd)->cancel_button),
|
|
939 "clicked",
|
|
940 GTK_SIGNAL_FUNC(gtk_widget_destroy),
|
|
941 GTK_OBJECT(fsd));
|
|
942 }
|
|
943 if(!GTK_WIDGET_VISIBLE(fsd))
|
|
944 gtk_widget_show(fsd);
|
|
945 else
|
|
946 gtk_widget_destroy(fsd);
|
|
947 }
|
|
948
|
|
949 void font_selection_ok(GtkWidget *button,gpointer *data)
|
|
950 {
|
|
951 gchar *new_fontname;
|
|
952
|
|
953 new_fontname=gtk_font_selection_dialog_get_font_name
|
|
954 (GTK_FONT_SELECTION_DIALOG(fsd));
|
|
955 if(new_fontname)
|
|
956 {
|
|
957 if(fontname) free(fontname);
|
|
958 fontname=new_fontname;
|
|
959 }
|
|
960 gtk_widget_destroy(fsd);
|
|
961 fsd=NULL;
|
|
962 }
|
|
963
|
|
964 void cleanup()
|
|
965 {
|
|
966 ConfigFile *cfg;
|
|
967
|
|
968 if(config)
|
|
969 {
|
|
970 gtk_input_remove(input_tag);
|
|
971 lirc_freeconfig(config);
|
|
972 config=NULL;
|
|
973 }
|
|
974 if(lirc_fd!=-1)
|
|
975 {
|
|
976 lirc_deinit();
|
|
977 lirc_fd=-1;
|
|
978 }
|
|
979 clear_select_list(&select_list);
|
|
980 if(fontname)
|
|
981 {
|
|
982 cfg=xmms_cfg_open_default_file();
|
|
983 if(cfg)
|
|
984 {
|
|
985 xmms_cfg_write_string(cfg,"LIRC","font",fontname);
|
|
986 xmms_cfg_write_default_file(cfg);
|
|
987 xmms_cfg_free(cfg);
|
|
988 }
|
|
989 free(fontname);
|
|
990 }
|
|
991 }
|