1 /*
2  * Copyright (C) 2000-2019 the xine project
3  *
4  * This file is part of xine, a unix video player.
5  *
6  * xine is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * xine is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19  *
20  *
21  */
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25 
26 #include <stdio.h>
27 #include <errno.h>
28 #include <X11/Xlib.h>
29 #include <X11/Xutil.h>
30 #include <X11/keysym.h>
31 #include <pthread.h>
32 
33 #include "common.h"
34 #include "recode.h"
35 
36 #define WINDOW_WIDTH        570
37 #define WINDOW_HEIGHT       616
38 
39 #define METAINFO_CHARSET    "UTF-8"
40 
41 
42 struct {
43   xitk_window_t        *xwin;
44 
45   xitk_widget_list_t   *widget_list;
46 
47   xitk_widget_t        *close;
48   xitk_widget_t        *update;
49 
50   struct {
51     xitk_widget_t      *title;
52     xitk_widget_t      *comment;
53     xitk_widget_t      *artist;
54     xitk_widget_t      *genre;
55     xitk_widget_t      *album;
56     xitk_widget_t      *year;
57     xitk_widget_t      *videocodec;
58     xitk_widget_t      *audiocodec;
59     xitk_widget_t      *systemlayer;
60     xitk_widget_t      *input_plugin;
61   } meta_infos;
62 
63   struct {
64     xitk_widget_t      *bitrate;
65     xitk_widget_t      *seekable;
66     xitk_widget_t      *video_resolution;
67     xitk_widget_t      *video_ratio;
68     xitk_widget_t      *video_channels;
69     xitk_widget_t      *video_streams;
70     xitk_widget_t      *video_bitrate;
71     xitk_widget_t      *video_fourcc;
72     xitk_widget_t      *video_handled;
73     xitk_widget_t      *frame_duration;
74     xitk_widget_t      *audio_channels;
75     xitk_widget_t      *audio_bits;
76     xitk_widget_t      *audio_samplerate;
77     xitk_widget_t      *audio_bitrate;
78     xitk_widget_t      *audio_fourcc;
79     xitk_widget_t      *audio_handled;
80     xitk_widget_t      *has_chapters;
81     xitk_widget_t      *has_video;
82     xitk_widget_t      *has_audio;
83     xitk_widget_t      *ignore_video;
84     xitk_widget_t      *ignore_audio;
85     xitk_widget_t      *ignore_spu;
86     xitk_widget_t      *has_still;
87   } infos;
88 
89   int                   running;
90   int                   visible;
91   xitk_register_key_t   widget_key;
92 
93 } sinfos;
94 
stream_infos_update(xitk_widget_t * w,void * data)95 static void stream_infos_update(xitk_widget_t *w, void *data) {
96   stream_infos_update_infos();
97 }
98 
set_label(xitk_widget_t * w,const char * label)99 static void set_label(xitk_widget_t *w, const char *label) {
100   xitk_label_change_label(w, label);
101 }
102 
get_yesno_string(uint32_t val)103 static const char *get_yesno_string(uint32_t val) {
104   static const char yesno[][4] =  { "No", "Yes" };
105 
106   return ((val > 0) ? yesno[1] : yesno[0]);
107 }
108 
get_fourcc_string(char * fcc,size_t fcc_size,uint32_t f)109 char *get_fourcc_string(char *fcc, size_t fcc_size, uint32_t f) {
110 
111   if (fcc_size < 5) {
112     *fcc = 0;
113     return fcc;
114   }
115 
116   /* Should we take care about endianess ? */
117   fcc[0] = f     | 0xFFFFFF00;
118   fcc[1] = f>>8  | 0xFFFFFF00;
119   fcc[2] = f>>16 | 0xFFFFFF00;
120   fcc[3] = f>>24 | 0xFFFFFF00;
121   fcc[4] = 0;
122 
123   if(f <= 0xFFFF)
124     snprintf(fcc, fcc_size, "0x%x", f);
125 
126   if(memcmp(fcc, "ms\0\x55", 4) == 0) {
127     strcpy(fcc, "3pm."); /* Force to '.mp3' */
128   }
129 
130   return fcc;
131 }
132 
get_meta_info(xitk_widget_t * w,int meta)133 static void get_meta_info(xitk_widget_t *w, int meta) {
134   gGui_t *gui = gGui;
135   char *minfo;
136   xitk_recode_t *xr;
137 
138   xr = xitk_recode_init (METAINFO_CHARSET, NULL, 0);
139 
140   minfo = (char *)xine_get_meta_info(gui->stream, meta);
141   if(minfo)
142     minfo = xitk_recode(xr, minfo);
143   set_label(w, (minfo) ? (char *) minfo : _("Unavailable"));
144 
145   free(minfo);
146   xitk_recode_done(xr);
147 }
148 
get_stream_info(xitk_widget_t * w,int info)149 static void get_stream_info(xitk_widget_t *w, int info) {
150   gGui_t *gui = gGui;
151   char tmp[32];
152 
153   snprintf(tmp, sizeof(tmp), "%d", xine_get_stream_info(gui->stream, info));
154 
155   set_label(w, tmp);
156 }
157 
get_stream_fourcc_info(xitk_widget_t * w,int info)158 static void get_stream_fourcc_info(xitk_widget_t *w, int info) {
159   gGui_t *gui = gGui;
160   uint32_t   iinfo;
161   char       tmp[8];
162 
163   iinfo = xine_get_stream_info(gui->stream, info);
164   set_label(w, (get_fourcc_string(tmp, sizeof(tmp), iinfo)));
165 }
166 
get_stream_yesno_info(xitk_widget_t * w,int info)167 static void get_stream_yesno_info(xitk_widget_t *w, int info) {
168   gGui_t *gui = gGui;
169   uint32_t   iinfo;
170 
171   iinfo = xine_get_stream_info(gui->stream, info);
172   set_label(w, (get_yesno_string(iinfo)));
173 }
174 
get_stream_video_resolution_info(void)175 static void get_stream_video_resolution_info(void) {
176   gGui_t *gui = gGui;
177   uint32_t    video_w, video_h;
178   char        buffer[1024];
179 
180   video_w = xine_get_stream_info(gui->stream, XINE_STREAM_INFO_VIDEO_WIDTH);
181   video_h = xine_get_stream_info(gui->stream, XINE_STREAM_INFO_VIDEO_HEIGHT);
182 
183   snprintf(buffer, sizeof(buffer), "%d X %d", video_w, video_h);
184   set_label(sinfos.infos.video_resolution, buffer);
185 }
186 
stream_infos_get_ident_from_stream(xine_stream_t * stream)187 char *stream_infos_get_ident_from_stream(xine_stream_t *stream) {
188   char        *title   = NULL;
189   char        *atitle  = NULL;
190   char        *album   = NULL;
191   char        *aartist = NULL;
192   char        *artist  = NULL;
193   char        *aalbum  = NULL;
194   char        *ident   = NULL;
195   xitk_recode_t *xr;
196 
197   if(!stream)
198     return NULL;
199 
200   title = (char *)xine_get_meta_info(stream, XINE_META_INFO_TITLE);
201   artist = (char *)xine_get_meta_info(stream, XINE_META_INFO_ARTIST);
202   album = (char *)xine_get_meta_info(stream, XINE_META_INFO_ALBUM);
203 
204   xr = xitk_recode_init (METAINFO_CHARSET, NULL, 0);
205   if(title)
206     title = xitk_recode(xr, title);
207   if(artist)
208     artist = xitk_recode(xr, artist);
209   if(album)
210     album = xitk_recode(xr, album);
211   xitk_recode_done(xr);
212 
213   /*
214    * Since meta info can be corrupted/wrong/ugly
215    * we need to clean and check them before using.
216    * Note: atoa() modify the string, so we work on a copy.
217    */
218   if(title && strlen(title)) {
219     atitle = atoa(title);
220     if ( ! *atitle )
221       atitle = strdup(title);
222     else
223       atitle = strdup(atitle);
224   }
225   if(artist && strlen(artist)) {
226     aartist = atoa(artist);
227     if ( ! *aartist )
228       aartist = strdup(artist);
229     else
230       aartist = strdup(aartist);
231   }
232   if(album && strlen(album)) {
233     aalbum = atoa(album);
234     if ( ! *aalbum )
235       aalbum = strdup(album);
236     else
237       aalbum = strdup(aalbum);
238   }
239   free(title);
240   free(artist);
241   free(album);
242 
243   if(atitle) {
244     int len = strlen(atitle) + 1;
245 
246     if(aartist && strlen(aartist))
247       len += strlen(aartist) + 3;
248     if(aalbum && strlen(aalbum))
249       len += strlen(aalbum) + 3;
250 
251     ident = (char *) malloc(len + 1);
252     strcpy(ident, atitle);
253 
254     if((aartist && strlen(aartist)) || (aalbum && strlen(aalbum))) {
255       strlcat(ident, " (", len);
256       if(aartist && strlen(aartist))
257 	strlcat(ident, aartist, len);
258       if((aartist && strlen(aartist)) && (aalbum && strlen(aalbum)))
259 	strlcat(ident, " - ", len);
260       if(aalbum && strlen(aalbum))
261 	strlcat(ident, aalbum, len);
262       strlcat(ident, ")", len);
263     }
264   }
265   free(atitle);
266   free(aartist);
267   free(aalbum);
268 
269   return ident;
270 }
271 
stream_infos_exit(xitk_widget_t * w,void * data)272 static void stream_infos_exit(xitk_widget_t *w, void *data) {
273   gGui_t *gui = gGui;
274 
275   window_info_t wi;
276 
277   if ( ! sinfos.running ) return;
278 
279     sinfos.running = 0;
280     sinfos.visible = 0;
281 
282     if((xitk_get_window_info(sinfos.widget_key, &wi))) {
283       config_update_num ("gui.sinfos_x", wi.x);
284       config_update_num ("gui.sinfos_y", wi.y);
285       WINDOW_INFO_ZERO(&wi);
286     }
287 
288     xitk_unregister_event_handler(&sinfos.widget_key);
289 
290     xitk_destroy_widgets(sinfos.widget_list);
291     xitk_window_destroy_window(gui->imlib_data, sinfos.xwin);
292 
293     sinfos.xwin = NULL;
294     /* xitk_dlist_init (&sinfos.widget_list.list); */
295 
296     gui->x_lock_display (gui->display);
297     XFreeGC(gui->display, (XITK_WIDGET_LIST_GC(sinfos.widget_list)));
298     gui->x_unlock_display (gui->display);
299 
300     XITK_WIDGET_LIST_FREE(sinfos.widget_list);
301 
302     try_to_set_input_focus(gui->video_window);
303 }
304 
handle_event(XEvent * event,void * data)305 static void handle_event(XEvent *event, void *data) {
306   switch(event->type) {
307 
308   case KeyPress:
309     if(xitk_get_key_pressed(event) == XK_Escape)
310       stream_infos_exit(NULL, NULL);
311     else
312       gui_handle_event (event, gGui);
313     break;
314   }
315 }
316 
stream_infos_is_visible(void)317 int stream_infos_is_visible(void) {
318   gGui_t *gui = gGui;
319 
320     if(gui->use_root_window)
321       return xitk_is_window_visible(gui->display, xitk_window_get_window(sinfos.xwin));
322     else
323       return sinfos.visible && xitk_is_window_visible(gui->display, xitk_window_get_window(sinfos.xwin));
324 
325   return 0;
326 }
327 
stream_infos_is_running(void)328 int stream_infos_is_running(void) {
329   return sinfos.running;
330 }
331 
stream_infos_toggle_auto_update(void)332 void stream_infos_toggle_auto_update(void) {
333   gGui_t *gui = gGui;
334     if(gui->stream_info_auto_update) {
335       xitk_hide_widget(sinfos.update);
336       gui->x_lock_display (gui->display);
337       XClearWindow(gui->display, xitk_window_get_window(sinfos.xwin));
338       gui->x_unlock_display (gui->display);
339       xitk_paint_widget_list(sinfos.widget_list);
340     }
341     else
342       xitk_show_widget(sinfos.update);
343 }
344 
stream_infos_raise_window(void)345 void stream_infos_raise_window(void) {
346     raise_window(xitk_window_get_window(sinfos.xwin), sinfos.visible, sinfos.running);
347 }
348 
stream_infos_toggle_visibility(xitk_widget_t * w,void * data)349 void stream_infos_toggle_visibility(xitk_widget_t *w, void *data) {
350     toggle_window(xitk_window_get_window(sinfos.xwin), sinfos.widget_list,
351 		  &sinfos.visible, sinfos.running);
352 }
353 
stream_infos_end(void)354 void stream_infos_end(void) {
355   stream_infos_exit(NULL, NULL);
356 }
357 
stream_info_update_undefined(void)358 static void stream_info_update_undefined(void) {
359   const char *const unavail = _("Unavailable");
360 
361   set_label(sinfos.meta_infos.title, unavail);
362   set_label(sinfos.meta_infos.comment, unavail);
363   set_label(sinfos.meta_infos.artist, unavail);
364   set_label(sinfos.meta_infos.genre, unavail);
365   set_label(sinfos.meta_infos.album, unavail);
366   set_label(sinfos.meta_infos.year, "19__");
367   set_label(sinfos.meta_infos.videocodec, unavail);
368   set_label(sinfos.meta_infos.audiocodec, unavail);
369   set_label(sinfos.meta_infos.systemlayer, unavail);
370   set_label(sinfos.meta_infos.input_plugin, unavail);
371   /* */
372   set_label(sinfos.infos.bitrate, "---");
373   set_label(sinfos.infos.seekable, "---");
374   set_label(sinfos.infos.video_resolution, "--- X ---");
375   set_label(sinfos.infos.video_ratio, "---");
376   set_label(sinfos.infos.video_channels, "---");
377   set_label(sinfos.infos.video_streams, "---");
378   set_label(sinfos.infos.video_bitrate, "---");
379   set_label(sinfos.infos.video_fourcc, "---");
380   set_label(sinfos.infos.video_handled, "---");
381   set_label(sinfos.infos.frame_duration, "---");
382   set_label(sinfos.infos.audio_channels, "---");
383   set_label(sinfos.infos.audio_bits, "---");
384   set_label(sinfos.infos.audio_samplerate, "---");
385   set_label(sinfos.infos.audio_bitrate, "---");
386   set_label(sinfos.infos.audio_fourcc, "---");
387   set_label(sinfos.infos.audio_handled, "---");
388   set_label(sinfos.infos.has_chapters, "---");
389   set_label(sinfos.infos.has_video, "---");
390   set_label(sinfos.infos.has_audio, "---");
391   set_label(sinfos.infos.ignore_video, "---");
392   set_label(sinfos.infos.ignore_audio, "---");
393   set_label(sinfos.infos.ignore_spu, "---");
394   set_label(sinfos.infos.has_still, "---");
395 }
396 
stream_infos_update_infos(void)397 void stream_infos_update_infos(void) {
398   gGui_t *gui = gGui;
399     if(!gui->logo_mode) {
400 
401       get_meta_info(sinfos.meta_infos.title, XINE_META_INFO_TITLE);
402       get_meta_info(sinfos.meta_infos.comment, XINE_META_INFO_COMMENT);
403       get_meta_info(sinfos.meta_infos.artist, XINE_META_INFO_ARTIST);
404       get_meta_info(sinfos.meta_infos.genre, XINE_META_INFO_GENRE);
405       get_meta_info(sinfos.meta_infos.album, XINE_META_INFO_ALBUM);
406       get_meta_info(sinfos.meta_infos.year, XINE_META_INFO_YEAR);
407       get_meta_info(sinfos.meta_infos.videocodec, XINE_META_INFO_VIDEOCODEC);
408       get_meta_info(sinfos.meta_infos.audiocodec, XINE_META_INFO_AUDIOCODEC);
409       get_meta_info(sinfos.meta_infos.systemlayer, XINE_META_INFO_SYSTEMLAYER);
410       get_meta_info(sinfos.meta_infos.input_plugin, XINE_META_INFO_INPUT_PLUGIN);
411 
412       get_stream_info(sinfos.infos.bitrate, XINE_STREAM_INFO_BITRATE);
413       get_stream_yesno_info(sinfos.infos.seekable, XINE_STREAM_INFO_SEEKABLE);
414       get_stream_video_resolution_info();
415       get_stream_info(sinfos.infos.video_ratio, XINE_STREAM_INFO_VIDEO_RATIO);
416       get_stream_info(sinfos.infos.video_channels, XINE_STREAM_INFO_VIDEO_CHANNELS);
417       get_stream_info(sinfos.infos.video_streams, XINE_STREAM_INFO_VIDEO_STREAMS);
418       get_stream_info(sinfos.infos.video_bitrate, XINE_STREAM_INFO_VIDEO_BITRATE);
419       get_stream_fourcc_info(sinfos.infos.video_fourcc, XINE_STREAM_INFO_VIDEO_FOURCC);
420       get_stream_yesno_info(sinfos.infos.video_handled, XINE_STREAM_INFO_VIDEO_HANDLED);
421       get_stream_info(sinfos.infos.frame_duration, XINE_STREAM_INFO_FRAME_DURATION);
422       get_stream_info(sinfos.infos.audio_channels, XINE_STREAM_INFO_AUDIO_CHANNELS);
423       get_stream_info(sinfos.infos.audio_bits, XINE_STREAM_INFO_AUDIO_BITS);
424       get_stream_info(sinfos.infos.audio_samplerate, XINE_STREAM_INFO_AUDIO_SAMPLERATE);
425       get_stream_info(sinfos.infos.audio_bitrate, XINE_STREAM_INFO_AUDIO_BITRATE);
426       get_stream_fourcc_info(sinfos.infos.audio_fourcc, XINE_STREAM_INFO_AUDIO_FOURCC);
427       get_stream_yesno_info(sinfos.infos.audio_handled, XINE_STREAM_INFO_AUDIO_HANDLED);
428       get_stream_yesno_info(sinfos.infos.has_chapters, XINE_STREAM_INFO_HAS_CHAPTERS);
429       get_stream_yesno_info(sinfos.infos.has_video, XINE_STREAM_INFO_HAS_VIDEO);
430       get_stream_yesno_info(sinfos.infos.has_audio, XINE_STREAM_INFO_HAS_AUDIO);
431       get_stream_yesno_info(sinfos.infos.ignore_video, XINE_STREAM_INFO_IGNORE_VIDEO);
432       get_stream_yesno_info(sinfos.infos.ignore_audio, XINE_STREAM_INFO_IGNORE_AUDIO);
433       get_stream_yesno_info(sinfos.infos.ignore_spu, XINE_STREAM_INFO_IGNORE_SPU);
434       get_stream_yesno_info(sinfos.infos.has_still, XINE_STREAM_INFO_VIDEO_HAS_STILL);
435     }
436     else
437       stream_info_update_undefined();
438 }
439 
stream_infos_reparent(void)440 void stream_infos_reparent(void) {
441     reparent_window((xitk_window_get_window(sinfos.xwin)));
442 }
443 
stream_infos_panel(void)444 void stream_infos_panel(void) {
445   gGui_t *gui = gGui;
446   GC                          gc;
447   xitk_labelbutton_widget_t   lb;
448   xitk_label_widget_t         lbl;
449   xitk_checkbox_widget_t      cb;
450   xitk_pixmap_t              *bg;
451   int                         x, y, w, width, height;
452   xitk_widget_t              *widget;
453 
454   x = xine_config_register_num (__xineui_global_xine_instance, "gui.sinfos_x",
455 				80,
456 				CONFIG_NO_DESC,
457 				CONFIG_NO_HELP,
458 				CONFIG_LEVEL_DEB,
459 				CONFIG_NO_CB,
460 				CONFIG_NO_DATA);
461   y = xine_config_register_num (__xineui_global_xine_instance, "gui.sinfos_y",
462 				80,
463 				CONFIG_NO_DESC,
464 				CONFIG_NO_HELP,
465 				CONFIG_LEVEL_DEB,
466 				CONFIG_NO_CB,
467 				CONFIG_NO_DATA);
468 
469   /* Create window */
470   sinfos.xwin = xitk_window_create_dialog_window(gui->imlib_data, _("Stream Information"), x, y,
471 						  WINDOW_WIDTH, WINDOW_HEIGHT);
472 
473   set_window_states_start((xitk_window_get_window(sinfos.xwin)));
474 
475   gui->x_lock_display (gui->display);
476   gc = XCreateGC(gui->display,
477 		 (xitk_window_get_window(sinfos.xwin)), None, None);
478   gui->x_unlock_display (gui->display);
479 
480   sinfos.widget_list = xitk_widget_list_new();
481   xitk_widget_list_set(sinfos.widget_list,
482 		       WIDGET_LIST_WINDOW, (void *) (xitk_window_get_window(sinfos.xwin)));
483   xitk_widget_list_set(sinfos.widget_list, WIDGET_LIST_GC, gc);
484 
485   XITK_WIDGET_INIT(&lb, gui->imlib_data);
486   XITK_WIDGET_INIT(&lbl, gui->imlib_data);
487   lbl.window            = xitk_window_get_window (sinfos.xwin);
488   lbl.gc                = (XITK_WIDGET_LIST_GC (sinfos.widget_list));
489   lbl.skin_element_name = NULL;
490   lbl.label             = "";
491   lbl.callback          = NULL;
492   XITK_WIDGET_INIT(&cb, gui->imlib_data);
493 
494   xitk_window_get_window_size(sinfos.xwin, &width, &height);
495   bg = xitk_image_create_xitk_pixmap(gui->imlib_data, width, height);
496   gui->x_lock_display (gui->display);
497   XCopyArea(gui->display, (xitk_window_get_background(sinfos.xwin)), bg->pixmap,
498 	    bg->gc, 0, 0, width, height, 0, 0);
499   gui->x_unlock_display (gui->display);
500 
501   x = 15;
502   y = 34 - 6;
503 
504   draw_outter_frame(gui->imlib_data, bg, _("General"), btnfontname,
505 		    x, y, WINDOW_WIDTH - 30, (4 * ((20 + 22) + 3) - 3 + 5 + 2) + 15);
506 
507   /* First Line */
508   x = 20;
509   y += 15;
510   w = WINDOW_WIDTH - 40 - 1;
511   draw_inner_frame(gui->imlib_data, bg, _("Title: "), lfontname,
512 		   x, y, w, (20 + 22));
513   sinfos.meta_infos.title = xitk_noskin_label_create (sinfos.widget_list, &lbl,
514     x + 5, y + 15, w - 10, 20, fontname);
515   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.title);
516   xitk_enable_and_show_widget(sinfos.meta_infos.title);
517 
518   /* New Line */
519   y += (20 + 22) + 3;
520   draw_inner_frame(gui->imlib_data, bg, _("Comment: "), lfontname,
521 		   x, y, w, (20 + 22));
522   sinfos.meta_infos.comment = xitk_noskin_label_create (sinfos.widget_list, &lbl,
523     x + 5, y + 15, w - 10, 20, fontname);
524   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.comment);
525   xitk_enable_and_show_widget(sinfos.meta_infos.comment);
526 
527   /* New Line */
528   y += (20 + 22) + 3;
529   w = (((WINDOW_WIDTH - 40 - 3 * 5) / 4) * 2) + 5 + 1;
530   draw_inner_frame(gui->imlib_data, bg, _("Artist: "), lfontname,
531 		   x, y, w, (20 + 22));
532   sinfos.meta_infos.artist = xitk_noskin_label_create (sinfos.widget_list, &lbl,
533     x + 5, y + 15, w - 10, 20, fontname);
534   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.artist);
535   xitk_enable_and_show_widget(sinfos.meta_infos.artist);
536 
537   x += w + 5;
538   w = ((WINDOW_WIDTH - 40 - 3 * 5) / 4) + 1;
539   draw_inner_frame(gui->imlib_data, bg, _("Genre: "), lfontname,
540 		   x, y, w, (20 + 22));
541   sinfos.meta_infos.genre = xitk_noskin_label_create (sinfos.widget_list, &lbl,
542     x + 5, y + 15, w - 10, 20, fontname);
543   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.genre);
544   xitk_enable_and_show_widget(sinfos.meta_infos.genre);
545 
546   x += w + 5;
547   w -= 1;
548   draw_inner_frame(gui->imlib_data, bg, _("Year: "), lfontname,
549 		   x, y, w, (20 + 22));
550   sinfos.meta_infos.year = xitk_noskin_label_create (sinfos.widget_list, &lbl,
551     x + 5, y + 15, w - 10, 20, fontname);
552   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.year);
553   xitk_enable_and_show_widget(sinfos.meta_infos.year);
554 
555   /* New Line */
556   x = 20;
557   y += (20 + 22) + 3;
558   w = (((WINDOW_WIDTH - 40 - 3 * 5) / 4) * 2) + 5 + 1;
559   draw_inner_frame(gui->imlib_data, bg, _("Album: "), lfontname,
560 		   x, y, w, (20 + 22));
561   sinfos.meta_infos.album = xitk_noskin_label_create (sinfos.widget_list, &lbl,
562     x + 5, y + 15, w - 10, 20, fontname);
563   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.album);
564   xitk_enable_and_show_widget(sinfos.meta_infos.album);
565 
566   /* frame space */
567   x = 15;
568   y += ((20 + 22) + 5 + 2) + 3;
569   draw_outter_frame(gui->imlib_data, bg, _("Misc"), btnfontname,
570 		    x, y, WINDOW_WIDTH - 30, (2 * ((20 + 22) + 3) - 3 + 5 + 2) + 15);
571   /* New Line */
572   x = 20;
573   y += 15;
574   w = (WINDOW_WIDTH - 40 - 3 * 5) / 4;
575   draw_inner_frame(gui->imlib_data, bg, _("Input Plugin: "), lfontname,
576 		   x, y, w, (20 + 22));
577   sinfos.meta_infos.input_plugin = xitk_noskin_label_create (sinfos.widget_list, &lbl,
578     x + 5, y + 15, w - 10, 20, fontname);
579   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.input_plugin);
580   xitk_enable_and_show_widget(sinfos.meta_infos.input_plugin);
581 
582   x += w + 5;
583   w += 1;
584   draw_inner_frame(gui->imlib_data, bg, _("System Layer: "), lfontname,
585 		   x, y, w, (20 + 22));
586   sinfos.meta_infos.systemlayer = xitk_noskin_label_create (sinfos.widget_list, &lbl,
587     x + 5, y + 15, w - 10, 20, fontname);
588   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.systemlayer);
589   xitk_enable_and_show_widget(sinfos.meta_infos.systemlayer);
590 
591   x += w + 5;
592   draw_inner_frame(gui->imlib_data, bg, _("Bitrate: "), lfontname,
593 		   x, y, w, (20 + 22));
594   sinfos.infos.bitrate = xitk_noskin_label_create (sinfos.widget_list, &lbl,
595     x + 5, y + 15, w - 10, 20, fontname);
596   xitk_add_widget (sinfos.widget_list, sinfos.infos.bitrate);
597   xitk_enable_and_show_widget(sinfos.infos.bitrate);
598 
599   x += w + 5;
600   w -= 1;
601   draw_inner_frame(gui->imlib_data, bg, _("Frame Duration: "), lfontname,
602 		   x, y, w, (20 + 22));
603   sinfos.infos.frame_duration = xitk_noskin_label_create (sinfos.widget_list, &lbl,
604     x + 5, y + 15, w - 10, 20, fontname);
605   xitk_add_widget (sinfos.widget_list, sinfos.infos.frame_duration);
606   xitk_enable_and_show_widget(sinfos.infos.frame_duration);
607 
608   /* New Line */
609   x = 20;
610   y += (20 + 22) + 3;
611   draw_inner_frame(gui->imlib_data, bg, _("Is Seekable: "), lfontname,
612 		   x, y, w, (20 + 22));
613   sinfos.infos.seekable = xitk_noskin_label_create (sinfos.widget_list, &lbl,
614     x + 5, y + 15, w - 10, 20, fontname);
615   xitk_add_widget (sinfos.widget_list, sinfos.infos.seekable);
616   xitk_enable_and_show_widget(sinfos.infos.seekable);
617 
618   x += w + 5;
619   w += 1;
620   draw_inner_frame(gui->imlib_data, bg, _("Has Chapters: "), lfontname,
621 		   x, y, w, (20 + 22));
622   sinfos.infos.has_chapters = xitk_noskin_label_create (sinfos.widget_list, &lbl,
623     x + 5, y + 15, w - 10, 20, fontname);
624   xitk_add_widget (sinfos.widget_list, sinfos.infos.has_chapters);
625   xitk_enable_and_show_widget(sinfos.infos.has_chapters);
626 
627   x += w + 5;
628   draw_inner_frame(gui->imlib_data, bg, _("Ignore Spu: "), lfontname,
629 		   x, y, w, (20 + 22));
630   sinfos.infos.ignore_spu = xitk_noskin_label_create (sinfos.widget_list, &lbl,
631     x + 5, y + 15, w - 10, 20, fontname);
632   xitk_add_widget (sinfos.widget_list, sinfos.infos.ignore_spu);
633   xitk_enable_and_show_widget(sinfos.infos.ignore_spu);
634 
635   x += w + 5;
636   w -= 1;
637   draw_inner_frame(gui->imlib_data, bg, _("Has Still: "), lfontname,
638 		   x, y, w, (20 + 22));
639   sinfos.infos.has_still = xitk_noskin_label_create (sinfos.widget_list, &lbl,
640     x + 5, y + 15, w - 10, 20, fontname);
641   xitk_add_widget (sinfos.widget_list, sinfos.infos.has_still);
642   xitk_enable_and_show_widget(sinfos.infos.has_still);
643 
644   /* video frame */
645   x = 15;
646   y += ((20 + 22) + 5 + 2) + 3;
647   draw_outter_frame(gui->imlib_data, bg, _("Video"), btnfontname,
648 		    x, y, WINDOW_WIDTH - 30, (2 * ((20 + 22) + 3) - 3 + 5 + 2) + 15);
649 
650   /* New Line */
651   x = 20;
652   y += 15;
653   w = (WINDOW_WIDTH - 40 - 4 * 5) / 5;
654   draw_inner_frame(gui->imlib_data, bg, _("Has: "), lfontname,
655 		   x, y, w, (20 + 22));
656   sinfos.infos.has_video = xitk_noskin_label_create (sinfos.widget_list, &lbl,
657     x + 5, y + 15, w - 10, 20, fontname);
658   xitk_add_widget (sinfos.widget_list, sinfos.infos.has_video);
659   xitk_enable_and_show_widget(sinfos.infos.has_video);
660 
661   x += w + 5;
662   draw_inner_frame(gui->imlib_data, bg, _("Handled: "), lfontname,
663 		   x, y, w, (20 + 22));
664   sinfos.infos.video_handled = xitk_noskin_label_create (sinfos.widget_list, &lbl,
665     x + 5, y + 15, w - 10, 20, fontname);
666   xitk_add_widget (sinfos.widget_list, sinfos.infos.video_handled);
667   xitk_enable_and_show_widget(sinfos.infos.video_handled);
668 
669   x += w + 5;
670   w -= 1;
671   draw_inner_frame(gui->imlib_data, bg, _("Ignore: "), lfontname,
672 		   x, y, w, (20 + 22));
673   sinfos.infos.ignore_video = xitk_noskin_label_create (sinfos.widget_list, &lbl,
674     x + 5, y + 15, w - 10, 20, fontname);
675   xitk_add_widget (sinfos.widget_list, sinfos.infos.ignore_video);
676   xitk_enable_and_show_widget(sinfos.infos.ignore_video);
677 
678   x += w + 5;
679   w += 1;
680   w = (w * 2) + 5;
681   draw_inner_frame(gui->imlib_data, bg, _("Codec: "), lfontname,
682 		   x, y, w, (20 + 22));
683   sinfos.meta_infos.videocodec = xitk_noskin_label_create (sinfos.widget_list, &lbl,
684     x + 5, y + 15, w - 10, 20, fontname);
685   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.videocodec);
686   xitk_enable_and_show_widget(sinfos.meta_infos.videocodec);
687 
688   /* New Line */
689   x = 20;
690   y += (20 + 22) + 3;
691   w = (WINDOW_WIDTH - 40 - 5 * 5) / 6;
692   draw_inner_frame(gui->imlib_data, bg, _("FourCC: "), lfontname,
693 		   x, y, w, (20 + 22));
694   sinfos.infos.video_fourcc = xitk_noskin_label_create (sinfos.widget_list, &lbl,
695     x + 5, y + 15, w - 10, 20, fontname);
696   xitk_add_widget (sinfos.widget_list, sinfos.infos.video_fourcc);
697   xitk_enable_and_show_widget(sinfos.infos.video_fourcc);
698 
699   x += w + 5;
700   draw_inner_frame(gui->imlib_data, bg, _("Channel(s): "), lfontname,
701 		   x, y, w, (20 + 22));
702   sinfos.infos.video_channels = xitk_noskin_label_create (sinfos.widget_list, &lbl,
703     x + 5, y + 15, w - 10, 20, fontname);
704   xitk_add_widget (sinfos.widget_list, sinfos.infos.video_channels);
705   xitk_enable_and_show_widget(sinfos.infos.video_channels);
706 
707   x += w + 5;
708   draw_inner_frame(gui->imlib_data, bg, _("Bitrate: "), lfontname,
709 		   x, y, w, (20 + 22));
710   sinfos.infos.video_bitrate = xitk_noskin_label_create (sinfos.widget_list, &lbl,
711     x + 5, y + 15, w - 10, 20, fontname);
712   xitk_add_widget (sinfos.widget_list, sinfos.infos.video_bitrate);
713   xitk_enable_and_show_widget(sinfos.infos.video_bitrate);
714 
715   x += w + 5;
716   draw_inner_frame(gui->imlib_data, bg, _("Resolution: "), lfontname,
717 		   x, y, w, (20 + 22));
718   sinfos.infos.video_resolution = xitk_noskin_label_create (sinfos.widget_list, &lbl,
719     x + 5, y + 15, w - 10, 20, fontname);
720   xitk_add_widget (sinfos.widget_list, sinfos.infos.video_resolution);
721   xitk_enable_and_show_widget(sinfos.infos.video_resolution);
722 
723   x += w + 5;
724   draw_inner_frame(gui->imlib_data, bg, _("Ratio: "), lfontname,
725 		   x, y, w, (20 + 22));
726   sinfos.infos.video_ratio = xitk_noskin_label_create (sinfos.widget_list, &lbl,
727     x + 5, y + 15, w - 10, 20, fontname);
728   xitk_add_widget (sinfos.widget_list, sinfos.infos.video_ratio);
729   xitk_enable_and_show_widget(sinfos.infos.video_ratio);
730 
731   x += w + 5;
732   draw_inner_frame(gui->imlib_data, bg, _("Stream(s): "), lfontname,
733 		   x, y, w, (20 + 22));
734   sinfos.infos.video_streams = xitk_noskin_label_create (sinfos.widget_list, &lbl,
735     x + 5, y + 15, w - 10, 20, fontname);
736   xitk_add_widget (sinfos.widget_list, sinfos.infos.video_streams);
737   xitk_enable_and_show_widget(sinfos.infos.video_streams);
738 
739   /* Audio Frame */
740   x = 15;
741   y += ((20 + 22) + 5 + 2) + 3;
742   draw_outter_frame(gui->imlib_data, bg, _("Audio"), btnfontname,
743 		    x, y, WINDOW_WIDTH - 30, (2 * ((20 + 22) + 3) - 3 + 5 + 2) + 15);
744 
745   /* New Line */
746   x = 20;
747   y += 15;
748   w = (WINDOW_WIDTH - 40 - 4 * 5) / 5;
749   draw_inner_frame(gui->imlib_data, bg, _("Has: "), lfontname,
750 		   x, y, w, (20 + 22));
751   sinfos.infos.has_audio = xitk_noskin_label_create (sinfos.widget_list, &lbl,
752     x + 5, y + 15, w - 10, 20, fontname);
753   xitk_add_widget (sinfos.widget_list, sinfos.infos.has_audio);
754   xitk_enable_and_show_widget(sinfos.infos.has_audio);
755 
756   x += w + 5;
757   draw_inner_frame(gui->imlib_data, bg, _("Handled: "), lfontname,
758 		   x, y, w, (20 + 22));
759   sinfos.infos.audio_handled = xitk_noskin_label_create (sinfos.widget_list, &lbl,
760     x + 5, y + 15, w - 10, 20, fontname);
761   xitk_add_widget (sinfos.widget_list, sinfos.infos.audio_handled);
762   xitk_enable_and_show_widget(sinfos.infos.audio_handled);
763 
764   x += w + 5;
765   w -= 1;
766   draw_inner_frame(gui->imlib_data, bg, _("Ignore: "), lfontname,
767 		   x, y, w, (20 + 22));
768   sinfos.infos.ignore_audio = xitk_noskin_label_create (sinfos.widget_list, &lbl,
769     x + 5, y + 15, w - 10, 20, fontname);
770   xitk_add_widget (sinfos.widget_list, sinfos.infos.ignore_audio);
771   xitk_enable_and_show_widget(sinfos.infos.ignore_audio);
772 
773   x += w + 5;
774   w += 1;
775   w = (w * 2) + 5;
776   draw_inner_frame(gui->imlib_data, bg, _("Codec: "), lfontname,
777 		   x, y, w, (20 + 22));
778   sinfos.meta_infos.audiocodec = xitk_noskin_label_create (sinfos.widget_list, &lbl,
779     x + 5, y + 15, w - 10, 20, fontname);
780   xitk_add_widget (sinfos.widget_list, sinfos.meta_infos.audiocodec);
781   xitk_enable_and_show_widget(sinfos.meta_infos.audiocodec);
782 
783   /* New Line */
784   x = 20;
785   y += (20 + 22) + 3;
786   w = (WINDOW_WIDTH - 40 - 4 * 5) / 5;
787   draw_inner_frame(gui->imlib_data, bg, _("FourCC: "), lfontname,
788 		   x, y, w, (20 + 22));
789   sinfos.infos.audio_fourcc = xitk_noskin_label_create (sinfos.widget_list, &lbl,
790     x + 5, y + 15, w - 10, 20, fontname);
791   xitk_add_widget (sinfos.widget_list, sinfos.infos.audio_fourcc);
792   xitk_enable_and_show_widget(sinfos.infos.audio_fourcc);
793 
794   x += w + 5;
795   draw_inner_frame(gui->imlib_data, bg, _("Channel(s): "), lfontname,
796 		   x, y, w, (20 + 22));
797   sinfos.infos.audio_channels = xitk_noskin_label_create (sinfos.widget_list, &lbl,
798     x + 5, y + 15, w - 10, 20, fontname);
799   xitk_add_widget (sinfos.widget_list, sinfos.infos.audio_channels);
800   xitk_enable_and_show_widget(sinfos.infos.audio_channels);
801 
802   x += w + 5;
803   w -= 1;
804   draw_inner_frame(gui->imlib_data, bg, _("Bitrate: "), lfontname,
805 		   x, y, w, (20 + 22));
806   sinfos.infos.audio_bitrate = xitk_noskin_label_create (sinfos.widget_list, &lbl,
807     x + 5, y + 15, w - 10, 20, fontname);
808   xitk_add_widget (sinfos.widget_list, sinfos.infos.audio_bitrate);
809   xitk_enable_and_show_widget(sinfos.infos.audio_bitrate);
810 
811   x += w + 5;
812   w += 1;
813   draw_inner_frame(gui->imlib_data, bg, _("Bits: "), lfontname,
814 		   x, y, w, (20 + 22));
815   sinfos.infos.audio_bits = xitk_noskin_label_create (sinfos.widget_list, &lbl,
816     x + 5, y + 15, w - 10, 20, fontname);
817   xitk_add_widget (sinfos.widget_list, sinfos.infos.audio_bits);
818   xitk_enable_and_show_widget(sinfos.infos.audio_bits);
819 
820   x += w + 5;
821   draw_inner_frame(gui->imlib_data, bg, _("Samplerate: "), lfontname,
822 		   x, y, w, (20 + 22));
823   sinfos.infos.audio_samplerate = xitk_noskin_label_create (sinfos.widget_list, &lbl,
824     x + 5, y + 15, w - 10, 20, fontname);
825   xitk_add_widget (sinfos.widget_list, sinfos.infos.audio_samplerate);
826   xitk_enable_and_show_widget(sinfos.infos.audio_samplerate);
827 
828   /*  */
829   y = WINDOW_HEIGHT - (23 + 15);
830   x = 15;
831 
832   lb.button_type       = CLICK_BUTTON;
833   lb.label             = _("Update");
834   lb.align             = ALIGN_CENTER;
835   lb.callback          = stream_infos_update;
836   lb.state_callback    = NULL;
837   lb.userdata          = NULL;
838   lb.skin_element_name = NULL;
839   sinfos.update = xitk_noskin_labelbutton_create (sinfos.widget_list,
840     &lb, x, y, 100, 23, "Black", "Black", "White", btnfontname);
841   xitk_add_widget (sinfos.widget_list, sinfos.update);
842   xitk_enable_and_show_widget(sinfos.update);
843 
844   if(gui->stream_info_auto_update)
845     xitk_hide_widget(sinfos.update);
846 
847   x = WINDOW_WIDTH - (100 + 15);
848 
849   lb.button_type       = CLICK_BUTTON;
850   lb.label             = _("Close");
851   lb.align             = ALIGN_CENTER;
852   lb.callback          = stream_infos_exit;
853   lb.state_callback    = NULL;
854   lb.userdata          = NULL;
855   lb.skin_element_name = NULL;
856   widget =  xitk_noskin_labelbutton_create (sinfos.widget_list,
857     &lb, x, y, 100, 23, "Black", "Black", "White", btnfontname);
858   xitk_add_widget (sinfos.widget_list, widget);
859   xitk_enable_and_show_widget(widget);
860 
861   xitk_window_change_background(gui->imlib_data, sinfos.xwin, bg->pixmap, width, height);
862   xitk_image_destroy_xitk_pixmap(bg);
863 
864   sinfos.widget_key = xitk_register_event_handler("sinfos",
865 						   (xitk_window_get_window(sinfos.xwin)),
866 						   handle_event,
867 						   NULL,
868 						   NULL,
869 						   sinfos.widget_list,
870 						   NULL);
871 
872   stream_infos_update_infos();
873 
874   sinfos.visible = 1;
875   sinfos.running = 1;
876   stream_infos_raise_window();
877 
878   try_to_set_input_focus(xitk_window_get_window(sinfos.xwin));
879 }
880