Mercurial > mplayer.hg
diff gui/dialog/dialog.c @ 35529:8ad4d2fb46e8
Rebuild GUI directory structure.
Rename and move ui/widgets.* to dialog/dialog.*.
author | ib |
---|---|
date | Thu, 06 Dec 2012 15:16:38 +0000 |
parents | gui/ui/widgets.c@3c901704a27c |
children | 46b3d0bb76e0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gui/dialog/dialog.c Thu Dec 06 15:16:38 2012 +0000 @@ -0,0 +1,337 @@ +/* + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <stdint.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <unistd.h> +#include <string.h> +#include <signal.h> + +#include <gdk/gdkprivate.h> +#include <gdk/gdkkeysyms.h> +#include <gdk/gdkx.h> +#include <gdk/gdk.h> +#include <gtk/gtk.h> + +#include "config.h" +#include "help_mp.h" +#include "mp_msg.h" +#include "libavutil/intreadwrite.h" +#include "libvo/x11_common.h" + +#include "dialog.h" +#include "gui/app/app.h" +#include "gui/app/gui.h" +#include "gui/interface.h" +#include "gui/wm/ws.h" + +#include "gui/ui/actions.h" +#include "fileselect.h" + +GtkWidget *PopUpMenu = NULL; + +GtkWidget *WarningPixmap; +GtkWidget *ErrorPixmap; + +int gtkPopupMenu = 0; +int gtkPopupMenuParam = 0; +int gtkInitialized = False; + +#include "skinbrowser.h" +#include "playlist.h" +#include "msgbox.h" +#include "about.h" +#include "preferences.h" +#include "menu.h" +#include "url.h" +#include "equalizer.h" + +static const char gui_icon_name[] = "mplayer"; + +#define THRESHOLD 128 // transparency values equal to or above this will become + // opaque, all values below this will become transparent + +/* init & close gtk */ + +guiIcon_t guiIcon; + +static int gtkLoadIcon(GtkIconTheme *theme, gint size, GdkPixmap **gdkIcon, GdkBitmap **gdkIconMask) +{ + GdkPixbuf *pixbuf; + guchar *data; + int csize, i; + + pixbuf = gtk_icon_theme_load_icon(theme, gui_icon_name, size, 0, NULL); + + if (pixbuf) + gdk_pixbuf_render_pixmap_and_mask_for_colormap(pixbuf, gdk_colormap_get_system(), gdkIcon, gdkIconMask, THRESHOLD); + + if (pixbuf && + gdk_pixbuf_get_colorspace(pixbuf) == GDK_COLORSPACE_RGB && + gdk_pixbuf_get_n_channels(pixbuf) == 4 && + gdk_pixbuf_get_bits_per_sample(pixbuf) == 8) { + csize = guiIcon.collection_size; + guiIcon.collection_size += 2 + gdk_pixbuf_get_width(pixbuf) * gdk_pixbuf_get_height(pixbuf); + + guiIcon.collection = realloc(guiIcon.collection, guiIcon.collection_size * sizeof(*guiIcon.collection)); + + if (guiIcon.collection) { + guiIcon.collection[csize++] = gdk_pixbuf_get_width(pixbuf); + guiIcon.collection[csize++] = gdk_pixbuf_get_height(pixbuf); + + data = gdk_pixbuf_get_pixels(pixbuf); + + for (i = csize; i < guiIcon.collection_size; data += 4, i++) + guiIcon.collection[i] = (uint32_t)(data[3] << 24) | AV_RB24(data); // RGBA -> ARGB + } + + g_object_unref(pixbuf); + } else + mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_ICONERROR, gui_icon_name, size); + + /* start up GTK which realizes the pixmaps */ + gtk_main_iteration_do(FALSE); + + return (pixbuf != NULL); +} + +void gtkInit(void) +{ + int argc = 0; + char *arg[3], **argv = arg; + GtkIconTheme *theme; + GdkPixmap *gdkIcon; + GdkBitmap *gdkIconMask; + + mp_msg(MSGT_GPLAYER, MSGL_V, "GTK init.\n"); + + arg[argc++] = GMPlayer; + + if (mDisplayName) { // MPlayer option '-display' was given + arg[argc++] = "--display"; // Pass corresponding command line arguments to GTK, + arg[argc++] = mDisplayName; // to open the requested display for the GUI, too. + } + +#ifdef CONFIG_GTK2 + gtk_disable_setlocale(); +#endif + + gtk_init(&argc, &argv); + + theme = gtk_icon_theme_get_default(); + + if (gtkLoadIcon(theme, 16, &gdkIcon, &gdkIconMask)) { + guiIcon.small = GDK_PIXMAP_XID(gdkIcon); + guiIcon.small_mask = GDK_PIXMAP_XID(gdkIconMask); + } + + if (gtkLoadIcon(theme, 32, &gdkIcon, &gdkIconMask)) { + guiIcon.normal = GDK_PIXMAP_XID(gdkIcon); + guiIcon.normal_mask = GDK_PIXMAP_XID(gdkIconMask); + } + + gtkLoadIcon(theme, 48, &gdkIcon, &gdkIconMask); + + gtkInitialized = True; +} + +void gtkAddIcon(GtkWidget *window) +{ + wsSetIcon(gdk_display, GDK_WINDOW_XWINDOW(window->window), &guiIcon); +} + +void gtkClearList(GtkWidget *list) +{ + gtk_clist_clear(GTK_CLIST(list)); +} + +int gtkFindCList(GtkWidget *list, char *item) +{ + gint j; + gchar *tmpstr; + + for (j = 0; j < GTK_CLIST(list)->rows; j++) { + gtk_clist_get_text(GTK_CLIST(list), j, 0, &tmpstr); + + if (!strcmp(tmpstr, item)) + return j; + } + + return -1; +} + +void gtkSetDefaultToCList(GtkWidget *list, char *item) +{ + gint i; + + if ((i = gtkFindCList(list, item)) > -1) + gtk_clist_select_row(GTK_CLIST(list), i, 0); +} + +void gtkEventHandling(void) +{ + int i; + + for (i = 0; i < 25; i++) + gtk_main_iteration_do(0); +} + +/* funcs */ + +void gtkMessageBox(int type, const gchar *str) +{ + if (!gtkInitialized) + return; + + ShowMessageBox(str); + gtk_label_set_text(GTK_LABEL(gtkMessageBoxText), str); + + /* enable linewrapping by alex */ +// GTK_LABEL(gtkMessageBoxText)->max_width = 80; + if (strlen(str) > 80) + gtk_label_set_line_wrap(GTK_LABEL(gtkMessageBoxText), TRUE); + else + gtk_label_set_line_wrap(GTK_LABEL(gtkMessageBoxText), FALSE); + + switch (type) { + case GTK_MB_FATAL: + gtk_window_set_title(GTK_WINDOW(MessageBox), MSGTR_MSGBOX_LABEL_FatalError); + gtk_widget_hide(WarningPixmap); + gtk_widget_show(ErrorPixmap); + break; + + case GTK_MB_ERROR: + gtk_window_set_title(GTK_WINDOW(MessageBox), MSGTR_MSGBOX_LABEL_Error); + gtk_widget_hide(WarningPixmap); + gtk_widget_show(ErrorPixmap); + break; + + case GTK_MB_WARNING: + gtk_window_set_title(GTK_WINDOW(MessageBox), MSGTR_MSGBOX_LABEL_Warning); + gtk_widget_show(WarningPixmap); + gtk_widget_hide(ErrorPixmap); + break; + } + + gtk_widget_show(MessageBox); + gtkSetLayer(MessageBox); + + if (type == GTK_MB_FATAL) + while (MessageBox) + gtk_main_iteration_do(0); +} + +void gtkSetLayer(GtkWidget *wdg) +{ + wsSetLayer(gdk_display, GDK_WINDOW_XWINDOW(wdg->window), guiApp.videoWindow.isFullScreen); + gtkActive(wdg); +} + +void gtkActive(GtkWidget *wdg) +{ + wsRaiseWindowTop(gdk_display, GDK_WINDOW_XWINDOW(wdg->window)); +} + +void gtkShow(int type, char *param) +{ + switch (type) { + case evEqualizer: + ShowEqualizer(); + gtkSetLayer(Equalizer); + break; + + case evSkinBrowser: + ShowSkinBrowser(); + +// gtkClearList( SkinList ); + if (gtkFillSkinList(sbMPlayerPrefixDir) && + gtkFillSkinList(sbMPlayerDirInHome)) { + gtkSetDefaultToCList(SkinList, param); + gtk_clist_sort(GTK_CLIST(SkinList)); + gtk_widget_show(SkinBrowser); + gtkSetLayer(SkinBrowser); + } else { + gtk_widget_destroy(SkinBrowser); + gtkMessageBox(GTK_MB_ERROR, "Skin dirs not found ... Please install skins."); + } + + break; + + case evPreferences: + ShowPreferences(); + break; + + case evPlaylist: + ShowPlayList(); + gtkSetLayer(PlayList); + break; + + case evLoad: + ShowFileSelect(fsVideoSelector, 0); + gtkSetLayer(fsFileSelect); + break; + + case evLoadSubtitle: + ShowFileSelect(fsSubtitleSelector, 0); + gtkSetLayer(fsFileSelect); + break; + + case evLoadAudioFile: + ShowFileSelect(fsAudioSelector, 0); + gtkSetLayer(fsFileSelect); + break; + + case evAbout: + ShowAboutBox(); + gtkSetLayer(About); + break; + + case ivShowPopUpMenu: + gtkPopupMenu = evNone; + gtkPopupMenuParam = 0; + + if (PopUpMenu) { + gtk_widget_hide(PopUpMenu); + gtk_widget_destroy(PopUpMenu); + } + + PopUpMenu = create_PopUpMenu(); + gtk_menu_popup(GTK_MENU(PopUpMenu), NULL, NULL, NULL, NULL, 0, 0); + break; + + case ivHidePopUpMenu: + + if (PopUpMenu) { + gtk_widget_hide(PopUpMenu); + gtk_widget_destroy(PopUpMenu); + PopUpMenu = NULL; + } + + break; + + case evLoadURL: + ShowURLDialogBox(); + gtkSetLayer(URL); + break; + } +}