[SCM] gnome-mpv/master: Imported Upstream version 0.7
infinity0 at users.alioth.debian.org
infinity0 at users.alioth.debian.org
Sun Feb 7 19:48:38 UTC 2016
The following commit has been merged in the master branch:
commit e9e9ad91b8cd2d026952713e92f6d6190a1bc30b
Author: Ximin Luo <infinity0 at debian.org>
Date: Sun Feb 7 19:37:00 2016 +0100
Imported Upstream version 0.7
diff --git a/.gitignore b/.gitignore
index dac63ba..3c153ca 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@
/config.*
/depcomp
/install-sh
+/intltool-*
/ltmain.sh
/missing
/ar-lib
@@ -14,7 +15,8 @@
/test-driver
/stamp-h1
/m4
-*.in
+Makefile.in.in
+Makefile.in
Makefile
config.*
po/POTFILES
@@ -36,7 +38,11 @@ po/stamp-it
.deps/
.libs/
data/*.valid
+data/gnome-mpv.appdata.xml
+data/gnome-mpv.desktop
+data/org.gnome-mpv.gschema.xml
po/*.gmo
+po/.intltool-merge-cache
.dirstamp
src/gnome-mpv
src/mpris/mpris_gdbus.*
diff --git a/README.md b/README.md
index e24e550..8277917 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@ capabilities.
## Dependencies
+- appstream-glib (build)
- autotools (build)
- autoconf-archive (build)
- pkg-config (build)
@@ -110,6 +111,12 @@ has to be loaded via the preferences dialog under the "Keybindings" section. In
case of conflict with default keybindings, keybindings defined in external file
will be given priority.
+## Contributing Translations
+
+GNOME MPV uses [Zanata](https://zanata.org) to coordinate
+translations. You can find GNOME MPV's page [here](https://translate.zanata.org/zanata/iteration/view/gnome-mpv/master).
+If you'd like to add a new language, open an issue on GitHub.
+
## License
GNOME MPV is free software: you can redistribute it and/or modify
diff --git a/configure.ac b/configure.ac
index c109ee9..0a67c0b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
AC_PREREQ([2.69])
AC_INIT( [gnome-mpv],
- [0.6],
+ [0.7],
[http://github.com/gnome-mpv/gnome-mpv/issues],
[gnome-mpv],
[http://github.com/gnome-mpv/gnome-mpv] )
@@ -22,12 +22,17 @@ AM_GLIB_GNU_GETTEXT
GLIB_GSETTINGS
AC_ARG_ENABLE([debug], AS_HELP_STRING([--enable-debug], [turn on debugging]))
+AC_ARG_ENABLE([opengl-cb], AS_HELP_STRING([--disable-opengl-cb], [disable support for opengl-cb, which is required to work on Wayland]))
AC_DEFUN([GM_CHECK_AX_MACRO],
[m4_ifndef([$1], [m4_fatal($1[ is not defined. Is autoconf-archive installed?])])])
GM_CHECK_AX_MACRO([AX_APPEND_COMPILE_FLAGS])
GM_CHECK_AX_MACRO([AX_APPEND_LINK_FLAGS])
+GM_CHECK_AX_MACRO([AX_REQUIRE_DEFINED])
+
+AX_REQUIRE_DEFINED([APPSTREAM_XML])
+APPSTREAM_XML
AS_IF([test "x$enable_debug" = "xyes"], [
AX_APPEND_COMPILE_FLAGS([-O0 -g -fsanitize=address])
@@ -69,7 +74,13 @@ AC_PROG_CC
AC_PROG_CC_STDC
# Checks for libraries.
-PKG_CHECK_MODULES(DEPS, [gtk+-3.0 >= 3.16 glib-2.0 >= 2.40 mpv >= 1.16 epoxy])
+AS_IF([test "x$enable_opengl_cb" != "xno"], [
+ AC_DEFINE([OPENGL_CB_ENABLED])
+ PKG_CHECK_MODULES(DEPS, [gtk+-3.0 >= 3.16 glib-2.0 >= 2.40 mpv >= 1.16 epoxy])
+], [
+ PKG_CHECK_MODULES(DEPS, [gtk+-3.0 >= 3.14 glib-2.0 >= 2.40 mpv >= 1.16])
+])
+
AC_DEFINE([GLIB_VERSION_MIN_REQUIRED], [GLIB_VERSION_2_40], [Dont warn using older APIs])
AC_DEFINE([GLIB_VERSION_MAX_ALLOWED], [GLIB_VERSION_2_40], [Prevents using newer APIs])
diff --git a/data/Makefile.am b/data/Makefile.am
index 7997921..cf73941 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -2,11 +2,24 @@ gsettings_SCHEMAS = org.gnome-mpv.gschema.xml
@GSETTINGS_RULES@
+appstream_in_files = gnome-mpv.appdata.xml.in
+appstream_XML = $(appstream_in_files:.xml.in=.xml)
+
+ at INTLTOOL_XML_RULE@
+ at APPSTREAM_XML_RULES@
+
desktopdir = $(datadir)/applications
-desktop_DATA = gnome-mpv.desktop
+desktop_in_files = gnome-mpv.desktop.in
+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+
+ at INTLTOOL_DESKTOP_RULE@
icondir = $(datadir)/icons/hicolor/scalable/apps
icon_DATA = gnome-mpv.svg
-EXTRA_DIST = $(gsettings_SCHEMAS) mpris_gdbus.xml gnome-mpv.svg \
- gnome-mpv.desktop
+symicondir = $(datadir)/icons/hicolor/symbolic/apps
+symicon_DATA = gnome-mpv-symbolic.svg
+
+EXTRA_DIST = $(gsettings_SCHEMAS) $(appstream_in_files) $(desktop_in_files) \
+ gnome-mpv.desktop gnome-mpv.svg gnome-mpv-symbolic.svg \
+ mpris_gdbus.xml org.gnome-mpv.gschema.xml.in
diff --git a/data/gnome-mpv-symbolic.svg b/data/gnome-mpv-symbolic.svg
new file mode 100644
index 0000000..3f014e6
--- /dev/null
+++ b/data/gnome-mpv-symbolic.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<svg xmlns="http://www.w3.org/2000/svg"
+ height="128"
+ width="128"
+ version="1.1" >
+
+ <g transform="translate(8.575,0)" fill-rule="evenodd">
+ <path d="M 0,0 V 128 L 110.85,64 Z M 89.63,64 L 10,110 V 18 Z"
+ fill="#bebebe"/>
+ <path d="M 19,36 V 92 L 70.35,64 Z"
+ fill="#bebebe"/>
+ </g>
+</svg>
diff --git a/data/gnome-mpv.appdata.xml.in b/data/gnome-mpv.appdata.xml.in
new file mode 100644
index 0000000..0a8decb
--- /dev/null
+++ b/data/gnome-mpv.appdata.xml.in
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2015 gnome-mpv -->
+<component type="desktop">
+ <id>gnome-mpv.desktop</id>
+ <metadata_license>CC-BY-SA-4.0</metadata_license>
+ <project_license>GPL-3.0+</project_license>
+ <name>GNOME MPV</name>
+ <summary>GTK+ frontend for mpv</summary>
+ <description>
+ <_p>
+ GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media
+ player capable of playing virtually all video and audio formats. The design
+ of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME
+ libraries. GNOME MPV also offers an option to disable client-side decorations
+ (CSD) for better compatibility with non-GNOME systems.
+ </_p>
+ <_p>Features:</_p>
+ <ul>
+ <_li>Drag and drop playlist</_li>
+ <_li>Loading external mpv configuration files</_li>
+ <_li>MPRIS2 D-Bus interface</_li>
+ </ul>
+ </description>
+ <screenshots>
+ <screenshot type="default">
+ <image>http://gnome-mpv.github.io/images/screenshot-0.png</image>
+ <_caption>The main window showing the application in action</_caption>
+ </screenshot>
+ <screenshot>
+ <image>http://gnome-mpv.github.io/images/screenshot-1.png</image>
+ <_caption>The main window with CSD disabled</_caption>
+ </screenshot>
+ <screenshot>
+ <image>http://gnome-mpv.github.io/images/screenshot-2.png</image>
+ <_caption>The main window with playlist open</_caption>
+ </screenshot>
+ </screenshots>
+ <url type="homepage">http://gnome-mpv.github.io</url>
+ <url type="bugtracker">http://github.com/gnome-mpv/gnome-mpv/issues</url>
+ <update_contact>gnome-mpv_at_openmailbox.org</update_contact>
+</component>
diff --git a/data/gnome-mpv.desktop b/data/gnome-mpv.desktop.in
similarity index 95%
rename from data/gnome-mpv.desktop
rename to data/gnome-mpv.desktop.in
index 3ff4246..5d07b9c 100644
--- a/data/gnome-mpv.desktop
+++ b/data/gnome-mpv.desktop.in
@@ -1,7 +1,7 @@
[Desktop Entry]
Version=1.0
-Name=GNOME MPV
-Comment=GNOME frontend for mpv
+_Name=GNOME MPV
+_Comment=GTK+ frontend for mpv
Exec=gnome-mpv %U
Icon=gnome-mpv
Terminal=false
diff --git a/data/org.gnome-mpv.gschema.xml b/data/org.gnome-mpv.gschema.xml.in
similarity index 60%
rename from data/org.gnome-mpv.gschema.xml
rename to data/org.gnome-mpv.gschema.xml.in
index 8f1732e..bbb22b1 100644
--- a/data/org.gnome-mpv.gschema.xml
+++ b/data/org.gnome-mpv.gschema.xml.in
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<schemalist>
+<schemalist gettext-domain="gnome-mpv">
<schema path="/org/gnome-mpv/gnome-mpv/" id="org.gnome-mpv">
<child schema="org.gnome-mpv.window-state" name="window-state"/>
@@ -12,9 +12,19 @@
</key>
<key name='csd-enable' type='b'>
<default>true</default>
- <summary>
- Enable or disable client-side decorations
- </summary>
+ <summary>Enable or disable client-side decorations</summary>
+ <description>
+ </description>
+ </key>
+ <key name='last-folder-enable' type='b'>
+ <default>false</default>
+ <summary>Whether or not to make file chooser dialog remember last folder accessed</summary>
+ <description>
+ </description>
+ </key>
+ <key name='mpv-msg-redir-enable' type='b'>
+ <default>false</default>
+ <summary>Whether or not to redirect mpv log messages to console</summary>
<description>
</description>
</key>
@@ -32,9 +42,7 @@
</key>
<key name='mpv-config-enable' type='b'>
<default>false</default>
- <summary>
- Load or don't load mpv configuration file
- </summary>
+ <summary>Load or don't load mpv configuration file</summary>
<description>
</description>
</key>
@@ -46,9 +54,7 @@
</key>
<key name='mpv-input-config-enable' type='b'>
<default>false</default>
- <summary>
- Load or don't load mpv input configuration file
- </summary>
+ <summary>Load or don't load mpv input configuration file</summary>
<description>
</description>
</key>
@@ -58,33 +64,37 @@
id="org.gnome-mpv.window-state">
<key name='width' type='i'>
<default>640</default>
- <summary>
- Width of the window
- </summary>
+ <summary>Width of the window</summary>
<description>
</description>
</key>
<key name='height' type='i'>
<default>480</default>
- <summary>
- Height of the window
- </summary>
+ <summary>Height of the window</summary>
+ <description>
+ </description>
+ </key>
+ <key name='volume' type='d'>
+ <default>1.0</default>
+ <summary>Volume of player</summary>
<description>
</description>
</key>
<key name='playlist-width' type='i'>
<default>250</default>
- <summary>
- Width of the playlist
- </summary>
+ <summary>Width of the playlist</summary>
<description>
</description>
</key>
<key name='show-playlist' type='b'>
<default>false</default>
- <summary>
- Show or not show the playlist
- </summary>
+ <summary>Show or not show the playlist</summary>
+ <description>
+ </description>
+ </key>
+ <key name='last-folder-uri' type='s'>
+ <default>''</default>
+ <summary>URI of the last folder accessed</summary>
<description>
</description>
</key>
diff --git a/po/LINGUAS b/po/LINGUAS
index ea9817b..d181e14 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -1,5 +1,8 @@
-zh_CN
-ja
-fr_FR
-cs_CZ
+cs
de_DE
+fr
+ja
+ro
+ru
+zh_CN
+zh_TW
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 1fd5a86..ec94fc0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,8 +1,12 @@
+[type: gettext/gsettings]data/org.gnome-mpv.gschema.xml.in
+[type: gettext/xml]data/gnome-mpv.appdata.xml.in
+[type: gettext/ini]data/gnome-mpv.desktop.in
+src/actionctl.c
+src/common.c
src/main.c
+src/menu.c
+src/mpv.c
src/open_loc_dialog.c
+src/playlist.c
src/playlist_widget.c
src/pref_dialog.c
-src/main_window.c
-src/actionctl.c
-src/common.c
-src/playlist.c
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
deleted file mode 100644
index 898dcf2..0000000
--- a/po/POTFILES.skip
+++ /dev/null
@@ -1 +0,0 @@
-src/mpv.c
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..4f95db2
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,364 @@
+# Czech translations for gnome-mpv package
+# gnome-mpv
+# Copyright (C) 2015 THE gnome-mpv'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-mpv package.
+# Tomáš Marný, 2015.
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2015. #zanata
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2016. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-mpv 0.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-23 10:58-0500\n"
+"PO-Revision-Date: 2015-08-15 10:05-0400\n"
+"Last-Translator: Language-Team: Czech\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: cs\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
+"X-Generator: Zanata 3.8.2\n"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:1
+msgid "Enable or disable dark theme"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:2
+msgid "Enable or disable client-side decorations"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:3
+msgid ""
+"Whether or not to make file chooser dialog remember last folder accessed"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:4
+msgid "Whether or not to redirect mpv log messages to console"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:5
+msgid "Options to pass to mpv"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:6
+msgid "Path to mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:7
+msgid "Load or don't load mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:8
+msgid "Path to mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:9
+msgid "Load or don't load mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:10
+msgid "Width of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:11
+msgid "Height of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:12
+msgid "Volume of player"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:13
+msgid "Width of the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:14
+msgid "Show or not show the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:15
+msgid "URI of the last folder accessed"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:1
+msgid ""
+"GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media "
+"player capable of playing virtually all video and audio formats. The design "
+"of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME "
+"libraries. GNOME MPV also offers an option to disable client-side "
+"decorations (CSD) for better compatibility with non-GNOME systems."
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:2
+msgid "Features:"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:3
+msgid "Drag and drop playlist"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:4
+msgid "Loading external mpv configuration files"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:5
+msgid "MPRIS2 D-Bus interface"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:6
+msgid "The main window showing the application in action"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:7
+msgid "The main window with CSD disabled"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:8
+msgid "The main window with playlist open"
+msgstr ""
+
+#: ../data/gnome-mpv.desktop.in.h:1 ../src/main.c:552
+msgid "GNOME MPV"
+msgstr "GNOME MPV"
+
+#: ../data/gnome-mpv.desktop.in.h:2
+msgid "GTK+ frontend for mpv"
+msgstr ""
+
+#: ../src/actionctl.c:106
+#, fuzzy
+msgid "Add File to Playlist"
+msgstr "_Přepnout seznam skladeb"
+
+#: ../src/actionctl.c:107
+msgid "Open File"
+msgstr "Otevřít soubor"
+
+#: ../src/actionctl.c:110 ../src/actionctl.c:409 ../src/open_loc_dialog.c:83
+#: ../src/playlist.c:60 ../src/pref_dialog.c:267
+msgid "_Cancel"
+msgstr "_Zrušit"
+
+#: ../src/actionctl.c:112 ../src/actionctl.c:411 ../src/menu.c:121
+#: ../src/menu.c:390 ../src/open_loc_dialog.c:81
+msgid "_Open"
+msgstr "_Otevřít"
+
+#: ../src/actionctl.c:251
+#, c-format
+msgid ""
+"Enabling or disabling client-side decorations requires restarting %s to take"
+" effect."
+msgstr ""
+"Povolení nebo zakázání dekorací na straně klienta vyžaduje restartování %s."
+
+#: ../src/actionctl.c:406
+msgid "Load External…"
+msgstr ""
+
+#: ../src/actionctl.c:482
+msgid "A GTK frontend for MPV"
+msgstr "GTK frontend pro MPV"
+
+#: ../src/common.c:236
+msgid "Error"
+msgstr ""
+
+#: ../src/common.c:401
+msgid ""
+"Keybindings that require Property Expansion are not supported and have been "
+"ignored."
+msgstr ""
+
+#: ../src/main.c:525 ../src/menu.c:138
+msgid "_Preferences"
+msgstr "_Předvolby"
+
+#: ../src/main.c:526 ../src/menu.c:169
+msgid "_About"
+msgstr "_O programu"
+
+#: ../src/main.c:527 ../src/menu.c:122
+msgid "_Quit"
+msgstr "_Ukončit"
+
+#: ../src/main.c:677
+#, c-format
+msgid ""
+"Preferences is now stored using GSettings. Your preferences have been "
+"migrated from the configuration file. A backup copy of the configuration "
+"file can be found at \"%s\"."
+msgstr ""
+
+#: ../src/menu.c:39
+msgid "None"
+msgstr ""
+
+#. For simplicity, also dup the default string used when the
+#. * track has no title.
+#: ../src/menu.c:54
+msgid "Unknown"
+msgstr ""
+
+#: ../src/menu.c:119
+msgid "_File"
+msgstr "_Soubor"
+
+#: ../src/menu.c:125 ../src/menu.c:393
+msgid "Open _Location"
+msgstr "_Otevřít umístění"
+
+#: ../src/menu.c:128 ../src/menu.c:296
+msgid "_Save Playlist"
+msgstr "_Uložit seznam skladeb"
+
+#: ../src/menu.c:135
+msgid "_Edit"
+msgstr "_Upravit"
+
+#: ../src/menu.c:145
+msgid "_View"
+msgstr "_Zobrazit"
+
+#: ../src/menu.c:148 ../src/menu.c:292
+msgid "_Toggle Playlist"
+msgstr "_Přepnout seznam skladeb"
+
+#: ../src/menu.c:151
+msgid "_Fullscreen"
+msgstr "_Celá obrazovka"
+
+#: ../src/menu.c:154 ../src/menu.c:300
+msgid "_Normal Size"
+msgstr "_Normální velikost"
+
+#: ../src/menu.c:157 ../src/menu.c:304
+msgid "_Double Size"
+msgstr "_Dvojnásobná velikost"
+
+#: ../src/menu.c:160 ../src/menu.c:308
+msgid "_Half Size"
+msgstr "_Poloviční velikost"
+
+#: ../src/menu.c:167
+msgid "_Help"
+msgstr "_Nápověda"
+
+#: ../src/menu.c:179 ../src/menu.c:316
+msgid "_Video Track"
+msgstr ""
+
+#: ../src/menu.c:196 ../src/menu.c:200 ../src/menu.c:346 ../src/menu.c:351
+msgid "_Load External..."
+msgstr ""
+
+#: ../src/menu.c:210 ../src/menu.c:335
+msgid "_Audio Track"
+msgstr ""
+
+#: ../src/menu.c:214 ../src/menu.c:339
+msgid "S_ubtitle Track"
+msgstr ""
+
+#: ../src/mpv.c:304
+msgid "Playing"
+msgstr ""
+
+#: ../src/mpv.c:596
+#, c-format
+msgid "Playback was terminated abnormally. Reason: %s."
+msgstr ""
+
+#: ../src/mpv.c:1087
+msgid "Failed to apply one or more MPV options."
+msgstr ""
+
+#: ../src/open_loc_dialog.c:77
+msgid "Location:"
+msgstr "Umístění:"
+
+#: ../src/open_loc_dialog.c:93
+msgid "Open Location"
+msgstr "Otevřít umístění"
+
+#: ../src/playlist.c:57
+#, fuzzy
+msgid "Save Playlist"
+msgstr "_Uložit seznam skladeb"
+
+#: ../src/playlist.c:62 ../src/pref_dialog.c:269
+msgid "_Save"
+msgstr "_Uložit"
+
+#: ../src/playlist_widget.c:44
+msgid "_Add…"
+msgstr ""
+
+#: ../src/playlist_widget.c:45
+msgid "Loop"
+msgstr ""
+
+#: ../src/playlist_widget.c:90
+msgid "Playlist"
+msgstr "Seznam skladeb"
+
+#: ../src/pref_dialog.c:105
+msgid "MPV configuration file:"
+msgstr "Konfigurační soubor MPV:"
+
+#: ../src/pref_dialog.c:106
+msgid "MPV input configuration file:"
+msgstr "Vstupní konfigurační soubor MPV:"
+
+#: ../src/pref_dialog.c:107
+msgid "Extra MPV options:"
+msgstr "Extra možnosti MPV:"
+
+#: ../src/pref_dialog.c:108
+msgid "<b>General</b>"
+msgstr "<b>Hlavní</b>"
+
+#: ../src/pref_dialog.c:109
+msgid "<b>MPV Configuration</b>"
+msgstr "<b>Nastavení MPV</b>"
+
+#: ../src/pref_dialog.c:110
+msgid "<b>Keybindings</b>"
+msgstr "<b>Klávesové zkratky</b>"
+
+#: ../src/pref_dialog.c:111
+msgid "<b>Miscellaneous</b>"
+msgstr "<b>Různé</b>"
+
+#: ../src/pref_dialog.c:126
+msgid "Enable client-side decorations"
+msgstr "Povolit dekorace na straně klienta"
+
+#: ../src/pref_dialog.c:130
+msgid "Enable dark theme"
+msgstr "Povolit tmavý motiv"
+
+#: ../src/pref_dialog.c:134
+msgid "Remember last file's location"
+msgstr ""
+
+#: ../src/pref_dialog.c:138
+msgid "MPV configuration file"
+msgstr "Konfigurační soubor MPV"
+
+#: ../src/pref_dialog.c:143
+msgid "MPV input configuration file"
+msgstr "Vstupní konfigurační soubor MPV"
+
+#: ../src/pref_dialog.c:148
+msgid "Load MPV configuration file"
+msgstr "Načíst konfigurační soubor MPV"
+
+#: ../src/pref_dialog.c:152
+msgid "Load MPV input configuration file"
+msgstr "Načíst vstupní konfigurační soubor MPV"
+
+#: ../src/pref_dialog.c:285
+msgid "Preferences"
+msgstr "Předvolby"
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
deleted file mode 100644
index 7dbcd40..0000000
--- a/po/cs_CZ.po
+++ /dev/null
@@ -1,191 +0,0 @@
-# Czech translations for gnome-mpv package
-# gnome-mpv
-# Copyright (C) 2015 THE gnome-mpv'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the gnome-mpv package.
-# Tomáš Marný, 2015.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: gnome-mpv 0.2\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-05-29 11:00+0800\n"
-"PO-Revision-Date: 2015-08-15 15:05+0100\n"
-"Last-Translator: Language-Team: Czech\n"
-"Language: cs_CZ\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.7.5\n"
-"Language-Team: \n"
-
-#: ../src/main.c:440 ../src/common.c:384
-msgid "_Preferences"
-msgstr "_Předvolby"
-
-#: ../src/main.c:441 ../src/common.c:415
-msgid "_About"
-msgstr "_O programu"
-
-#: ../src/main.c:442 ../src/common.c:365
-msgid "_Quit"
-msgstr "_Ukončit"
-
-#: ../src/main.c:465
-msgid "GNOME MPV"
-msgstr "GNOME MPV"
-
-#: ../src/main.c:559
-#, c-format
-msgid "Your configuration file has been moved to the new location at %s."
-msgstr "Váš konfigurační soubor byl přesunut do nového umístění na %s."
-
-#: ../src/open_loc_dialog.c:68
-msgid "Location:"
-msgstr "Umístění:"
-
-#: ../src/open_loc_dialog.c:72 ../src/main_window.c:270 ../src/actionctl.c:75
-#: ../src/actionctl.c:345 ../src/common.c:364
-msgid "_Open"
-msgstr "_Otevřít"
-
-#: ../src/open_loc_dialog.c:74 ../src/pref_dialog.c:155 ../src/actionctl.c:73
-#: ../src/actionctl.c:343
-msgid "_Cancel"
-msgstr "_Zrušit"
-
-#: ../src/open_loc_dialog.c:84
-msgid "Open Location"
-msgstr "Otevřít umístění"
-
-#: ../src/playlist_widget.c:49
-msgid "Playlist"
-msgstr "Seznam skladeb"
-
-#: ../src/pref_dialog.c:71
-msgid "MPV configuration file:"
-msgstr "Konfigurační soubor MPV:"
-
-#: ../src/pref_dialog.c:72
-msgid "MPV input configuration file:"
-msgstr "Vstupní konfigurační soubor MPV:"
-
-#: ../src/pref_dialog.c:73
-msgid "Extra MPV options:"
-msgstr "Extra možnosti MPV:"
-
-#: ../src/pref_dialog.c:74
-msgid "<b>General</b>"
-msgstr "<b>Hlavní</b>"
-
-#: ../src/pref_dialog.c:75
-msgid "<b>MPV Configuration</b>"
-msgstr "<b>Nastavení MPV</b>"
-
-#: ../src/pref_dialog.c:76
-msgid "<b>Keybindings</b>"
-msgstr "<b>Klávesové zkratky</b>"
-
-#: ../src/pref_dialog.c:77
-msgid "<b>Miscellaneous</b>"
-msgstr "<b>Různé</b>"
-
-#: ../src/pref_dialog.c:91
-msgid "Enable client-side decorations"
-msgstr "Povolit dekorace na straně klienta"
-
-#: ../src/pref_dialog.c:94
-msgid "Enable dark theme"
-msgstr "Povolit tmavý motiv"
-
-#: ../src/pref_dialog.c:97
-msgid "MPV configuration file"
-msgstr "Konfigurační soubor MPV"
-
-#: ../src/pref_dialog.c:102
-msgid "MPV input configuration file"
-msgstr "Vstupní konfigurační soubor MPV"
-
-#: ../src/pref_dialog.c:107
-msgid "Load MPV configuration file"
-msgstr "Načíst konfigurační soubor MPV"
-
-#: ../src/pref_dialog.c:111
-msgid "Load MPV input configuration file"
-msgstr "Načíst vstupní konfigurační soubor MPV"
-
-#: ../src/pref_dialog.c:153
-msgid "_Save"
-msgstr "_Uložit"
-
-#: ../src/pref_dialog.c:160
-msgid "Preferences"
-msgstr "Předvolby"
-
-#: ../src/main_window.c:227 ../src/common.c:394
-msgid "_Toggle Playlist"
-msgstr "_Přepnout seznam skladeb"
-
-#: ../src/main_window.c:230 ../src/common.c:371
-msgid "_Save Playlist"
-msgstr "_Uložit seznam skladeb"
-
-#: ../src/main_window.c:233 ../src/common.c:381
-msgid "_Load Subtitle"
-msgstr "_Načíst titulky"
-
-#: ../src/main_window.c:236 ../src/common.c:397
-msgid "_Fullscreen"
-msgstr "_Celá obrazovka"
-
-#: ../src/main_window.c:239 ../src/common.c:400
-msgid "_Normal Size"
-msgstr "_Normální velikost"
-
-#: ../src/main_window.c:242 ../src/common.c:403
-msgid "_Double Size"
-msgstr "_Dvojnásobná velikost"
-
-#: ../src/main_window.c:245 ../src/common.c:406
-msgid "_Half Size"
-msgstr "_Poloviční velikost"
-
-#: ../src/main_window.c:273 ../src/common.c:368
-msgid "Open _Location"
-msgstr "_Otevřít umístění"
-
-#: ../src/actionctl.c:70
-msgid "Open File"
-msgstr "Otevřít soubor"
-
-#: ../src/actionctl.c:227
-#, c-format
-msgid "Enabling or disabling client-side decorations requires restarting %s to take effect."
-msgstr "Povolení nebo zakázání dekorací na straně klienta vyžaduje restartování %s."
-
-#: ../src/actionctl.c:340
-msgid "Load Subtitle"
-msgstr "Načíst titulky"
-
-#: ../src/actionctl.c:414
-msgid "A GTK frontend for MPV"
-msgstr "GTK frontend pro MPV"
-
-#: ../src/common.c:362
-msgid "_File"
-msgstr "_Soubor"
-
-#: ../src/common.c:378
-msgid "_Edit"
-msgstr "_Upravit"
-
-#: ../src/common.c:391
-msgid "_View"
-msgstr "_Zobrazit"
-
-#: ../src/common.c:413
-msgid "_Help"
-msgstr "_Nápověda"
-
-#: ../src/common.c:452
-msgid "Keybindings that require Property Expansion are not supported and have been ignored."
-msgstr ""
diff --git a/po/de_DE.po b/po/de_DE.po
index 3e1e3cc..3b5c4d6 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -3,197 +3,363 @@
# Copyright (C) 2015 THE gnome-mpv'S COPYRIGHT HOLDER
# This file is distributed under the same license as the gnone-mpv package.
# Vincent Bermel <willovince at openmailbox.org>, 2015.
-#
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2015. #zanata
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2016. #zanata
msgid ""
msgstr ""
-"Project-Id-Version: gnome-mpv 0.5\n"
+"Project-Id-Version: gnome-mpv 0.6\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-09-13 20:58+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"POT-Creation-Date: 2015-11-23 10:58-0500\n"
+"PO-Revision-Date: 2015-10-26 07:55-0400\n"
"Last-Translator: Vincent Bermel <willovince at openmailbox.org>\n"
"Language-Team: German Translations\n"
-"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: de-DE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Zanata 3.8.2\n"
-#: ../src/main.c:445 ../src/common.c:460
+#: ../data/org.gnome-mpv.gschema.xml.in.h:1
+msgid "Enable or disable dark theme"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:2
+msgid "Enable or disable client-side decorations"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:3
+msgid ""
+"Whether or not to make file chooser dialog remember last folder accessed"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:4
+msgid "Whether or not to redirect mpv log messages to console"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:5
+msgid "Options to pass to mpv"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:6
+msgid "Path to mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:7
+msgid "Load or don't load mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:8
+msgid "Path to mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:9
+msgid "Load or don't load mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:10
+msgid "Width of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:11
+msgid "Height of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:12
+msgid "Volume of player"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:13
+msgid "Width of the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:14
+msgid "Show or not show the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:15
+msgid "URI of the last folder accessed"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:1
+msgid ""
+"GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media "
+"player capable of playing virtually all video and audio formats. The design "
+"of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME "
+"libraries. GNOME MPV also offers an option to disable client-side "
+"decorations (CSD) for better compatibility with non-GNOME systems."
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:2
+msgid "Features:"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:3
+msgid "Drag and drop playlist"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:4
+msgid "Loading external mpv configuration files"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:5
+msgid "MPRIS2 D-Bus interface"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:6
+msgid "The main window showing the application in action"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:7
+msgid "The main window with CSD disabled"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:8
+msgid "The main window with playlist open"
+msgstr ""
+
+#: ../data/gnome-mpv.desktop.in.h:1 ../src/main.c:552
+msgid "GNOME MPV"
+msgstr "GNOME MPV"
+
+#: ../data/gnome-mpv.desktop.in.h:2
+msgid "GTK+ frontend for mpv"
+msgstr ""
+
+#: ../src/actionctl.c:106
+msgid "Add File to Playlist"
+msgstr "Datei zur _Wiedergabeliste hinzufügen"
+
+#: ../src/actionctl.c:107
+msgid "Open File"
+msgstr "Datei öffnen"
+
+#: ../src/actionctl.c:110 ../src/actionctl.c:409 ../src/open_loc_dialog.c:83
+#: ../src/playlist.c:60 ../src/pref_dialog.c:267
+msgid "_Cancel"
+msgstr "_Abbrechen"
+
+#: ../src/actionctl.c:112 ../src/actionctl.c:411 ../src/menu.c:121
+#: ../src/menu.c:390 ../src/open_loc_dialog.c:81
+msgid "_Open"
+msgstr "Ö_ffnen"
+
+#: ../src/actionctl.c:251
+#, c-format
+msgid ""
+"Enabling or disabling client-side decorations requires restarting %s to take"
+" effect."
+msgstr "Die Änderungen erfordern einen Neustart von %s."
+
+#: ../src/actionctl.c:406
+msgid "Load External…"
+msgstr ""
+
+#: ../src/actionctl.c:482
+msgid "A GTK frontend for MPV"
+msgstr "Eine GTK-Oberfläche für MPV"
+
+#: ../src/common.c:236
+msgid "Error"
+msgstr ""
+
+#: ../src/common.c:401
+msgid ""
+"Keybindings that require Property Expansion are not supported and have been "
+"ignored."
+msgstr ""
+"Tastenbelegungen, die Property Expansion benötigen werden nicht unterstützt."
+
+#: ../src/main.c:525 ../src/menu.c:138
msgid "_Preferences"
msgstr "_Einstellungen"
-#: ../src/main.c:446 ../src/common.c:491
+#: ../src/main.c:526 ../src/menu.c:169
msgid "_About"
msgstr "_Info"
-#: ../src/main.c:447 ../src/common.c:441
+#: ../src/main.c:527 ../src/menu.c:122
msgid "_Quit"
msgstr "_Beenden"
-#: ../src/main.c:470
-msgid "GNOME MPV"
-msgstr "GNOME MPV"
+#: ../src/main.c:677
+#, c-format
+msgid ""
+"Preferences is now stored using GSettings. Your preferences have been "
+"migrated from the configuration file. A backup copy of the configuration "
+"file can be found at \"%s\"."
+msgstr ""
+"Die Benutzereinstellungen werden fortan von GSettings verwaltet. Ihre "
+"Einstellungen wurden aus der Konfigurationsdatei übernommen. Eine "
+"Sicherheitskopie dieser Datei befindet sich unter \"%s\"."
+
+#: ../src/menu.c:39
+msgid "None"
+msgstr ""
+
+#. For simplicity, also dup the default string used when the
+#. * track has no title.
+#: ../src/menu.c:54
+msgid "Unknown"
+msgstr ""
+
+#: ../src/menu.c:119
+msgid "_File"
+msgstr "_Datei"
+
+#: ../src/menu.c:125 ../src/menu.c:393
+msgid "Open _Location"
+msgstr "_Adresse öffnen"
+
+#: ../src/menu.c:128 ../src/menu.c:296
+msgid "_Save Playlist"
+msgstr "Wiedergabeliste _speichern"
+
+#: ../src/menu.c:135
+msgid "_Edit"
+msgstr "_Bearbeiten"
+
+#: ../src/menu.c:145
+msgid "_View"
+msgstr "_Ansicht"
+
+#: ../src/menu.c:148 ../src/menu.c:292
+msgid "_Toggle Playlist"
+msgstr "_Wiedergabeliste ein/aus"
+
+#: ../src/menu.c:151
+msgid "_Fullscreen"
+msgstr "_Vollbild"
+
+#: ../src/menu.c:154 ../src/menu.c:300
+msgid "_Normal Size"
+msgstr "_Normale Videogröße"
+
+#: ../src/menu.c:157 ../src/menu.c:304
+msgid "_Double Size"
+msgstr "_Doppelte Videogröße"
+
+#: ../src/menu.c:160 ../src/menu.c:308
+msgid "_Half Size"
+msgstr "_Halbe Videogröße"
+
+#: ../src/menu.c:167
+msgid "_Help"
+msgstr "_Hilfe"
-#: ../src/main.c:570
+#: ../src/menu.c:179 ../src/menu.c:316
+msgid "_Video Track"
+msgstr ""
+
+#: ../src/menu.c:196 ../src/menu.c:200 ../src/menu.c:346 ../src/menu.c:351
+msgid "_Load External..."
+msgstr ""
+
+#: ../src/menu.c:210 ../src/menu.c:335
+msgid "_Audio Track"
+msgstr ""
+
+#: ../src/menu.c:214 ../src/menu.c:339
+msgid "S_ubtitle Track"
+msgstr ""
+
+#: ../src/mpv.c:304
+msgid "Playing"
+msgstr ""
+
+#: ../src/mpv.c:596
#, c-format
-msgid "Your configuration file has been moved to the new location at %s."
-msgstr "Die Konfigurationsdatei wurde am neuen Ort %s gespeichert."
+msgid "Playback was terminated abnormally. Reason: %s."
+msgstr ""
+
+#: ../src/mpv.c:1087
+msgid "Failed to apply one or more MPV options."
+msgstr ""
-#: ../src/open_loc_dialog.c:76
+#: ../src/open_loc_dialog.c:77
msgid "Location:"
msgstr "Adresse:"
-#: ../src/open_loc_dialog.c:80 ../src/main_window.c:274 ../src/actionctl.c:75
-#: ../src/actionctl.c:343 ../src/common.c:440
-msgid "_Open"
-msgstr "Ö_ffnen"
-
-#: ../src/open_loc_dialog.c:82 ../src/pref_dialog.c:204 ../src/actionctl.c:73
-#: ../src/actionctl.c:341 ../src/playlist.c:60
-msgid "_Cancel"
-msgstr "_Abbrechen"
-
-#: ../src/open_loc_dialog.c:92
+#: ../src/open_loc_dialog.c:93
msgid "Open Location"
msgstr "Adresse öffnen"
-#: ../src/playlist_widget.c:53
+#: ../src/playlist.c:57
+msgid "Save Playlist"
+msgstr "Wiedergabeliste speichern"
+
+#: ../src/playlist.c:62 ../src/pref_dialog.c:269
+msgid "_Save"
+msgstr "_Speichern"
+
+#: ../src/playlist_widget.c:44
+msgid "_Add…"
+msgstr ""
+
+#: ../src/playlist_widget.c:45
+msgid "Loop"
+msgstr "Wiederholen"
+
+#: ../src/playlist_widget.c:90
msgid "Playlist"
msgstr "Wiedergabeliste"
-#: ../src/pref_dialog.c:86
+#: ../src/pref_dialog.c:105
msgid "MPV configuration file:"
msgstr "MPV-Konfigurationsdatei"
-#: ../src/pref_dialog.c:87
+#: ../src/pref_dialog.c:106
msgid "MPV input configuration file:"
msgstr "Datei mit MPV-Tastenbelegungen"
-#: ../src/pref_dialog.c:88
+#: ../src/pref_dialog.c:107
msgid "Extra MPV options:"
msgstr "Weitere Optionen für MPV"
-#: ../src/pref_dialog.c:89
+#: ../src/pref_dialog.c:108
msgid "<b>General</b>"
msgstr "<b>Allgemein</b>"
-#: ../src/pref_dialog.c:90
+#: ../src/pref_dialog.c:109
msgid "<b>MPV Configuration</b>"
msgstr "<b>MPV-Einstellungen</b>"
-#: ../src/pref_dialog.c:91
+#: ../src/pref_dialog.c:110
msgid "<b>Keybindings</b>"
msgstr "<b>Tastenbelegungen</b>"
-#: ../src/pref_dialog.c:92
+#: ../src/pref_dialog.c:111
msgid "<b>Miscellaneous</b>"
msgstr "<b>Sonstiges</b>"
-#: ../src/pref_dialog.c:106
+#: ../src/pref_dialog.c:126
msgid "Enable client-side decorations"
msgstr "Kombinierte Titel-/Menüleiste (CSD)"
-#: ../src/pref_dialog.c:109
+#: ../src/pref_dialog.c:130
msgid "Enable dark theme"
msgstr "Dunkles Thema verwenden"
-#: ../src/pref_dialog.c:112
+#: ../src/pref_dialog.c:134
+msgid "Remember last file's location"
+msgstr "Speicherort der zuletzt gespielten Datei merken"
+
+#: ../src/pref_dialog.c:138
msgid "MPV configuration file"
msgstr "MPV-Konfigurationsdatei"
-#: ../src/pref_dialog.c:117
+#: ../src/pref_dialog.c:143
msgid "MPV input configuration file"
msgstr "Datei mit MPV-Tastenbelegungen"
-#: ../src/pref_dialog.c:122
+#: ../src/pref_dialog.c:148
msgid "Load MPV configuration file"
msgstr "MPV-Konfiguration aus Datei laden"
-#: ../src/pref_dialog.c:126
+#: ../src/pref_dialog.c:152
msgid "Load MPV input configuration file"
msgstr "MPV-Tastenbelegung aus Datei laden"
-#: ../src/pref_dialog.c:206 ../src/playlist.c:62
-msgid "_Save"
-msgstr "_Speichern"
-
-#: ../src/pref_dialog.c:215
+#: ../src/pref_dialog.c:285
msgid "Preferences"
msgstr "Einstellungen"
-
-#: ../src/main_window.c:231 ../src/common.c:470
-msgid "_Toggle Playlist"
-msgstr "_Wiedergabeliste ein/aus"
-
-#: ../src/main_window.c:234 ../src/common.c:447
-msgid "_Save Playlist"
-msgstr "Wiedergabeliste _speichern"
-
-#: ../src/main_window.c:237 ../src/common.c:457
-msgid "_Load Subtitle"
-msgstr "_Untertitel laden"
-
-#: ../src/main_window.c:240 ../src/common.c:473
-msgid "_Fullscreen"
-msgstr "_Vollbild"
-
-#: ../src/main_window.c:243 ../src/common.c:476
-msgid "_Normal Size"
-msgstr "_Normale Videogröße"
-
-#: ../src/main_window.c:246 ../src/common.c:479
-msgid "_Double Size"
-msgstr "_Doppelte Videogröße"
-
-#: ../src/main_window.c:249 ../src/common.c:482
-msgid "_Half Size"
-msgstr "_Halbe Videogröße"
-
-#: ../src/main_window.c:277 ../src/common.c:444
-msgid "Open _Location"
-msgstr "_Adresse öffnen"
-
-#: ../src/actionctl.c:70
-msgid "Open File"
-msgstr "Datei öffnen"
-
-#: ../src/actionctl.c:232
-#, c-format
-msgid ""
-"Enabling or disabling client-side decorations requires restarting %s to take "
-"effect."
-msgstr "Die Änderungen erfordern einen Neustart von %s."
-
-#: ../src/actionctl.c:338
-msgid "Load Subtitle"
-msgstr "Untertitel laden"
-
-#: ../src/actionctl.c:412
-msgid "A GTK frontend for MPV"
-msgstr "Eine GTK-Oberfläche für MPV"
-
-#: ../src/common.c:438
-msgid "_File"
-msgstr "_Datei"
-
-#: ../src/common.c:454
-msgid "_Edit"
-msgstr "_Bearbeiten"
-
-#: ../src/common.c:467
-msgid "_View"
-msgstr "_Ansicht"
-
-#: ../src/common.c:489
-msgid "_Help"
-msgstr "_Hilfe"
-
-#: ../src/common.c:527
-msgid ""
-"Keybindings that require Property Expansion are not supported and have been "
-"ignored."
-msgstr ""
-"Tastenbelegungen, die Property Expansion benötigen werden nicht unterstützt."
-
-#: ../src/playlist.c:57
-msgid "Save Playlist"
-msgstr "Wiedergabeliste speichern"
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..e5da38b
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,370 @@
+# French translations for gnome-mpv package
+# gnome-mpvパッケージに対する日本語翻訳.
+# Copyright (C) 2015 The gnome-mpv'u copyright holder
+# This file is distributed under the same license as the gnome-mpv package.
+# Harenome Ranaivorarivony Razanajato <harenome at hareno.me>, 2015.
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2015. #zanata
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2016. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-mpv 0.5\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-23 10:58-0500\n"
+"PO-Revision-Date: 2016-01-15 06:36-0500\n"
+"Last-Translator: gnome-mpv <gnome-mpv at openmailbox.org>\n"
+"Language-Team: Français\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Zanata 3.8.2\n"
+"X-Poedit-Basepath: ../src\n"
+"X-Poedit-SearchPath-0: .\n"
+"X-Poedit-SearchPathExcluded-0: mpv.c\n"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:1
+msgid "Enable or disable dark theme"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:2
+msgid "Enable or disable client-side decorations"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:3
+msgid ""
+"Whether or not to make file chooser dialog remember last folder accessed"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:4
+msgid "Whether or not to redirect mpv log messages to console"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:5
+msgid "Options to pass to mpv"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:6
+msgid "Path to mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:7
+msgid "Load or don't load mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:8
+msgid "Path to mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:9
+msgid "Load or don't load mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:10
+msgid "Width of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:11
+msgid "Height of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:12
+msgid "Volume of player"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:13
+msgid "Width of the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:14
+msgid "Show or not show the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:15
+msgid "URI of the last folder accessed"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:1
+msgid ""
+"GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media "
+"player capable of playing virtually all video and audio formats. The design "
+"of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME "
+"libraries. GNOME MPV also offers an option to disable client-side "
+"decorations (CSD) for better compatibility with non-GNOME systems."
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:2
+msgid "Features:"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:3
+msgid "Drag and drop playlist"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:4
+msgid "Loading external mpv configuration files"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:5
+msgid "MPRIS2 D-Bus interface"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:6
+msgid "The main window showing the application in action"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:7
+msgid "The main window with CSD disabled"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:8
+msgid "The main window with playlist open"
+msgstr ""
+
+#: ../data/gnome-mpv.desktop.in.h:1 ../src/main.c:552
+msgid "GNOME MPV"
+msgstr "GNOME MPV"
+
+#: ../data/gnome-mpv.desktop.in.h:2
+msgid "GTK+ frontend for mpv"
+msgstr ""
+
+#: ../src/actionctl.c:106
+#, fuzzy
+msgid "Add File to Playlist"
+msgstr "_Afficher la liste de lecture"
+
+#: ../src/actionctl.c:107
+msgid "Open File"
+msgstr "Ouvrir un fichier"
+
+#: ../src/actionctl.c:110 ../src/actionctl.c:409 ../src/open_loc_dialog.c:83
+#: ../src/playlist.c:60 ../src/pref_dialog.c:267
+msgid "_Cancel"
+msgstr "_Annuler"
+
+#: ../src/actionctl.c:112 ../src/actionctl.c:411 ../src/menu.c:121
+#: ../src/menu.c:390 ../src/open_loc_dialog.c:81
+msgid "_Open"
+msgstr "_Ouvrir"
+
+#: ../src/actionctl.c:251
+#, c-format
+msgid ""
+"Enabling or disabling client-side decorations requires restarting %s to take"
+" effect."
+msgstr ""
+"L'activation ou la désactivation des décorations fenêtre prendra effet après"
+" un redémarrage de %s."
+
+#: ../src/actionctl.c:406
+msgid "Load External…"
+msgstr ""
+
+#: ../src/actionctl.c:482
+msgid "A GTK frontend for MPV"
+msgstr "Une interface GTK pour MPV"
+
+#: ../src/common.c:236
+msgid "Error"
+msgstr ""
+
+#: ../src/common.c:401
+msgid ""
+"Keybindings that require Property Expansion are not supported and have been "
+"ignored."
+msgstr ""
+"Les raccourcis clavier qui reposent sur l'expansion de propriété sont "
+"ignorés car ils ne sont pas pris en charge."
+
+#: ../src/main.c:525 ../src/menu.c:138
+msgid "_Preferences"
+msgstr "_Préférences"
+
+#: ../src/main.c:526 ../src/menu.c:169
+msgid "_About"
+msgstr "À _propos"
+
+#: ../src/main.c:527 ../src/menu.c:122
+msgid "_Quit"
+msgstr "_Quitter"
+
+#: ../src/main.c:677
+#, c-format
+msgid ""
+"Preferences is now stored using GSettings. Your preferences have been "
+"migrated from the configuration file. A backup copy of the configuration "
+"file can be found at \"%s\"."
+msgstr ""
+
+#: ../src/menu.c:39
+msgid "None"
+msgstr ""
+
+#. For simplicity, also dup the default string used when the
+#. * track has no title.
+#: ../src/menu.c:54
+msgid "Unknown"
+msgstr ""
+
+#: ../src/menu.c:119
+msgid "_File"
+msgstr "_Fichier"
+
+#: ../src/menu.c:125 ../src/menu.c:393
+msgid "Open _Location"
+msgstr "Ouvrir un _répertoire"
+
+#: ../src/menu.c:128 ../src/menu.c:296
+msgid "_Save Playlist"
+msgstr "_Enregistrer la liste de lecture"
+
+#: ../src/menu.c:135
+msgid "_Edit"
+msgstr "É_diter"
+
+#: ../src/menu.c:145
+msgid "_View"
+msgstr "_Vue"
+
+#: ../src/menu.c:148 ../src/menu.c:292
+msgid "_Toggle Playlist"
+msgstr "_Afficher la liste de lecture"
+
+#: ../src/menu.c:151
+msgid "_Fullscreen"
+msgstr "_Plein écran"
+
+#: ../src/menu.c:154 ../src/menu.c:300
+msgid "_Normal Size"
+msgstr "Taille _Normale"
+
+#: ../src/menu.c:157 ../src/menu.c:304
+msgid "_Double Size"
+msgstr "Taille _Double"
+
+#: ../src/menu.c:160 ../src/menu.c:308
+msgid "_Half Size"
+msgstr "Taille _Moitié"
+
+#: ../src/menu.c:167
+msgid "_Help"
+msgstr "_Aide"
+
+#: ../src/menu.c:179 ../src/menu.c:316
+msgid "_Video Track"
+msgstr ""
+
+#: ../src/menu.c:196 ../src/menu.c:200 ../src/menu.c:346 ../src/menu.c:351
+msgid "_Load External..."
+msgstr ""
+
+#: ../src/menu.c:210 ../src/menu.c:335
+msgid "_Audio Track"
+msgstr ""
+
+#: ../src/menu.c:214 ../src/menu.c:339
+msgid "S_ubtitle Track"
+msgstr ""
+
+#: ../src/mpv.c:304
+msgid "Playing"
+msgstr ""
+
+#: ../src/mpv.c:596
+#, c-format
+msgid "Playback was terminated abnormally. Reason: %s."
+msgstr ""
+
+#: ../src/mpv.c:1087
+msgid "Failed to apply one or more MPV options."
+msgstr ""
+
+#: ../src/open_loc_dialog.c:77
+msgid "Location:"
+msgstr "Emplacement:"
+
+#: ../src/open_loc_dialog.c:93
+msgid "Open Location"
+msgstr "Ouvrir un répertoire"
+
+#: ../src/playlist.c:57
+#, fuzzy
+msgid "Save Playlist"
+msgstr "_Enregistrer la liste de lecture"
+
+#: ../src/playlist.c:62 ../src/pref_dialog.c:269
+msgid "_Save"
+msgstr "_Enregistrer"
+
+#: ../src/playlist_widget.c:44
+msgid "_Add…"
+msgstr ""
+
+#: ../src/playlist_widget.c:45
+msgid "Loop"
+msgstr ""
+
+#: ../src/playlist_widget.c:90
+msgid "Playlist"
+msgstr "Liste de lecture"
+
+#: ../src/pref_dialog.c:105
+msgid "MPV configuration file:"
+msgstr "Fichier de configuration MPV:"
+
+#: ../src/pref_dialog.c:106
+msgid "MPV input configuration file:"
+msgstr "Fichier de configuration des raccourcis clavier MPV:"
+
+#: ../src/pref_dialog.c:107
+msgid "Extra MPV options:"
+msgstr "Options supplémentaires pour MPV"
+
+#: ../src/pref_dialog.c:108
+msgid "<b>General</b>"
+msgstr "<b>Général</b>"
+
+#: ../src/pref_dialog.c:109
+msgid "<b>MPV Configuration</b>"
+msgstr "<b>Configuration MPV</b>"
+
+#: ../src/pref_dialog.c:110
+msgid "<b>Keybindings</b>"
+msgstr "<b>Raccourcis clavier</b>"
+
+#: ../src/pref_dialog.c:111
+msgid "<b>Miscellaneous</b>"
+msgstr "<b>Divers</b>"
+
+#: ../src/pref_dialog.c:126
+msgid "Enable client-side decorations"
+msgstr "Activer les décorations fenêtre"
+
+#: ../src/pref_dialog.c:130
+msgid "Enable dark theme"
+msgstr "Activer le thème sombre"
+
+#: ../src/pref_dialog.c:134
+msgid "Remember last file's location"
+msgstr ""
+
+#: ../src/pref_dialog.c:138
+msgid "MPV configuration file"
+msgstr "Fichier de configuration MPV"
+
+#: ../src/pref_dialog.c:143
+msgid "MPV input configuration file"
+msgstr "Fichier de configuration MPV d'entrée"
+
+#: ../src/pref_dialog.c:148
+msgid "Load MPV configuration file"
+msgstr "Charger un fichier de configuration MPV"
+
+#: ../src/pref_dialog.c:152
+msgid "Load MPV input configuration file"
+msgstr "Charger un fichier de configuration des raccourcis clavier MPV"
+
+#: ../src/pref_dialog.c:285
+msgid "Preferences"
+msgstr "Préférences"
diff --git a/po/fr_FR.po b/po/fr_FR.po
deleted file mode 100644
index 66d7a71..0000000
--- a/po/fr_FR.po
+++ /dev/null
@@ -1,148 +0,0 @@
-# French translations for gnome-mpv package
-# gnome-mpvパッケージに対する日本語翻訳.
-# Copyright (C) 2015 The gnome-mpv'u copyright holder
-# This file is distributed under the same license as the gnome-mpv package.
-# Harenome Ranaivorarivony Razanajato <harenome at hareno.me>, 2015.
-msgid ""
-msgstr ""
-"Project-Id-Version: gnome-mpv 0.5\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-08-11 11:55+0200\n"
-"PO-Revision-Date: 2015-08-11 15:19+0200\n"
-"Last-Translator: Harenome Ranaivoarivony Razanajato <harenome at hareno.me>\n"
-"Language-Team: Français\n"
-"Language: fr_FR\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.2\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Poedit-Basepath: ../src\n"
-"X-Poedit-SearchPath-0: .\n"
-"X-Poedit-SearchPathExcluded-0: mpv.c\n"
-
-msgid "_Preferences"
-msgstr "_Préférences"
-
-msgid "_About"
-msgstr "_À propos"
-
-msgid "_Quit"
-msgstr "_Quitter"
-
-msgid "GNOME MPV"
-msgstr "GNOME MPV"
-
-msgid "Your configuration file has been moved to the new location at %s."
-msgstr "Votre fichier de configuration a été déplacé au nouvel emplacement %s."
-
-msgid "Location:"
-msgstr "Emplacement:"
-
-msgid "_Open"
-msgstr "_Ouvrir"
-
-msgid "_Cancel"
-msgstr "_Annuler"
-
-msgid "Open Location"
-msgstr "Ouvrir un répertoire"
-
-msgid "Playlist"
-msgstr "Liste de lecture"
-
-msgid "MPV configuration file:"
-msgstr "Fichier de configuration MPV:"
-
-msgid "MPV input configuration file:"
-msgstr "Fichier de configuration des raccourcis clavier MPV:"
-
-msgid "Extra MPV options:"
-msgstr "Options supplémentaires pour MPV"
-
-msgid "<b>General</b>"
-msgstr "<b>Général</b>"
-
-msgid "<b>MPV Configuration</b>"
-msgstr "<b>Configuration MPV</b>"
-
-msgid "<b>Keybindings</b>"
-msgstr "<b>Raccourcis clavier</b>"
-
-msgid "<b>Miscellaneous</b>"
-msgstr "<b>Divers</b>"
-
-msgid "Enable client-side decorations"
-msgstr "Activer les décorations fenêtre"
-
-msgid "Enable dark theme"
-msgstr "Activer le thème sombre"
-
-msgid "MPV configuration file"
-msgstr "Fichier de configuration MPV"
-
-msgid "MPV input configuration file"
-msgstr "Fichier de configuration MPV d'entrée"
-
-msgid "Load MPV configuration file"
-msgstr "Charger un fichier de configuration MPV"
-
-msgid "Load MPV input configuration file"
-msgstr "Charger un fichier de configuration des raccourcis clavier MPV"
-
-msgid "_Save"
-msgstr "_Enregistrer"
-
-msgid "Preferences"
-msgstr "Préférences"
-
-msgid "_Toggle Playlist"
-msgstr "_Afficher la liste de lecture"
-
-msgid "_Save Playlist"
-msgstr "_Enregistrer la liste de lecture"
-
-msgid "_Load Subtitle"
-msgstr "_Charger les sous-titres"
-
-msgid "_Fullscreen"
-msgstr "_Plein écran"
-
-msgid "_Normal Size"
-msgstr "Taille _Normale"
-
-msgid "_Double Size"
-msgstr "Taille _Double"
-
-msgid "_Half Size"
-msgstr "Taille _Moitié"
-
-msgid "Open _Location"
-msgstr "Ouvrir un répertoire"
-
-msgid "Open File"
-msgstr "Ouvrir un fichier"
-
-msgid "Enabling or disabling client-side decorations requires restarting %s to take effect."
-msgstr "L'activation ou la désactivation des décorations fenêtre prendra effet après un redémarrage de %s."
-
-msgid "Load Subtitle"
-msgstr "Charger les sous-titres"
-
-msgid "A GTK frontend for MPV"
-msgstr "Une interface GTK pour MPV"
-
-msgid "_File"
-msgstr "_Fichier"
-
-msgid "_Edit"
-msgstr "_Éditer"
-
-msgid "_View"
-msgstr "_Vue"
-
-msgid "_Help"
-msgstr "_Aide"
-
-msgid "Keybindings that require Property Expansion are not supported and have been ignored."
-msgstr "Les raccourcis clavier qui reposent sur l'expansion de propriété sont ignorés car ils ne sont pas pris en charge."
diff --git a/po/ja.po b/po/ja.po
index ff4eb20..55b2e28 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -3,194 +3,360 @@
# Copyright (C) 2015 THE gnome-mpv'S COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-mpv package.
# Tista <tista.gma500 at gmail.com>, 2015.
-#
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2015. #zanata
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: gnome-mpv 0.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-05-29 11:00+0800\n"
-"PO-Revision-Date: 2015-07-20 05:26+0900\n"
-"Last-Translator: Tista <tista.gma500 at gmail.com>\n"
+"POT-Creation-Date: 2015-11-23 10:58-0500\n"
+"PO-Revision-Date: 2016-01-11 11:19-0500\n"
+"Last-Translator: gnome-mpv <gnome-mpv at openmailbox.org>\n"
"Language-Team: Japanese <>\n"
-"Language: ja_JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Gtranslator 2.91.6\n"
+"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Zanata 3.8.2\n"
-#: ../src/main.c:440 ../src/common.c:384
+#: ../data/org.gnome-mpv.gschema.xml.in.h:1
+msgid "Enable or disable dark theme"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:2
+msgid "Enable or disable client-side decorations"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:3
+msgid ""
+"Whether or not to make file chooser dialog remember last folder accessed"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:4
+msgid "Whether or not to redirect mpv log messages to console"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:5
+msgid "Options to pass to mpv"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:6
+msgid "Path to mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:7
+msgid "Load or don't load mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:8
+msgid "Path to mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:9
+msgid "Load or don't load mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:10
+msgid "Width of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:11
+msgid "Height of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:12
+msgid "Volume of player"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:13
+msgid "Width of the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:14
+msgid "Show or not show the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:15
+msgid "URI of the last folder accessed"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:1
+msgid ""
+"GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media "
+"player capable of playing virtually all video and audio formats. The design "
+"of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME "
+"libraries. GNOME MPV also offers an option to disable client-side "
+"decorations (CSD) for better compatibility with non-GNOME systems."
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:2
+msgid "Features:"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:3
+msgid "Drag and drop playlist"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:4
+msgid "Loading external mpv configuration files"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:5
+msgid "MPRIS2 D-Bus interface"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:6
+msgid "The main window showing the application in action"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:7
+msgid "The main window with CSD disabled"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:8
+msgid "The main window with playlist open"
+msgstr ""
+
+#: ../data/gnome-mpv.desktop.in.h:1 ../src/main.c:552
+msgid "GNOME MPV"
+msgstr "GNOME MPV"
+
+#: ../data/gnome-mpv.desktop.in.h:2
+msgid "GTK+ frontend for mpv"
+msgstr ""
+
+#: ../src/actionctl.c:106
+msgid "Add File to Playlist"
+msgstr "プレイリストの表示・非表示"
+
+#: ../src/actionctl.c:107
+msgid "Open File"
+msgstr "ファイルを開く"
+
+#: ../src/actionctl.c:110 ../src/actionctl.c:409 ../src/open_loc_dialog.c:83
+#: ../src/playlist.c:60 ../src/pref_dialog.c:267
+msgid "_Cancel"
+msgstr "キャンセル(_C)"
+
+#: ../src/actionctl.c:112 ../src/actionctl.c:411 ../src/menu.c:121
+#: ../src/menu.c:390 ../src/open_loc_dialog.c:81
+msgid "_Open"
+msgstr "開く(_O)"
+
+#: ../src/actionctl.c:251
+#, c-format
+msgid ""
+"Enabling or disabling client-side decorations requires restarting %s to take"
+" effect."
+msgstr "CSDの有効・無効は %s の再起動が必要です。"
+
+#: ../src/actionctl.c:406
+msgid "Load External…"
+msgstr ""
+
+#: ../src/actionctl.c:482
+msgid "A GTK frontend for MPV"
+msgstr "MPVのGTKフロントエンド"
+
+#: ../src/common.c:236
+msgid "Error"
+msgstr ""
+
+#: ../src/common.c:401
+msgid ""
+"Keybindings that require Property Expansion are not supported and have been "
+"ignored."
+msgstr "拡張キーバインドはサポートされず、無効化されます。"
+
+#: ../src/main.c:525 ../src/menu.c:138
msgid "_Preferences"
-msgstr "_設定"
+msgstr "設定(_P)"
-#: ../src/main.c:441 ../src/common.c:415
+#: ../src/main.c:526 ../src/menu.c:169
msgid "_About"
-msgstr "_このアプリケーションについて"
+msgstr "このアプリケーションについて(_A)"
-#: ../src/main.c:442 ../src/common.c:365
+#: ../src/main.c:527 ../src/menu.c:122
msgid "_Quit"
-msgstr "_終了"
+msgstr "終了(_Q)"
-#: ../src/main.c:465
-msgid "GNOME MPV"
-msgstr "GNOME MPV"
+#: ../src/main.c:677
+#, c-format
+msgid ""
+"Preferences is now stored using GSettings. Your preferences have been "
+"migrated from the configuration file. A backup copy of the configuration "
+"file can be found at \"%s\"."
+msgstr ""
+
+#: ../src/menu.c:39
+msgid "None"
+msgstr ""
+
+#. For simplicity, also dup the default string used when the
+#. * track has no title.
+#: ../src/menu.c:54
+msgid "Unknown"
+msgstr ""
-#: ../src/main.c:559
+#: ../src/menu.c:119
+msgid "_File"
+msgstr "ファイル(_F)"
+
+#: ../src/menu.c:125 ../src/menu.c:393
+msgid "Open _Location"
+msgstr "開く場所(_L)"
+
+#: ../src/menu.c:128 ../src/menu.c:296
+msgid "_Save Playlist"
+msgstr "プレイリストの保存(_S)"
+
+#: ../src/menu.c:135
+msgid "_Edit"
+msgstr "編集(_E)"
+
+#: ../src/menu.c:145
+msgid "_View"
+msgstr "表示(_V)"
+
+#: ../src/menu.c:148 ../src/menu.c:292
+msgid "_Toggle Playlist"
+msgstr "プレイリストの表示・非表示(_T)"
+
+#: ../src/menu.c:151
+msgid "_Fullscreen"
+msgstr "全画面表示(_F)"
+
+#: ../src/menu.c:154 ../src/menu.c:300
+msgid "_Normal Size"
+msgstr "通常のサイズ(_N)"
+
+#: ../src/menu.c:157 ../src/menu.c:304
+msgid "_Double Size"
+msgstr "2倍のサイズ(_D)"
+
+#: ../src/menu.c:160 ../src/menu.c:308
+msgid "_Half Size"
+msgstr "半分のサイズ(_H)"
+
+#: ../src/menu.c:167
+msgid "_Help"
+msgstr "ヘルプ(_H)"
+
+#: ../src/menu.c:179 ../src/menu.c:316
+msgid "_Video Track"
+msgstr ""
+
+#: ../src/menu.c:196 ../src/menu.c:200 ../src/menu.c:346 ../src/menu.c:351
+msgid "_Load External..."
+msgstr ""
+
+#: ../src/menu.c:210 ../src/menu.c:335
+msgid "_Audio Track"
+msgstr ""
+
+#: ../src/menu.c:214 ../src/menu.c:339
+msgid "S_ubtitle Track"
+msgstr ""
+
+#: ../src/mpv.c:304
+msgid "Playing"
+msgstr ""
+
+#: ../src/mpv.c:596
#, c-format
-msgid "Your configuration file has been moved to the new location at %s."
-msgstr "あなたの設定ファイルが新しく %s に作成されました。"
+msgid "Playback was terminated abnormally. Reason: %s."
+msgstr ""
-#: ../src/open_loc_dialog.c:68
+#: ../src/mpv.c:1087
+msgid "Failed to apply one or more MPV options."
+msgstr ""
+
+#: ../src/open_loc_dialog.c:77
msgid "Location:"
msgstr "場所:"
-#: ../src/open_loc_dialog.c:72 ../src/main_window.c:270 ../src/actionctl.c:75
-#: ../src/actionctl.c:345 ../src/common.c:364
-msgid "_Open"
-msgstr "_開く"
-
-#: ../src/open_loc_dialog.c:74 ../src/pref_dialog.c:155 ../src/actionctl.c:73
-#: ../src/actionctl.c:343
-msgid "_Cancel"
-msgstr "_キャンセル"
-
-#: ../src/open_loc_dialog.c:84
+#: ../src/open_loc_dialog.c:93
msgid "Open Location"
msgstr "場所を開く"
-#: ../src/playlist_widget.c:49
+#: ../src/playlist.c:57
+#, fuzzy
+msgid "Save Playlist"
+msgstr "_プレイリストの保存"
+
+#: ../src/playlist.c:62 ../src/pref_dialog.c:269
+msgid "_Save"
+msgstr "保存(_S)"
+
+#: ../src/playlist_widget.c:44
+msgid "_Add…"
+msgstr ""
+
+#: ../src/playlist_widget.c:45
+msgid "Loop"
+msgstr ""
+
+#: ../src/playlist_widget.c:90
msgid "Playlist"
msgstr "プレイリスト"
-#: ../src/pref_dialog.c:71
+#: ../src/pref_dialog.c:105
msgid "MPV configuration file:"
msgstr "MPV設定ファイル:"
-#: ../src/pref_dialog.c:72
+#: ../src/pref_dialog.c:106
msgid "MPV input configuration file:"
msgstr "MPV入力設定ファイル:"
-#: ../src/pref_dialog.c:73
+#: ../src/pref_dialog.c:107
msgid "Extra MPV options:"
msgstr "その他のMPVオプション:"
-#: ../src/pref_dialog.c:74
+#: ../src/pref_dialog.c:108
msgid "<b>General</b>"
msgstr "<b>一般</b>"
-#: ../src/pref_dialog.c:75
+#: ../src/pref_dialog.c:109
msgid "<b>MPV Configuration</b>"
msgstr "<b>MPVの設定</b>"
-#: ../src/pref_dialog.c:76
+#: ../src/pref_dialog.c:110
msgid "<b>Keybindings</b>"
msgstr "<b>キーバインド</b>"
-#: ../src/pref_dialog.c:77
+#: ../src/pref_dialog.c:111
msgid "<b>Miscellaneous</b>"
msgstr "<b>その他</b>"
-#: ../src/pref_dialog.c:91
+#: ../src/pref_dialog.c:126
msgid "Enable client-side decorations"
msgstr "CSDを有効にする"
-#: ../src/pref_dialog.c:94
+#: ../src/pref_dialog.c:130
msgid "Enable dark theme"
msgstr "暗いテーマを有効にする"
-#: ../src/pref_dialog.c:97
+#: ../src/pref_dialog.c:134
+msgid "Remember last file's location"
+msgstr ""
+
+#: ../src/pref_dialog.c:138
msgid "MPV configuration file"
msgstr "MPV設定ファイル"
-#: ../src/pref_dialog.c:102
+#: ../src/pref_dialog.c:143
msgid "MPV input configuration file"
msgstr "MPV入力設定ファイル"
-#: ../src/pref_dialog.c:107
+#: ../src/pref_dialog.c:148
msgid "Load MPV configuration file"
msgstr "MPV設定ファイルをロードする"
-#: ../src/pref_dialog.c:111
+#: ../src/pref_dialog.c:152
msgid "Load MPV input configuration file"
msgstr "MPV入力設定ファイルをロードする"
-#: ../src/pref_dialog.c:153
-msgid "_Save"
-msgstr "_保存"
-
-#: ../src/pref_dialog.c:160
+#: ../src/pref_dialog.c:285
msgid "Preferences"
msgstr "設定"
-
-#: ../src/main_window.c:227 ../src/common.c:394
-msgid "_Toggle Playlist"
-msgstr "_プレイリストの表示・非表示"
-
-#: ../src/main_window.c:230 ../src/common.c:371
-msgid "_Save Playlist"
-msgstr "_プレイリストの保存"
-
-#: ../src/main_window.c:233 ../src/common.c:381
-msgid "_Load Subtitle"
-msgstr "_字幕をロードする"
-
-#: ../src/main_window.c:236 ../src/common.c:397
-msgid "_Fullscreen"
-msgstr "_全画面表示"
-
-#: ../src/main_window.c:239 ../src/common.c:400
-msgid "_Normal Size"
-msgstr "_通常のサイズ"
-
-#: ../src/main_window.c:242 ../src/common.c:403
-msgid "_Double Size"
-msgstr "_2倍のサイズ"
-
-#: ../src/main_window.c:245 ../src/common.c:406
-msgid "_Half Size"
-msgstr "_半分のサイズ"
-
-#: ../src/main_window.c:273 ../src/common.c:368
-msgid "Open _Location"
-msgstr "開く _場所"
-
-#: ../src/actionctl.c:70
-msgid "Open File"
-msgstr "ファイルを開く"
-
-#: ../src/actionctl.c:227
-#, c-format
-msgid ""
-"Enabling or disabling client-side decorations requires restarting %s to take "
-"effect."
-msgstr "CSDの有効・無効は %s の再起動が必要です。"
-
-#: ../src/actionctl.c:340
-msgid "Load Subtitle"
-msgstr "字幕をロードする"
-
-#: ../src/actionctl.c:414
-msgid "A GTK frontend for MPV"
-msgstr "MPVのGTKフロントエンド"
-
-#: ../src/common.c:362
-msgid "_File"
-msgstr "_ファイル"
-
-#: ../src/common.c:378
-msgid "_Edit"
-msgstr "_編集"
-
-#: ../src/common.c:391
-msgid "_View"
-msgstr "_表示"
-
-#: ../src/common.c:413
-msgid "_Help"
-msgstr "_ヘルプ"
-
-#: ../src/common.c:452
-msgid ""
-"Keybindings that require Property Expansion are not supported and have been "
-"ignored."
-msgstr "拡張キーバインドはサポートされず、無効化されます。"
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..08bd369
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,368 @@
+# Romanian (ro_RO) translations for gnome-mpv package.
+# gnome-mpv
+# Copyright (C) 2015 THE gnome-mpv'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnone-mpv package.
+# Robert Datcu <robert.datcu at gmail.com>, 2015.
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2015. #zanata
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2016. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-01-19 16:48+0700\n"
+"PO-Revision-Date: 2016-01-15 06:40-0500\n"
+"Last-Translator: gnome-mpv <gnome-mpv at openmailbox.org>\n"
+"Language-Team: Romanian Translations\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ro\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Zanata 3.8.2\n"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:1
+msgid "Enable or disable dark theme"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:2
+msgid "Enable or disable client-side decorations"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:3
+msgid ""
+"Whether or not to make file chooser dialog remember last folder accessed"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:4
+msgid "Whether or not to redirect mpv log messages to console"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:5
+msgid "Options to pass to mpv"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:6
+msgid "Path to mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:7
+msgid "Load or don't load mpv configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:8
+msgid "Path to mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:9
+msgid "Load or don't load mpv input configuration file"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:10
+msgid "Width of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:11
+msgid "Height of the window"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:12
+msgid "Volume of player"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:13
+msgid "Width of the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:14
+msgid "Show or not show the playlist"
+msgstr ""
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:15
+msgid "URI of the last folder accessed"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:1
+msgid ""
+"GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media "
+"player capable of playing virtually all video and audio formats. The design "
+"of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME "
+"libraries. GNOME MPV also offers an option to disable client-side "
+"decorations (CSD) for better compatibility with non-GNOME systems."
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:2
+msgid "Features:"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:3
+msgid "Drag and drop playlist"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:4
+msgid "Loading external mpv configuration files"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:5
+msgid "MPRIS2 D-Bus interface"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:6
+msgid "The main window showing the application in action"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:7
+msgid "The main window with CSD disabled"
+msgstr ""
+
+#: ../data/gnome-mpv.appdata.xml.in.h:8
+msgid "The main window with playlist open"
+msgstr ""
+
+#: ../data/gnome-mpv.desktop.in.h:1 ../src/main.c:552
+msgid "GNOME MPV"
+msgstr "GNOME MPV"
+
+#: ../data/gnome-mpv.desktop.in.h:2
+msgid "GTK+ frontend for mpv"
+msgstr ""
+
+#: ../src/actionctl.c:106
+msgid "Add File to Playlist"
+msgstr "Adaugă un fișier Listei de Redare"
+
+#: ../src/actionctl.c:107
+msgid "Open File"
+msgstr "Deschide Fișier"
+
+#: ../src/actionctl.c:110 ../src/actionctl.c:409 ../src/open_loc_dialog.c:83
+#: ../src/playlist.c:60 ../src/pref_dialog.c:267
+msgid "_Cancel"
+msgstr "_Anulează"
+
+#: ../src/actionctl.c:112 ../src/actionctl.c:411 ../src/menu.c:121
+#: ../src/menu.c:390 ../src/open_loc_dialog.c:81
+msgid "_Open"
+msgstr "_Deschide"
+
+#: ../src/actionctl.c:251
+#, c-format
+msgid ""
+"Enabling or disabling client-side decorations requires restarting %s to take"
+" effect."
+msgstr ""
+"Activarea sau dezactivarea decorațiilor ferestrelor (CSD) necesită "
+"repornirea %s."
+
+#: ../src/actionctl.c:406
+msgid "Load External…"
+msgstr ""
+
+#: ../src/actionctl.c:482
+msgid "A GTK frontend for MPV"
+msgstr "O interfață GTK pentru MPV"
+
+#: ../src/common.c:236
+msgid "Error"
+msgstr ""
+
+#: ../src/common.c:401
+msgid ""
+"Keybindings that require Property Expansion are not supported and have been "
+"ignored."
+msgstr ""
+"Combinațiile de taste care necesită extinderea proprietăților nu sunt "
+"suportate și au fost ignorate."
+
+#: ../src/main.c:525 ../src/menu.c:138
+msgid "_Preferences"
+msgstr "_Preferințe"
+
+#: ../src/main.c:526 ../src/menu.c:169
+msgid "_About"
+msgstr "_Despre"
+
+#: ../src/main.c:527 ../src/menu.c:122
+msgid "_Quit"
+msgstr "Î_nchide"
+
+#: ../src/main.c:677
+#, c-format
+msgid ""
+"Preferences is now stored using GSettings. Your preferences have been "
+"migrated from the configuration file. A backup copy of the configuration "
+"file can be found at \"%s\"."
+msgstr ""
+"Preferințele sunt stocate folosind GSettings. Preferințele tale au fost "
+"transferate din fișierul de configurare. O copie de rezervă a fișierului de "
+"configurare poate fi găsită la \"%s\"."
+
+#: ../src/menu.c:39
+msgid "None"
+msgstr ""
+
+#. For simplicity, also dup the default string used when the
+#. * track has no title.
+#: ../src/menu.c:54
+msgid "Unknown"
+msgstr ""
+
+#: ../src/menu.c:119
+msgid "_File"
+msgstr "_Fișier"
+
+#: ../src/menu.c:125 ../src/menu.c:393
+msgid "Open _Location"
+msgstr "_Deschide Adresa"
+
+#: ../src/menu.c:128 ../src/menu.c:296
+msgid "_Save Playlist"
+msgstr "_Salvează Lista Redare"
+
+#: ../src/menu.c:135
+msgid "_Edit"
+msgstr "_Modifică"
+
+#: ../src/menu.c:145
+msgid "_View"
+msgstr "_Vizualizare"
+
+#: ../src/menu.c:148 ../src/menu.c:292
+msgid "_Toggle Playlist"
+msgstr "_Afișează Lista Redare"
+
+#: ../src/menu.c:151
+msgid "_Fullscreen"
+msgstr "_Tot ecranul"
+
+#: ../src/menu.c:154 ../src/menu.c:300
+msgid "_Normal Size"
+msgstr "_Dimensiune Normală"
+
+#: ../src/menu.c:157 ../src/menu.c:304
+msgid "_Double Size"
+msgstr "_Dimensiune Dublă"
+
+#: ../src/menu.c:160 ../src/menu.c:308
+msgid "_Half Size"
+msgstr "_Dimensiune Înjumătățită"
+
+#: ../src/menu.c:167
+msgid "_Help"
+msgstr "_Ajutor"
+
+#: ../src/menu.c:179 ../src/menu.c:316
+msgid "_Video Track"
+msgstr ""
+
+#: ../src/menu.c:196 ../src/menu.c:200 ../src/menu.c:346 ../src/menu.c:351
+msgid "_Load External..."
+msgstr ""
+
+#: ../src/menu.c:210 ../src/menu.c:335
+msgid "_Audio Track"
+msgstr ""
+
+#: ../src/menu.c:214 ../src/menu.c:339
+msgid "S_ubtitle Track"
+msgstr ""
+
+#: ../src/mpv.c:304
+msgid "Playing"
+msgstr ""
+
+#: ../src/mpv.c:596
+#, c-format
+msgid "Playback was terminated abnormally. Reason: %s."
+msgstr ""
+
+#: ../src/mpv.c:1087
+msgid "Failed to apply one or more MPV options."
+msgstr ""
+
+#: ../src/open_loc_dialog.c:77
+msgid "Location:"
+msgstr "Adresă:"
+
+#: ../src/open_loc_dialog.c:93
+msgid "Open Location"
+msgstr "Deschide Adresa"
+
+#: ../src/playlist.c:57
+msgid "Save Playlist"
+msgstr "Salvează Lista de Redare"
+
+#: ../src/playlist.c:62 ../src/pref_dialog.c:269
+msgid "_Save"
+msgstr "_Salvează"
+
+#: ../src/playlist_widget.c:44
+msgid "_Add…"
+msgstr ""
+
+#: ../src/playlist_widget.c:45
+msgid "Loop"
+msgstr "Buclă"
+
+#: ../src/playlist_widget.c:90
+msgid "Playlist"
+msgstr "Listă de redare"
+
+#: ../src/pref_dialog.c:105
+msgid "MPV configuration file:"
+msgstr "fișier configurare MPV:"
+
+#: ../src/pref_dialog.c:106
+msgid "MPV input configuration file:"
+msgstr "fișier MPV configurare combinații taste:"
+
+#: ../src/pref_dialog.c:107
+msgid "Extra MPV options:"
+msgstr "Extraopțiuni MPV:"
+
+#: ../src/pref_dialog.c:108
+msgid "<b>General</b>"
+msgstr "<b>General</b>"
+
+#: ../src/pref_dialog.c:109
+msgid "<b>MPV Configuration</b>"
+msgstr "<b>Configurare MPV</b>"
+
+#: ../src/pref_dialog.c:110
+msgid "<b>Keybindings</b>"
+msgstr "<b>Combinații Taste</b>"
+
+#: ../src/pref_dialog.c:111
+msgid "<b>Miscellaneous</b>"
+msgstr "<b>Diverse</b>"
+
+#: ../src/pref_dialog.c:126
+msgid "Enable client-side decorations"
+msgstr "Activează decorațiile ferestrelor (CSD)"
+
+#: ../src/pref_dialog.c:130
+msgid "Enable dark theme"
+msgstr "Activează tema întunecată"
+
+#: ../src/pref_dialog.c:134
+msgid "Remember last file's location"
+msgstr "Ține minte adresa ultimului fișier"
+
+#: ../src/pref_dialog.c:138
+msgid "MPV configuration file"
+msgstr "fișier configurare MPV"
+
+#: ../src/pref_dialog.c:143
+msgid "MPV input configuration file"
+msgstr "fișier MPV combinații taste"
+
+#: ../src/pref_dialog.c:148
+msgid "Load MPV configuration file"
+msgstr "Încarcă fișierul de configurare MPV"
+
+#: ../src/pref_dialog.c:152
+msgid "Load MPV input configuration file"
+msgstr "Încarcă fișierul MPV de combinații taste"
+
+#: ../src/pref_dialog.c:285
+msgid "Preferences"
+msgstr "Preferințe"
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..79c86c2
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,365 @@
+# Maxim Orlov <murmansksity at gmail.com>, 2016. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-01-04 00:00+0700\n"
+"PO-Revision-Date: 2016-01-22 03:02-0500\n"
+"Last-Translator: Maxim Orlov <murmansksity at gmail.com>\n"
+"Language-Team: Russian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+"X-Generator: Zanata 3.8.2\n"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:1
+msgid "Enable or disable dark theme"
+msgstr "Включить или отключить тёмную тему"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:2
+msgid "Enable or disable client-side decorations"
+msgstr "Включить или отключить CSD"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:3
+msgid ""
+"Whether or not to make file chooser dialog remember last folder accessed"
+msgstr "Запомнить или нет последнее расположение в диалоге открытия файла"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:4
+msgid "Whether or not to redirect mpv log messages to console"
+msgstr "Перенаправить выхлоп MPV в консоль"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:5
+msgid "Options to pass to mpv"
+msgstr "Перейти к опциям MPV"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:6
+msgid "Path to mpv configuration file"
+msgstr "Путь к файлу конфигурации MPV"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:7
+msgid "Load or don't load mpv configuration file"
+msgstr "Загрузить файл конфигурации MPV"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:8
+msgid "Path to mpv input configuration file"
+msgstr "Путь к файлу конфигурации ввода MPV"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:9
+msgid "Load or don't load mpv input configuration file"
+msgstr "Загрузить файл конфигурации ввода MPV"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:10
+msgid "Width of the window"
+msgstr "Ширина"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:11
+msgid "Height of the window"
+msgstr "Высота"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:12
+msgid "Volume of player"
+msgstr "Громкость"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:13
+msgid "Width of the playlist"
+msgstr "Ширина списка воспроизведения"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:14
+msgid "Show or not show the playlist"
+msgstr "Показать или скрыть список воспроизведения"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:15
+msgid "URI of the last folder accessed"
+msgstr "Адрес последнего открытого файла"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:1
+msgid ""
+"GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media "
+"player capable of playing virtually all video and audio formats. The design "
+"of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME "
+"libraries. GNOME MPV also offers an option to disable client-side "
+"decorations (CSD) for better compatibility with non-GNOME systems."
+msgstr ""
+"GNOME MPV - это простая GTK+ оболочка для MPV, поэтому является очень мощным"
+" медиаплеером, который способен воспроизводить практически все видео и аудио"
+" форматы. Дизайн GNOME MPV соответствует GNOME HIG. GNOME MPV также "
+"предлагает опцию, чтобы отключить декорирование на стороне клиента (CSD) для"
+" лучшей совместимости с системами, отличными от GNOME."
+
+#: ../data/gnome-mpv.appdata.xml.in.h:2
+msgid "Features:"
+msgstr "Возможности:"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:3
+msgid "Drag and drop playlist"
+msgstr "Перетаскивание списка воспроизведения"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:4
+msgid "Loading external mpv configuration files"
+msgstr "Загрузка внешних конфигурационных файлов MPV"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:5
+msgid "MPRIS2 D-Bus interface"
+msgstr "Интерфейс MPRIS2 D-Bus"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:6
+msgid "The main window showing the application in action"
+msgstr "Главное окно, показывающее приложение в действии"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:7
+msgid "The main window with CSD disabled"
+msgstr "Главное окно с отключённым CSD"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:8
+msgid "The main window with playlist open"
+msgstr "Главное окно с открытым списком воспроизведения"
+
+#: ../data/gnome-mpv.desktop.in.h:1 ../src/main.c:552
+msgid "GNOME MPV"
+msgstr "GNOME MPV"
+
+#: ../data/gnome-mpv.desktop.in.h:2
+msgid "GTK+ frontend for mpv"
+msgstr "GTK+ интерфейс для MPV"
+
+#: ../src/actionctl.c:106
+msgid "Add File to Playlist"
+msgstr "Добавить файл в список воспроизведения"
+
+#: ../src/actionctl.c:107
+msgid "Open File"
+msgstr "Открыть файл"
+
+#: ../src/actionctl.c:110 ../src/actionctl.c:409 ../src/open_loc_dialog.c:83
+#: ../src/playlist.c:60 ../src/pref_dialog.c:267
+msgid "_Cancel"
+msgstr "_Отмена"
+
+#: ../src/actionctl.c:112 ../src/actionctl.c:411 ../src/menu.c:121
+#: ../src/menu.c:390 ../src/open_loc_dialog.c:81
+msgid "_Open"
+msgstr "_Открыть"
+
+#: ../src/actionctl.c:251
+#, c-format
+msgid ""
+"Enabling or disabling client-side decorations requires restarting %s to take"
+" effect."
+msgstr ""
+"Чтобы изменения вступили в силу, необходимо перезапустить приложение %s."
+
+#: ../src/actionctl.c:406
+msgid "Load External…"
+msgstr "Загрузить внешние…"
+
+#: ../src/actionctl.c:482
+msgid "A GTK frontend for MPV"
+msgstr "GTK интерфейс для MPV"
+
+#: ../src/common.c:236
+msgid "Error"
+msgstr "Ошибка"
+
+#: ../src/common.c:401
+msgid ""
+"Keybindings that require Property Expansion are not supported and have been "
+"ignored."
+msgstr ""
+"Комбинации клавиш, которым требуются расширенные возможности не "
+"поддерживаются и были проигнорированы."
+
+#: ../src/main.c:525 ../src/menu.c:138
+msgid "_Preferences"
+msgstr "_Настройки"
+
+#: ../src/main.c:526 ../src/menu.c:169
+msgid "_About"
+msgstr "_О программе"
+
+#: ../src/main.c:527 ../src/menu.c:122
+msgid "_Quit"
+msgstr "_Выйти"
+
+#: ../src/main.c:677
+#, c-format
+msgid ""
+"Preferences is now stored using GSettings. Your preferences have been "
+"migrated from the configuration file. A backup copy of the configuration "
+"file can be found at \"%s\"."
+msgstr ""
+"Параметры настроек теперь хранятся посредством GSettings. Резервную копию "
+"файла конфигурации можно найти в \"%s\"."
+
+#: ../src/menu.c:39
+msgid "None"
+msgstr "Ничего"
+
+#. For simplicity, also dup the default string used when the
+#. * track has no title.
+#: ../src/menu.c:54
+msgid "Unknown"
+msgstr "Неизвестный"
+
+#: ../src/menu.c:119
+msgid "_File"
+msgstr "_Файл"
+
+#: ../src/menu.c:125 ../src/menu.c:393
+msgid "Open _Location"
+msgstr "Открыть _адрес"
+
+#: ../src/menu.c:128 ../src/menu.c:296
+msgid "_Save Playlist"
+msgstr "_Сохранить список воспроизведения"
+
+#: ../src/menu.c:135
+msgid "_Edit"
+msgstr "_Правка"
+
+#: ../src/menu.c:145
+msgid "_View"
+msgstr "_Вид"
+
+#: ../src/menu.c:148 ../src/menu.c:292
+msgid "_Toggle Playlist"
+msgstr "_Показать / Скрыть список воспроизведения"
+
+#: ../src/menu.c:151
+msgid "_Fullscreen"
+msgstr "_Полноэкранный режим"
+
+#: ../src/menu.c:154 ../src/menu.c:300
+msgid "_Normal Size"
+msgstr "_Нормальный размер"
+
+#: ../src/menu.c:157 ../src/menu.c:304
+msgid "_Double Size"
+msgstr "_Двойной размер"
+
+#: ../src/menu.c:160 ../src/menu.c:308
+msgid "_Half Size"
+msgstr "_Половинный размер"
+
+#: ../src/menu.c:167
+msgid "_Help"
+msgstr "_Справка"
+
+#: ../src/menu.c:179 ../src/menu.c:316
+msgid "_Video Track"
+msgstr "_Видео дорожка"
+
+#: ../src/menu.c:196 ../src/menu.c:200 ../src/menu.c:346 ../src/menu.c:351
+msgid "_Load External..."
+msgstr "_Загрузить внешние…"
+
+#: ../src/menu.c:210 ../src/menu.c:335
+msgid "_Audio Track"
+msgstr "_Аудио дорожка"
+
+#: ../src/menu.c:214 ../src/menu.c:339
+msgid "S_ubtitle Track"
+msgstr "Дорожка с_убтитров"
+
+#: ../src/mpv.c:304
+msgid "Playing"
+msgstr "Воспроизведение"
+
+#: ../src/mpv.c:596
+#, c-format
+msgid "Playback was terminated abnormally. Reason: %s."
+msgstr "Воспроизведение было прекращено. Причина: %s."
+
+#: ../src/mpv.c:1087
+msgid "Failed to apply one or more MPV options."
+msgstr "Не удалось применить одну или несколько опций MPV."
+
+#: ../src/open_loc_dialog.c:77
+msgid "Location:"
+msgstr "Адрес:"
+
+#: ../src/open_loc_dialog.c:93
+msgid "Open Location"
+msgstr "Открыть адрес"
+
+#: ../src/playlist.c:57
+msgid "Save Playlist"
+msgstr "Сохранить список воспроизведения"
+
+#: ../src/playlist.c:62 ../src/pref_dialog.c:269
+msgid "_Save"
+msgstr "_Сохранить"
+
+#: ../src/playlist_widget.c:44
+msgid "_Add…"
+msgstr "_Добавить…"
+
+#: ../src/playlist_widget.c:45
+msgid "Loop"
+msgstr "Повторить"
+
+#: ../src/playlist_widget.c:90
+msgid "Playlist"
+msgstr "Список воспроизведения"
+
+#: ../src/pref_dialog.c:105
+msgid "MPV configuration file:"
+msgstr "Файл конфигурации MPV:"
+
+#: ../src/pref_dialog.c:106
+msgid "MPV input configuration file:"
+msgstr "Файл конфигурации ввода MPV:"
+
+#: ../src/pref_dialog.c:107
+msgid "Extra MPV options:"
+msgstr "Дополнительные опции MPV:"
+
+#: ../src/pref_dialog.c:108
+msgid "<b>General</b>"
+msgstr "<b>Общие</b>"
+
+#: ../src/pref_dialog.c:109
+msgid "<b>MPV Configuration</b>"
+msgstr "<b>Конфигурация MPV</b>"
+
+#: ../src/pref_dialog.c:110
+msgid "<b>Keybindings</b>"
+msgstr "<b>Комбинации клавиш</b>"
+
+#: ../src/pref_dialog.c:111
+msgid "<b>Miscellaneous</b>"
+msgstr "<b>Разное</b>"
+
+#: ../src/pref_dialog.c:126
+msgid "Enable client-side decorations"
+msgstr "Включить / Отключить CSD"
+
+#: ../src/pref_dialog.c:130
+msgid "Enable dark theme"
+msgstr "Использовать тёмный вариант темы"
+
+#: ../src/pref_dialog.c:134
+msgid "Remember last file's location"
+msgstr "Запомнить последнее расположение файла"
+
+#: ../src/pref_dialog.c:138
+msgid "MPV configuration file"
+msgstr "Файл конфигурации MPV"
+
+#: ../src/pref_dialog.c:143
+msgid "MPV input configuration file"
+msgstr "Файл конфигурации ввода MPV"
+
+#: ../src/pref_dialog.c:148
+msgid "Load MPV configuration file"
+msgstr "Загрузить файл конфигурации MPV"
+
+#: ../src/pref_dialog.c:152
+msgid "Load MPV input configuration file"
+msgstr "Загрузить файл конфигурации ввода MPV"
+
+#: ../src/pref_dialog.c:285
+msgid "Preferences"
+msgstr "Настройки"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 3aa9513..a2c1abd 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -1,191 +1,365 @@
# Chinese translations for gnome-mpv package
# gnome-mpv 软件包的简体中文翻译.
-# Copyright (C) 2015 THE gnome-mpv'S COPYRIGHT HOLDER
+# Copyright (C) 2015 THE GNOME-MPV'S COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-mpv package.
# sun <warmsun0220 at gmail.com>, 2015.
-#
+# Mingye Wang <arthur2e5 at aosc.xyz>, 2015.
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2015. #zanata
+# Mingye Wang <arthur2e5 at aosc.xyz>, 2016. #zanata
msgid ""
msgstr ""
-"Project-Id-Version: gnome-mpv 0.2\n"
+"Project-Id-Version: gnome-mpv 0.6\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-05-29 11:00+0800\n"
-"PO-Revision-Date: 2015-05-29 11:02+0800\n"
-"Last-Translator: sun <warmsun0220 at gmail.com>\n"
-"Language-Team: Chinese (simplified)\n"
-"Language: zh_CN\n"
+"POT-Creation-Date: 2015-11-16 21:24+0800\n"
+"PO-Revision-Date: 2016-01-24 12:32-0500\n"
+"Last-Translator: Mingye Wang <arthur2e5 at aosc.xyz>\n"
+"Language-Team: AOSC zh_CN <aosc at member.fsf.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.1\n"
+"Language: zh-CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Zanata 3.8.2\n"
-#: ../src/main.c:440 ../src/common.c:384
+#: ../data/org.gnome-mpv.gschema.xml.in.h:1
+msgid "Enable or disable dark theme"
+msgstr "启用或禁用暗色主题"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:2
+msgid "Enable or disable client-side decorations"
+msgstr "启用或禁用客户端装饰"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:3
+msgid ""
+"Whether or not to make file chooser dialog remember last folder accessed"
+msgstr "是否让文件选择对话框记住最近访问的文件夹"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:4
+msgid "Whether or not to redirect mpv log messages to console"
+msgstr "是否将 mpv 日志信息重定向到控制台"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:5
+msgid "Options to pass to mpv"
+msgstr "要传递给 mpv 的选项"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:6
+msgid "Path to mpv configuration file"
+msgstr "mpv 配置文件的路径"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:7
+msgid "Load or don't load mpv configuration file"
+msgstr "是否载入 mpv 配置文件"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:8
+msgid "Path to mpv input configuration file"
+msgstr "mpv 输入配置文件的路径"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:9
+msgid "Load or don't load mpv input configuration file"
+msgstr "是否载入 mpv 输入配置文件"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:10
+msgid "Width of the window"
+msgstr "窗口宽度"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:11
+msgid "Height of the window"
+msgstr "窗口高度"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:12
+msgid "Volume of player"
+msgstr "播放器音量"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:13
+msgid "Width of the playlist"
+msgstr "播放列表宽度"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:14
+msgid "Show or not show the playlist"
+msgstr "是否显示播放列表"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:15
+msgid "URI of the last folder accessed"
+msgstr "最近访问的文件夹 URI"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:1
+msgid ""
+"GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media "
+"player capable of playing virtually all video and audio formats. The design "
+"of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME "
+"libraries. GNOME MPV also offers an option to disable client-side "
+"decorations (CSD) for better compatibility with non-GNOME systems."
+msgstr ""
+"GNOME MPV 是一个简单的 GTK+ mpv 前端,mpv 是一个功能强大的媒体播放器,可用于播放几乎所有的视频和音频格式。尽管该程序不依赖于任何"
+" GNOME 库,GNOME MPV 是一个基于 GNOME HIG(人机界面准则)设计的程序。GNOME MPV "
+"还提供禁用客户端装饰(CSD)的选项以为不运行 GNOME 的系统提供更好的兼容性。"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:2
+msgid "Features:"
+msgstr "特性:"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:3
+msgid "Drag and drop playlist"
+msgstr "拖放播放列表"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:4
+msgid "Loading external mpv configuration files"
+msgstr "正在载入外部 mpv 配置文件"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:5
+msgid "MPRIS2 D-Bus interface"
+msgstr "MPRIS2 D-Bus 界面"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:6
+msgid "The main window showing the application in action"
+msgstr "显示运行中应用的主窗口"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:7
+msgid "The main window with CSD disabled"
+msgstr "关闭了 CSD 的主窗口"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:8
+msgid "The main window with playlist open"
+msgstr "打开了播放列表的主窗口"
+
+#: ../data/gnome-mpv.desktop.in.h:1 ../src/main.c:552
+msgid "GNOME MPV"
+msgstr "GNOME MPV"
+
+#: ../data/gnome-mpv.desktop.in.h:2
+msgid "GTK+ frontend for mpv"
+msgstr "MPV 的 GTK 前端程序"
+
+#: ../src/actionctl.c:106
+msgid "Add File to Playlist"
+msgstr "添加文件到播放列表"
+
+#: ../src/actionctl.c:107
+msgid "Open File"
+msgstr "打开文件"
+
+#: ../src/actionctl.c:110 ../src/actionctl.c:409 ../src/open_loc_dialog.c:83
+#: ../src/playlist.c:60 ../src/pref_dialog.c:267
+msgid "_Cancel"
+msgstr "取消(_C)"
+
+#: ../src/actionctl.c:112 ../src/actionctl.c:411 ../src/menu.c:121
+#: ../src/menu.c:390 ../src/open_loc_dialog.c:81
+msgid "_Open"
+msgstr "打开(_O)"
+
+#: ../src/actionctl.c:251
+#, c-format
+msgid ""
+"Enabling or disabling client-side decorations requires restarting %s to take"
+" effect."
+msgstr "启用或禁用客户端装饰需要重启 %s 生效。"
+
+#: ../src/actionctl.c:406
+msgid "Load External…"
+msgstr "载入外部配置文件…"
+
+#: ../src/actionctl.c:482
+msgid "A GTK frontend for MPV"
+msgstr "MPV 的 GTK 前端程序"
+
+#: ../src/common.c:236
+msgid "Error"
+msgstr "错误"
+
+#: ../src/common.c:401
+msgid ""
+"Keybindings that require Property Expansion are not supported and have been "
+"ignored."
+msgstr "需要属性扩展的键绑定不被支持,已被忽略。"
+
+#: ../src/main.c:525 ../src/menu.c:138
msgid "_Preferences"
-msgstr "_首选项"
+msgstr "首选项(_P)"
-#: ../src/main.c:441 ../src/common.c:415
+#: ../src/main.c:526 ../src/menu.c:169
msgid "_About"
-msgstr "_关于"
+msgstr "关于(_A)"
-#: ../src/main.c:442 ../src/common.c:365
+#: ../src/main.c:527 ../src/menu.c:122
msgid "_Quit"
-msgstr "_关闭"
+msgstr "退出(_Q)"
-#: ../src/main.c:465
-msgid "GNOME MPV"
-msgstr "GNOME MPV"
+#: ../src/main.c:677
+#, c-format
+msgid ""
+"Preferences is now stored using GSettings. Your preferences have been "
+"migrated from the configuration file. A backup copy of the configuration "
+"file can be found at \"%s\"."
+msgstr "现在本软件使用 GSettings 存储首选项。您的首选项已从配置文件中迁移到 GSettings 中,配置文件的副本被保存在“%s”。"
+
+#: ../src/menu.c:39
+msgid "None"
+msgstr "无"
+
+#. For simplicity, also dup the default string used when the
+#. * track has no title.
+#: ../src/menu.c:54
+msgid "Unknown"
+msgstr "未知"
+
+#: ../src/menu.c:119
+msgid "_File"
+msgstr "文件(_F)"
+
+#: ../src/menu.c:125 ../src/menu.c:393
+msgid "Open _Location"
+msgstr "打开位置(_L)"
+
+#: ../src/menu.c:128 ../src/menu.c:296
+msgid "_Save Playlist"
+msgstr "保存播放列表(_S)"
+
+#: ../src/menu.c:135
+msgid "_Edit"
+msgstr "编辑(_E)"
+
+#: ../src/menu.c:145
+msgid "_View"
+msgstr "视图(_V)"
+
+#: ../src/menu.c:148 ../src/menu.c:292
+msgid "_Toggle Playlist"
+msgstr "切换播放列表(_T)"
+
+#: ../src/menu.c:151
+msgid "_Fullscreen"
+msgstr "全屏(_F)"
+
+#: ../src/menu.c:154 ../src/menu.c:300
+msgid "_Normal Size"
+msgstr "正常尺寸(_N)"
+
+#: ../src/menu.c:157 ../src/menu.c:304
+msgid "_Double Size"
+msgstr "两倍尺寸(_D)"
+
+#: ../src/menu.c:160 ../src/menu.c:308
+msgid "_Half Size"
+msgstr "一半尺寸(_H)"
+
+#: ../src/menu.c:167
+msgid "_Help"
+msgstr "帮助(_F)"
+
+#: ../src/menu.c:179 ../src/menu.c:316
+msgid "_Video Track"
+msgstr "视频轨道(_V)"
+
+#: ../src/menu.c:196 ../src/menu.c:200 ../src/menu.c:346 ../src/menu.c:351
+msgid "_Load External..."
+msgstr "载入外部配置文件(_L)…"
+
+#: ../src/menu.c:210 ../src/menu.c:335
+msgid "_Audio Track"
+msgstr "音轨(_A)"
-#: ../src/main.c:559
+#: ../src/menu.c:214 ../src/menu.c:339
+msgid "S_ubtitle Track"
+msgstr "字幕轨道(_U)"
+
+#: ../src/mpv.c:304
+msgid "Playing"
+msgstr "正在播放"
+
+#: ../src/mpv.c:596
#, c-format
-msgid "Your configuration file has been moved to the new location at %s."
-msgstr "你的配置文件已经被移到新位置:%s。"
+msgid "Playback was terminated abnormally. Reason: %s."
+msgstr "回放被异常终止。原因:%s。"
-#: ../src/open_loc_dialog.c:68
+#: ../src/mpv.c:1087
+msgid "Failed to apply one or more MPV options."
+msgstr "应用一个或多个 MPV 选项失败。"
+
+#: ../src/open_loc_dialog.c:77
msgid "Location:"
msgstr "位置:"
-#: ../src/open_loc_dialog.c:72 ../src/main_window.c:270 ../src/actionctl.c:75
-#: ../src/actionctl.c:345 ../src/common.c:364
-msgid "_Open"
-msgstr "_打开"
-
-#: ../src/open_loc_dialog.c:74 ../src/pref_dialog.c:155 ../src/actionctl.c:73
-#: ../src/actionctl.c:343
-msgid "_Cancel"
-msgstr "_取消"
-
-#: ../src/open_loc_dialog.c:84
+#: ../src/open_loc_dialog.c:93
msgid "Open Location"
msgstr "打开位置"
-#: ../src/playlist_widget.c:49
+#: ../src/playlist.c:57
+msgid "Save Playlist"
+msgstr "保存播放列表"
+
+#: ../src/playlist.c:62 ../src/pref_dialog.c:269
+msgid "_Save"
+msgstr "保存(_S)"
+
+#: ../src/playlist_widget.c:44
+msgid "_Add…"
+msgstr "添加(_A)…"
+
+#: ../src/playlist_widget.c:45
+msgid "Loop"
+msgstr "循环"
+
+#: ../src/playlist_widget.c:90
msgid "Playlist"
msgstr "播放列表"
-#: ../src/pref_dialog.c:71
+#: ../src/pref_dialog.c:105
msgid "MPV configuration file:"
-msgstr "MPV配置文件:"
+msgstr "MPV 配置文件:"
-#: ../src/pref_dialog.c:72
+#: ../src/pref_dialog.c:106
msgid "MPV input configuration file:"
-msgstr "MPV输入配置文件:"
+msgstr "MPV 输入配置文件:"
-#: ../src/pref_dialog.c:73
+#: ../src/pref_dialog.c:107
msgid "Extra MPV options:"
-msgstr "额外的MPV参数:"
+msgstr "额外的 MPV 选项:"
-#: ../src/pref_dialog.c:74
+#: ../src/pref_dialog.c:108
msgid "<b>General</b>"
msgstr "<b>常规</b>"
-#: ../src/pref_dialog.c:75
+#: ../src/pref_dialog.c:109
msgid "<b>MPV Configuration</b>"
msgstr "<b>MPV 配置</b>"
-#: ../src/pref_dialog.c:76
+#: ../src/pref_dialog.c:110
msgid "<b>Keybindings</b>"
-msgstr "<b>快捷键</b>"
+msgstr "<b>键绑定</b>"
-#: ../src/pref_dialog.c:77
+#: ../src/pref_dialog.c:111
msgid "<b>Miscellaneous</b>"
msgstr "<b>杂项</b>"
-#: ../src/pref_dialog.c:91
+#: ../src/pref_dialog.c:126
msgid "Enable client-side decorations"
msgstr "启用客户端装饰"
-#: ../src/pref_dialog.c:94
+#: ../src/pref_dialog.c:130
msgid "Enable dark theme"
-msgstr "启用黑色主题"
+msgstr "启用暗色主题"
-#: ../src/pref_dialog.c:97
+#: ../src/pref_dialog.c:134
+msgid "Remember last file's location"
+msgstr "记住最后一次打开位置"
+
+#: ../src/pref_dialog.c:138
msgid "MPV configuration file"
-msgstr "MPV配置文件"
+msgstr "MPV 配置文件"
-#: ../src/pref_dialog.c:102
+#: ../src/pref_dialog.c:143
msgid "MPV input configuration file"
-msgstr "MPV输入配置文件"
+msgstr "MPV 输入配置文件"
-#: ../src/pref_dialog.c:107
+#: ../src/pref_dialog.c:148
msgid "Load MPV configuration file"
-msgstr "加载MPV配置文件"
+msgstr "加载 MPV 配置文件"
-#: ../src/pref_dialog.c:111
+#: ../src/pref_dialog.c:152
msgid "Load MPV input configuration file"
-msgstr "加载MPV输入配置文件"
-
-#: ../src/pref_dialog.c:153
-msgid "_Save"
-msgstr "_保存"
+msgstr "加载 MPV 输入配置文件"
-#: ../src/pref_dialog.c:160
+#: ../src/pref_dialog.c:285
msgid "Preferences"
msgstr "首选项"
-
-#: ../src/main_window.c:227 ../src/common.c:394
-msgid "_Toggle Playlist"
-msgstr "_切换播放列表 "
-
-#: ../src/main_window.c:230 ../src/common.c:371
-msgid "_Save Playlist"
-msgstr "_保存播放列表"
-
-#: ../src/main_window.c:233 ../src/common.c:381
-msgid "_Load Subtitle"
-msgstr "加载字幕"
-
-#: ../src/main_window.c:236 ../src/common.c:397
-msgid "_Fullscreen"
-msgstr "_全屏"
-
-#: ../src/main_window.c:239 ../src/common.c:400
-msgid "_Normal Size"
-msgstr "_正常尺寸"
-
-#: ../src/main_window.c:242 ../src/common.c:403
-msgid "_Double Size"
-msgstr "_两倍尺寸"
-
-#: ../src/main_window.c:245 ../src/common.c:406
-msgid "_Half Size"
-msgstr "_一半尺寸"
-
-#: ../src/main_window.c:273 ../src/common.c:368
-msgid "Open _Location"
-msgstr "打开_位置"
-
-#: ../src/actionctl.c:70
-msgid "Open File"
-msgstr "打开文件"
-
-#: ../src/actionctl.c:227
-#, c-format
-msgid "Enabling or disabling client-side decorations requires restarting %s to take effect."
-msgstr "启用或禁用客户端装饰需要重启 %s 生效。"
-
-#: ../src/actionctl.c:340
-msgid "Load Subtitle"
-msgstr "加载字幕"
-
-#: ../src/actionctl.c:414
-msgid "A GTK frontend for MPV"
-msgstr "基于GTK编写的MPV前端程序"
-
-#: ../src/common.c:362
-msgid "_File"
-msgstr "_文件"
-
-#: ../src/common.c:378
-msgid "_Edit"
-msgstr "_编辑"
-
-#: ../src/common.c:391
-msgid "_View"
-msgstr "_查看"
-
-#: ../src/common.c:413
-msgid "_Help"
-msgstr "_帮助"
-
-#: ../src/common.c:452
-msgid "Keybindings that require Property Expansion are not supported and have been ignored."
-msgstr "需要属性扩展的快捷键不被支持,已被忽略。"
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..39228f3
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,365 @@
+# Chinese translations for gnome-mpv package
+# gnome-mpv 套件的正體中文翻譯
+# Copyright (C) 2015 THE GNOME-MPV'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-mpv package.
+# sun <warmsun0220 at gmail.com>, 2015.
+# Mingye Wang <arthur2e5 at aosc.xyz>, 2015.
+# gnome-mpv <gnome-mpv at openmailbox.org>, 2015. #zanata
+# Mingye Wang <arthur2e5 at aosc.xyz>, 2016. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-mpv 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-16 21:24+0800\n"
+"PO-Revision-Date: 2016-01-24 12:32-0500\n"
+"Last-Translator: Mingye Wang <arthur2e5 at aosc.xyz>\n"
+"Language-Team: zh_Hant <chinese-l10n at googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh-TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Zanata 3.8.2\n"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:1
+msgid "Enable or disable dark theme"
+msgstr "啟用或禁用暗色主題"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:2
+msgid "Enable or disable client-side decorations"
+msgstr "啟用或禁用客戶端裝飾"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:3
+msgid ""
+"Whether or not to make file chooser dialog remember last folder accessed"
+msgstr "是否讓檔案選擇對話窗記住最近訪問的資料夾"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:4
+msgid "Whether or not to redirect mpv log messages to console"
+msgstr "是否將 mpv 日誌資訊重定向到控制檯"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:5
+msgid "Options to pass to mpv"
+msgstr "要傳遞給 mpv 的選項"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:6
+msgid "Path to mpv configuration file"
+msgstr "mpv 配置檔的路徑"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:7
+msgid "Load or don't load mpv configuration file"
+msgstr "是否載入 mpv 配置檔"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:8
+msgid "Path to mpv input configuration file"
+msgstr "mpv 輸入配置檔的路徑"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:9
+msgid "Load or don't load mpv input configuration file"
+msgstr "是否載入 mpv 輸入配置檔"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:10
+msgid "Width of the window"
+msgstr "視窗寬度"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:11
+msgid "Height of the window"
+msgstr "視窗高度"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:12
+msgid "Volume of player"
+msgstr "播放器音量"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:13
+msgid "Width of the playlist"
+msgstr "播放列表寬度"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:14
+msgid "Show or not show the playlist"
+msgstr "是否顯示播放列表"
+
+#: ../data/org.gnome-mpv.gschema.xml.in.h:15
+msgid "URI of the last folder accessed"
+msgstr "最近訪問的資料夾 URI"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:1
+msgid ""
+"GNOME MPV is a simple GTK+ frontend for mpv, which is a very powerful media "
+"player capable of playing virtually all video and audio formats. The design "
+"of GNOME MPV is based on GNOME HIG, though it is not dependent on any GNOME "
+"libraries. GNOME MPV also offers an option to disable client-side "
+"decorations (CSD) for better compatibility with non-GNOME systems."
+msgstr ""
+"GNOME MPV 是一個簡單的 GTK+ mpv 前端,mpv 是一個功能強大的媒體播放器,可用於播放幾乎所有的視訊和音訊格式。儘管該程式不依賴於任何"
+" GNOME 庫,GNOME MPV 是一個基於 GNOME HIG(人機介面準則)設計的程式。GNOME MPV "
+"還提供禁用客戶端裝飾(CSD)的選項以為不執行 GNOME 的系統提供更好的相容性。"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:2
+msgid "Features:"
+msgstr "特性:"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:3
+msgid "Drag and drop playlist"
+msgstr "拖放播放列表"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:4
+msgid "Loading external mpv configuration files"
+msgstr "正在載入外部 mpv 配置檔"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:5
+msgid "MPRIS2 D-Bus interface"
+msgstr "MPRIS2 D-Bus 介面"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:6
+msgid "The main window showing the application in action"
+msgstr "顯示執行中套用的主視窗"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:7
+msgid "The main window with CSD disabled"
+msgstr "關閉了 CSD 的主視窗"
+
+#: ../data/gnome-mpv.appdata.xml.in.h:8
+msgid "The main window with playlist open"
+msgstr "打開了播放列表的主視窗"
+
+#: ../data/gnome-mpv.desktop.in.h:1 ../src/main.c:552
+msgid "GNOME MPV"
+msgstr "GNOME MPV"
+
+#: ../data/gnome-mpv.desktop.in.h:2
+msgid "GTK+ frontend for mpv"
+msgstr "MPV 之 GTK 前端程式"
+
+#: ../src/actionctl.c:106
+msgid "Add File to Playlist"
+msgstr "新增檔案到播放列表"
+
+#: ../src/actionctl.c:107
+msgid "Open File"
+msgstr "開啟檔案"
+
+#: ../src/actionctl.c:110 ../src/actionctl.c:409 ../src/open_loc_dialog.c:83
+#: ../src/playlist.c:60 ../src/pref_dialog.c:267
+msgid "_Cancel"
+msgstr "取消(_C)"
+
+#: ../src/actionctl.c:112 ../src/actionctl.c:411 ../src/menu.c:121
+#: ../src/menu.c:390 ../src/open_loc_dialog.c:81
+msgid "_Open"
+msgstr "開啟(_O)"
+
+#: ../src/actionctl.c:251
+#, c-format
+msgid ""
+"Enabling or disabling client-side decorations requires restarting %s to take"
+" effect."
+msgstr "啟用或禁用客戶端裝飾需要重啟 %s 生效。"
+
+#: ../src/actionctl.c:406
+msgid "Load External…"
+msgstr "載入外部配置檔…"
+
+#: ../src/actionctl.c:482
+msgid "A GTK frontend for MPV"
+msgstr "MPV 的 GTK 前端程式"
+
+#: ../src/common.c:236
+msgid "Error"
+msgstr "錯誤"
+
+#: ../src/common.c:401
+msgid ""
+"Keybindings that require Property Expansion are not supported and have been "
+"ignored."
+msgstr "不支援需要屬性擴充的鍵綁定,已被忽略。"
+
+#: ../src/main.c:525 ../src/menu.c:138
+msgid "_Preferences"
+msgstr "偏好設定(_P)"
+
+#: ../src/main.c:526 ../src/menu.c:169
+msgid "_About"
+msgstr "關於(_A)"
+
+#: ../src/main.c:527 ../src/menu.c:122
+msgid "_Quit"
+msgstr "退出(_Q)"
+
+#: ../src/main.c:677
+#, c-format
+msgid ""
+"Preferences is now stored using GSettings. Your preferences have been "
+"migrated from the configuration file. A backup copy of the configuration "
+"file can be found at \"%s\"."
+msgstr "現在本軟體使用 GSettings 儲存偏好設定。您的偏好設定已從配置檔中遷移到 GSettings 中,配置檔的副本被儲存在「%s」。"
+
+#: ../src/menu.c:39
+msgid "None"
+msgstr "無"
+
+#. For simplicity, also dup the default string used when the
+#. * track has no title.
+#: ../src/menu.c:54
+msgid "Unknown"
+msgstr "未知"
+
+#: ../src/menu.c:119
+msgid "_File"
+msgstr "檔案(_F)"
+
+#: ../src/menu.c:125 ../src/menu.c:393
+msgid "Open _Location"
+msgstr "開啟位置(_L)"
+
+#: ../src/menu.c:128 ../src/menu.c:296
+msgid "_Save Playlist"
+msgstr "儲存播放列表(_S)"
+
+#: ../src/menu.c:135
+msgid "_Edit"
+msgstr "編輯(_E)"
+
+#: ../src/menu.c:145
+msgid "_View"
+msgstr "檢視(_V)"
+
+#: ../src/menu.c:148 ../src/menu.c:292
+msgid "_Toggle Playlist"
+msgstr "切換播放列表(_T)"
+
+#: ../src/menu.c:151
+msgid "_Fullscreen"
+msgstr "全屏(_F)"
+
+#: ../src/menu.c:154 ../src/menu.c:300
+msgid "_Normal Size"
+msgstr "正常尺寸(_N)"
+
+#: ../src/menu.c:157 ../src/menu.c:304
+msgid "_Double Size"
+msgstr "兩倍尺寸(_D)"
+
+#: ../src/menu.c:160 ../src/menu.c:308
+msgid "_Half Size"
+msgstr "一半尺寸(_H)"
+
+#: ../src/menu.c:167
+msgid "_Help"
+msgstr "幫助(_F)"
+
+#: ../src/menu.c:179 ../src/menu.c:316
+msgid "_Video Track"
+msgstr "視訊軌道(_V)"
+
+#: ../src/menu.c:196 ../src/menu.c:200 ../src/menu.c:346 ../src/menu.c:351
+msgid "_Load External..."
+msgstr "載入外部(_L)…"
+
+#: ../src/menu.c:210 ../src/menu.c:335
+msgid "_Audio Track"
+msgstr "音軌(_A)"
+
+#: ../src/menu.c:214 ../src/menu.c:339
+msgid "S_ubtitle Track"
+msgstr "字幕軌道(_U)"
+
+#: ../src/mpv.c:304
+msgid "Playing"
+msgstr "正在播放"
+
+#: ../src/mpv.c:596
+#, c-format
+msgid "Playback was terminated abnormally. Reason: %s."
+msgstr "回放被異常終止。原因:%s。"
+
+#: ../src/mpv.c:1087
+msgid "Failed to apply one or more MPV options."
+msgstr "套用一個或多個 MPV 選項失敗。"
+
+#: ../src/open_loc_dialog.c:77
+msgid "Location:"
+msgstr "位置:"
+
+#: ../src/open_loc_dialog.c:93
+msgid "Open Location"
+msgstr "開啟位置"
+
+#: ../src/playlist.c:57
+msgid "Save Playlist"
+msgstr "儲存播放列表"
+
+#: ../src/playlist.c:62 ../src/pref_dialog.c:269
+msgid "_Save"
+msgstr "儲存(_S)"
+
+#: ../src/playlist_widget.c:44
+msgid "_Add…"
+msgstr "新增(_A)…"
+
+#: ../src/playlist_widget.c:45
+msgid "Loop"
+msgstr "迴圈"
+
+#: ../src/playlist_widget.c:90
+msgid "Playlist"
+msgstr "播放列表"
+
+#: ../src/pref_dialog.c:105
+msgid "MPV configuration file:"
+msgstr "MPV 配置檔:"
+
+#: ../src/pref_dialog.c:106
+msgid "MPV input configuration file:"
+msgstr "MPV 輸入配置檔:"
+
+#: ../src/pref_dialog.c:107
+msgid "Extra MPV options:"
+msgstr "額外的 MPV 選項:"
+
+#: ../src/pref_dialog.c:108
+msgid "<b>General</b>"
+msgstr "<b>常規</b>"
+
+#: ../src/pref_dialog.c:109
+msgid "<b>MPV Configuration</b>"
+msgstr "<b>MPV 配置</b>"
+
+#: ../src/pref_dialog.c:110
+msgid "<b>Keybindings</b>"
+msgstr "<b>鍵繫結</b>"
+
+#: ../src/pref_dialog.c:111
+msgid "<b>Miscellaneous</b>"
+msgstr "<b>雜項</b>"
+
+#: ../src/pref_dialog.c:126
+msgid "Enable client-side decorations"
+msgstr "啟用客戶端裝飾"
+
+#: ../src/pref_dialog.c:130
+msgid "Enable dark theme"
+msgstr "啟用暗色主題"
+
+#: ../src/pref_dialog.c:134
+msgid "Remember last file's location"
+msgstr "記住最後一次開啟位置"
+
+#: ../src/pref_dialog.c:138
+msgid "MPV configuration file"
+msgstr "MPV 配置檔"
+
+#: ../src/pref_dialog.c:143
+msgid "MPV input configuration file"
+msgstr "MPV 輸入配置檔"
+
+#: ../src/pref_dialog.c:148
+msgid "Load MPV configuration file"
+msgstr "載入 MPV 配置檔"
+
+#: ../src/pref_dialog.c:152
+msgid "Load MPV input configuration file"
+msgstr "載入 MPV 輸入配置檔"
+
+#: ../src/pref_dialog.c:285
+msgid "Preferences"
+msgstr "偏好設定"
diff --git a/src/Makefile.am b/src/Makefile.am
index 672164b..06400dd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -16,12 +16,21 @@ media_key_files = media_keys/media_keys.c media_keys/media_keys.h
BUILT_SOURCES = $(mpris_generated)
-gnome_mpv_SOURCES = main.c def.h common.c common.h mpv.c mpv.h keybind.c \
- keybind.h actionctl.c actionctl.h playbackctl.c \
- playbackctl.h playlist.c playlist.h main_window.c \
- main_window.h control_box.c control_box.h \
- pref_dialog.c pref_dialog.h open_loc_dialog.c \
- open_loc_dialog.h playlist_widget.c playlist_widget.h \
+gnome_mpv_SOURCES = main.c def.h \
+ actionctl.c actionctl.h \
+ common.c common.h \
+ control_box.c control_box.h \
+ keybind.c keybind.h \
+ main_window.c main_window.h \
+ menu.c menu.h \
+ mpv.c mpv.h \
+ open_loc_dialog.c open_loc_dialog.h \
+ playbackctl.c playbackctl.h \
+ playlist.c playlist.h \
+ playlist_widget.c playlist_widget.h \
+ pref_dialog.c pref_dialog.h \
+ pref_store.c pref_store.h \
+ track.c track.h \
$(mpris_files) $(media_key_files)
gnome_mpv_CFLAGS = $(DEPS_CFLAGS) \
diff --git a/src/actionctl.c b/src/actionctl.c
index e33d64f..a713b23 100644
--- a/src/actionctl.c
+++ b/src/actionctl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 gnome-mpv
+ * Copyright (c) 2015-2016 gnome-mpv
*
* This file is part of GNOME MPV.
*
@@ -27,6 +27,31 @@
#include "pref_dialog.h"
#include "common.h"
+#define G_SETTINGS_KEY_PREF_MAP(VAR, PREF) \
+const struct \
+{ \
+ GType type; \
+ const gchar *key; \
+ gpointer value; \
+} \
+VAR[] = { {G_TYPE_BOOLEAN, "csd-enable", \
+ &pref->csd_enable}, \
+ {G_TYPE_BOOLEAN, "dark-theme-enable", \
+ &pref->dark_theme_enable}, \
+ {G_TYPE_BOOLEAN, "last-folder-enable", \
+ &pref->last_folder_enable}, \
+ {G_TYPE_BOOLEAN, "mpv-config-enable", \
+ &pref->mpv_config_enable}, \
+ {G_TYPE_BOOLEAN, "mpv-input-config-enable", \
+ &pref->mpv_input_config_enable}, \
+ {G_TYPE_STRING, "mpv-config-file", \
+ &pref->mpv_config_file}, \
+ {G_TYPE_STRING, "mpv-input-config-file", \
+ &pref->mpv_input_config_file}, \
+ {G_TYPE_STRING, "mpv-options", \
+ &pref->mpv_options}, \
+ {G_TYPE_INVALID, NULL, NULL} };
+
static void open_handler( GSimpleAction *action,
GVariant *param,
gpointer data );
@@ -39,7 +64,10 @@ static void pref_handler( GSimpleAction *action,
static void quit_handler( GSimpleAction *action,
GVariant *param,
gpointer data );
-static void load_sub_handler( GSimpleAction *action,
+static void track_select_handler( GSimpleAction *action,
+ GVariant *param,
+ gpointer data );
+static void load_track_handler( GSimpleAction *action,
GVariant *param,
gpointer data );
static void fullscreen_handler( GSimpleAction *action,
@@ -57,17 +85,26 @@ static void half_size_handler( GSimpleAction *action,
static void about_handler( GSimpleAction *action,
GVariant *param,
gpointer data );
+static pref_store *get_pref(GSettings *settings);
+static void set_pref(GSettings *settings, pref_store *pref);
static void open_handler( GSimpleAction *action,
GVariant *param,
gpointer data )
{
- gmpv_handle *ctx = (gmpv_handle*)data;
+ gmpv_handle *ctx = data;
+ GSettings *config = NULL;
GtkFileChooser *file_chooser;
GtkWidget *open_dialog;
+ gboolean last_folder_enable;
+ gboolean append;
+
+ g_variant_get(param, "b", &append);
open_dialog
- = gtk_file_chooser_dialog_new( _("Open File"),
+ = gtk_file_chooser_dialog_new( append?
+ _("Add File to Playlist"):
+ _("Open File"),
GTK_WINDOW(ctx->gui),
GTK_FILE_CHOOSER_ACTION_OPEN,
_("_Cancel"),
@@ -78,6 +115,29 @@ static void open_handler( GSimpleAction *action,
file_chooser = GTK_FILE_CHOOSER(open_dialog);
+ last_folder_enable
+ = g_settings_get_boolean( ctx->config,
+ "last-folder-enable" );
+
+ if(last_folder_enable)
+ {
+ gchar *last_folder_uri;
+
+ config = g_settings_new(CONFIG_WIN_STATE);
+
+ last_folder_uri = g_settings_get_string
+ (config, "last-folder-uri");
+
+
+ if(last_folder_uri && strlen(last_folder_uri) > 0)
+ {
+ gtk_file_chooser_set_current_folder_uri
+ (file_chooser, last_folder_uri);
+ }
+
+ g_free(last_folder_uri);
+ }
+
gtk_file_chooser_set_select_multiple(file_chooser, TRUE);
if(gtk_dialog_run(GTK_DIALOG(open_dialog)) == GTK_RESPONSE_ACCEPT)
@@ -89,15 +149,31 @@ static void open_handler( GSimpleAction *action,
while(uri)
{
- mpv_load(ctx, uri->data, (uri != uri_list), TRUE);
+ mpv_load( ctx,
+ uri->data,
+ (append || uri != uri_list),
+ TRUE );
uri = g_slist_next(uri);
}
+ if(last_folder_enable)
+ {
+ gchar *last_folder_uri
+ = gtk_file_chooser_get_current_folder_uri
+ (file_chooser);
+
+ g_settings_set_string
+ (config, "last-folder-uri", last_folder_uri ?: "" );
+
+ g_free(last_folder_uri);
+ }
+
g_slist_free_full(uri_list, g_free);
}
gtk_widget_destroy(open_dialog);
+ g_clear_object(&config);
}
static void open_loc_handler( GSimpleAction *action,
@@ -124,104 +200,47 @@ static void open_loc_handler( GSimpleAction *action,
gtk_widget_destroy(GTK_WIDGET(open_loc_dialog));
}
+static void loop_handler( GSimpleAction *action,
+ GVariant *value,
+ gpointer data )
+{
+ gmpv_handle *ctx = data;
+ gboolean loop = g_variant_get_boolean(value);
+
+ g_simple_action_set_state(action, value);
+
+ mpv_check_error(mpv_set_property_string( ctx->mpv_ctx,
+ "loop",
+ loop?"inf":"no" ));
+}
+
static void pref_handler( GSimpleAction *action,
GVariant *param,
gpointer data )
{
const gchar *quit_cmd[] = {"quit_watch_later", NULL};
gmpv_handle *ctx = data;
+ pref_store *old_pref;
+ pref_store *new_pref;
PrefDialog *pref_dialog;
- gboolean csd_enable_buffer;
- gboolean dark_theme_enable_buffer;
- gboolean mpvconf_enable_buffer;
- gboolean mpvinput_enable_buffer;
- gchar *mpvconf_buffer;
- gchar *mpvinput_buffer;
- gchar *mpvopt_buffer;
-
- csd_enable_buffer
- = g_settings_get_boolean(ctx->config, "csd-enable");
-
- dark_theme_enable_buffer
- = g_settings_get_boolean(ctx->config, "dark-theme-enable");
-
- mpvconf_enable_buffer
- = g_settings_get_boolean(ctx->config, "mpv-config-enable");
-
- mpvinput_enable_buffer
- = g_settings_get_boolean(ctx->config, "mpv-input-config-enable");
-
- mpvconf_buffer
- = g_settings_get_string(ctx->config, "mpv-config-file");
-
- mpvinput_buffer
- = g_settings_get_string(ctx->config, "mpv-input-config-file");
-
- mpvopt_buffer
- = g_settings_get_string(ctx->config, "mpv-options");
+ old_pref = get_pref(ctx->config);
pref_dialog = PREF_DIALOG(pref_dialog_new(GTK_WINDOW(ctx->gui)));
- pref_dialog_set_csd_enable(pref_dialog, csd_enable_buffer);
- pref_dialog_set_dark_theme_enable(pref_dialog, dark_theme_enable_buffer);
- pref_dialog_set_mpvconf_enable(pref_dialog, mpvconf_enable_buffer);
- pref_dialog_set_mpvinput_enable(pref_dialog, mpvinput_enable_buffer);
-
- pref_dialog_set_mpvconf(pref_dialog, mpvconf_buffer);
- pref_dialog_set_mpvinput(pref_dialog, mpvinput_buffer);
- pref_dialog_set_mpvopt(pref_dialog, mpvopt_buffer);
-
- g_free(mpvconf_buffer);
- g_free(mpvinput_buffer);
- g_free(mpvopt_buffer);
+ pref_dialog_set_pref(pref_dialog, old_pref);
if(gtk_dialog_run(GTK_DIALOG(pref_dialog)) == GTK_RESPONSE_ACCEPT)
{
- gboolean csd_enable;
- gboolean dark_theme_enable;
- gboolean mpvconf_enable;
- gboolean mpvinput_enable;
- const gchar* mpvconf;
- const gchar* mpvinput;
- const gchar* mpvopt;
gint64 playlist_pos;
gdouble time_pos;
gint playlist_pos_rc;
gint time_pos_rc;
- dark_theme_enable
- = pref_dialog_get_dark_theme_enable(pref_dialog);
+ new_pref = pref_dialog_get_pref(pref_dialog);
- csd_enable = pref_dialog_get_csd_enable(pref_dialog);
- mpvconf_enable = pref_dialog_get_mpvconf_enable(pref_dialog);
- mpvinput_enable = pref_dialog_get_mpvinput_enable(pref_dialog);
- mpvconf = pref_dialog_get_mpvconf(pref_dialog);
- mpvinput = pref_dialog_get_mpvinput(pref_dialog);
- mpvopt = pref_dialog_get_mpvopt(pref_dialog);
+ set_pref(ctx->config, new_pref);
- g_settings_set_boolean
- (ctx->config, "csd-enable", csd_enable);
-
- g_settings_set_boolean
- (ctx->config, "dark-theme-enable", dark_theme_enable);
-
- g_settings_set_boolean
- (ctx->config, "mpv-config-enable", mpvconf_enable);
-
- g_settings_set_string
- (ctx->config, "mpv-config-file", mpvconf);
-
- g_settings_set_string
- (ctx->config, "mpv-input-config-file", mpvinput);
-
- g_settings_set_string
- (ctx->config, "mpv-options", mpvopt);
-
- g_settings_set_boolean( ctx->config,
- "mpv-input-config-enable",
- mpvinput_enable );
-
- if(csd_enable_buffer != csd_enable)
+ if(old_pref->csd_enable != new_pref->csd_enable)
{
GtkWidget *dialog
= gtk_message_dialog_new
@@ -241,7 +260,7 @@ static void pref_handler( GSimpleAction *action,
g_object_set( ctx->gui->settings,
"gtk-application-prefer-dark-theme",
- dark_theme_enable,
+ new_pref->dark_theme_enable,
NULL );
mpv_check_error(mpv_set_property_string( ctx->mpv_ctx,
@@ -314,11 +333,15 @@ static void pref_handler( GSimpleAction *action,
}
load_keybind( ctx,
- mpvinput_enable?mpvinput:NULL,
- mpvinput_enable );
+ new_pref->mpv_input_config_enable?
+ new_pref->mpv_input_config_file:NULL,
+ new_pref->mpv_input_config_enable );
+
+ pref_store_free(new_pref);
}
gtk_widget_destroy(GTK_WIDGET(pref_dialog));
+ pref_store_free(old_pref);
}
static void quit_handler( GSimpleAction *action,
@@ -328,16 +351,59 @@ static void quit_handler( GSimpleAction *action,
quit(data);
}
-static void load_sub_handler( GSimpleAction *action,
+static void track_select_handler( GSimpleAction *action,
+ GVariant *value,
+ gpointer data )
+{
+ gmpv_handle *ctx = data;
+ gint64 id;
+ gchar *name;
+ const gchar *mpv_prop;
+
+ g_object_get(action, "name", &name, NULL);
+ g_variant_get(value, "x", &id);
+ g_simple_action_set_state(action, value);
+
+ if(g_strcmp0(name, "audio_select") == 0)
+ {
+ mpv_prop = "aid";
+ }
+ else if(g_strcmp0(name, "video_select") == 0)
+ {
+ mpv_prop = "vid";
+ }
+ else if(g_strcmp0(name, "sub_select") == 0)
+ {
+ mpv_prop = "sid";
+ }
+ else
+ {
+ g_assert_not_reached();
+ }
+
+ if(id >= 0)
+ {
+ mpv_set_property(ctx->mpv_ctx, mpv_prop, MPV_FORMAT_INT64, &id);
+ }
+ else
+ {
+ mpv_set_property_string(ctx->mpv_ctx, mpv_prop, "no");
+ }
+}
+
+static void load_track_handler( GSimpleAction *action,
GVariant *param,
gpointer data )
{
gmpv_handle *ctx = (gmpv_handle*)data;
GtkFileChooser *file_chooser;
GtkWidget *open_dialog;
+ const gchar *cmd_name;
+
+ g_variant_get(param, "s", &cmd_name);
open_dialog
- = gtk_file_chooser_dialog_new( _("Load Subtitle"),
+ = gtk_file_chooser_dialog_new( _("Load External…"),
GTK_WINDOW(ctx->gui),
GTK_FILE_CHOOSER_ACTION_OPEN,
_("_Cancel"),
@@ -352,7 +418,7 @@ static void load_sub_handler( GSimpleAction *action,
if(gtk_dialog_run(GTK_DIALOG(open_dialog)) == GTK_RESPONSE_ACCEPT)
{
- const gchar *cmd[] = {"sub_add", NULL, NULL};
+ const gchar *cmd[] = {cmd_name, NULL, NULL};
GSList *uri_list = gtk_file_chooser_get_filenames(file_chooser);
GSList *uri = uri_list;
@@ -368,6 +434,8 @@ static void load_sub_handler( GSimpleAction *action,
g_slist_free_full(uri_list, g_free);
}
+ mpv_load_gui_update(ctx);
+
gtk_widget_destroy(open_dialog);
}
@@ -412,26 +480,120 @@ static void about_handler( GSimpleAction *action,
VERSION,
"comments",
_("A GTK frontend for MPV"),
+ "website",
+ "https://github.com/gnome-mpv/gnome-mpv",
"license-type",
GTK_LICENSE_GPL_3_0,
+ "copyright",
+ "\u00A9 2014-2016 The GNOME MPV authors",
NULL );
}
+static pref_store *get_pref(GSettings *settings)
+{
+ pref_store *pref = pref_store_new();
+
+ G_SETTINGS_KEY_PREF_MAP(map, pref)
+
+ for(gint i = 0; map[i].key; i++)
+ {
+ GVariant *value = g_settings_get_value(settings, map[i].key);
+
+ if(map[i].type == G_TYPE_BOOLEAN)
+ {
+ *((gboolean *)map[i].value)
+ = g_variant_get_boolean(value);
+ }
+ else if(map[i].type == G_TYPE_STRING)
+ {
+ *((gchar **)map[i].value)
+ = g_strdup(g_variant_get_string(value, NULL));
+ }
+ else
+ {
+ g_assert_not_reached();
+ }
+
+ g_variant_unref(value);
+ }
+
+ return pref;
+}
+
+static void set_pref(GSettings *settings, pref_store *pref)
+{
+ G_SETTINGS_KEY_PREF_MAP(map, pref)
+
+ for(gint i = 0; map[i].key; i++)
+ {
+ GVariant *value = NULL;
+
+ if(map[i].type == G_TYPE_BOOLEAN)
+ {
+ value = g_variant_new_boolean
+ (*((gboolean *)map[i].value));
+ }
+ else if(map[i].type == G_TYPE_STRING)
+ {
+ value = g_variant_new_string
+ (*((gchar **)map[i].value));
+ }
+ else
+ {
+ g_assert_not_reached();
+ }
+
+ if(!g_settings_set_value(settings, map[i].key, value))
+ {
+ g_warning("Failed to set GSettings key %s", map[i].key);
+ }
+ }
+}
+
void actionctl_map_actions(gmpv_handle *ctx)
{
const GActionEntry entries[]
- = { {.name = "open", .activate = open_handler},
- {.name = "quit", .activate = quit_handler},
- {.name = "about", .activate = about_handler},
- {.name = "pref", .activate = pref_handler},
- {.name = "openloc", .activate = open_loc_handler},
- {.name = "playlist_toggle", .activate = playlist_toggle_handler},
- {.name = "playlist_save", .activate = playlist_save_handler},
- {.name = "loadsub", .activate = load_sub_handler},
- {.name = "fullscreen", .activate = fullscreen_handler},
- {.name = "normalsize", .activate = normal_size_handler},
- {.name = "doublesize", .activate = double_size_handler},
- {.name = "halfsize", .activate = half_size_handler} };
+ = { {.name = "open",
+ .activate = open_handler,
+ .parameter_type = "b"},
+ {.name = "quit",
+ .activate = quit_handler},
+ {.name = "about",
+ .activate = about_handler},
+ {.name = "pref",
+ .activate = pref_handler},
+ {.name = "openloc",
+ .activate = open_loc_handler},
+ {.name = "loop",
+ .state = "false",
+ .change_state = loop_handler},
+ {.name = "playlist_toggle",
+ .activate = playlist_toggle_handler},
+ {.name = "playlist_save",
+ .activate = playlist_save_handler},
+ {.name = "audio_select",
+ .change_state = track_select_handler,
+ .state = "@x 1",
+ .parameter_type = "x"},
+ {.name = "video_select",
+ .change_state = track_select_handler,
+ .state = "@x 1",
+ .parameter_type = "x"},
+ {.name = "sub_select",
+ .change_state = track_select_handler,
+ .state = "@x 1",
+ .parameter_type = "x"},
+ {.name = "load_track",
+ .activate = load_track_handler,
+ .parameter_type = "s"},
+ {.name = "fullscreen",
+ .activate = fullscreen_handler},
+ {.name = "normalsize",
+ .activate = normal_size_handler},
+ {.name = "doublesize",
+ .activate = double_size_handler},
+ {.name = "halfsize",
+ .activate = half_size_handler} };
g_action_map_add_action_entries( G_ACTION_MAP(ctx->app),
entries,
diff --git a/src/common.c b/src/common.c
index 1b873a8..ecc8b46 100644
--- a/src/common.c
+++ b/src/common.c
@@ -17,6 +17,7 @@
* along with GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <gio/gsettingsbackend.h>
#include <glib/gi18n.h>
#include <string.h>
@@ -30,10 +31,9 @@
gchar *get_config_dir_path(void)
{
- return g_strconcat( g_get_user_config_dir(),
- "/",
- CONFIG_DIR,
- NULL );
+ return g_build_filename( g_get_user_config_dir(),
+ CONFIG_DIR,
+ NULL );
}
gchar *get_config_file_path(void)
@@ -42,7 +42,7 @@ gchar *get_config_file_path(void)
gchar *result;
config_dir = get_config_dir_path();
- result = g_strconcat(config_dir, "/" CONFIG_FILE, NULL);
+ result = g_build_filename(config_dir, "gnome-mpv.conf", NULL);
g_free(config_dir);
@@ -99,29 +99,22 @@ gboolean quit(gpointer data)
return FALSE;
}
+/* This only supports migrating from v0.5's config file */
gboolean migrate_config(gmpv_handle *ctx)
{
- gchar *config_dir = get_config_dir_path();
gchar *config_file = get_config_file_path();
- gboolean result;
- char *old_path;
- GKeyFile *key_config;
- gchar *keybuf;
-
- result = FALSE;
- old_path = g_strconcat(g_get_user_config_dir(), "/", CONFIG_FILE, NULL);
+ gchar *backup_config_file = g_strconcat(config_file, ".bak", NULL);
+ gboolean result = FALSE;
- /* Move config file to the new location if it is at the old location */
- if(g_file_test(old_path, G_FILE_TEST_EXISTS))
+ if(g_file_test(config_file, G_FILE_TEST_EXISTS))
{
- GFile *src = g_file_new_for_path(old_path);
- GFile *dest = g_file_new_for_path(config_file);
-
- g_mkdir_with_parents(config_dir, 0700);
+ /* Backup the old config file */
+ GFile *src = g_file_new_for_path(config_file);
+ GFile *dest = g_file_new_for_path(backup_config_file);
result = g_file_move( src,
dest,
- G_FILE_COPY_NONE,
+ G_FILE_COPY_OVERWRITE,
NULL,
NULL,
NULL,
@@ -131,58 +124,54 @@ gboolean migrate_config(gmpv_handle *ctx)
g_object_unref(dest);
}
- key_config = g_key_file_new();
-
- g_key_file_load_from_file( key_config,
- config_file,
- G_KEY_FILE_NONE,
- NULL );
-
- keybuf = g_key_file_get_string( key_config,
- "main",
- "mpv-options",
- NULL );
-
- /* If config file is in the old format, convert it to the new format */
- if(keybuf && keybuf[0] != '\'' && keybuf[0] != '\"')
+ if(result)
{
- const gchar *opts[] = { "mpv-options",
- "mpv-config-file",
- "mpv-input-config-file",
- NULL };
-
- const gchar **current = opts;
-
- g_free(keybuf);
-
- while(*current)
+ /* Load settings from the backup file */
+ const gchar *key_list[] = { "csd-enable",
+ "dark-theme-enable",
+ "mpv-input-config-enable",
+ "mpv-config-enable",
+ "mpv-input-config-file",
+ "mpv-config-file",
+ "mpv-options",
+ NULL };
+
+ GSettingsBackend *backend;
+ GSettings *keyfile_settings;
+ GSettings *default_settings;
+ const gchar **iter;
+
+ backend = g_keyfile_settings_backend_new
+ ( backup_config_file,
+ "/org/gnome-mpv/gnome-mpv/",
+ "main" );
+
+ keyfile_settings = g_settings_new_with_backend( CONFIG_ROOT,
+ backend );
+
+ default_settings = g_settings_new(CONFIG_ROOT);
+ iter = key_list;
+
+ while(*iter)
{
- keybuf = g_key_file_get_string( key_config,
- "main",
- *current,
- NULL );
+ GVariant *value;
- g_settings_set_string( ctx->config,
- *current,
- keybuf );
+ value = g_settings_get_value(keyfile_settings, *iter);
- g_free(keybuf);
+ g_settings_set_value(default_settings, *iter, value);
- current++;
- }
+ iter++;
- keybuf = NULL;
- }
+ g_variant_unref(value);
+ }
- if(keybuf)
- {
- g_free(keybuf);
+ g_object_unref(backend);
+ g_object_unref(keyfile_settings);
+ g_object_unref(default_settings);
}
- g_key_file_free(key_config);
- g_free(config_dir);
g_free(config_file);
- g_free(old_path);
+ g_free(backup_config_file);
return result;
}
@@ -244,7 +233,7 @@ void show_error_dialog(gmpv_handle *ctx, const gchar *prefix, const gchar *msg)
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
- "Error" );
+ _("Error") );
msg_area = gtk_message_dialog_get_message_area
(GTK_MESSAGE_DIALOG(dialog));
@@ -322,7 +311,11 @@ void remove_current_playlist_entry(gmpv_handle *ctx)
ctx );
playlist_widget_remove(playlist, index);
- mpv_check_error(mpv_command(ctx->mpv_ctx, cmd));
+
+ if(ctx->loaded)
+ {
+ mpv_check_error(mpv_command(ctx->mpv_ctx, cmd));
+ }
if(playlist_widget_empty(playlist))
{
@@ -394,115 +387,6 @@ void toggle_fullscreen(gmpv_handle *ctx)
&ctx->gui->fullscreen );
}
-GMenu *build_full_menu()
-{
- GMenu *menu;
- GMenu *file_menu;
- GMenu *edit_menu;
- GMenu *view_menu;
- GMenu *help_menu;
- GMenuItem *file_menu_item;
- GMenuItem *open_menu_item;
- GMenuItem *quit_menu_item;
- GMenuItem *open_loc_menu_item;
- GMenuItem *save_playlist_menu_item;
- GMenuItem *edit_menu_item;
- GMenuItem *load_sub_menu_item;
- GMenuItem *pref_menu_item;
- GMenuItem *view_menu_item;
- GMenuItem *playlist_menu_item;
- GMenuItem *fullscreen_menu_item;
- GMenuItem *normal_size_menu_item;
- GMenuItem *double_size_menu_item;
- GMenuItem *half_size_menu_item;
- GMenuItem *help_menu_item;
- GMenuItem *about_menu_item;
-
- menu = g_menu_new();
-
- /* File */
- file_menu = g_menu_new();
-
- file_menu_item
- = g_menu_item_new_submenu
- (_("_File"), G_MENU_MODEL(file_menu));
-
- open_menu_item = g_menu_item_new(_("_Open"), "app.open");
- quit_menu_item = g_menu_item_new(_("_Quit"), "app.quit");
-
- open_loc_menu_item
- = g_menu_item_new(_("Open _Location"), "app.openloc");
-
- save_playlist_menu_item
- = g_menu_item_new(_("_Save Playlist"), "app.playlist_save");
-
- /* Edit */
- edit_menu = g_menu_new();
-
- edit_menu_item
- = g_menu_item_new_submenu
- (_("_Edit"), G_MENU_MODEL(edit_menu));
-
- load_sub_menu_item
- = g_menu_item_new(_("_Load Subtitle"), "app.loadsub");
-
- pref_menu_item
- = g_menu_item_new(_("_Preferences"), "app.pref");
-
- /* View */
- view_menu = g_menu_new();
-
- view_menu_item
- = g_menu_item_new_submenu
- (_("_View"), G_MENU_MODEL(view_menu));
-
- playlist_menu_item
- = g_menu_item_new(_("_Toggle Playlist"), "app.playlist_toggle");
-
- fullscreen_menu_item
- = g_menu_item_new(_("_Fullscreen"), "app.fullscreen");
-
- normal_size_menu_item
- = g_menu_item_new(_("_Normal Size"), "app.normalsize");
-
- double_size_menu_item
- = g_menu_item_new(_("_Double Size"), "app.doublesize");
-
- half_size_menu_item
- = g_menu_item_new(_("_Half Size"), "app.halfsize");
-
- /* Help */
- help_menu = g_menu_new();
-
- help_menu_item
- = g_menu_item_new_submenu
- (_("_Help"), G_MENU_MODEL(help_menu));
-
- about_menu_item = g_menu_item_new(_("_About"), "app.about");
-
- g_menu_append_item(menu, file_menu_item);
- g_menu_append_item(file_menu, open_menu_item);
- g_menu_append_item(file_menu, open_loc_menu_item);
- g_menu_append_item(file_menu, save_playlist_menu_item);
- g_menu_append_item(file_menu, quit_menu_item);
-
- g_menu_append_item(menu, edit_menu_item);
- g_menu_append_item(edit_menu, load_sub_menu_item);
- g_menu_append_item(edit_menu, pref_menu_item);
-
- g_menu_append_item(menu, view_menu_item);
- g_menu_append_item(view_menu, playlist_menu_item);
- g_menu_append_item(view_menu, fullscreen_menu_item);
- g_menu_append_item(view_menu, normal_size_menu_item);
- g_menu_append_item(view_menu, double_size_menu_item);
- g_menu_append_item(view_menu, half_size_menu_item);
-
- g_menu_append_item(menu, help_menu_item);
- g_menu_append_item(help_menu, about_menu_item);
-
- return menu;
-}
-
void load_keybind( gmpv_handle *ctx,
const gchar *config_path,
gboolean notify_propexp )
diff --git a/src/common.h b/src/common.h
index 52a0448..97fffda 100644
--- a/src/common.h
+++ b/src/common.h
@@ -46,6 +46,7 @@ struct gmpv_handle
gboolean sub_visible;
gboolean init_load;
gint64 vid_area_wid;
+ guint inhibit_cookie;
gint playlist_move_dest;
GSList *log_level_list;
GSList *keybind_list;
@@ -68,7 +69,6 @@ void show_error_dialog(gmpv_handle *ctx, const gchar *prefix, const gchar *msg);
void remove_current_playlist_entry(gmpv_handle *ctx);
void resize_window_to_fit(gmpv_handle *ctx, gdouble multiplier);
void toggle_fullscreen(gmpv_handle *ctx);
-GMenu *build_full_menu(void);
void load_keybind( gmpv_handle *ctx,
const gchar *config_path,
gboolean notify_ignore );
diff --git a/src/control_box.c b/src/control_box.c
index a5ccef8..da8f8e2 100644
--- a/src/control_box.c
+++ b/src/control_box.c
@@ -121,6 +121,7 @@ static void control_box_init(ControlBox *box)
GTK_STYLE_CLASS_BACKGROUND );
gtk_range_set_increments(GTK_RANGE(box->seek_bar), 10, 10);
+ gtk_widget_set_sensitive(box->volume_button, FALSE);
g_object_set(box->play_button, "relief", GTK_RELIEF_NONE, NULL);
g_object_set(box->stop_button, "relief", GTK_RELIEF_NONE, NULL);
@@ -238,6 +239,11 @@ void control_box_set_volume(ControlBox *box, gdouble volume)
(GTK_SCALE_BUTTON(box->volume_button), volume);
}
+gdouble control_box_get_volume(ControlBox *box)
+{
+ return gtk_scale_button_get_value(GTK_SCALE_BUTTON(box->volume_button));
+}
+
void control_box_set_playing_state(ControlBox *box, gboolean playing)
{
GtkWidget *play_icon;
@@ -274,5 +280,6 @@ void control_box_reset_control(ControlBox *box)
{
control_box_set_seek_bar_length(box, 0);
control_box_set_playing_state(box, FALSE);
+ control_box_set_chapter_enabled(box, FALSE);
control_box_set_fullscreen_state(box, FALSE);
}
diff --git a/src/control_box.h b/src/control_box.h
index bc7e0b5..6abbdea 100644
--- a/src/control_box.h
+++ b/src/control_box.h
@@ -68,6 +68,7 @@ void control_box_set_enabled(ControlBox *box, gboolean enabled);
void control_box_set_chapter_enabled(ControlBox *box, gboolean enabled);
void control_box_set_seek_bar_length(ControlBox *box, gint length);
void control_box_set_volume(ControlBox *box, gdouble volume);
+gdouble control_box_get_volume(ControlBox *box);
void control_box_set_playing_state(ControlBox *box, gboolean playing);
void control_box_set_fullscreen_state(ControlBox *box, gboolean fullscreen);
void control_box_set_fullscreen_btn_visible(ControlBox *box, gboolean value);
diff --git a/src/def.h b/src/def.h
index fc67dbf..907c0f0 100644
--- a/src/def.h
+++ b/src/def.h
@@ -23,11 +23,8 @@
#define APP_ID "org.gnome-mpv"
#define ICON_NAME "gnome-mpv"
#define CONFIG_DIR "gnome-mpv"
-#define CONFIG_FILE "gnome-mpv.conf"
#define CONFIG_ROOT APP_ID
#define CONFIG_WIN_STATE APP_ID".window-state"
-#define CONFIG_ROOT_PATH "/org/gnome-mpv/gnome-mpv/"
-#define CONFIG_ROOT_GROUP "main"
#define DEFAULT_LOG_LEVEL MPV_LOG_LEVEL_ERROR
#define MPRIS_TRACK_ID_PREFIX "/org/gnome_mpv/Track/"
#define MPRIS_BUS_NAME "org.mpris.MediaPlayer2.gnome-mpv"
@@ -52,10 +49,10 @@
"< playlist_prev",\
"> playlist_next",\
"U stop",\
- "RIGHT seek 10",\
- "LEFT seek -10",\
- "UP seek 60",\
- "DOWN seek -60",\
+ "RIGHT no-osd seek 10",\
+ "LEFT no-osd seek -10",\
+ "UP no-osd seek 60",\
+ "DOWN no-osd seek -60",\
"Q quit_watch_later",\
"MOUSE_BTN0_DBL cycle fullscreen",\
"MOUSE_BTN2 cycle pause",\
diff --git a/src/keybind.c b/src/keybind.c
index 0a4301d..546fbda 100644
--- a/src/keybind.c
+++ b/src/keybind.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 gnome-mpv
+ * Copyright (c) 2015-2016 gnome-mpv
*
* This file is part of GNOME MPV.
*
@@ -19,7 +19,6 @@
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include "keybind.h"
#include "def.h"
@@ -59,8 +58,11 @@ keybind *keybind_parse_config_line(const gchar *line, gboolean *propexp)
*/
if(!g_regex_match_simple("\\$[^\\$]", linebuf, 0, 0))
{
- GRegex *regex = g_regex_new("\\$\\$", 0, 0, NULL);
- gchar *old_linebuf = linebuf;
+ gchar *old_linebuf;
+ GRegex *regex;
+
+ old_linebuf = linebuf;
+ regex = g_regex_new("\\$\\$", 0, 0, NULL);
linebuf = g_regex_replace_literal
(regex, old_linebuf, -1, 0, "$", 0, NULL);
@@ -68,7 +70,15 @@ keybind *keybind_parse_config_line(const gchar *line, gboolean *propexp)
g_free(old_linebuf);
g_regex_unref(regex);
- tokens = g_strsplit_set(linebuf, " \t", -1);
+ regex = g_regex_new("\\s+", 0, 0, NULL);
+
+ tokens = g_regex_split_full( regex,
+ linebuf,
+ -1, 0, 0, 2,
+ NULL );
+
+ g_regex_unref(regex);
+
keys = tokens?g_strsplit(tokens[0], "+", -1):NULL;
if(keys)
@@ -176,7 +186,7 @@ keybind *keybind_parse_config_line(const gchar *line, gboolean *propexp)
if(result)
{
- result->command = g_strdupv(tokens+1);
+ result->command = g_strdup(tokens[1]);
g_strfreev(tokens);
g_strfreev(keys);
@@ -265,10 +275,13 @@ GSList *keybind_parse_config(const gchar *config_path, gboolean* propexp)
g_object_unref(config_file);
}
- return result;
+ /* Reverse the list so that bindings defined later in the file will have
+ * priority over the ones defined earlier.
+ */
+ return g_slist_reverse(result);
}
-gchar **keybind_get_command( gmpv_handle *ctx,
+gchar *keybind_get_command( gmpv_handle *ctx,
gboolean mouse,
guint modifier,
guint keyval )
diff --git a/src/keybind.h b/src/keybind.h
index d523b70..13d0aa1 100644
--- a/src/keybind.h
+++ b/src/keybind.h
@@ -20,8 +20,6 @@
#ifndef KEYBIND_H
#define KEYBIND_H
-#include <gdk/gdk.h>
-
#include "common.h"
struct keybind
@@ -29,14 +27,14 @@ struct keybind
gboolean mouse;
guint modifier;
guint keyval;
- gchar **command;
+ gchar *command;
};
typedef struct keybind keybind;
keybind *keybind_parse_config_line(const gchar *line, gboolean *propexp);
GSList *keybind_parse_config(const gchar *config_path, gboolean *propexp);
-gchar **keybind_get_command( gmpv_handle *ctx,
+gchar *keybind_get_command( gmpv_handle *ctx,
gboolean mouse,
guint modifier,
guint keyval );
diff --git a/src/main.c b/src/main.c
index 63fd2ef..53471ac 100644
--- a/src/main.c
+++ b/src/main.c
@@ -17,13 +17,13 @@
* along with GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <gio/gsettingsbackend.h>
#include <gio/gio.h>
#include <glib/gi18n.h>
#include <gdk/gdk.h>
-#include <epoxy/gl.h>
#include <locale.h>
+#ifdef OPENGL_CB_ENABLED
+#include <epoxy/gl.h>
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
#include <epoxy/glx.h>
@@ -36,9 +36,17 @@
#include <gdk/gdkwin32.h>
#include <epoxy/wgl.h>
#endif
+#else
+#ifdef GDK_WINDOWING_X11
+#include <gdk/gdkx.h>
+#else
+#error "X11 GDK backend is required when opengl-cb is disabled."
+#endif
+#endif
#include "def.h"
#include "common.h"
+#include "menu.h"
#include "mpv.h"
#include "keybind.h"
#include "playlist.h"
@@ -47,8 +55,6 @@
#include "main_window.h"
#include "control_box.h"
#include "playlist_widget.h"
-#include "pref_dialog.h"
-#include "open_loc_dialog.h"
#include "mpris/mpris.h"
#include "media_keys/media_keys.h"
@@ -85,12 +91,64 @@ static gboolean key_press_handler( GtkWidget *widget,
static gboolean mouse_press_handler( GtkWidget *widget,
GdkEvent *event,
gpointer data );
+static gboolean get_use_opengl(void);
+static gint64 get_xid(GtkWidget *widget);
+
+#ifdef OPENGL_CB_ENABLED
+static void *get_proc_address(void *fn_ctx, const gchar *name);
static gboolean vid_area_render_handler( GtkGLArea *area,
GdkGLContext *context,
gpointer data );
-static void *get_proc_address(void *fn_ctx, const gchar *name);
-static gboolean get_use_opengl(void);
-static gint64 get_xid(GtkWidget *widget);
+
+static void *get_proc_address(void *fn_ctx, const gchar *name)
+{
+ GdkDisplay *display = gdk_display_get_default();
+
+#ifdef GDK_WINDOWING_WAYLAND
+ if (GDK_IS_WAYLAND_DISPLAY(display))
+ return eglGetProcAddress(name);
+#endif
+#ifdef GDK_WINDOWING_X11
+ if (GDK_IS_X11_DISPLAY(display))
+ return (void *)(intptr_t)glXGetProcAddressARB((const GLubyte *)name);
+#endif
+#ifdef GDK_WINDOWING_WIN32
+ if (GDK_IS_WIN32_DISPLAY(display))
+ return wglGetProcAddress(name);
+#endif
+
+ g_assert_not_reached();
+}
+
+static gboolean vid_area_render_handler( GtkGLArea *area,
+ GdkGLContext *context,
+ gpointer data )
+{
+ gmpv_handle *ctx = data;
+ int width;
+ int height;
+ int fbo;
+
+ if(!ctx->opengl_ready)
+ {
+ mpv_check_error(mpv_opengl_cb_init_gl( ctx->opengl_ctx,
+ NULL,
+ get_proc_address,
+ NULL ));
+
+ ctx->opengl_ready = TRUE;
+ }
+
+ width = gtk_widget_get_allocated_width(GTK_WIDGET(area));
+ height = (-1)*gtk_widget_get_allocated_height(GTK_WIDGET(area));
+ fbo = -1;
+
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo);
+ mpv_opengl_cb_draw(ctx->opengl_ctx, fbo, width, height);
+
+ return TRUE;
+}
+#endif
static gboolean draw_handler(GtkWidget *widget, cairo_t *cr, gpointer data)
{
@@ -217,7 +275,7 @@ static gboolean key_press_handler( GtkWidget *widget,
gmpv_handle *ctx = data;
guint keyval = ((GdkEventKey*)event)->keyval;
guint state = ((GdkEventKey*)event)->state;
- gchar **command;
+ gchar *command;
const guint mod_mask = GDK_MODIFIER_MASK
&~(GDK_SHIFT_MASK
@@ -234,7 +292,7 @@ static gboolean key_press_handler( GtkWidget *widget,
/* Try user-specified keys first, then fallback to hard-coded keys */
if(command)
{
- mpv_command(ctx->mpv_ctx, (const char **)command);
+ mpv_command_string(ctx->mpv_ctx, command);
}
else if((state&mod_mask) == 0)
{
@@ -268,7 +326,7 @@ static gboolean mouse_press_handler( GtkWidget *widget,
{
gmpv_handle *ctx = data;
GdkEventButton *btn_event = (GdkEventButton *)event;
- gchar **command;
+ gchar *command;
command = keybind_get_command( ctx,
TRUE,
@@ -277,7 +335,7 @@ static gboolean mouse_press_handler( GtkWidget *widget,
if(command)
{
- mpv_command(ctx->mpv_ctx, (const char **)command);
+ mpv_command_string(ctx->mpv_ctx, command);
}
return TRUE;
@@ -288,34 +346,16 @@ static void app_activate_handler(GApplication *app, gpointer data)
gtk_window_present(GTK_WINDOW(((gmpv_handle *)data)->gui));
}
-static void *get_proc_address(void *fn_ctx, const gchar *name)
-{
- GdkDisplay *display = gdk_display_get_default();
-
-#ifdef GDK_WINDOWING_WAYLAND
- if (GDK_IS_WAYLAND_DISPLAY(display))
- return eglGetProcAddress(name);
-#endif
-#ifdef GDK_WINDOWING_X11
- if (GDK_IS_X11_DISPLAY(display))
- return (void *)(intptr_t)glXGetProcAddressARB((const GLubyte *)name);
-#endif
-#ifdef GDK_WINDOWING_WIN32
- if (GDK_IS_WIN32_DISPLAY(display))
- return wglGetProcAddress(name);
-#endif
-
- g_assert_not_reached();
-}
-
static gboolean get_use_opengl(void)
{
-#ifdef GDK_WINDOWING_X11
+#if defined(OPENGL_CB_ENABLED) && defined(GDK_WINDOWING_X11)
/* TODO: Add option to use opengl on X11 */
- return !GDK_IS_X11_DISPLAY(gdk_display_get_default());
-#else
+ return !GDK_IS_X11_DISPLAY(gdk_display_get_default()) ;
+#elif defined(OPENGL_CB_ENABLED)
/* In theory this can work on any backend supporting GtkGLArea */
return TRUE;
+#else
+ return FALSE;
#endif
}
@@ -328,35 +368,6 @@ static gint64 get_xid(GtkWidget *widget)
#endif
}
-static gboolean vid_area_render_handler( GtkGLArea *area,
- GdkGLContext *context,
- gpointer data )
-{
- gmpv_handle *ctx = data;
- int width;
- int height;
- int fbo;
-
- if(!ctx->opengl_ready)
- {
- mpv_check_error(mpv_opengl_cb_init_gl( ctx->opengl_ctx,
- NULL,
- get_proc_address,
- NULL ));
-
- ctx->opengl_ready = TRUE;
- }
-
- width = gtk_widget_get_allocated_width(GTK_WIDGET(area));
- height = (-1)*gtk_widget_get_allocated_height(GTK_WIDGET(area));
- fbo = -1;
-
- glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo);
- mpv_opengl_cb_draw(ctx->opengl_ctx, fbo, width, height);
-
- return TRUE;
-}
-
static void app_open_handler( GApplication *app,
gpointer files,
gint n_files,
@@ -420,6 +431,7 @@ static void connect_signals(gmpv_handle *ctx)
playbackctl_connect_signals(ctx);
+#ifdef OPENGL_CB_ENABLED
if(main_window_get_use_opengl(ctx->gui))
{
g_signal_connect( ctx->gui->vid_area,
@@ -427,6 +439,7 @@ static void connect_signals(gmpv_handle *ctx)
G_CALLBACK(vid_area_render_handler),
ctx );
}
+#endif
g_signal_connect( ctx->gui->vid_area,
"drag-data-received",
@@ -485,7 +498,7 @@ static inline void add_accelerator( GtkApplication *app,
static void setup_accelerators(gmpv_handle *ctx)
{
- add_accelerator(ctx->app, "<Control>o", "app.open");
+ add_accelerator(ctx->app, "<Control>o", "app.open(false)");
add_accelerator(ctx->app, "<Control>l", "app.openloc");
add_accelerator(ctx->app, "<Control>S", "app.playlist_save");
add_accelerator(ctx->app, "<Control>q", "app.quit");
@@ -526,7 +539,6 @@ static void app_startup_handler(GApplication *app, gpointer data)
{
gmpv_handle *ctx = data;
const gchar *vid_area_style = ".gmpv-vid-area{background-color: black}";
- GSettingsBackend *config_backend;
GtkCssProvider *style_provider;
gboolean css_loaded;
gboolean use_opengl;
@@ -534,7 +546,6 @@ static void app_startup_handler(GApplication *app, gpointer data)
gboolean mpvinput_enable;
gboolean csd_enable;
gboolean dark_theme_enable;
- gchar *config_file;
gchar *mpvinput;
setlocale(LC_NUMERIC, "C");
@@ -545,13 +556,6 @@ static void app_startup_handler(GApplication *app, gpointer data)
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);
- config_file = get_config_file_path();
-
- config_backend = g_keyfile_settings_backend_new
- ( config_file,
- CONFIG_ROOT_PATH,
- CONFIG_ROOT_GROUP );
-
use_opengl = get_use_opengl();
ctx->mpv_ctx = mpv_create();
@@ -563,10 +567,11 @@ static void app_startup_handler(GApplication *app, gpointer data)
ctx->new_file = TRUE;
ctx->sub_visible = TRUE;
ctx->init_load = TRUE;
+ ctx->inhibit_cookie = 0;
ctx->playlist_move_dest = -1;
ctx->log_level_list = NULL;
ctx->keybind_list = NULL;
- ctx->config = g_settings_new_with_backend(APP_ID, config_backend);
+ ctx->config = g_settings_new(CONFIG_ROOT);
ctx->app = GTK_APPLICATION(app);
ctx->gui = MAIN_WINDOW(main_window_new(ctx->app, use_opengl));
ctx->fs_control = NULL;
@@ -611,11 +616,11 @@ static void app_startup_handler(GApplication *app, gpointer data)
}
else
{
- gtk_application_set_app_menu
- (ctx->app, NULL);
+ GMenu *full_menu = g_menu_new();
- gtk_application_set_menubar
- (ctx->app, G_MENU_MODEL(build_full_menu()));
+ menu_build_full(full_menu, NULL, NULL, NULL);
+ gtk_application_set_app_menu (ctx->app, NULL);
+ gtk_application_set_menubar(ctx->app, G_MENU_MODEL(full_menu));
}
gtk_widget_show_all(GTK_WIDGET(ctx->gui));
@@ -657,21 +662,31 @@ static void app_startup_handler(GApplication *app, gpointer data)
if(config_migrated)
{
- GtkWidget *dialog
- = gtk_message_dialog_new
+ gchar *config_file;
+ gchar *backup_config_file;
+ GtkWidget *dialog;
+
+ config_file = get_config_file_path();
+ backup_config_file = g_strconcat(config_file, ".bak", NULL);
+
+ dialog = gtk_message_dialog_new
( GTK_WINDOW(ctx->gui),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
- _("Your configuration file has been "
- "moved to the new location at %s."),
- config_file );
+ _("Preferences is now stored using "
+ "GSettings. Your preferences have been "
+ "migrated from the configuration file. "
+ "A backup copy of the configuration "
+ "file can be found at \"%s\"."),
+ backup_config_file );
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
+ g_free(config_file);
+ g_free(backup_config_file);
}
- g_free(config_file);
g_free(mpvinput);
}
@@ -681,6 +696,10 @@ int main(int argc, char **argv)
gmpv_handle *ctx;
gint status;
+#ifndef OPENGL_CB_ENABLED
+ gdk_set_allowed_backends("x11");
+#endif
+
app = gtk_application_new(APP_ID, G_APPLICATION_HANDLES_OPEN);
ctx = g_malloc(sizeof(gmpv_handle));
diff --git a/src/main_window.c b/src/main_window.c
index afa0d30..54658df 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -17,11 +17,8 @@
* along with GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <gio/gsettingsbackend.h>
-#include <glib/gi18n.h>
-
#include "def.h"
-#include "common.h"
+#include "menu.h"
#include "playlist_widget.h"
#include "main_window.h"
#include "control_box.h"
@@ -39,10 +36,9 @@ struct _MainWindowPrivate
};
static void vid_area_init(MainWindow *wnd, gboolean use_opengl);
+static GtkWidget *vid_area_new(gboolean use_opengl);
static gboolean timeout_handler(gpointer data);
static gboolean finalize_load_state(gpointer data);
-static GMenu *menu_btn_build_menu(void);
-static GMenu *open_btn_build_menu(void);
G_DEFINE_TYPE_WITH_PRIVATE(MainWindow, main_window, GTK_TYPE_APPLICATION_WINDOW)
@@ -106,8 +102,8 @@ static gboolean motion_notify_handler(GtkWidget *widget, GdkEventMotion *event)
MainWindow *wnd = MAIN_WINDOW(widget);
GdkCursor *cursor;
- cursor = gdk_cursor_new_for_display( gdk_display_get_default(),
- GDK_ARROW );
+ cursor = gdk_cursor_new_from_name( gdk_display_get_default(),
+ "default" );
gdk_window_set_cursor
(gtk_widget_get_window(GTK_WIDGET(wnd->vid_area)), cursor);
@@ -162,15 +158,18 @@ static void vid_area_init(MainWindow *wnd, gboolean use_opengl)
{
GtkStyleContext *style_context;
- wnd->vid_area = use_opengl?
- gtk_gl_area_new():
- gtk_drawing_area_new();
-
+ wnd->vid_area = vid_area_new(use_opengl);
style_context = gtk_widget_get_style_context(wnd->vid_area);
- gtk_widget_add_events(wnd->vid_area, GDK_BUTTON_PRESS_MASK);
gtk_style_context_add_class(style_context, "gmpv-vid-area");
+ /* GDK_BUTTON_RELEASE_MASK is needed so that GtkMenuButtons can
+ * hide their menus when vid_area is clicked.
+ */
+ gtk_widget_add_events( wnd->vid_area,
+ GDK_BUTTON_PRESS_MASK|
+ GDK_BUTTON_RELEASE_MASK );
+
gtk_container_add( GTK_CONTAINER(wnd->vid_area_overlay),
wnd->vid_area );
@@ -181,6 +180,15 @@ static void vid_area_init(MainWindow *wnd, gboolean use_opengl)
}
}
+static GtkWidget *vid_area_new(gboolean use_opengl)
+{
+#ifdef OPENGL_CB_ENABLED
+ return use_opengl?gtk_gl_area_new():gtk_drawing_area_new();
+#else
+ return gtk_drawing_area_new();
+#endif
+}
+
static gboolean timeout_handler(gpointer data)
{
MainWindow *wnd;
@@ -233,150 +241,53 @@ static gboolean finalize_load_state(gpointer data)
return FALSE;
}
-static GMenu *menu_btn_build_menu()
-{
- GMenu *menu;
- GMenu *playlist_submenu;
- GMenu *sub_submenu;
- GMenu *view_submenu;
- GMenuItem *playlist_section;
- GMenuItem *sub_section;
- GMenuItem *view_section;
- GMenuItem *load_sub_menu_item;
- GMenuItem *playlist_toggle_menu_item;
- GMenuItem *playlist_save_menu_item;
- GMenuItem *normal_size_menu_item;
- GMenuItem *double_size_menu_item;
- GMenuItem *half_size_menu_item;
-
- menu = g_menu_new();
- playlist_submenu = g_menu_new();
- sub_submenu = g_menu_new();
- view_submenu = g_menu_new();
-
- playlist_section
- = g_menu_item_new_section(NULL, G_MENU_MODEL(playlist_submenu));
-
- sub_section
- = g_menu_item_new_section(NULL, G_MENU_MODEL(sub_submenu));
-
- view_section
- = g_menu_item_new_section(NULL, G_MENU_MODEL(view_submenu));
-
- playlist_toggle_menu_item
- = g_menu_item_new(_("_Toggle Playlist"), "app.playlist_toggle");
-
- playlist_save_menu_item
- = g_menu_item_new(_("_Save Playlist"), "app.playlist_save");
-
- load_sub_menu_item
- = g_menu_item_new(_("_Load Subtitle"), "app.loadsub");
-
- normal_size_menu_item
- = g_menu_item_new(_("_Normal Size"), "app.normalsize");
-
- double_size_menu_item
- = g_menu_item_new(_("_Double Size"), "app.doublesize");
-
- half_size_menu_item
- = g_menu_item_new(_("_Half Size"), "app.halfsize");
-
- g_menu_append_item(playlist_submenu, playlist_toggle_menu_item);
- g_menu_append_item(playlist_submenu, playlist_save_menu_item);
- g_menu_append_item(sub_submenu, load_sub_menu_item);
- g_menu_append_item(view_submenu, normal_size_menu_item);
- g_menu_append_item(view_submenu, double_size_menu_item);
- g_menu_append_item(view_submenu, half_size_menu_item);
-
- g_menu_append_item(menu, playlist_section);
- g_menu_append_item(menu, sub_section);
- g_menu_append_item(menu, view_section);
-
- return menu;
-}
-
-static GMenu *open_btn_build_menu()
-{
- GMenu *menu;
- GMenuItem *open_menu_item;
- GMenuItem *open_loc_menu_item;
-
- menu = g_menu_new();
-
- open_menu_item = g_menu_item_new(_("_Open"), "app.open");
-
- open_loc_menu_item
- = g_menu_item_new(_("Open _Location"), "app.openloc");
-
- g_menu_append_item(menu, open_menu_item);
- g_menu_append_item(menu, open_loc_menu_item);
-
- return menu;
-}
-
void main_window_save_state(MainWindow *wnd)
{
- GSettingsBackend *config_backend;
- GSettings *config;
- gchar *config_file;
+ GSettings *settings;
gint width;
gint height;
gint handle_pos;
+ gdouble volume;
- config_file = get_config_file_path();
-
- config_backend = g_keyfile_settings_backend_new
- ( config_file,
- CONFIG_ROOT_PATH,
- CONFIG_ROOT_GROUP );
-
- config = g_settings_new_with_backend(CONFIG_WIN_STATE, config_backend);
+ settings = g_settings_new(CONFIG_WIN_STATE);
handle_pos = gtk_paned_get_position(GTK_PANED(wnd->vid_area_paned));
+ volume = control_box_get_volume(CONTROL_BOX(wnd->control_box));
gtk_window_get_size(GTK_WINDOW(wnd), &width, &height);
- g_settings_set_int(config, "width", width);
- g_settings_set_int(config, "height", height);
+ g_settings_set_int(settings, "width", width);
+ g_settings_set_int(settings, "height", height);
+ g_settings_set_double(settings, "volume", volume);
+
+ g_settings_set_boolean( settings,
+ "show-playlist",
+ wnd->playlist_visible );
if(main_window_get_playlist_visible(wnd))
{
- g_settings_set_int( config,
+ g_settings_set_int( settings,
"playlist-width",
width-handle_pos );
}
else
{
- g_settings_set_int( config,
+ g_settings_set_int( settings,
"playlist-width",
wnd->playlist_width );
}
- g_settings_set_boolean( config,
- "show-playlist",
- wnd->playlist_visible );
-
- g_free(config_file);
+ g_clear_object(&settings);
}
void main_window_load_state(MainWindow *wnd)
{
- GSettingsBackend *config_backend;
- GSettings *config;
- gchar *config_file;
-
- config_file = get_config_file_path();
+ GSettings *settings = g_settings_new(CONFIG_WIN_STATE);
- config_backend = g_keyfile_settings_backend_new
- ( config_file,
- CONFIG_ROOT_PATH,
- CONFIG_ROOT_GROUP );
-
- config = g_settings_new_with_backend(CONFIG_WIN_STATE, config_backend);
- wnd->init_width = g_settings_get_int(config, "width");
- wnd->init_height = g_settings_get_int(config, "height");
+ wnd->init_width = g_settings_get_int(settings, "width");
+ wnd->init_height = g_settings_get_int(settings, "height");
wnd->init_playlist_visible
- = g_settings_get_boolean(config, "show-playlist");
+ = g_settings_get_boolean(settings, "show-playlist");
g_signal_connect( wnd,
"configure-event",
@@ -388,11 +299,45 @@ void main_window_load_state(MainWindow *wnd)
*/
main_window_set_playlist_visible(wnd, TRUE);
- wnd->playlist_width = g_settings_get_int(config, "playlist-width");
+ wnd->playlist_width = g_settings_get_int(settings, "playlist-width");
+
+ control_box_set_volume( CONTROL_BOX(wnd->control_box),
+ g_settings_get_double(settings, "volume") );
gtk_window_resize(GTK_WINDOW(wnd), wnd->init_width, wnd->init_height);
- g_free(config_file);
+ g_clear_object(&settings);
+}
+
+void main_window_update_track_list( MainWindow *wnd,
+ const GSList *audio_list,
+ const GSList *video_list,
+ const GSList *sub_list )
+{
+ if(main_window_get_csd_enabled(wnd))
+ {
+ GMenu *menu = g_menu_new();
+
+ menu_build_menu_btn(menu, audio_list, video_list, sub_list);
+
+ gtk_menu_button_set_menu_model
+ ( GTK_MENU_BUTTON(wnd->menu_hdr_btn),
+ G_MENU_MODEL(menu) );
+ }
+ else
+ {
+ GtkApplication *app;
+ GMenu *menu;
+
+ app = gtk_window_get_application(GTK_WINDOW(wnd));
+ menu = G_MENU(gtk_application_get_menubar(app));
+
+ if(menu)
+ {
+ g_menu_remove_all(menu);
+ menu_build_full(menu, audio_list, video_list, sub_list);
+ }
+ }
}
static void main_window_class_init(MainWindowClass *klass)
@@ -524,6 +469,9 @@ void main_window_toggle_fullscreen(MainWindow *wnd)
if(wnd->fullscreen)
{
+ GdkCursor *cursor;
+ GdkWindow *vid_area;
+
gtk_widget_set_halign(wnd->control_box, GTK_ALIGN_FILL);
gtk_widget_set_valign(wnd->control_box, GTK_ALIGN_FILL);
gtk_widget_set_size_request(wnd->control_box, -1, -1);
@@ -553,6 +501,13 @@ void main_window_toggle_fullscreen(MainWindow *wnd)
gtk_widget_show(wnd->playlist);
}
+ cursor = gdk_cursor_new_from_name
+ (gdk_display_get_default(), "default");
+
+ vid_area = gtk_widget_get_window(GTK_WIDGET(wnd->vid_area));
+
+ gdk_window_set_cursor(vid_area, cursor);
+
wnd->fullscreen = FALSE;
}
else
@@ -584,7 +539,6 @@ void main_window_toggle_fullscreen(MainWindow *wnd)
gtk_window_fullscreen(GTK_WINDOW(wnd));
gtk_window_present(GTK_WINDOW(wnd));
gtk_widget_hide(wnd->control_box);
- timeout_handler(wnd);
if(main_window_get_csd_enabled(wnd))
{
@@ -603,6 +557,7 @@ void main_window_toggle_fullscreen(MainWindow *wnd)
}
wnd->fullscreen = TRUE;
+ timeout_handler(wnd);
}
}
@@ -631,10 +586,15 @@ gboolean main_window_get_use_opengl(MainWindow *wnd)
void main_window_enable_csd(MainWindow *wnd)
{
+ GMenu *menu_btn_menu;
+ GMenu *open_btn_menu;
GIcon *open_icon;
GIcon *fullscreen_icon;
GIcon *menu_icon;
+ open_btn_menu = g_menu_new();
+ menu_btn_menu = g_menu_new();
+
open_icon = g_themed_icon_new_with_default_fallbacks
("list-add-symbolic");
@@ -649,6 +609,9 @@ void main_window_enable_csd(MainWindow *wnd)
wnd->fullscreen_hdr_btn = gtk_button_new();
wnd->menu_hdr_btn = gtk_menu_button_new();
+ menu_build_open_btn(open_btn_menu);
+ menu_build_menu_btn(menu_btn_menu, NULL, NULL, NULL);
+
gtk_widget_set_can_focus(wnd->open_hdr_btn, FALSE);
gtk_widget_set_can_focus(wnd->fullscreen_hdr_btn, FALSE);
gtk_widget_set_can_focus(wnd->menu_hdr_btn, FALSE);
@@ -670,11 +633,11 @@ void main_window_enable_csd(MainWindow *wnd)
gtk_menu_button_set_menu_model
( GTK_MENU_BUTTON(wnd->open_hdr_btn),
- G_MENU_MODEL(open_btn_build_menu()) );
+ G_MENU_MODEL(open_btn_menu) );
gtk_menu_button_set_menu_model
( GTK_MENU_BUTTON(wnd->menu_hdr_btn),
- G_MENU_MODEL(menu_btn_build_menu()) );
+ G_MENU_MODEL(menu_btn_menu) );
gtk_header_bar_pack_start
(GTK_HEADER_BAR(wnd->header_bar), wnd->open_hdr_btn);
diff --git a/src/main_window.h b/src/main_window.h
index fc218a5..50709cd 100644
--- a/src/main_window.h
+++ b/src/main_window.h
@@ -78,6 +78,10 @@ void main_window_toggle_fullscreen(MainWindow *wnd);
void main_window_reset(MainWindow *wnd);
void main_window_save_state(MainWindow *wnd);
void main_window_load_state(MainWindow *wnd);
+void main_window_update_track_list( MainWindow *wnd,
+ const GSList *audio_list,
+ const GSList *video_list,
+ const GSList *sub_list );
gint main_window_get_width_margin(MainWindow *wnd);
gint main_window_get_height_margin(MainWindow *wnd);
gboolean main_window_get_use_opengl(MainWindow *wnd);
diff --git a/src/menu.c b/src/menu.c
new file mode 100644
index 0000000..12d2c57
--- /dev/null
+++ b/src/menu.c
@@ -0,0 +1,401 @@
+/*
+ * Copyright (c) 2015-2016 gnome-mpv
+ *
+ * This file is part of GNOME MPV.
+ *
+ * GNOME MPV 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNOME MPV 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 GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib/gi18n.h>
+
+#include "menu.h"
+#include "track.h"
+
+static void build_menu_from_track_list( GMenu *menu,
+ const GSList *list,
+ const gchar *action );
+
+void build_menu_from_track_list( GMenu *menu,
+ const GSList *list,
+ const gchar *action )
+{
+ const GSList *iter = list;
+ const glong max_len = 32;
+ gchar *detailed_action;
+
+ detailed_action = g_strdup_printf("app.%s(@x -1)", action);
+
+ g_menu_append(menu, _("None"), detailed_action);
+ g_free(detailed_action);
+
+ while(iter)
+ {
+ Track *entry;
+ glong entry_title_len;
+ gchar *entry_title;
+ gchar *title;
+
+ entry = iter->data;
+
+ /* For simplicity, also dup the default string used when the
+ * track has no title.
+ */
+ entry_title = g_strdup(entry->title?:_("Unknown"));
+
+ /* Maximum number of bytes per UTF-8 character is 4 */
+ entry_title_len = g_utf8_strlen(entry_title, 4*(max_len+1));
+
+ if(entry_title_len > max_len)
+ {
+ /* Truncate the string */
+ *(g_utf8_offset_to_pointer(entry_title, max_len)) = '\0';
+ }
+
+ detailed_action
+ = g_strdup_printf( "app.%s"
+ "(@x %" G_GINT64_FORMAT ")",
+ action,
+ entry->id );
+
+ /* Ellipsize the title if it's longer than max_len */
+ title = g_strdup_printf( entry->lang?
+ "%s%s (%s)":"%s%s",
+ entry_title,
+ (entry_title_len > max_len)?
+ "…":"",
+ entry->lang );
+
+ g_menu_append(menu, title, detailed_action);
+
+ iter = g_slist_next(iter);
+
+ g_free(detailed_action);
+ g_free(entry_title);
+ g_free(title);
+ }
+}
+
+void menu_build_full( GMenu *menu,
+ const GSList *audio_list,
+ const GSList *video_list,
+ const GSList *sub_list )
+{
+ GMenu *file_menu;
+ GMenu *edit_menu;
+ GMenu *view_menu;
+ GMenu *help_menu;
+ GMenuItem *file_menu_item;
+ GMenuItem *open_menu_item;
+ GMenuItem *quit_menu_item;
+ GMenuItem *open_loc_menu_item;
+ GMenuItem *save_playlist_menu_item;
+ GMenuItem *edit_menu_item;
+ GMenuItem *pref_menu_item;
+ GMenuItem *view_menu_item;
+ GMenuItem *playlist_menu_item;
+ GMenuItem *fullscreen_menu_item;
+ GMenuItem *normal_size_menu_item;
+ GMenuItem *double_size_menu_item;
+ GMenuItem *half_size_menu_item;
+ GMenuItem *help_menu_item;
+ GMenuItem *about_menu_item;
+
+ /* File */
+ file_menu = g_menu_new();
+
+ file_menu_item
+ = g_menu_item_new_submenu
+ (_("_File"), G_MENU_MODEL(file_menu));
+
+ open_menu_item = g_menu_item_new(_("_Open"), "app.open(false)");
+ quit_menu_item = g_menu_item_new(_("_Quit"), "app.quit");
+
+ open_loc_menu_item
+ = g_menu_item_new(_("Open _Location"), "app.openloc");
+
+ save_playlist_menu_item
+ = g_menu_item_new(_("_Save Playlist"), "app.playlist_save");
+
+ /* Edit */
+ edit_menu = g_menu_new();
+
+ edit_menu_item
+ = g_menu_item_new_submenu
+ (_("_Edit"), G_MENU_MODEL(edit_menu));
+
+ pref_menu_item
+ = g_menu_item_new(_("_Preferences"), "app.pref");
+
+ /* View */
+ view_menu = g_menu_new();
+
+ view_menu_item
+ = g_menu_item_new_submenu
+ (_("_View"), G_MENU_MODEL(view_menu));
+
+ playlist_menu_item
+ = g_menu_item_new(_("_Toggle Playlist"), "app.playlist_toggle");
+
+ fullscreen_menu_item
+ = g_menu_item_new(_("_Fullscreen"), "app.fullscreen");
+
+ normal_size_menu_item
+ = g_menu_item_new(_("_Normal Size"), "app.normalsize");
+
+ double_size_menu_item
+ = g_menu_item_new(_("_Double Size"), "app.doublesize");
+
+ half_size_menu_item
+ = g_menu_item_new(_("_Half Size"), "app.halfsize");
+
+ /* Help */
+ help_menu = g_menu_new();
+
+ help_menu_item
+ = g_menu_item_new_submenu
+ (_("_Help"), G_MENU_MODEL(help_menu));
+
+ about_menu_item = g_menu_item_new(_("_About"), "app.about");
+
+ if(video_list)
+ {
+ GMenu *video_menu = g_menu_new();
+
+ build_menu_from_track_list
+ (video_menu, video_list, "video_select");
+
+ g_menu_append_submenu( edit_menu,
+ _("_Video Track"),
+ G_MENU_MODEL(video_menu) );
+ }
+
+ /* If there is no track, then no file is playing and we can just leave
+ * out track-related menu items. However, if there is something playing,
+ * show both menu items for audio and subtitle tracks even if they are
+ * empty so that the users can load external ones if they want.
+ */
+ if(video_list || audio_list || sub_list)
+ {
+ GMenu *audio_menu = g_menu_new();
+ GMenu *sub_menu = g_menu_new();
+ GMenuItem *load_audio_menu_item;
+ GMenuItem *load_sub_menu_item;
+
+ load_audio_menu_item
+ = g_menu_item_new( _("_Load External..."),
+ "app.load_track('audio-add')" );
+
+ load_sub_menu_item
+ = g_menu_item_new( _("_Load External..."),
+ "app.load_track('sub-add')" );
+
+ build_menu_from_track_list
+ (audio_menu, audio_list, "audio_select");
+
+ build_menu_from_track_list
+ (sub_menu, sub_list, "sub_select");
+
+ g_menu_append_submenu( edit_menu,
+ _("_Audio Track"),
+ G_MENU_MODEL(audio_menu) );
+
+ g_menu_append_submenu( edit_menu,
+ _("S_ubtitle Track"),
+ G_MENU_MODEL(sub_menu) );
+
+ g_menu_append_item(audio_menu, load_audio_menu_item);
+ g_menu_append_item(sub_menu, load_sub_menu_item);
+
+ g_object_unref(load_audio_menu_item);
+ g_object_unref(load_sub_menu_item);
+ }
+
+ g_menu_append_item(menu, file_menu_item);
+ g_menu_append_item(file_menu, open_menu_item);
+ g_menu_append_item(file_menu, open_loc_menu_item);
+ g_menu_append_item(file_menu, save_playlist_menu_item);
+ g_menu_append_item(file_menu, quit_menu_item);
+
+ g_menu_append_item(menu, edit_menu_item);
+ g_menu_append_item(edit_menu, pref_menu_item);
+
+ g_menu_append_item(menu, view_menu_item);
+ g_menu_append_item(view_menu, playlist_menu_item);
+ g_menu_append_item(view_menu, fullscreen_menu_item);
+ g_menu_append_item(view_menu, normal_size_menu_item);
+ g_menu_append_item(view_menu, double_size_menu_item);
+ g_menu_append_item(view_menu, half_size_menu_item);
+
+ g_menu_append_item(menu, help_menu_item);
+ g_menu_append_item(help_menu, about_menu_item);
+
+ g_object_unref(file_menu_item);
+ g_object_unref(open_menu_item);
+ g_object_unref(open_loc_menu_item);
+ g_object_unref(save_playlist_menu_item);
+ g_object_unref(quit_menu_item);
+ g_object_unref(edit_menu_item);
+ g_object_unref(pref_menu_item);
+ g_object_unref(view_menu_item);
+ g_object_unref(playlist_menu_item);
+ g_object_unref(fullscreen_menu_item);
+ g_object_unref(normal_size_menu_item);
+ g_object_unref(double_size_menu_item);
+ g_object_unref(half_size_menu_item);
+ g_object_unref(help_menu_item);
+ g_object_unref(about_menu_item);
+}
+
+void menu_build_menu_btn( GMenu *menu,
+ const GSList *audio_list,
+ const GSList *video_list,
+ const GSList *sub_list )
+{
+ GMenu *playlist;
+ GMenu *track;
+ GMenu *view;
+ GMenuItem *playlist_section;
+ GMenuItem *track_section;
+ GMenuItem *view_section;
+ GMenuItem *playlist_toggle_menu_item;
+ GMenuItem *playlist_save_menu_item;
+ GMenuItem *normal_size_menu_item;
+ GMenuItem *double_size_menu_item;
+ GMenuItem *half_size_menu_item;
+
+ playlist = g_menu_new();
+ track = g_menu_new();
+ view = g_menu_new();
+
+ playlist_section
+ = g_menu_item_new_section(NULL, G_MENU_MODEL(playlist));
+
+ track_section
+ = g_menu_item_new_section(NULL, G_MENU_MODEL(track));
+
+ view_section
+ = g_menu_item_new_section(NULL, G_MENU_MODEL(view));
+
+ playlist_toggle_menu_item
+ = g_menu_item_new
+ (_("_Toggle Playlist"), "app.playlist_toggle");
+
+ playlist_save_menu_item
+ = g_menu_item_new
+ (_("_Save Playlist"), "app.playlist_save");
+
+ normal_size_menu_item
+ = g_menu_item_new
+ (_("_Normal Size"), "app.normalsize");
+
+ double_size_menu_item
+ = g_menu_item_new
+ (_("_Double Size"), "app.doublesize");
+
+ half_size_menu_item
+ = g_menu_item_new
+ (_("_Half Size"), "app.halfsize");
+
+ if(video_list)
+ {
+ GMenu *video = g_menu_new();
+ GMenuItem *video_menu_item;
+
+ video_menu_item = g_menu_item_new_submenu
+ ( _("_Video Track"),
+ G_MENU_MODEL(video) );
+
+ build_menu_from_track_list(video, video_list, "video_select");
+ g_menu_append_item(track, video_menu_item);
+ g_object_unref(video_menu_item);
+ }
+
+ if(video_list || audio_list || sub_list)
+ {
+ GMenu *audio = g_menu_new();
+ GMenu *subtitle = g_menu_new();
+ GMenuItem *audio_menu_item;
+ GMenuItem *subtitle_menu_item;
+ GMenuItem *load_audio_menu_item;
+ GMenuItem *load_sub_menu_item;
+
+ audio_menu_item
+ = g_menu_item_new_submenu
+ (_("_Audio Track"), G_MENU_MODEL(audio));
+
+ subtitle_menu_item
+ = g_menu_item_new_submenu
+ (_("S_ubtitle Track"), G_MENU_MODEL(subtitle));
+
+ build_menu_from_track_list(audio, audio_list, "audio_select");
+ build_menu_from_track_list(subtitle, sub_list, "sub_select");
+
+ load_audio_menu_item
+ = g_menu_item_new
+ ( _("_Load External..."),
+ "app.load_track('audio-add')" );
+
+ load_sub_menu_item
+ = g_menu_item_new
+ ( _("_Load External..."),
+ "app.load_track('sub-add')" );
+
+ g_menu_append_item(track, audio_menu_item);
+ g_menu_append_item(track, subtitle_menu_item);
+ g_menu_append_item(audio, load_audio_menu_item);
+ g_menu_append_item(subtitle, load_sub_menu_item);
+
+ g_object_unref(audio_menu_item);
+ g_object_unref(subtitle_menu_item);
+ g_object_unref(load_audio_menu_item);
+ g_object_unref(load_sub_menu_item);
+ }
+
+ g_menu_append_item(playlist, playlist_toggle_menu_item);
+ g_menu_append_item(playlist, playlist_save_menu_item);
+ g_menu_append_item(view, normal_size_menu_item);
+ g_menu_append_item(view, double_size_menu_item);
+ g_menu_append_item(view, half_size_menu_item);
+ g_menu_append_item(menu, playlist_section);
+ g_menu_append_item(menu, track_section);
+ g_menu_append_item(menu, view_section);
+
+ g_object_unref(playlist_toggle_menu_item);
+ g_object_unref(playlist_save_menu_item);
+ g_object_unref(normal_size_menu_item);
+ g_object_unref(double_size_menu_item);
+ g_object_unref(half_size_menu_item);
+ g_object_unref(playlist_section);
+ g_object_unref(track_section);
+ g_object_unref(view_section);
+}
+
+void menu_build_open_btn(GMenu *menu)
+{
+ GMenuItem *open_menu_item;
+ GMenuItem *open_loc_menu_item;
+
+ open_menu_item
+ = g_menu_item_new(_("_Open"), "app.open(false)");
+
+ open_loc_menu_item
+ = g_menu_item_new(_("Open _Location"), "app.openloc");
+
+ g_menu_append_item(menu, open_menu_item);
+ g_menu_append_item(menu, open_loc_menu_item);
+
+ g_object_unref(open_menu_item);
+ g_object_unref(open_loc_menu_item);
+}
+
diff --git a/src/media_keys/media_keys.h b/src/menu.h
similarity index 68%
copy from src/media_keys/media_keys.h
copy to src/menu.h
index 4e8a88e..4c51afa 100644
--- a/src/media_keys/media_keys.h
+++ b/src/menu.h
@@ -17,22 +17,19 @@
* along with GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef MEDIA_KEYS_H
-#define MEDIA_KEYS_H
+#ifndef MENU_H
+#define MENU_H
-#include "common.h"
+#include <gio/gio.h>
-typedef struct media_keys media_keys;
-
-struct media_keys
-{
- gmpv_handle *gmpv_ctx;
- gulong g_signal_sig_id;
- gulong shutdown_sig_id;
- GDBusProxy *proxy;
- GDBusConnection *session_bus_conn;
-};
-
-void media_keys_init(gmpv_handle *gmpv_ctx);
+void menu_build_full( GMenu *menu,
+ const GSList *audio_list,
+ const GSList *video_list,
+ const GSList *sub_list );
+void menu_build_menu_btn( GMenu *menu,
+ const GSList *audio_list,
+ const GSList *video_list,
+ const GSList *sub_list );
+void menu_build_open_btn(GMenu *menu);
#endif
diff --git a/src/mpris/mpris.c b/src/mpris/mpris.c
index 3e2a2e4..555aa5c 100644
--- a/src/mpris/mpris.c
+++ b/src/mpris/mpris.c
@@ -30,9 +30,13 @@
static void bus_acquired_handler( GDBusConnection *connection,
const gchar *name,
gpointer data );
+static void name_lost_handler( GDBusConnection *connection,
+ const gchar *name,
+ gpointer data );
static gboolean delete_handler( GtkWidget *widget,
GdkEvent *event,
gpointer data );
+static void unregister(mpris *inst);
static void bus_acquired_handler( GDBusConnection *connection,
const gchar *name,
@@ -46,6 +50,13 @@ static void bus_acquired_handler( GDBusConnection *connection,
mpris_player_register(inst);
}
+static void name_lost_handler( GDBusConnection *connection,
+ const gchar *name,
+ gpointer data )
+{
+ unregister(data);
+}
+
static gboolean delete_handler( GtkWidget *widget,
GdkEvent *event,
gpointer data )
@@ -55,6 +66,15 @@ static gboolean delete_handler( GtkWidget *widget,
g_signal_handler_disconnect( inst->gmpv_ctx->gui,
inst->shutdown_sig_id );
+ unregister(inst);
+ g_bus_unown_name(inst->name_id);
+ g_free(inst);
+
+ return FALSE;
+}
+
+static void unregister(mpris *inst)
+{
if(inst->base_reg_id > 0)
{
mpris_base_unregister(inst);
@@ -64,11 +84,6 @@ static gboolean delete_handler( GtkWidget *widget,
{
mpris_player_unregister(inst);
}
-
- g_bus_unown_name(inst->name_id);
- g_free(inst);
-
- return FALSE;
}
void mpris_emit_prop_changed(mpris *inst, const mpris_prop_val_pair *prop_list)
@@ -151,7 +166,8 @@ void mpris_init(gmpv_handle *gmpv_ctx)
(GBusAcquiredCallback)
bus_acquired_handler,
NULL,
- NULL,
+ (GBusNameLostCallback)
+ name_lost_handler,
inst,
NULL );
}
diff --git a/src/mpris/mpris_base.c b/src/mpris/mpris_base.c
index 0728717..de85808 100644
--- a/src/mpris/mpris_base.c
+++ b/src/mpris/mpris_base.c
@@ -244,18 +244,21 @@ void mpris_base_unregister(mpris *inst)
{
gulong *current_sig_id = inst->base_sig_id_list;
- while(current_sig_id && *current_sig_id > 0)
+ if(current_sig_id)
{
- g_signal_handler_disconnect( inst->gmpv_ctx->gui,
- *current_sig_id );
+ while(current_sig_id && *current_sig_id > 0)
+ {
+ g_signal_handler_disconnect( inst->gmpv_ctx->gui,
+ *current_sig_id );
- current_sig_id++;
- }
+ current_sig_id++;
+ }
- g_dbus_connection_unregister_object( inst->session_bus_conn,
- inst->base_reg_id );
+ g_dbus_connection_unregister_object( inst->session_bus_conn,
+ inst->base_reg_id );
- g_hash_table_remove_all(inst->base_prop_table);
- g_hash_table_unref(inst->base_prop_table);
- g_free(inst->base_sig_id_list);
+ g_hash_table_remove_all(inst->base_prop_table);
+ g_hash_table_unref(inst->base_prop_table);
+ g_clear_pointer(&inst->base_sig_id_list, g_free);
+ }
}
diff --git a/src/mpris/mpris_player.c b/src/mpris/mpris_player.c
index 067c6e5..2d52daa 100644
--- a/src/mpris/mpris_player.c
+++ b/src/mpris/mpris_player.c
@@ -726,18 +726,21 @@ void mpris_player_unregister(mpris *inst)
{
gulong *current_sig_id = inst->player_sig_id_list;
- while(current_sig_id && *current_sig_id > 0)
+ if(current_sig_id)
{
- g_signal_handler_disconnect( inst->gmpv_ctx->gui,
- *current_sig_id );
+ while(current_sig_id && *current_sig_id > 0)
+ {
+ g_signal_handler_disconnect( inst->gmpv_ctx->gui,
+ *current_sig_id );
- current_sig_id++;
- }
+ current_sig_id++;
+ }
- g_dbus_connection_unregister_object( inst->session_bus_conn,
- inst->player_reg_id );
+ g_dbus_connection_unregister_object( inst->session_bus_conn,
+ inst->player_reg_id );
- g_hash_table_remove_all(inst->player_prop_table);
- g_hash_table_unref(inst->player_prop_table);
- g_free(inst->player_sig_id_list);
+ g_hash_table_remove_all(inst->player_prop_table);
+ g_hash_table_unref(inst->player_prop_table);
+ g_clear_pointer(&inst->player_sig_id_list, g_free);
+ }
}
diff --git a/src/mpv.c b/src/mpv.c
index 3e94420..d7b76fa 100644
--- a/src/mpv.c
+++ b/src/mpv.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2015 gnome-mpv
+ * Copyright (c) 2014-2016 gnome-mpv
*
* This file is part of GNOME MPV.
*
@@ -18,13 +18,13 @@
*/
#include <glib/gi18n.h>
-#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <execinfo.h>
#include "mpv.h"
#include "def.h"
+#include "track.h"
#include "playlist.h"
#include "control_box.h"
#include "playlist_widget.h"
@@ -38,6 +38,8 @@ static void handle_msg_level_opt(gmpv_handle *ctx);
static void handle_property_change_event( gmpv_handle *ctx,
mpv_event_property* prop);
static void opengl_callback(void *cb_ctx);
+static void uninit_opengl_cb(gmpv_handle *ctx);
+static Track *parse_track_list(mpv_node_list *node);
static void parse_dim_string( gmpv_handle *ctx,
const gchar *mpv_geom_str,
@@ -280,42 +282,76 @@ static void handle_property_change_event( gmpv_handle *ctx,
{
if(g_strcmp0(prop->name, "pause") == 0)
{
+ GtkWindow *wnd = GTK_WINDOW(ctx->gui);
+ GtkApplication *app = gtk_window_get_application(wnd);
+ gboolean idle;
+
ctx->paused = prop->data?*((int *)prop->data):TRUE;
- if(!ctx->loaded && !ctx->paused)
+ mpv_get_property(ctx->mpv_ctx, "idle", MPV_FORMAT_FLAG, &idle);
+
+ if(idle && !ctx->paused)
{
mpv_load(ctx, NULL, FALSE, TRUE);
}
+ if(!ctx->paused)
+ {
+ ctx->inhibit_cookie
+ = gtk_application_inhibit
+ ( app, wnd,
+ GTK_APPLICATION_INHIBIT_IDLE,
+ _("Playing") );
+ }
+ else if(ctx->inhibit_cookie != 0)
+ {
+ gtk_application_uninhibit(app, ctx->inhibit_cookie);
+ }
+
mpv_load_gui_update(ctx);
}
- else if(g_strcmp0(prop->name, "volume") == 0)
+ else if(g_strcmp0(prop->name, "volume") == 0
+ && (ctx->init_load || ctx->loaded))
{
- ControlBox *control_box;
- gdouble volume;
-
- control_box = CONTROL_BOX(ctx->gui->control_box);
- volume = prop->data?*((double *)prop->data)/100.0:0;
+ gchar *aid = mpv_get_property_string(ctx->mpv_ctx, "aid");
+ ControlBox *control_box = CONTROL_BOX(ctx->gui->control_box);
- g_signal_handlers_block_matched
- ( control_box->volume_button,
- G_SIGNAL_MATCH_DATA,
- 0,
- 0,
- NULL,
- NULL,
- ctx );
-
- control_box_set_volume(control_box, volume);
+ if(g_strcmp0(aid, "no") == 0)
+ {
+ gtk_widget_set_sensitive
+ (control_box->volume_button, FALSE);
+ }
+ else
+ {
+ gdouble volume;
+
+ volume = prop->data?*((double *)prop->data)/100.0:0;
+
+ gtk_widget_set_sensitive
+ (control_box->volume_button, TRUE);
+
+ g_signal_handlers_block_matched
+ ( control_box->volume_button,
+ G_SIGNAL_MATCH_DATA,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ ctx );
+
+ control_box_set_volume(control_box, volume);
+
+ g_signal_handlers_unblock_matched
+ ( control_box->volume_button,
+ G_SIGNAL_MATCH_DATA,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ ctx );
+ }
- g_signal_handlers_unblock_matched
- ( control_box->volume_button,
- G_SIGNAL_MATCH_DATA,
- 0,
- 0,
- NULL,
- NULL,
- ctx );
+ mpv_free(aid);
}
else if(g_strcmp0(prop->name, "fullscreen") == 0)
{
@@ -341,12 +377,62 @@ static void handle_property_change_event( gmpv_handle *ctx,
static void opengl_callback(void *cb_ctx)
{
+#ifdef OPENGL_CB_ENABLED
gmpv_handle *ctx = cb_ctx;
if(ctx->opengl_ctx)
{
gtk_gl_area_queue_render(GTK_GL_AREA(ctx->gui->vid_area));
}
+#endif
+}
+
+static void uninit_opengl_cb(gmpv_handle *ctx)
+{
+#ifdef OPENGL_CB_ENABLED
+ gtk_gl_area_make_current(GTK_GL_AREA(ctx->gui->vid_area));
+ mpv_opengl_cb_uninit_gl(ctx->opengl_ctx);
+#endif
+}
+
+static Track *parse_track_list(mpv_node_list *node)
+{
+ Track *entry = track_new();
+
+ for(gint i = 0; i < node->num; i++)
+ {
+ if(g_strcmp0(node->keys[i], "type") == 0)
+ {
+ const gchar *type = node->values[i].u.string;
+
+ if(g_strcmp0(type, "audio") == 0)
+ {
+ entry->type = TRACK_TYPE_AUDIO;
+ }
+ else if(g_strcmp0(type, "video") == 0)
+ {
+ entry->type = TRACK_TYPE_VIDEO;
+ }
+ else if(g_strcmp0(type, "sub") == 0)
+ {
+ entry->type = TRACK_TYPE_SUBTITLE;
+ }
+ }
+ else if(g_strcmp0(node->keys[i], "title") == 0)
+ {
+ entry->title = g_strdup(node->values[i].u.string);
+ }
+ else if(g_strcmp0(node->keys[i], "lang") == 0)
+ {
+ entry->lang = g_strdup(node->values[i].u.string);
+ }
+ else if(g_strcmp0(node->keys[i], "id") == 0)
+ {
+ entry->id = node->values[i].u.int64;
+ }
+ }
+
+ return entry;
}
void mpv_wakeup_callback(void *data)
@@ -395,7 +481,26 @@ void mpv_log_handler(gmpv_handle *ctx, mpv_event_log_message* message)
if(!iter || (message->log_level <= level->level))
{
- show_error_dialog(ctx, message->prefix, message->text);
+ gchar *buf = g_strdup(message->text);
+ gsize len = strlen(buf);
+
+ if(len > 1)
+ {
+ /* g_message() automatically adds a newline
+ * character when using the default log handler,
+ * but log messages from mpv already come
+ * terminated with a newline character so we
+ * need to take it out.
+ */
+ if(buf[len-1] == '\n')
+ {
+ buf[len-1] = '\0';
+ }
+
+ g_message("[%s] %s", message->prefix, buf);
+ }
+
+ g_free(buf);
}
}
@@ -440,8 +545,6 @@ gboolean mpv_handle_event(gpointer data)
{
if(ctx->init_load)
{
- ctx->init_load = FALSE;
-
mpv_load(ctx, NULL, FALSE, FALSE);
}
else if(ctx->loaded)
@@ -460,20 +563,44 @@ gboolean mpv_handle_event(gpointer data)
main_window_reset(ctx->gui);
playlist_reset(ctx);
}
+
+ ctx->init_load = FALSE;
}
else if(event->event_id == MPV_EVENT_FILE_LOADED)
{
ctx->loaded = TRUE;
+ ctx->init_load = FALSE;
mpv_update_playlist(ctx);
mpv_load_gui_update(ctx);
}
else if(event->event_id == MPV_EVENT_END_FILE)
{
+ mpv_event_end_file *ef_event = event->data;
+
+ ctx->init_load = FALSE;
+
if(ctx->loaded)
{
ctx->new_file = FALSE;
}
+
+ if(ef_event->reason == MPV_END_FILE_REASON_ERROR)
+ {
+ const gchar *err_str;
+ gchar *msg;
+
+ err_str = mpv_error_string(ef_event->error);
+
+ msg = g_strdup_printf
+ ( _("Playback was terminated "
+ "abnormally. Reason: %s."),
+ err_str );
+
+ show_error_dialog(ctx, NULL, msg);
+
+ g_free(msg);
+ }
}
else if(event->event_id == MPV_EVENT_VIDEO_RECONFIG)
{
@@ -515,20 +642,25 @@ void mpv_update_playlist(gmpv_handle *ctx)
*/
const gsize filename_prop_str_size = 38;
PlaylistWidget *playlist;
- mpv_node playlist_array;
+ GtkListStore *store;
+ GtkTreeIter iter;
+ mpv_node mpv_playlist;
gchar *filename_prop_str;
+ gboolean iter_end;
gint playlist_count;
gint i;
playlist = PLAYLIST_WIDGET(ctx->gui->playlist);
+ store = playlist->list_store;
filename_prop_str = g_malloc(filename_prop_str_size);
+ iter_end = FALSE;
mpv_check_error(mpv_get_property( ctx->mpv_ctx,
"playlist",
MPV_FORMAT_NODE,
- &playlist_array ));
+ &mpv_playlist ));
- playlist_count = playlist_array.u.list->num;
+ playlist_count = mpv_playlist.u.list->num;
g_signal_handlers_block_matched
( playlist->list_store,
@@ -539,41 +671,83 @@ void mpv_update_playlist(gmpv_handle *ctx)
NULL,
ctx );
- playlist_widget_clear(playlist);
+ gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
for(i = 0; i < playlist_count; i++)
{
gint prop_count = 0;
- gchar *path = NULL;
+ gchar *uri = NULL;
gchar *title = NULL;
gchar *name = NULL;
+ gchar *old_name = NULL;
+ gchar *old_uri = NULL;
- prop_count = playlist_array.u.list->values[i].u.list->num;
+ prop_count = mpv_playlist.u.list->values[i].u.list->num;
/* The first entry must always exist */
- path = playlist_array.u.list
+ uri = mpv_playlist.u.list
->values[i].u.list
->values[0].u.string;
/* Try retrieving the title from mpv playlist */
if(prop_count >= 4)
{
- title = playlist_array.u.list
+ title = mpv_playlist.u.list
->values[i].u.list
->values[3].u.string;
}
- if(!title)
+ name = title?title:get_name_from_path(uri);
+
+ if(!iter_end)
{
- name = get_name_from_path(path);
- }
+ gtk_tree_model_get
+ ( GTK_TREE_MODEL(store), &iter,
+ PLAYLIST_NAME_COLUMN, &old_name,
+ PLAYLIST_URI_COLUMN, &old_uri, -1 );
+
+ if(g_strcmp0(name, old_name) != 0)
+ {
+ gtk_list_store_set
+ ( store, &iter,
+ PLAYLIST_NAME_COLUMN, name, -1 );
+ }
- playlist_widget_append(playlist, title?title:name, path);
+ if(g_strcmp0(uri, old_uri) != 0)
+ {
+ gtk_list_store_set
+ ( store, &iter,
+ PLAYLIST_URI_COLUMN, uri, -1 );
+ }
- mpv_free(path);
+ iter_end = !gtk_tree_model_iter_next
+ (GTK_TREE_MODEL(store), &iter);
+
+ g_free(old_name);
+ g_free(old_uri);
+ }
+ /* Append entries to the playlist if there are fewer entries in
+ * the playlist widget than mpv's playlist.
+ */
+ else
+ {
+ playlist_widget_append(playlist, name, uri);
+ }
+
+ mpv_free(uri);
g_free(name);
}
+ /* If there are more entries in the playlist widget than mpv's playlist,
+ * remove the excess entries from the playlist widget.
+ */
+ if(!iter_end)
+ {
+ while(gtk_list_store_remove(store, &iter));
+ }
+
+ gtk_tree_view_columns_autosize(GTK_TREE_VIEW(playlist->tree_view));
+
g_signal_handlers_unblock_matched
( playlist->list_store,
G_SIGNAL_MATCH_DATA,
@@ -584,12 +758,13 @@ void mpv_update_playlist(gmpv_handle *ctx)
ctx );
g_free(filename_prop_str);
- mpv_free_node_contents(&playlist_array);
+ mpv_free_node_contents(&mpv_playlist);
}
void mpv_load_gui_update(gmpv_handle *ctx)
{
ControlBox *control_box;
+ mpv_node track_list;
gchar* title;
gint64 chapter_count;
gint64 playlist_pos;
@@ -612,6 +787,86 @@ void mpv_load_gui_update(gmpv_handle *ctx)
&ctx->paused));
if(mpv_get_property( ctx->mpv_ctx,
+ "track-list",
+ MPV_FORMAT_NODE,
+ &track_list) >= 0)
+ {
+ mpv_node_list *org_list = track_list.u.list;
+ GSList *audio_list = NULL;
+ GSList *video_list = NULL;
+ GSList *sub_list = NULL;
+ GAction *action = NULL;
+ gint64 aid = -1;
+ gint64 sid = -1;
+
+ mpv_get_property( ctx->mpv_ctx,
+ "aid",
+ MPV_FORMAT_INT64,
+ &aid );
+
+ mpv_get_property( ctx->mpv_ctx,
+ "sid",
+ MPV_FORMAT_INT64,
+ &sid );
+
+ action = g_action_map_lookup_action
+ (G_ACTION_MAP(ctx->app), "audio_select");
+
+ g_simple_action_set_state
+ (G_SIMPLE_ACTION(action), g_variant_new_int64(aid));
+
+ action = g_action_map_lookup_action
+ (G_ACTION_MAP(ctx->app), "sub_select");
+
+ g_simple_action_set_state
+ (G_SIMPLE_ACTION(action), g_variant_new_int64(sid));
+
+ for(gint i = 0; i < org_list->num; i++)
+ {
+ Track *entry;
+ GSList **list;
+
+ entry = parse_track_list
+ (org_list->values[i].u.list);
+
+ if(entry->type == TRACK_TYPE_AUDIO)
+ {
+ list = &audio_list;
+ }
+ else if(entry->type == TRACK_TYPE_VIDEO)
+ {
+ list = &video_list;
+ }
+ else if(entry->type == TRACK_TYPE_SUBTITLE)
+ {
+ list = &sub_list;
+ }
+ else
+ {
+ g_assert(FALSE);
+ }
+
+ *list = g_slist_prepend(*list, entry);
+ }
+
+ audio_list = g_slist_reverse(audio_list);
+ video_list = g_slist_reverse(video_list);
+ sub_list = g_slist_reverse(sub_list);
+
+ main_window_update_track_list
+ (ctx->gui, audio_list, video_list, sub_list);
+
+ g_slist_free_full
+ (audio_list, (GDestroyNotify)track_free);
+
+ g_slist_free_full
+ (video_list, (GDestroyNotify)track_free);
+
+ g_slist_free_full
+ (sub_list, (GDestroyNotify)track_free);
+ }
+
+ if(mpv_get_property( ctx->mpv_ctx,
"playlist-pos",
MPV_FORMAT_INT64,
&playlist_pos) >= 0)
@@ -697,8 +952,12 @@ gint mpv_apply_args(mpv_handle *mpv_ctx, gchar *args)
token_arg = "";
}
+ /* Ignore --autofit since it triggers weird behavior in mpv when
+ * running on Wayland and opengl-cb is disabled
+ */
+ if(g_strcmp0(token, "autofit") != 0
/* Failing to apply extra options is non-fatal */
- if(mpv_set_option_string(mpv_ctx, token, token_arg) < 0)
+ && mpv_set_option_string(mpv_ctx, token, token_arg) < 0)
{
fail_count++;
@@ -722,14 +981,12 @@ gint mpv_apply_args(mpv_handle *mpv_ctx, gchar *args)
void mpv_init(gmpv_handle *ctx)
{
+ GSettings *settings = g_settings_new(CONFIG_WIN_STATE);
+ gdouble volume = g_settings_get_double(settings, "volume")*100;
gboolean mpvconf_enable = FALSE;
gchar *config_dir = get_config_dir_path();
gchar *mpvconf = NULL;
gchar *mpvopt = NULL;
- gchar *screenshot_template = NULL;
-
- screenshot_template
- = g_build_filename(g_get_home_dir(), "screenshot-%n", NULL);
/* Set default options */
mpv_check_error(mpv_set_option_string(ctx->mpv_ctx, "osd-level", "1"));
@@ -748,6 +1005,10 @@ void mpv_init(gmpv_handle *ctx)
"${media-title}" ));
mpv_check_error(mpv_set_option_string( ctx->mpv_ctx,
+ "pause",
+ "yes" ));
+
+ mpv_check_error(mpv_set_option_string( ctx->mpv_ctx,
"ytdl",
"yes" ));
@@ -768,12 +1029,17 @@ void mpv_init(gmpv_handle *ctx)
"yes" ));
mpv_check_error(mpv_set_option_string( ctx->mpv_ctx,
+ "screenshot-template",
+ "gnome-mpv-shot%n" ));
+
+ mpv_check_error(mpv_set_option_string( ctx->mpv_ctx,
"config-dir",
config_dir ));
- mpv_check_error(mpv_set_option_string( ctx->mpv_ctx,
- "screenshot-template",
- screenshot_template ));
+ mpv_check_error(mpv_set_option( ctx->mpv_ctx,
+ "volume",
+ MPV_FORMAT_DOUBLE,
+ &volume ));
if(!main_window_get_use_opengl(ctx->gui))
{
@@ -841,10 +1107,10 @@ void mpv_init(gmpv_handle *ctx)
opengl_callback,
ctx );
+ g_clear_object(&settings);
g_free(config_dir);
g_free(mpvconf);
g_free(mpvopt);
- g_free(screenshot_template);
}
void mpv_quit(gmpv_handle *ctx)
@@ -852,8 +1118,7 @@ void mpv_quit(gmpv_handle *ctx)
if(gtk_widget_get_realized(ctx->gui->vid_area)
&& main_window_get_use_opengl(ctx->gui))
{
- gtk_gl_area_make_current(GTK_GL_AREA(ctx->gui->vid_area));
- mpv_opengl_cb_uninit_gl(ctx->opengl_ctx);
+ uninit_opengl_cb(ctx);
ctx->opengl_ready = FALSE;
}
diff --git a/src/open_loc_dialog.c b/src/open_loc_dialog.c
index 0259cfb..c858c50 100644
--- a/src/open_loc_dialog.c
+++ b/src/open_loc_dialog.c
@@ -20,6 +20,7 @@
#include <glib/gi18n.h>
#include "open_loc_dialog.h"
+#include "main_window.h"
struct _OpenLocDialog
{
@@ -71,7 +72,7 @@ static void open_loc_dialog_init(OpenLocDialog *dlg)
geom.max_width = G_MAXINT;
geom.max_height = 0;
- dlg->content_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ dlg->content_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
dlg->content_area = gtk_dialog_get_content_area(GTK_DIALOG(dlg));
dlg->loc_label = gtk_label_new(_("Location:"));
dlg->loc_entry = gtk_entry_new();
@@ -90,7 +91,12 @@ static void open_loc_dialog_init(OpenLocDialog *dlg)
gtk_window_set_modal(GTK_WINDOW(dlg), 1);
gtk_window_set_title(GTK_WINDOW(dlg), _("Open Location"));
- gtk_container_set_border_width(GTK_CONTAINER(dlg->content_box), 5);
+ gtk_container_set_border_width(GTK_CONTAINER(dlg->content_area), 12);
+
+ if(!gtk_dialog_get_header_bar(GTK_DIALOG(dlg)))
+ {
+ gtk_widget_set_margin_bottom(dlg->content_box, 6);
+ }
gtk_window_set_geometry_hints( GTK_WINDOW(dlg),
GTK_WIDGET(dlg),
@@ -110,11 +116,40 @@ static void open_loc_dialog_init(OpenLocDialog *dlg)
TRUE,
TRUE,
0 );
+
+ gtk_window_set_default_size(GTK_WINDOW(dlg), 350, -1);
+ gtk_dialog_set_default_response (GTK_DIALOG(dlg), GTK_RESPONSE_ACCEPT);
}
GtkWidget *open_loc_dialog_new(GtkWindow *parent)
{
- GtkWidget *dlg = g_object_new(open_loc_dialog_get_type(), NULL);
+ GtkWidget *dlg;
+ GtkWidget *header_bar;
+ gboolean csd_enabled;
+
+ csd_enabled = main_window_get_csd_enabled(MAIN_WINDOW(parent));
+
+ dlg = g_object_new( open_loc_dialog_get_type(),
+ "use-header-bar", csd_enabled,
+ NULL );
+
+ header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(dlg));
+
+ if(header_bar)
+ {
+ GtkWidget *cancel_btn = gtk_dialog_get_widget_for_response
+ (GTK_DIALOG(dlg), GTK_RESPONSE_REJECT);
+
+ gtk_container_child_set( GTK_CONTAINER(header_bar),
+ cancel_btn,
+ "pack-type",
+ GTK_PACK_START,
+ NULL );
+
+ gtk_header_bar_set_show_close_button
+ (GTK_HEADER_BAR(header_bar), FALSE);
+
+ }
gtk_widget_hide_on_delete(dlg);
gtk_window_set_transient_for(GTK_WINDOW(dlg), parent);
diff --git a/src/playlist_widget.c b/src/playlist_widget.c
index 1bdb6df..b73bb2e 100644
--- a/src/playlist_widget.c
+++ b/src/playlist_widget.c
@@ -23,6 +23,43 @@
G_DEFINE_TYPE(PlaylistWidget, playlist_widget, GTK_TYPE_SCROLLED_WINDOW)
+static gboolean mouse_press_handler( GtkWidget *widget,
+ GdkEvent *event,
+ gpointer data )
+{
+ GdkEventButton *btn_event = (GdkEventButton *)event;
+ gboolean handled;
+
+ handled = ( btn_event->type == GDK_BUTTON_PRESS &&
+ btn_event->button == 3 );
+
+ if(handled)
+ {
+ GMenu *menu;
+ GMenuItem *add_menu_item;
+ GMenuItem *loop_menu_item;
+ GtkWidget *ctx_menu;
+
+ menu = g_menu_new();
+ add_menu_item = g_menu_item_new(_("_Add…"), "app.open(true)");
+ loop_menu_item = g_menu_item_new(_("Loop"), "app.loop");
+
+ g_menu_append_item(menu, add_menu_item);
+ g_menu_append_item(menu, loop_menu_item);
+ g_menu_freeze(menu);
+
+ ctx_menu = gtk_menu_new_from_model(G_MENU_MODEL(menu));
+
+ gtk_menu_attach_to_widget(GTK_MENU(ctx_menu), widget, NULL);
+ gtk_widget_show_all(ctx_menu);
+
+ gtk_menu_popup( GTK_MENU(ctx_menu), NULL, NULL, NULL, NULL,
+ btn_event->button, btn_event->time );
+ }
+
+ return handled;
+}
+
static void playlist_widget_class_init(PlaylistWidgetClass *klass)
{
}
@@ -52,6 +89,11 @@ static void playlist_widget_init(PlaylistWidget *wgt)
= gtk_tree_view_column_new_with_attributes
(_("Playlist"), wgt->title_renderer, "text", 1, NULL);
+ g_signal_connect( wgt->tree_view,
+ "button-press-event",
+ G_CALLBACK(mouse_press_handler),
+ NULL );
+
gtk_widget_set_can_focus(GTK_WIDGET(wgt->tree_view), FALSE);
gtk_tree_view_set_reorderable(GTK_TREE_VIEW(wgt->tree_view), TRUE);
diff --git a/src/pref_dialog.c b/src/pref_dialog.c
index e297b4a..43c9175 100644
--- a/src/pref_dialog.c
+++ b/src/pref_dialog.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2015 gnome-mpv
+ * Copyright (c) 2014-2016 gnome-mpv
*
* This file is part of GNOME MPV.
*
@@ -22,18 +22,37 @@
#include "pref_dialog.h"
#include "main_window.h"
+#define TOGGLE_BTN_PREF_MAP(VAR, DLG, PREF) \
+const struct \
+{ \
+ GtkToggleButton *btn; \
+ gboolean *value; \
+} \
+VAR[] = { {GTK_TOGGLE_BUTTON(DLG->csd_enable_check), \
+ &PREF->csd_enable}, \
+ {GTK_TOGGLE_BUTTON(DLG->dark_theme_enable_check), \
+ &PREF->dark_theme_enable}, \
+ {GTK_TOGGLE_BUTTON(DLG->last_folder_enable_check), \
+ &PREF->last_folder_enable}, \
+ {GTK_TOGGLE_BUTTON(DLG->mpv_input_enable_check), \
+ &PREF->mpv_input_config_enable}, \
+ {GTK_TOGGLE_BUTTON(DLG->mpv_conf_enable_check), \
+ &PREF->mpv_config_enable}, \
+ {NULL, NULL} };
+
struct _PrefDialog
{
GtkDialog parent_instance;
GtkWidget *grid;
GtkWidget *content_area;
- GtkWidget *dark_theme_enable_check;
GtkWidget *csd_enable_check;
- GtkWidget *mpvinput_enable_check;
- GtkWidget *mpvinput_button;
- GtkWidget *mpvconf_enable_check;
- GtkWidget *mpvconf_button;
- GtkWidget *mpvopt_entry;
+ GtkWidget *dark_theme_enable_check;
+ GtkWidget *last_folder_enable_check;
+ GtkWidget *mpv_input_enable_check;
+ GtkWidget *mpv_input_button;
+ GtkWidget *mpv_conf_enable_check;
+ GtkWidget *mpv_conf_button;
+ GtkWidget *mpv_options_entry;
};
struct _PrefDialogClass
@@ -64,13 +83,18 @@ static gboolean key_press_handler(GtkWidget *widget, GdkEventKey *event)
return GTK_WIDGET_CLASS(pref_dialog_parent_class)->key_press_event (widget, event);
}
-static inline void set_margin_start(GtkWidget *widget, gint margin)
+static void pref_dialog_constructed(GObject *obj)
{
-#if GTK_CHECK_VERSION(3, 12, 0)
- gtk_widget_set_margin_start(widget, margin);
-#else
- gtk_widget_set_margin_left(widget, margin);
-#endif
+ gboolean csd_enabled;
+
+ g_object_get(obj, "use-header-bar", &csd_enabled, NULL);
+
+ if(!csd_enabled)
+ {
+ gtk_widget_set_margin_bottom(PREF_DIALOG(obj)->grid, 12);
+ }
+
+ G_OBJECT_CLASS(pref_dialog_parent_class)->constructed(obj);
}
static void pref_dialog_class_init(PrefDialogClass *klass)
@@ -78,26 +102,29 @@ static void pref_dialog_class_init(PrefDialogClass *klass)
GtkWidgetClass *wid_class = GTK_WIDGET_CLASS(klass);
wid_class->key_press_event = key_press_handler;
+ G_OBJECT_CLASS(wid_class)->constructed = pref_dialog_constructed;
}
static void pref_dialog_init(PrefDialog *dlg)
{
GdkGeometry geom;
- GtkWidget *mpvconf_label;
- GtkWidget *mpvinput_label;
- GtkWidget *mpvopt_label;
+ GtkWidget *mpv_conf_label;
+ GtkWidget *mpv_input_label;
+ GtkWidget *mpv_options_label;
GtkWidget *general_group_label;
- GtkWidget *mpvconf_group_label;
- GtkWidget *mpvinput_group_label;
+ GtkWidget *mpv_conf_group_label;
+ GtkWidget *mpv_input_group_label;
GtkWidget *misc_group_label;
+ gint grid_row;
- mpvconf_label = gtk_label_new(_("MPV configuration file:"));
- mpvinput_label = gtk_label_new(_("MPV input configuration file:"));
- mpvopt_label = gtk_label_new(_("Extra MPV options:"));
+ mpv_conf_label = gtk_label_new(_("MPV configuration file:"));
+ mpv_input_label = gtk_label_new(_("MPV input configuration file:"));
+ mpv_options_label = gtk_label_new(_("Extra MPV options:"));
general_group_label = gtk_label_new(_("<b>General</b>"));
- mpvconf_group_label = gtk_label_new(_("<b>MPV Configuration</b>"));
- mpvinput_group_label = gtk_label_new(_("<b>Keybindings</b>"));
+ mpv_conf_group_label = gtk_label_new(_("<b>MPV Configuration</b>"));
+ mpv_input_group_label = gtk_label_new(_("<b>Keybindings</b>"));
misc_group_label = gtk_label_new(_("<b>Miscellaneous</b>"));
+ grid_row = 0;
/* This 'locks' the height of the dialog while allowing the width to be
* freely adjusted.
@@ -107,120 +134,144 @@ static void pref_dialog_init(PrefDialog *dlg)
dlg->grid = gtk_grid_new();
dlg->content_area = gtk_dialog_get_content_area(GTK_DIALOG(dlg));
- dlg->mpvopt_entry = gtk_entry_new();
+ dlg->mpv_options_entry = gtk_entry_new();
dlg->csd_enable_check
= gtk_check_button_new_with_label
(_("Enable client-side decorations"));
dlg->dark_theme_enable_check
- = gtk_check_button_new_with_label(_("Enable dark theme"));
+ = gtk_check_button_new_with_label
+ (_("Enable dark theme"));
- dlg->mpvconf_button
- = gtk_file_chooser_button_new( _("MPV configuration file"),
- GTK_FILE_CHOOSER_ACTION_OPEN );
+ dlg->last_folder_enable_check
+ = gtk_check_button_new_with_label
+ (_("Remember last file's location"));
+
+ dlg->mpv_conf_button
+ = gtk_file_chooser_button_new
+ ( _("MPV configuration file"),
+ GTK_FILE_CHOOSER_ACTION_OPEN );
- dlg->mpvinput_button
+ dlg->mpv_input_button
= gtk_file_chooser_button_new
( _("MPV input configuration file"),
GTK_FILE_CHOOSER_ACTION_OPEN );
- dlg->mpvconf_enable_check
+ dlg->mpv_conf_enable_check
= gtk_check_button_new_with_label
(_("Load MPV configuration file"));
- dlg->mpvinput_enable_check
+ dlg->mpv_input_enable_check
= gtk_check_button_new_with_label
(_("Load MPV input configuration file"));
gtk_label_set_use_markup(GTK_LABEL(general_group_label), TRUE);
- gtk_label_set_use_markup(GTK_LABEL(mpvconf_group_label), TRUE);
- gtk_label_set_use_markup(GTK_LABEL(mpvinput_group_label), TRUE);
+ gtk_label_set_use_markup(GTK_LABEL(mpv_conf_group_label), TRUE);
+ gtk_label_set_use_markup(GTK_LABEL(mpv_input_group_label), TRUE);
gtk_label_set_use_markup(GTK_LABEL(misc_group_label), TRUE);
- gtk_widget_set_margin_top(mpvconf_group_label, 10);
- gtk_widget_set_margin_top(mpvinput_group_label, 10);
- gtk_widget_set_margin_top(misc_group_label, 10);
- gtk_widget_set_margin_bottom(dlg->grid, 5);
- gtk_grid_set_row_spacing(GTK_GRID(dlg->grid), 5);
- gtk_grid_set_column_spacing(GTK_GRID(dlg->grid), 5);
+ gtk_widget_set_margin_top(mpv_conf_group_label, 12);
+ gtk_widget_set_margin_top(mpv_input_group_label, 12);
+ gtk_widget_set_margin_top(misc_group_label, 12);
+ gtk_grid_set_row_spacing(GTK_GRID(dlg->grid), 6);
+ gtk_grid_set_column_spacing(GTK_GRID(dlg->grid), 12);
- gtk_widget_set_halign(mpvconf_label, GTK_ALIGN_START);
- gtk_widget_set_halign(mpvinput_label, GTK_ALIGN_START);
- gtk_widget_set_halign(mpvopt_label, GTK_ALIGN_START);
+ gtk_widget_set_halign(mpv_conf_label, GTK_ALIGN_START);
+ gtk_widget_set_halign(mpv_input_label, GTK_ALIGN_START);
+ gtk_widget_set_halign(mpv_options_label, GTK_ALIGN_START);
gtk_widget_set_halign(general_group_label, GTK_ALIGN_START);
- gtk_widget_set_halign(mpvconf_group_label, GTK_ALIGN_START);
- gtk_widget_set_halign(mpvinput_group_label, GTK_ALIGN_START);
+ gtk_widget_set_halign(mpv_conf_group_label, GTK_ALIGN_START);
+ gtk_widget_set_halign(mpv_input_group_label, GTK_ALIGN_START);
gtk_widget_set_halign(misc_group_label, GTK_ALIGN_START);
- gtk_widget_set_hexpand(mpvconf_label, FALSE);
- gtk_widget_set_hexpand(mpvinput_label, FALSE);
- gtk_widget_set_hexpand(mpvopt_label, FALSE);
- gtk_widget_set_hexpand(dlg->mpvconf_button, TRUE);
- gtk_widget_set_hexpand(dlg->mpvinput_button, TRUE);
- gtk_widget_set_hexpand(dlg->mpvopt_entry, TRUE);
-
- set_margin_start(mpvconf_label, 10);
- set_margin_start(mpvinput_label, 10);
- set_margin_start(mpvopt_label, 10);
- set_margin_start(dlg->csd_enable_check, 10);
- set_margin_start(dlg->dark_theme_enable_check, 10);
- set_margin_start(dlg->mpvconf_enable_check, 10);
- set_margin_start(dlg->mpvinput_enable_check, 10);
- set_margin_start(dlg->mpvopt_entry, 10);
-
- gtk_widget_set_size_request(dlg->mpvconf_button, 100, -1);
- gtk_widget_set_size_request(dlg->mpvinput_button, 100, -1);
+ gtk_widget_set_hexpand(mpv_conf_label, FALSE);
+ gtk_widget_set_hexpand(mpv_input_label, FALSE);
+ gtk_widget_set_hexpand(mpv_options_label, FALSE);
+ gtk_widget_set_hexpand(dlg->mpv_conf_button, TRUE);
+ gtk_widget_set_hexpand(dlg->mpv_input_button, TRUE);
+ gtk_widget_set_hexpand(dlg->mpv_options_entry, TRUE);
+
+ gtk_widget_set_margin_start(mpv_conf_label, 12);
+ gtk_widget_set_margin_start(mpv_input_label, 12);
+ gtk_widget_set_margin_start(mpv_options_label, 12);
+ gtk_widget_set_margin_start(dlg->csd_enable_check, 12);
+ gtk_widget_set_margin_start(dlg->dark_theme_enable_check, 12);
+ gtk_widget_set_margin_start(dlg->last_folder_enable_check, 12);
+ gtk_widget_set_margin_start(dlg->mpv_conf_enable_check, 12);
+ gtk_widget_set_margin_start(dlg->mpv_input_enable_check, 12);
+ gtk_widget_set_margin_start(dlg->mpv_options_entry, 12);
+
+ gtk_widget_set_size_request(dlg->mpv_conf_button, 100, -1);
+ gtk_widget_set_size_request(dlg->mpv_input_button, 100, -1);
gtk_window_set_geometry_hints( GTK_WINDOW(dlg),
GTK_WIDGET(dlg),
&geom,
GDK_HINT_MAX_SIZE );
- gtk_container_set_border_width(GTK_CONTAINER(dlg->content_area), 5);
+ gtk_container_set_border_width(GTK_CONTAINER(dlg->content_area), 12);
gtk_container_add(GTK_CONTAINER(dlg->content_area), dlg->grid);
- gtk_grid_attach
- (GTK_GRID(dlg->grid), general_group_label, 0, 0, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ general_group_label,
+ 0, grid_row++, 1, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), dlg->csd_enable_check, 0, 1, 2, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ dlg->csd_enable_check,
+ 0, grid_row++, 2, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), dlg->dark_theme_enable_check, 0, 2, 2, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ dlg->dark_theme_enable_check,
+ 0, grid_row++, 2, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), mpvconf_group_label, 0, 3, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ dlg->last_folder_enable_check,
+ 0, grid_row++, 2, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), dlg->mpvconf_enable_check, 0, 4, 2, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ mpv_conf_group_label,
+ 0, grid_row++, 1, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), mpvconf_label, 0, 5, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ dlg->mpv_conf_enable_check,
+ 0, grid_row++, 2, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), dlg->mpvconf_button, 1, 5, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ mpv_conf_label,
+ 0, grid_row, 1, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), mpvinput_group_label, 0, 6, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ dlg->mpv_conf_button,
+ 1, grid_row++, 1, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), dlg->mpvinput_enable_check, 0, 7, 2, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ mpv_input_group_label,
+ 0, grid_row++, 1, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), mpvinput_label, 0, 8, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ dlg->mpv_input_enable_check,
+ 0, grid_row++, 2, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), dlg->mpvinput_button, 1, 8, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ mpv_input_label,
+ 0, grid_row, 1, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), misc_group_label, 0, 9, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ dlg->mpv_input_button,
+ 1, grid_row++, 1, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), mpvopt_label, 0, 10, 1, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ misc_group_label,
+ 0, grid_row++, 1, 1 );
- gtk_grid_attach
- (GTK_GRID(dlg->grid), dlg->mpvopt_entry, 0, 11, 2, 1);
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ mpv_options_label,
+ 0, grid_row++, 1, 1 );
+
+ gtk_grid_attach( GTK_GRID(dlg->grid),
+ dlg->mpv_options_entry,
+ 0, grid_row++, 2, 1 );
gtk_dialog_add_buttons( GTK_DIALOG(dlg),
_("_Cancel"),
@@ -249,10 +300,7 @@ GtkWidget *pref_dialog_new(GtkWindow *parent)
header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(dlg));
- gtk_widget_hide_on_delete (dlg);
- gtk_widget_show_all (dlg);
-
- if (header_bar)
+ if(header_bar)
{
/* The defaults use PACK_END which is ugly with multiple buttons
*/
@@ -269,110 +317,59 @@ GtkWidget *pref_dialog_new(GtkWindow *parent)
(GTK_HEADER_BAR(header_bar), FALSE);
}
- return dlg;
-}
-
-void pref_dialog_set_dark_theme_enable(PrefDialog *dlg, gboolean value)
-{
- GtkToggleButton *button
- = GTK_TOGGLE_BUTTON(dlg->dark_theme_enable_check);
-
- gtk_toggle_button_set_active(button, value);
-}
-
-gboolean pref_dialog_get_dark_theme_enable(PrefDialog *dlg)
-{
- GtkToggleButton *button
- = GTK_TOGGLE_BUTTON(dlg->dark_theme_enable_check);
-
- return gtk_toggle_button_get_active(button);
-}
-
-void pref_dialog_set_csd_enable(PrefDialog *dlg, gboolean value)
-{
- GtkToggleButton *button = GTK_TOGGLE_BUTTON(dlg->csd_enable_check);
-
- gtk_toggle_button_set_active(button, value);
-}
-
-gboolean pref_dialog_get_csd_enable(PrefDialog *dlg)
-{
- GtkToggleButton *button = GTK_TOGGLE_BUTTON(dlg->csd_enable_check);
-
- return gtk_toggle_button_get_active(button);
-}
-
-void pref_dialog_set_mpvconf_enable(PrefDialog *dlg, gboolean value)
-{
- GtkToggleButton *button = GTK_TOGGLE_BUTTON(dlg->mpvconf_enable_check);
+ gtk_widget_hide_on_delete(dlg);
+ gtk_widget_show_all(dlg);
- gtk_toggle_button_set_active(button, value);
+ return dlg;
}
-gboolean pref_dialog_get_mpvconf_enable(PrefDialog *dlg)
+pref_store *pref_dialog_get_pref(PrefDialog *dlg)
{
- GtkToggleButton *button = GTK_TOGGLE_BUTTON(dlg->mpvconf_enable_check);
+ pref_store *pref = g_malloc(sizeof(pref_store));
+ GtkFileChooser *conf_chooser = GTK_FILE_CHOOSER(dlg->mpv_conf_button);
+ GtkFileChooser *input_chooser = GTK_FILE_CHOOSER(dlg->mpv_input_button);
+ GtkEntry *mpv_options_entry = GTK_ENTRY(dlg->mpv_options_entry);
- return gtk_toggle_button_get_active(button);
-}
+ TOGGLE_BTN_PREF_MAP(toggle_btn, dlg, pref)
-void pref_dialog_set_mpvconf(PrefDialog *dlg, const gchar *buffer)
-{
- GtkFileChooser *chooser = GTK_FILE_CHOOSER(dlg->mpvconf_button);
-
- if(buffer)
+ for(gint i = 0; toggle_btn[i].btn; i++)
{
- gtk_file_chooser_set_filename(chooser, buffer);
+ *(toggle_btn[i].value)
+ = gtk_toggle_button_get_active(toggle_btn[i].btn);
}
-}
-gchar *pref_dialog_get_mpvconf(PrefDialog *dlg)
-{
- GtkFileChooser *chooser = GTK_FILE_CHOOSER(dlg->mpvconf_button);
+ pref->mpv_config_file
+ = gtk_file_chooser_get_filename(conf_chooser);
- return gtk_file_chooser_get_filename(chooser);
-}
+ pref->mpv_input_config_file
+ = gtk_file_chooser_get_filename(input_chooser);
-void pref_dialog_set_mpvinput_enable(PrefDialog *dlg, gboolean value)
-{
- GtkToggleButton *button = GTK_TOGGLE_BUTTON(dlg->mpvinput_enable_check);
+ pref->mpv_options
+ = g_strdup(gtk_entry_get_text(mpv_options_entry));
- gtk_toggle_button_set_active(button, value);
+ return pref;
}
-gboolean pref_dialog_get_mpvinput_enable(PrefDialog *dlg)
+void pref_dialog_set_pref(PrefDialog *dlg, pref_store *pref)
{
- GtkToggleButton *button = GTK_TOGGLE_BUTTON(dlg->mpvinput_enable_check);
+ GtkFileChooser *conf_chooser = GTK_FILE_CHOOSER(dlg->mpv_conf_button);
+ GtkFileChooser *input_chooser = GTK_FILE_CHOOSER(dlg->mpv_input_button);
+ GtkEntry *mpv_options_entry = GTK_ENTRY(dlg->mpv_options_entry);
- return gtk_toggle_button_get_active(button);
-}
+ TOGGLE_BTN_PREF_MAP(toggle_btn, dlg, pref)
-void pref_dialog_set_mpvinput(PrefDialog *dlg, const gchar *buffer)
-{
- GtkFileChooser *chooser = GTK_FILE_CHOOSER(dlg->mpvinput_button);
-
- if(buffer)
+ for(gint i = 0; toggle_btn[i].btn; i++)
{
- gtk_file_chooser_set_filename(chooser, buffer);
+ gtk_toggle_button_set_active
+ (toggle_btn[i].btn, *(toggle_btn[i].value));
}
-}
-
-gchar *pref_dialog_get_mpvinput(PrefDialog *dlg)
-{
- GtkFileChooser *chooser = GTK_FILE_CHOOSER(dlg->mpvinput_button);
- return gtk_file_chooser_get_filename(chooser);
-}
+ gtk_file_chooser_set_filename
+ (conf_chooser, pref->mpv_config_file);
-void pref_dialog_set_mpvopt(PrefDialog *dlg, gchar *buffer)
-{
- if(buffer)
- {
- gtk_entry_set_text(GTK_ENTRY(dlg->mpvopt_entry), buffer);
- }
-}
+ gtk_file_chooser_set_filename
+ (input_chooser, pref->mpv_input_config_file);
-const gchar *pref_dialog_get_mpvopt(PrefDialog *dlg)
-{
- return gtk_entry_get_text(GTK_ENTRY(dlg->mpvopt_entry));
+ gtk_entry_set_text
+ (mpv_options_entry, pref->mpv_options);
}
diff --git a/src/pref_dialog.h b/src/pref_dialog.h
index acdb609..38d81be 100644
--- a/src/pref_dialog.h
+++ b/src/pref_dialog.h
@@ -22,6 +22,8 @@
#include <gtk/gtk.h>
+#include "pref_store.h"
+
G_BEGIN_DECLS
#define PREF_DIALOG_TYPE (pref_dialog_get_type ())
@@ -43,20 +45,8 @@ typedef struct _PrefDialogClass PrefDialogClass;
GtkWidget *pref_dialog_new(GtkWindow *parent);
GType pref_dialog_get_type(void);
-void pref_dialog_set_dark_theme_enable(PrefDialog *dlg, gboolean value);
-gboolean pref_dialog_get_dark_theme_enable(PrefDialog *dlg);
-void pref_dialog_set_csd_enable(PrefDialog *dlg, gboolean value);
-gboolean pref_dialog_get_csd_enable(PrefDialog *dlg);
-void pref_dialog_set_mpvconf_enable(PrefDialog *dlg, gboolean value);
-gboolean pref_dialog_get_mpvconf_enable(PrefDialog *dlg);
-void pref_dialog_set_mpvconf(PrefDialog *dlg, const gchar *buffer);
-gchar *pref_dialog_get_mpvconf(PrefDialog *dlg);
-void pref_dialog_set_mpvinput_enable(PrefDialog *dlg, gboolean value);
-gboolean pref_dialog_get_mpvinput_enable(PrefDialog *dlg);
-void pref_dialog_set_mpvinput(PrefDialog *dlg, const gchar *buffer);
-gchar *pref_dialog_get_mpvinput(PrefDialog *dlg);
-void pref_dialog_set_mpvopt(PrefDialog *dlg, gchar *buffer);
-const gchar *pref_dialog_get_mpvopt(PrefDialog *dlg);
+pref_store *pref_dialog_get_pref(PrefDialog *dlg);
+void pref_dialog_set_pref(PrefDialog *dlg, pref_store *pref);
G_END_DECLS
diff --git a/src/media_keys/media_keys.h b/src/pref_store.c
similarity index 53%
copy from src/media_keys/media_keys.h
copy to src/pref_store.c
index 4e8a88e..39a731a 100644
--- a/src/media_keys/media_keys.h
+++ b/src/pref_store.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 gnome-mpv
+ * Copyright (c) 2015-2016 gnome-mpv
*
* This file is part of GNOME MPV.
*
@@ -17,22 +17,31 @@
* along with GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef MEDIA_KEYS_H
-#define MEDIA_KEYS_H
+#include "pref_store.h"
-#include "common.h"
-
-typedef struct media_keys media_keys;
-
-struct media_keys
+pref_store *pref_store_new()
{
- gmpv_handle *gmpv_ctx;
- gulong g_signal_sig_id;
- gulong shutdown_sig_id;
- GDBusProxy *proxy;
- GDBusConnection *session_bus_conn;
-};
+ pref_store *pref = g_malloc(sizeof(pref_store));
-void media_keys_init(gmpv_handle *gmpv_ctx);
+ pref->dark_theme_enable = TRUE;
+ pref->csd_enable = TRUE;
+ pref->last_folder_enable = FALSE;
+ pref->mpv_input_config_enable = FALSE;
+ pref->mpv_config_enable = FALSE;
+ pref->mpv_input_config_file = NULL;
+ pref->mpv_config_file = NULL;
+ pref->mpv_options = NULL;
-#endif
+ return pref;
+}
+
+void pref_store_free(pref_store *pref)
+{
+ if(pref)
+ {
+ g_free(pref->mpv_input_config_file);
+ g_free(pref->mpv_config_file);
+ g_free(pref->mpv_options);
+ g_free(pref);
+ }
+}
diff --git a/src/media_keys/media_keys.h b/src/pref_store.h
similarity index 61%
copy from src/media_keys/media_keys.h
copy to src/pref_store.h
index 4e8a88e..7b596ee 100644
--- a/src/media_keys/media_keys.h
+++ b/src/pref_store.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 gnome-mpv
+ * Copyright (c) 2015-2016 gnome-mpv
*
* This file is part of GNOME MPV.
*
@@ -17,22 +17,26 @@
* along with GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef MEDIA_KEYS_H
-#define MEDIA_KEYS_H
+#ifndef PREF_H
+#define PREF_H
-#include "common.h"
+#include <glib.h>
-typedef struct media_keys media_keys;
-
-struct media_keys
+struct pref_store
{
- gmpv_handle *gmpv_ctx;
- gulong g_signal_sig_id;
- gulong shutdown_sig_id;
- GDBusProxy *proxy;
- GDBusConnection *session_bus_conn;
+ gboolean dark_theme_enable;
+ gboolean csd_enable;
+ gboolean last_folder_enable;
+ gboolean mpv_input_config_enable;
+ gboolean mpv_config_enable;
+ gchar *mpv_input_config_file;
+ gchar *mpv_config_file;
+ gchar *mpv_options;
};
-void media_keys_init(gmpv_handle *gmpv_ctx);
+typedef struct pref_store pref_store;
+
+pref_store *pref_store_new(void);
+void pref_store_free(pref_store *pref);
#endif
diff --git a/src/media_keys/media_keys.h b/src/track.c
similarity index 70%
copy from src/media_keys/media_keys.h
copy to src/track.c
index 4e8a88e..59ebaee 100644
--- a/src/media_keys/media_keys.h
+++ b/src/track.c
@@ -17,22 +17,26 @@
* along with GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef MEDIA_KEYS_H
-#define MEDIA_KEYS_H
+#include "track.h"
-#include "common.h"
-
-typedef struct media_keys media_keys;
-
-struct media_keys
+Track *track_new(void)
{
- gmpv_handle *gmpv_ctx;
- gulong g_signal_sig_id;
- gulong shutdown_sig_id;
- GDBusProxy *proxy;
- GDBusConnection *session_bus_conn;
-};
+ Track *entry = g_malloc(sizeof(Track));
-void media_keys_init(gmpv_handle *gmpv_ctx);
+ entry->type = TRACK_TYPE_INVALID;
+ entry->title = NULL;
+ entry->lang = NULL;
+ entry->id = 0;
-#endif
+ return entry;
+}
+
+void track_free(Track *entry)
+{
+ if(entry)
+ {
+ g_free(entry->title);
+ g_free(entry->lang);
+ g_free(entry);
+ }
+}
diff --git a/src/media_keys/media_keys.h b/src/track.h
similarity index 68%
copy from src/media_keys/media_keys.h
copy to src/track.h
index 4e8a88e..5ca9790 100644
--- a/src/media_keys/media_keys.h
+++ b/src/track.h
@@ -17,22 +17,31 @@
* along with GNOME MPV. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef MEDIA_KEYS_H
-#define MEDIA_KEYS_H
+#ifndef TRACK_H
+#define TRACK_H
-#include "common.h"
+#include <glib.h>
-typedef struct media_keys media_keys;
+typedef enum TrackType TrackType;
+typedef struct Track Track;
-struct media_keys
+enum TrackType
{
- gmpv_handle *gmpv_ctx;
- gulong g_signal_sig_id;
- gulong shutdown_sig_id;
- GDBusProxy *proxy;
- GDBusConnection *session_bus_conn;
+ TRACK_TYPE_INVALID,
+ TRACK_TYPE_AUDIO,
+ TRACK_TYPE_VIDEO,
+ TRACK_TYPE_SUBTITLE
};
-void media_keys_init(gmpv_handle *gmpv_ctx);
+struct Track
+{
+ TrackType type;
+ gint64 id;
+ gchar *title;
+ gchar *lang;
+};
+
+Track *track_new(void);
+void track_free(Track *entry);
#endif
diff --git a/zanata.xml b/zanata.xml
new file mode 100644
index 0000000..fbd6457
--- /dev/null
+++ b/zanata.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<config xmlns="http://zanata.org/namespace/config/">
+ <url>https://translate.zanata.org/zanata/</url>
+ <project>gnome-mpv</project>
+ <project-version>master</project-version>
+ <project-type>gettext</project-type>
+ <src-dir>po</src-dir>
+ <trans-dir>po</trans-dir>
+</config>
--
gnome-mpv packaging
More information about the pkg-multimedia-commits
mailing list