~siretart/gxine/bug.542506

« back to all changes in this revision

Viewing changes to src/infobar.c

  • Committer: Bazaar Package Importer
  • Author(s): Siggi Langauf
  • Date: 2005-01-05 01:49:18 UTC
  • mto: (2.1.1 etch) (1.1.9 upstream)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20050105014918-wgldiqcd79ck2b0v
Tags: upstream-0.4.1
ImportĀ upstreamĀ versionĀ 0.4.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright (C) 2002-2003 the xine-project
 
2
 * Copyright (C) 2002-2004 the xine-project
3
3
 *
4
4
 * This program is free software; you can redistribute it and/or 
5
5
 * modify it under the terms of the GNU General Public License as 
16
16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
17
17
 * USA
18
18
 *
19
 
 * $Id: infobar.c,v 1.10 2003/03/24 00:13:55 guenter Exp $
 
19
 * $Id: infobar.c,v 1.18 2004/12/03 22:01:22 dsalt Exp $
20
20
 *
21
21
 * a nice black information display area
22
22
 */
23
23
 
24
 
#ifdef HAVE_CONFIG_H
25
 
#include <config.h>
26
 
#endif
 
24
#include "globals.h"
27
25
 
28
26
#include <stdio.h>
29
27
#include <stdlib.h>
30
28
#include <string.h>
31
29
 
 
30
#include <xine.h>
 
31
 
32
32
#include "infobar.h"
 
33
#include "utils.h"
 
34
#include "globals.h"
 
35
#include "player.h"
 
36
 
 
37
#define NUMLINES 3
33
38
 
34
39
struct infobar_s {
35
40
 
36
41
  GtkWidget            *w;
37
42
 
38
 
  PangoLayout          *pl;
39
 
  PangoFontDescription *pfd;
 
43
  PangoLayout          *pl[NUMLINES];
 
44
  PangoFontDescription *pfd, *pfd_big;
40
45
 
41
46
  GdkGC                *black_gc, *blue_gc, *white_gc;
42
47
 
43
 
  gchar                *line1;
44
 
  gchar                *line2;
 
48
  gchar                *line[NUMLINES];
45
49
};
46
50
 
47
 
static void paint_bar (infobar_t *bar) {
48
 
 
 
51
static void paint_bar (infobar_t *bar)
 
52
{
 
53
  int i;
49
54
  gdk_draw_rectangle (bar->w->window, bar->black_gc, TRUE,
50
55
                      0, 0, 
51
 
                      bar->w->allocation.width, bar->w->allocation.height);
52
 
 
53
 
  pango_layout_set_text (bar->pl, bar->line1, -1);
54
 
 
55
 
  gdk_draw_layout (bar->w->window, bar->blue_gc, 7, 2, bar->pl);
56
 
 
57
 
  pango_layout_set_text (bar->pl, bar->line2, -1);
58
 
  gdk_draw_layout (bar->w->window, bar->blue_gc, 7, 15, bar->pl);
 
56
                      bar->w->allocation.width, bar->w->allocation.height+1);
 
57
 
 
58
  pango_layout_set_text (bar->pl[0], bar->line[0] ? : "", -1);
 
59
  gdk_draw_layout (bar->w->window, bar->blue_gc, 7, 2, bar->pl[0]);
 
60
 
 
61
  for (i = 1; i < NUMLINES; ++i)
 
62
  {
 
63
    pango_layout_set_text (bar->pl[i], bar->line[i] ? : "", -1);
 
64
    gdk_draw_layout (bar->w->window, bar->blue_gc, 7, 9 + 14 * i, bar->pl[i]);
 
65
  }
59
66
}
60
67
 
61
68
static gboolean expose_event_cb (GtkWidget *widget, 
66
73
 
67
74
  gdk_window_clear_area (widget->window,
68
75
                         event->area.x, event->area.y,
69
 
                         event->area.width, event->area.height);
 
76
                         event->area.width, event->area.height+1);
70
77
 
71
78
  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
72
79
                             &event->area);
78
85
  return TRUE;
79
86
}
80
87
 
81
 
void infobar_line1 (infobar_t *bar, const char *format, ...) {
82
 
 
83
 
  va_list argp;
84
 
 
85
 
  va_start (argp, format);
86
 
 
87
 
  vsnprintf (bar->line1, 1024, format, argp);
88
 
 
89
 
  va_end (argp);
90
 
 
91
 
  normalize_to_ascii (bar->line1);
92
 
 
 
88
void infobar_clear (infobar_t *bar)
 
89
{
 
90
  int i;
 
91
  if (!bar) return;
 
92
  for (i = 0; i < NUMLINES; ++i)
 
93
  {
 
94
    free (bar->line[i]);
 
95
    bar->line[i] = NULL;
 
96
  }
93
97
  paint_bar (bar);
94
98
}
95
99
 
96
 
void infobar_line2 (infobar_t *bar, const char *format, ...){
97
 
 
98
 
  va_list argp;
99
 
 
100
 
  va_start (argp, format);
101
 
 
102
 
  vsnprintf (bar->line2, 1024, format, argp);
103
 
 
104
 
  va_end (argp);
105
 
 
106
 
  normalize_to_ascii (bar->line2);
 
100
void infobar_line (infobar_t *bar, unsigned int line, const char *format, ...)
 
101
{
 
102
  if (!bar || line >= NUMLINES)
 
103
    return;
 
104
 
 
105
  free (bar->line[line]);
 
106
  bar->line[line] = NULL;
 
107
 
 
108
  if (format)
 
109
  {
 
110
    va_list argp;
 
111
    va_start (argp, format);
 
112
    bar->line[line] = g_strdup_vprintf (format, argp);
 
113
    va_end (argp);
 
114
  }
107
115
 
108
116
  paint_bar (bar);
109
117
}
122
130
  }
123
131
}
124
132
 
 
133
void infobar_show_metadata (void)
 
134
{
 
135
  char       *strbuf = NULL;
 
136
  const char *t;
 
137
  const char *str;
 
138
  int         n, w, h;
 
139
 
 
140
  if (!bar) return;
 
141
 
 
142
  if ( (t=xine_get_meta_info (stream, XINE_META_INFO_TITLE)) ) {
 
143
    const char *a;
 
144
 
 
145
    if ( (a=xine_get_meta_info (stream, XINE_META_INFO_ARTIST)) ) {
 
146
      strbuf = g_strdup_printf ("%s (%s) - gxine %s", t, a, VERSION);
 
147
      infobar_line (bar, 0, "%s (%s)", t, a);
 
148
    } else {
 
149
      strbuf = g_strdup_printf ("%s - gxine %s", t, VERSION);
 
150
      infobar_line (bar, 0, "%s", t);
 
151
    }
 
152
  } else {
 
153
    if (strlen (player_get_cur_mrl()) > 0) {
 
154
 
 
155
      char *str = strrchr (player_get_cur_mrl(), '/');
 
156
 
 
157
      if (str) {
 
158
        strbuf = g_strdup_printf ("%s - gxine %s", str+1, VERSION);
 
159
        infobar_line (bar, 0, "%s", str+1);
 
160
      } else {
 
161
        str = player_get_cur_mrl ();
 
162
        strbuf = g_strdup_printf ("%s - gxine %s", str, VERSION);
 
163
        infobar_line (bar, 0, "%s", str);
 
164
      }
 
165
    } else {
 
166
      strbuf = g_strdup_printf ("gxine %s", VERSION);
 
167
      infobar_line (bar, 0, "%s", strbuf);
 
168
    }
 
169
  }
 
170
  gtk_window_set_title (GTK_WINDOW (app), strbuf);
 
171
 
 
172
  /*
 
173
   * display some metainfo
 
174
   */
 
175
 
 
176
  strbuf[0]=0;
 
177
 
 
178
  str = xine_get_meta_info (stream, XINE_META_INFO_SYSTEMLAYER);
 
179
  if (str) asreprintf (&strbuf, "%s%s ", strbuf, str);
 
180
 
 
181
  w = xine_get_stream_info (stream, XINE_STREAM_INFO_VIDEO_WIDTH);
 
182
  h = xine_get_stream_info (stream, XINE_STREAM_INFO_VIDEO_HEIGHT);
 
183
  if (w && h) asreprintf (&strbuf, "%s%dx%d ", strbuf, w, h); 
 
184
 
 
185
  str = xine_get_meta_info (stream, XINE_META_INFO_VIDEOCODEC);
 
186
  if (str) asreprintf (&strbuf, "%s%s ", strbuf, str);
 
187
 
 
188
  n = xine_get_stream_info (stream, XINE_STREAM_INFO_VIDEO_BITRATE)/1000;
 
189
  if (n > 10 && n < 20000) asreprintf (&strbuf, "%s%d kBit/s ", strbuf, n); 
 
190
 
 
191
  infobar_line (bar, 1, strbuf);
 
192
 
 
193
  strbuf[0] = 0;
 
194
 
 
195
  n = xine_get_stream_info (stream, XINE_STREAM_INFO_AUDIO_SAMPLERATE)/1000;
 
196
  if ((n>0) && (n<256)) asreprintf (&strbuf, "%s%d kHz ", strbuf, n);
 
197
 
 
198
  n = xine_get_stream_info (stream, XINE_STREAM_INFO_AUDIO_BITRATE)/1000;
 
199
  if ((n>0) && (n<1024)) asreprintf (&strbuf, "%s%d kBit/s ", strbuf, n);
 
200
 
 
201
  str = xine_get_meta_info (stream, XINE_META_INFO_AUDIOCODEC);
 
202
  if (str) asreprintf (&strbuf, "%s%s ", strbuf, str);
 
203
 
 
204
  infobar_line (bar, 2, strbuf);
 
205
 
 
206
  free (strbuf);
 
207
}
 
208
 
125
209
 
126
210
infobar_t *create_infobar (GtkWidget **w) {
127
211
 
128
212
  infobar_t *bar;
 
213
  int i;
129
214
 
130
215
  bar = (infobar_t *) malloc (sizeof (infobar_t));
131
216
 
132
217
  bar->w = gtk_drawing_area_new ();
133
 
  gtk_drawing_area_size (GTK_DRAWING_AREA(bar->w), 250, 30);
 
218
  gtk_drawing_area_size (GTK_DRAWING_AREA(bar->w), 300, 12 + NUMLINES * 14);
134
219
 
135
 
  bar->line1 = malloc(1025);
136
 
  bar->line2 = malloc(1025);
 
220
  for (i = 0; i < NUMLINES; ++i)
 
221
    bar->line[i] = NULL;
137
222
 
138
223
  *w = bar->w;
139
224
 
140
225
  return bar;
141
226
}
142
227
 
143
 
void postinit_infobar (GtkWidget *window, infobar_t *bar) {
 
228
void postinit_infobar (GtkWidget *window, infobar_t *bar)
 
229
{
 
230
  int i;
 
231
 
 
232
  if (!bar) return;
144
233
 
145
234
  g_signal_connect (bar->w, "expose_event", 
146
235
                    G_CALLBACK (expose_event_cb), bar);
162
251
  pango_font_description_set_family (bar->pfd, "Sans");
163
252
  pango_font_description_set_weight (bar->pfd, PANGO_WEIGHT_BOLD);
164
253
  pango_font_description_set_size (bar->pfd, 8*PANGO_SCALE);
165
 
 
166
 
  bar->pl = gtk_widget_create_pango_layout (bar->w, NULL);
167
 
 
168
 
  pango_layout_set_font_description (bar->pl, bar->pfd);
 
254
  bar->pfd_big = pango_font_description_new ();
 
255
  pango_font_description_set_family (bar->pfd_big, "Sans");
 
256
  pango_font_description_set_weight (bar->pfd_big, PANGO_WEIGHT_BOLD);
 
257
  pango_font_description_set_size (bar->pfd_big, 12*PANGO_SCALE);
 
258
 
 
259
  bar->pl[0] = gtk_widget_create_pango_layout (bar->w, NULL);
 
260
  pango_layout_set_font_description (bar->pl[0], bar->pfd_big);
 
261
 
 
262
  for (i = 1; i < NUMLINES; ++i)
 
263
  {
 
264
    bar->pl[i] = gtk_widget_create_pango_layout (bar->w, NULL);
 
265
    pango_layout_set_font_description (bar->pl[i], bar->pfd);
 
266
  }
 
267
 
169
268
}