Mercurial > mplayer.hg
annotate gui/ui/widgets.c @ 35361:3e8dcfa3ceef
Prevent unintended sign extension from int to long on 64-bit machines.
If the property format is 32, the property data will be stored as
an array of longs (which on 64-bit machines will be 64-bit values
that are padded in the upper 4 bytes).
author | ib |
---|---|
date | Fri, 23 Nov 2012 12:08:56 +0000 |
parents | bdf54c7f4eb6 |
children | 411875efca3f |
rev | line source |
---|---|
26458 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
23077 | 18 |
19 #include <stdlib.h> | |
20 #include <stdio.h> | |
35361
3e8dcfa3ceef
Prevent unintended sign extension from int to long on 64-bit machines.
ib
parents:
34781
diff
changeset
|
21 #include <stdint.h> |
23077 | 22 |
23 #include <sys/types.h> | |
24 #include <sys/stat.h> | |
25 #include <sys/wait.h> | |
26 #include <unistd.h> | |
27 #include <string.h> | |
28 #include <signal.h> | |
29 | |
30 #include <gdk/gdkprivate.h> | |
31 #include <gdk/gdkkeysyms.h> | |
32 #include <gdk/gdkx.h> | |
33 #include <gdk/gdk.h> | |
34 #include <gtk/gtk.h> | |
35 | |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
36 #include "config.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
37 #include "help_mp.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
38 #include "mp_msg.h" |
33542 | 39 #include "libavutil/intreadwrite.h" |
33465 | 40 #include "libvo/x11_common.h" |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
41 |
23077 | 42 #include "widgets.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
43 #include "gui/app.h" |
33466 | 44 #include "gui/interface.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
45 #include "gui/wm/ws.h" |
23077 | 46 |
33556 | 47 #include "actions.h" |
33572 | 48 #include "gtk/fileselect.h" |
23077 | 49 |
33538 | 50 GtkWidget *PopUpMenu = NULL; |
23077 | 51 |
33538 | 52 GtkWidget *WarningPixmap; |
53 GtkWidget *ErrorPixmap; | |
23077 | 54 |
33538 | 55 int gtkPopupMenu = 0; |
23077 | 56 int gtkPopupMenuParam = 0; |
33538 | 57 int gtkInitialized = 0; |
23077 | 58 |
33572 | 59 #include "gtk/skinbrowser.h" |
60 #include "gtk/playlist.h" | |
61 #include "gtk/msgbox.h" | |
23077 | 62 #include "gtk/about.h" |
33572 | 63 #include "gtk/preferences.h" |
64 #include "gtk/menu.h" | |
65 #include "gtk/url.h" | |
66 #include "gtk/equalizer.h" | |
23077 | 67 |
34596
04feb00f91be
Prefer static const char arrays for string constants to #defines.
ib
parents:
34481
diff
changeset
|
68 static const char gui_icon_name[] = "mplayer"; |
23077 | 69 |
33542 | 70 #define THRESHOLD 128 // transparency values equal to or above this will become |
71 // opaque, all values below this will become transparent | |
72 | |
34684 | 73 /* init & close gtk */ |
23077 | 74 |
33529 | 75 guiIcon_t guiIcon; |
23077 | 76 |
34780 | 77 static int gtkLoadIcon(GtkIconTheme *theme, gint size, GdkPixmap **gdkIcon, GdkBitmap **gdkIconMask) |
34480 | 78 { |
79 GdkPixbuf *pixbuf; | |
80 guchar *data; | |
81 int csize, i; | |
82 | |
34596
04feb00f91be
Prefer static const char arrays for string constants to #defines.
ib
parents:
34481
diff
changeset
|
83 pixbuf = gtk_icon_theme_load_icon(theme, gui_icon_name, size, 0, NULL); |
34480 | 84 |
85 if (pixbuf) | |
86 gdk_pixbuf_render_pixmap_and_mask_for_colormap(pixbuf, gdk_colormap_get_system(), gdkIcon, gdkIconMask, THRESHOLD); | |
87 | |
88 if (pixbuf && | |
89 gdk_pixbuf_get_colorspace(pixbuf) == GDK_COLORSPACE_RGB && | |
90 gdk_pixbuf_get_n_channels(pixbuf) == 4 && | |
91 gdk_pixbuf_get_bits_per_sample(pixbuf) == 8) { | |
92 csize = guiIcon.collection_size; | |
93 guiIcon.collection_size += 2 + gdk_pixbuf_get_width(pixbuf) * gdk_pixbuf_get_height(pixbuf); | |
94 | |
95 guiIcon.collection = realloc(guiIcon.collection, guiIcon.collection_size * sizeof(*guiIcon.collection)); | |
96 | |
97 if (guiIcon.collection) { | |
98 guiIcon.collection[csize++] = gdk_pixbuf_get_width(pixbuf); | |
99 guiIcon.collection[csize++] = gdk_pixbuf_get_height(pixbuf); | |
100 | |
101 data = gdk_pixbuf_get_pixels(pixbuf); | |
102 | |
103 for (i = csize; i < guiIcon.collection_size; data += 4, i++) | |
35361
3e8dcfa3ceef
Prevent unintended sign extension from int to long on 64-bit machines.
ib
parents:
34781
diff
changeset
|
104 guiIcon.collection[i] = (uint32_t)(data[3] << 24) | AV_RB24(data); // RGBA -> ARGB |
34480 | 105 } |
106 | |
107 g_object_unref(pixbuf); | |
108 } else | |
34596
04feb00f91be
Prefer static const char arrays for string constants to #defines.
ib
parents:
34481
diff
changeset
|
109 mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_ICONERROR, gui_icon_name, size); |
34480 | 110 |
34684 | 111 /* start up GTK which realizes the pixmaps */ |
34480 | 112 gtk_main_iteration_do(FALSE); |
34780 | 113 |
114 return (pixbuf != NULL); | |
34480 | 115 } |
116 | |
33538 | 117 void gtkInit(void) |
23077 | 118 { |
34480 | 119 int argc = 0; |
33538 | 120 char *arg[3], **argv = arg; |
34480 | 121 GtkIconTheme *theme; |
33538 | 122 GdkPixmap *gdkIcon; |
123 GdkBitmap *gdkIconMask; | |
33465 | 124 |
33538 | 125 mp_msg(MSGT_GPLAYER, MSGL_V, "GTK init.\n"); |
33528 | 126 |
33538 | 127 arg[argc++] = GMPlayer; |
33465 | 128 |
33538 | 129 if (mDisplayName) { // MPlayer option '-display' was given |
130 arg[argc++] = "--display"; // Pass corresponding command line arguments to GTK, | |
131 arg[argc++] = mDisplayName; // to open the requested display for the GUI, too. | |
132 } | |
33465 | 133 |
27343 | 134 #ifdef CONFIG_GTK2 |
33538 | 135 gtk_disable_setlocale(); |
23077 | 136 #endif |
33528 | 137 |
33538 | 138 gtk_init(&argc, &argv); |
139 | |
34480 | 140 theme = gtk_icon_theme_get_default(); |
33542 | 141 |
34780 | 142 if (gtkLoadIcon(theme, 16, &gdkIcon, &gdkIconMask)) { |
34781 | 143 guiIcon.small = GDK_PIXMAP_XID(gdkIcon); |
144 guiIcon.small_mask = GDK_PIXMAP_XID(gdkIconMask); | |
34780 | 145 } |
33542 | 146 |
34780 | 147 if (gtkLoadIcon(theme, 32, &gdkIcon, &gdkIconMask)) { |
34781 | 148 guiIcon.normal = GDK_PIXMAP_XID(gdkIcon); |
149 guiIcon.normal_mask = GDK_PIXMAP_XID(gdkIconMask); | |
34780 | 150 } |
23077 | 151 |
34480 | 152 gtkLoadIcon(theme, 48, &gdkIcon, &gdkIconMask); |
153 | |
33538 | 154 gtkInitialized = 1; |
155 } | |
23077 | 156 |
33538 | 157 void gtkAddIcon(GtkWidget *window) |
158 { | |
159 wsSetIcon(gdk_display, GDK_WINDOW_XWINDOW(window->window), &guiIcon); | |
160 } | |
23077 | 161 |
33538 | 162 void gtkClearList(GtkWidget *list) |
163 { | |
164 gtk_clist_clear(GTK_CLIST(list)); | |
23077 | 165 } |
166 | |
33538 | 167 int gtkFindCList(GtkWidget *list, char *item) |
23077 | 168 { |
33538 | 169 gint j; |
170 gchar *tmpstr; | |
171 | |
172 for (j = 0; j < GTK_CLIST(list)->rows; j++) { | |
173 gtk_clist_get_text(GTK_CLIST(list), j, 0, &tmpstr); | |
174 | |
175 if (!strcmp(tmpstr, item)) | |
176 return j; | |
177 } | |
178 | |
179 return -1; | |
23077 | 180 } |
181 | |
33538 | 182 void gtkSetDefaultToCList(GtkWidget *list, char *item) |
23077 | 183 { |
33538 | 184 gint i; |
185 | |
186 if ((i = gtkFindCList(list, item)) > -1) | |
187 gtk_clist_select_row(GTK_CLIST(list), i, 0); | |
23077 | 188 } |
189 | |
33538 | 190 void gtkEventHandling(void) |
23077 | 191 { |
33538 | 192 int i; |
193 | |
194 for (i = 0; i < 25; i++) | |
195 gtk_main_iteration_do(0); | |
23077 | 196 } |
197 | |
34684 | 198 /* funcs */ |
23077 | 199 |
33538 | 200 void gtkMessageBox(int type, const gchar *str) |
23077 | 201 { |
33538 | 202 if (!gtkInitialized) |
203 return; | |
204 | |
205 ShowMessageBox(str); | |
206 gtk_label_set_text(GTK_LABEL(gtkMessageBoxText), str); | |
207 | |
208 /* enable linewrapping by alex */ | |
23077 | 209 // GTK_LABEL(gtkMessageBoxText)->max_width = 80; |
33538 | 210 if (strlen(str) > 80) |
211 gtk_label_set_line_wrap(GTK_LABEL(gtkMessageBoxText), TRUE); | |
212 else | |
213 gtk_label_set_line_wrap(GTK_LABEL(gtkMessageBoxText), FALSE); | |
214 | |
215 switch (type) { | |
23077 | 216 case GTK_MB_FATAL: |
33538 | 217 gtk_window_set_title(GTK_WINDOW(MessageBox), MSGTR_MSGBOX_LABEL_FatalError); |
218 gtk_widget_hide(WarningPixmap); | |
219 gtk_widget_show(ErrorPixmap); | |
220 break; | |
221 | |
23077 | 222 case GTK_MB_ERROR: |
33538 | 223 gtk_window_set_title(GTK_WINDOW(MessageBox), MSGTR_MSGBOX_LABEL_Error); |
224 gtk_widget_hide(WarningPixmap); | |
225 gtk_widget_show(ErrorPixmap); | |
226 break; | |
227 | |
23077 | 228 case GTK_MB_WARNING: |
33538 | 229 gtk_window_set_title(GTK_WINDOW(MessageBox), MSGTR_MSGBOX_LABEL_Warning); |
230 gtk_widget_show(WarningPixmap); | |
231 gtk_widget_hide(ErrorPixmap); | |
232 break; | |
233 } | |
234 | |
235 gtk_widget_show(MessageBox); | |
236 gtkSetLayer(MessageBox); | |
237 | |
238 if (type == GTK_MB_FATAL) | |
239 while (MessageBox) | |
240 gtk_main_iteration_do(0); | |
23077 | 241 } |
242 | |
33538 | 243 void gtkSetLayer(GtkWidget *wdg) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27343
diff
changeset
|
244 { |
34697 | 245 wsSetLayer(gdk_display, GDK_WINDOW_XWINDOW(wdg->window), guiApp.videoWindow.isFullScreen); |
33538 | 246 gtkActive(wdg); |
247 } | |
248 | |
249 void gtkActive(GtkWidget *wdg) | |
250 { | |
33990
3a93b9227b01
Cosmetic: Rename wsMoveTopWindow() wsRaiseWindowTop().
ib
parents:
33572
diff
changeset
|
251 wsRaiseWindowTop(gdk_display, GDK_WINDOW_XWINDOW(wdg->window)); |
23077 | 252 } |
253 | |
33538 | 254 void gtkShow(int type, char *param) |
23077 | 255 { |
33538 | 256 switch (type) { |
257 case evEqualizer: | |
258 ShowEqualizer(); | |
259 gtkSetLayer(Equalizer); | |
260 break; | |
261 | |
262 case evSkinBrowser: | |
263 ShowSkinBrowser(); | |
264 | |
23077 | 265 // gtkClearList( SkinList ); |
33538 | 266 if (gtkFillSkinList(sbMPlayerPrefixDir) && |
267 gtkFillSkinList(sbMPlayerDirInHome)) { | |
268 gtkSetDefaultToCList(SkinList, param); | |
269 gtk_clist_sort(GTK_CLIST(SkinList)); | |
270 gtk_widget_show(SkinBrowser); | |
271 gtkSetLayer(SkinBrowser); | |
272 } else { | |
273 gtk_widget_destroy(SkinBrowser); | |
274 gtkMessageBox(GTK_MB_ERROR, "Skin dirs not found ... Please install skins."); | |
275 } | |
276 | |
23077 | 277 break; |
33538 | 278 |
279 case evPreferences: | |
23077 | 280 ShowPreferences(); |
281 break; | |
33538 | 282 |
34321
daebf766dea6
Cosmetic: Synchronize evPlaylist event and message names.
ib
parents:
33990
diff
changeset
|
283 case evPlaylist: |
23077 | 284 ShowPlayList(); |
33538 | 285 gtkSetLayer(PlayList); |
23077 | 286 break; |
33538 | 287 |
288 case evLoad: | |
289 ShowFileSelect(fsVideoSelector, 0); | |
290 gtkSetLayer(fsFileSelect); | |
23077 | 291 break; |
33538 | 292 |
293 case evLoadSubtitle: | |
294 ShowFileSelect(fsSubtitleSelector, 0); | |
295 gtkSetLayer(fsFileSelect); | |
23077 | 296 break; |
33538 | 297 |
298 case evLoadAudioFile: | |
299 ShowFileSelect(fsAudioSelector, 0); | |
300 gtkSetLayer(fsFileSelect); | |
301 break; | |
302 | |
303 case evAbout: | |
304 ShowAboutBox(); | |
305 gtkSetLayer(About); | |
23077 | 306 break; |
33538 | 307 |
34333 | 308 case ivShowPopUpMenu: |
33538 | 309 gtkPopupMenu = evNone; |
310 gtkPopupMenuParam = 0; | |
311 | |
312 if (PopUpMenu) { | |
313 gtk_widget_hide(PopUpMenu); | |
314 gtk_widget_destroy(PopUpMenu); | |
315 } | |
316 | |
317 PopUpMenu = create_PopUpMenu(); | |
318 gtk_menu_popup(GTK_MENU(PopUpMenu), NULL, NULL, NULL, NULL, 0, 0); | |
23077 | 319 break; |
33538 | 320 |
34333 | 321 case ivHidePopUpMenu: |
33538 | 322 |
323 if (PopUpMenu) { | |
324 gtk_widget_hide(PopUpMenu); | |
325 gtk_widget_destroy(PopUpMenu); | |
326 PopUpMenu = NULL; | |
327 } | |
328 | |
23077 | 329 break; |
33538 | 330 |
34329 | 331 case evLoadURL: |
33538 | 332 ShowURLDialogBox(); |
333 gtkSetLayer(URL); | |
334 break; | |
335 } | |
23077 | 336 } |