Mercurial > mplayer.hg
view gui/cfg.c @ 33526:140525bcc32f
Fix GUI icon bug.
The GUI icon did not display properly but showed up with various distortions.
The reason was the icon mask which hadn't been put to the X server yet when
used.
The icon itself was okay, but is rendered now in a way that doesn't need a
drawable which spares creating a GTK window and destroying it right after.
The locally used GDK variables have been moved inside the function where
they are needed.
Patch with grateful support by Steaphan Greene, sgreene cs.binghamton edu.
This closes Bugzilla #582.
author | ib |
---|---|
date | Tue, 14 Jun 2011 17:51:17 +0000 |
parents | e413b573e4ec |
children | 7ced3616af42 |
line wrap: on
line source
/* * 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 <string.h> #include "cfg.h" #include "interface.h" #include "config.h" #include "help_mp.h" #include "libmpcodecs/vd.h" #include "libvo/video_out.h" #include "libvo/x11_common.h" #include "mixer.h" #include "mp_msg.h" #include "mpcommon.h" #include "mplayer.h" #include "parser-cfg.h" #include "path.h" #include "sub/font_load.h" #include "sub/sub.h" m_config_t *gui_conf; int gtkCacheOn; int gtkCacheSize = 2048; int gtkVfPP; #ifdef CONFIG_DXR3 int gtkVfLAVC; char *gtkDXR3Device; #endif int gtkAutoSyncOn; int gtkAutoSync; int gtkAONorm; int gtkAOSurround; int gtkAOExtraStereo; float gtkAOExtraStereoMul = 1.0f; #ifdef CONFIG_ALSA char *gtkAOALSAMixer; char *gtkAOALSAMixerChannel; char *gtkAOALSADevice; #endif #ifdef CONFIG_OSS_AUDIO char *gtkAOOSSMixer; char *gtkAOOSSMixerChannel; char *gtkAOOSSDevice; #endif #ifdef CONFIG_ESD char *gtkAOESDDevice; #endif #ifdef CONFIG_SDL char *gtkAOSDLDriver; #endif int gtkEnableAudioEqualizer; int gtkSubDumpMPSub; int gtkSubDumpSrt; #ifdef CONFIG_ASS gtkASS_t gtkASS; #endif int gtkEnablePlayBar = 1; int gtkLoadFullscreen; int gtkShowVideoWindow = 1; int gui_save_pos = 1; int gui_main_pos_x = -3; int gui_main_pos_y = -3; int gui_sub_pos_x = -3; int gui_sub_pos_y = -3; static const m_option_t gui_opts[] = { { "cache", >kCacheOn, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "cache_size", >kCacheSize, CONF_TYPE_INT, CONF_RANGE, 32, 1048576, NULL }, { "vf_pp", >kVfPP, CONF_TYPE_FLAG, 0, 0, 1, NULL }, #ifdef CONFIG_DXR3 { "vf_lavc", >kVfLAVC, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "vo_dxr3_device", >kDXR3Device, CONF_TYPE_STRING, 0, 0, 0, NULL }, #endif { "autosync", >kAutoSyncOn, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "autosync_size", >kAutoSync, CONF_TYPE_INT, CONF_RANGE, 0, 10000, NULL }, { "ao_volnorm", >kAONorm, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "ao_surround", >kAOSurround, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "ao_extra_stereo", >kAOExtraStereo, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "ao_extra_stereo_coefficient", >kAOExtraStereoMul, CONF_TYPE_FLOAT, CONF_RANGE, -10.0, 10.0, NULL }, #ifdef CONFIG_ALSA { "ao_alsa_mixer", >kAOALSAMixer, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "ao_alsa_mixer_channel", >kAOALSAMixerChannel, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "ao_alsa_device", >kAOALSADevice, CONF_TYPE_STRING, 0, 0, 0, NULL }, #endif #ifdef CONFIG_OSS_AUDIO { "ao_oss_mixer", >kAOOSSMixer, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "ao_oss_mixer_channel", >kAOOSSMixerChannel, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "ao_oss_device", >kAOOSSDevice, CONF_TYPE_STRING, 0, 0, 0, NULL }, #endif #ifdef CONFIG_ESD { "ao_esd_device", >kAOESDDevice, CONF_TYPE_STRING, 0, 0, 0, NULL }, #endif #ifdef CONFIG_SDL { "ao_sdl_subdriver", >kAOSDLDriver, CONF_TYPE_STRING, 0, 0, 0, NULL }, #endif { "enable_audio_equ", >kEnableAudioEqualizer, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "equ_channel_1", >kEquChannel1, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "equ_channel_2", >kEquChannel2, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "equ_channel_3", >kEquChannel3, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "equ_channel_4", >kEquChannel4, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "equ_channel_5", >kEquChannel5, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "equ_channel_6", >kEquChannel6, CONF_TYPE_STRING, 0, 0, 0, NULL }, #define audio_equ_row(i, j) \ { "equ_band_" # i # j, >kEquChannels[i][j], CONF_TYPE_FLOAT, CONF_RANGE, -15.0, 15.0, NULL } audio_equ_row(0, 0), audio_equ_row(0, 1), audio_equ_row(0, 2), audio_equ_row(0, 3), audio_equ_row(0, 4), audio_equ_row(0, 5), audio_equ_row(0, 6), audio_equ_row(0, 7), audio_equ_row(0, 8), audio_equ_row(0, 9), audio_equ_row(1, 0), audio_equ_row(1, 1), audio_equ_row(1, 2), audio_equ_row(1, 3), audio_equ_row(1, 4), audio_equ_row(1, 5), audio_equ_row(1, 6), audio_equ_row(1, 7), audio_equ_row(1, 8), audio_equ_row(1, 9), audio_equ_row(2, 0), audio_equ_row(2, 1), audio_equ_row(2, 2), audio_equ_row(2, 3), audio_equ_row(2, 4), audio_equ_row(2, 5), audio_equ_row(2, 6), audio_equ_row(2, 7), audio_equ_row(2, 8), audio_equ_row(2, 9), audio_equ_row(3, 0), audio_equ_row(3, 1), audio_equ_row(3, 2), audio_equ_row(3, 3), audio_equ_row(3, 4), audio_equ_row(3, 5), audio_equ_row(3, 6), audio_equ_row(3, 7), audio_equ_row(3, 8), audio_equ_row(3, 9), audio_equ_row(4, 0), audio_equ_row(4, 1), audio_equ_row(4, 2), audio_equ_row(4, 3), audio_equ_row(4, 4), audio_equ_row(4, 5), audio_equ_row(4, 6), audio_equ_row(4, 7), audio_equ_row(4, 8), audio_equ_row(4, 9), audio_equ_row(5, 0), audio_equ_row(5, 1), audio_equ_row(5, 2), audio_equ_row(5, 3), audio_equ_row(5, 4), audio_equ_row(5, 5), audio_equ_row(5, 6), audio_equ_row(5, 7), audio_equ_row(5, 8), audio_equ_row(5, 9), #undef audio_equ_row { "playbar", >kEnablePlayBar, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "load_fullscreen", >kLoadFullscreen, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "show_videowin", >kShowVideoWindow, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "gui_save_pos", &gui_save_pos, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "gui_main_pos_x", &gui_main_pos_x, CONF_TYPE_INT, 0, 0, 0, NULL }, { "gui_main_pos_y", &gui_main_pos_y, CONF_TYPE_INT, 0, 0, 0, NULL }, { "gui_video_out_pos_x", &gui_sub_pos_x, CONF_TYPE_INT, 0, 0, 0, NULL }, { "gui_video_out_pos_y", &gui_sub_pos_y, CONF_TYPE_INT, 0, 0, 0, NULL }, { "idle", &player_idle_mode, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL }, // NOTE TO MYSELF: Do we really need all/any non-gtkOptions, i.e. override mplayer options? { "gui_skin", &skinName, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "stopxscreensaver", &stop_xscreensaver, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "cdrom_device", &cdrom_device, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "dvd_device", &dvd_device, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "osd_level", &osd_level, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL }, { "vo_driver", &video_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL }, { "v_vfm", &video_fm_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL }, { "vf_autoq", &auto_quality, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL }, { "vo_direct_render", &vo_directrendering, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "vo_doublebuffering", &vo_doublebuffering, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "vo_panscan", &vo_panscan, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL }, { "v_flip", &flip, CONF_TYPE_INT, CONF_RANGE, -1, 1, NULL }, { "v_framedrop", &frame_dropping, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL }, { "v_idx", &index_mode, CONF_TYPE_INT, CONF_RANGE, -1, 2, NULL }, { "v_ni", &force_ni, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "ao_driver", &audio_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL }, { "a_afm", &audio_fm_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL }, { "softvol", &soft_vol, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "sub_auto_load", &sub_auto, CONF_TYPE_FLAG, 0, 0, 1, NULL }, #ifdef CONFIG_ICONV { "sub_cp", &sub_cp, CONF_TYPE_STRING, 0, 0, 0, NULL }, #endif { "sub_overlap", &suboverlap_enabled, CONF_TYPE_FLAG, 0, 0, 0, NULL }, { "sub_pos", &sub_pos, CONF_TYPE_INT, CONF_RANGE, 0, 200, NULL }, { "sub_unicode", &sub_unicode, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "font_factor", &font_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 10.0, NULL }, { "font_name", &font_name, CONF_TYPE_STRING, 0, 0, 0, NULL }, #ifdef CONFIG_FREETYPE { "font_encoding", &subtitle_font_encoding, CONF_TYPE_STRING, 0, 0, 0, NULL }, { "font_text_scale", &text_font_scale_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 100.0, NULL }, { "font_osd_scale", &osd_font_scale_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 100.0, NULL }, { "font_blur", &subtitle_font_radius, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 8.0, NULL }, { "font_outline", &subtitle_font_thickness, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 8.0, NULL }, { "font_autoscale", &subtitle_autoscale, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL }, #endif #ifdef CONFIG_ASS { "ass_enabled", &ass_enabled, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "ass_use_margins", &ass_use_margins, CONF_TYPE_FLAG, 0, 0, 1, NULL }, { "ass_top_margin", &ass_top_margin, CONF_TYPE_INT, CONF_RANGE, 0, 512, NULL }, { "ass_bottom_margin", &ass_bottom_margin, CONF_TYPE_INT, CONF_RANGE, 0, 512, NULL }, #endif { NULL, NULL, 0, 0, 0, 0, NULL } }; static char *gfgets(char *str, int size, FILE *f) { char *s, c; s = fgets(str, size, f); if (s) { c = s[strlen(s) - 1]; if (c == '\n' || c == '\r') s[strlen(s) - 1] = 0; c = s[strlen(s) - 1]; if (c == '\n' || c == '\r') s[strlen(s) - 1] = 0; } return s; } int cfg_gui_include(m_option_t *conf, char *filename) { (void)conf; return m_config_parse_config_file(gui_conf, filename); } int cfg_read(void) { char *cfg; FILE *f; player_idle_mode = 1; // GUI is in idle mode by default // configuration cfg = get_path("gui.conf"); mp_msg(MSGT_GPLAYER, MSGL_V, "[cfg] reading config file: %s\n", cfg); gui_conf = m_config_new(); if (!gui_conf) { gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_MemAllocFailed); guiExit(EXIT_ERROR); } m_config_register_options(gui_conf, gui_opts); if (!disable_gui_conf && (m_config_parse_config_file(gui_conf, cfg) < 0)) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_ConfigFileError); // guiExit(1); } free(cfg); // playlist cfg = get_path("gui.pl"); f = fopen(cfg, "rt"); if (f) { while (!feof(f)) { char tmp[512]; plItem *item; if (gfgets(tmp, 512, f) == NULL) continue; item = calloc(1, sizeof(plItem)); item->path = strdup(tmp); gfgets(tmp, 512, f); item->name = strdup(tmp); gtkSet(gtkAddPlItem, 0, (void *)item); } fclose(f); } free(cfg); // URL list cfg = get_path("gui.url"); f = fopen(cfg, "rt"); if (f) { while (!feof(f)) { char tmp[512]; URLItem *item; if (gfgets(tmp, 512, f) == NULL) continue; item = calloc(1, sizeof(URLItem)); item->url = strdup(tmp); gtkSet(gtkAddURLItem, 0, (void *)item); } fclose(f); } free(cfg); // directory history cfg = get_path("gui.history"); f = fopen(cfg, "rt+"); if (f) { int i = 0; while (!feof(f)) { char tmp[512]; if (gfgets(tmp, 512, f) == NULL) continue; fsHistory[i++] = gstrdup(tmp); } fclose(f); } free(cfg); return 0; } int cfg_write(void) { char *cfg; FILE *f; int i; // configuration cfg = get_path("gui.conf"); f = fopen(cfg, "wt+"); if (f) { for (i = 0; gui_opts[i].name; i++) { char *v = m_option_print(&gui_opts[i], gui_opts[i].p); if (v == (char *)-1) { mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_UnableToSaveOption, gui_opts[i].name); v = NULL; } if (v) { fprintf(f, "%s = \"%s\"\n", gui_opts[i].name, v); free(v); } } fclose(f); } free(cfg); // playlist cfg = get_path("gui.pl"); f = fopen(cfg, "wt+"); if (f) { plCurrent = plList; while (plCurrent) { if (plCurrent->path && plCurrent->name) { fprintf(f, "%s\n", plCurrent->path); fprintf(f, "%s\n", plCurrent->name); } plCurrent = plCurrent->next; } fclose(f); } free(cfg); // URL list cfg = get_path("gui.url"); f = fopen(cfg, "wt+"); if (f) { while (URLList) { if (URLList->url) fprintf(f, "%s\n", URLList->url); URLList = URLList->next; } fclose(f); } free(cfg); // directory history cfg = get_path("gui.history"); f = fopen(cfg, "wt+"); if (f) { int i = 0; // while (fsHistory[i] != NULL) for (i = 0; i < 5; i++) if (fsHistory[i]) fprintf(f, "%s\n", fsHistory[i]); fclose(f); } free(cfg); return 0; }