[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