[135031] trunk/dports/multimedia
ionic at macports.org
ionic at macports.org
Mon Apr 13 09:24:21 PDT 2015
Revision: 135031
https://trac.macports.org/changeset/135031
Author: ionic at macports.org
Date: 2015-04-13 09:24:21 -0700 (Mon, 13 Apr 2015)
Log Message:
-----------
audacious{,-{core,plugins}}: update to 3.6.1. Also:
- Upstream now uses C++11. Insert abomination to make that work on
10.6+.
- Re-do patches. Replace -std=gnu++11 with -std=c++11 to not pull in
libstdc++ unnecessarily.
- Require either gtk2 or gtk3, but make gtk2 preferred.
- Drop universal variant.
- Add optional Qt5 support.
- Drop libsdl patch for audacious-plugins. Merged upstream.
- Enable cdaudio variant now that libcdio-paranoia is ported.
- Enable cdaudio by default.
- Use MacPorts-provided libxml2.
- Remove deleted configure flags.
- Enable coreaudio output plugin by default. May not work on 10.6.
- Add mac-media-keys as disabled, as it's currently broken.
Modified Paths:
--------------
trunk/dports/multimedia/audacious/Portfile
trunk/dports/multimedia/audacious-core/Portfile
trunk/dports/multimedia/audacious-core/files/patch-buildsys.diff
trunk/dports/multimedia/audacious-plugins/Portfile
trunk/dports/multimedia/audacious-plugins/files/patch-buildsys.diff
Added Paths:
-----------
trunk/dports/multimedia/audacious-core/files/patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff
trunk/dports/multimedia/audacious-core/files/patch-gtk3.diff
trunk/dports/multimedia/audacious-plugins/files/patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff
trunk/dports/multimedia/audacious-plugins/files/patch-gtk3.diff
Removed Paths:
-------------
trunk/dports/multimedia/audacious-plugins/files/patch-configure.ac-select-libsdl.diff
Modified: trunk/dports/multimedia/audacious/Portfile
===================================================================
--- trunk/dports/multimedia/audacious/Portfile 2015-04-13 16:07:33 UTC (rev 135030)
+++ trunk/dports/multimedia/audacious/Portfile 2015-04-13 16:24:21 UTC (rev 135031)
@@ -6,7 +6,7 @@
name audacious
# Please keep audacious, audacious-core and audacious-plugins synchronized.
-version 3.5.2
+version 3.6.1
revision 0
license BSD GPL-2+
Modified: trunk/dports/multimedia/audacious-core/Portfile
===================================================================
--- trunk/dports/multimedia/audacious-core/Portfile 2015-04-13 16:07:33 UTC (rev 135030)
+++ trunk/dports/multimedia/audacious-core/Portfile 2015-04-13 16:24:21 UTC (rev 135031)
@@ -3,12 +3,13 @@
PortSystem 1.0
PortGroup conflicts_build 1.0
+PortGroup compiler_blacklist_versions 1.0
name audacious-core
set real_name audacious
# Please keep audacious, audacious-core and audacious-plugins synchronized.
-version 3.5.2
+version 3.6.1
revision 0
license BSD
@@ -31,12 +32,15 @@
master_sites http://distfiles.audacious-media-player.org
distname ${real_name}-${version}
use_bzip2 yes
-checksums rmd160 dd41e56544d9563b47401a670d96a34d7be920b6 \
- sha256 3915b9692ef8acb2588b0e26c2738e59e36766cfe83e7e52c0e601688e6c1956
+checksums rmd160 45efb8bd90e0c0529be6c4ce82952f300b422e90 \
+ sha256 85d1d5a80240f45c858bb25af6565c13d53e4b92882eb15fb2b18511fabf3de6
+universal_variant no
+
conflicts_build ${name}
-patchfiles patch-buildsys.diff
+patchfiles patch-buildsys.diff \
+ patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff
depends_build path:bin/pkg-config:pkgconfig \
path:bin/aclocal:automake \
@@ -45,8 +49,7 @@
depends_lib port:libiconv \
port:gettext \
path:lib/pkgconfig/dbus-1.pc:dbus \
- path:lib/pkgconfig/glib-2.0.pc:glib2 \
- path:lib/pkgconfig/gtk-3.0.pc:gtk3
+ path:lib/pkgconfig/glib-2.0.pc:glib2
# Note: rpath is required on Mac OS X.
configure.args --enable-nls \
@@ -59,17 +62,48 @@
autoreconf.cmd ./autogen.sh
autoreconf.args
+# A compiler supporting C++11 is required to build audacious and its plugins.
+# The newer, the merrier.
+# Compilers supporting C++11 are GCC >= 4.6 and clang >= 3.3.
+# We do not know what "cc" is, so blacklist it as well.
+compiler.blacklist-append {*gcc-4.[0-5]} {clang < 500} macports-clang-2.* \
+ {macports-clang-3.[0-2]} cc
+
platform darwin {
- if {${configure.cxx_stdlib} ne {} &&
- [string equal ${configure.cxx_stdlib} "libc++"]} {
- if {${os.major} > 10} {
- configure.ldflags-append "-mmacosx-version-min=10.7"
+ if {${os.major} >= 13} {
+ if {${configure.cxx_stdlib} ne {} &&
+ [string equal ${configure.cxx_stdlib} "libc++"]} {
+ # Blacklist all GCC compilers to not accidentally pull in libstdc++.
+ compiler.blacklist-append {*gcc*}
+
+ # Make sure binary runs on 10.9+ only.
+ configure.ldflags-append "-mmacosx-version-min=10.9"
} else {
- ui_error "libc++ is only supported on OS X 10.7 and up for this port."
- error "libc++ supported on >= 10.7 only."
+ ui_error "The system libraries in OS X 10.9 and higher use libc++. Thus, libstdc++ is not supported for this port."
+ error "libstdc++ supported on <= 10.8 only."
}
} else {
- configure.ldflags-append "-mmacosx-version-min=10.5"
+ if {${configure.cxx_stdlib} ne {} &&
+ [string equal ${configure.cxx_stdlib} "libc++"]} {
+ ui_error "The system libraries in OS X 10.8 and lower use libstdc++. Thus, libstdc++ is not supported for this port."
+ error "libc++ supported on >= 10.9 only."
+ } else {
+ # Shameless copy from rust.
+ depends_lib-append {path:lib/libstdc\\+\\+.6.dylib:libgcc}
+
+ # Force GCC 4.9.
+ compiler.blacklist-append {*clang*}
+ compiler.fallback-append macports-gcc-4.9
+
+ # Make sure binary runs on 10.5+ only.
+ configure.ldflags-append "-mmacosx-version-min=10.5"
+
+ notes-append {
+ Upstream for some reason requires libc++.
+ Your build will use libstdc++. The maintainer assumes this
+ to be OK, but you're on your own if stuff breaks.\
+ }
+ }
}
}
@@ -86,6 +120,39 @@
# --enable-chardet
#}
+variant qt5 description {Add Qt5 support} {
+ PortGroup qt5 1.0
+
+ configure.args-replace --disable-qt \
+ --enable-qt
+
+ notes-append {
+ Qt5 support is optional and untested.
+ If it breaks, you've got to keep the pieces.\
+ }
+}
+
+variant gtk2 conflicts gtk3 description {Add GTK2 support} {
+ depends_lib-append path:lib/pkgconfig/gtk-2.0.pc:gtk2
+
+ configure.args-replace --disable-gtk \
+ --enable-gtk
+}
+
+variant gtk3 conflicts gtk2 description {Add GTK3 support} {
+ depends_lib-append path:lib/pkgconfig/gtk-3.0.pc:gtk3
+
+ patchfiles-append patch-gtk3.diff
+
+ configure.args-replace --disable-gtk \
+ --enable-gtk
+}
+
+# Need either one of gtk2 or gtk3. Default to gtk2, which is preferred by upstream.
+if {![variant_isset gtk2] && ![variant_isset gtk3]} {
+ default_variants-append +gtk2
+}
+
livecheck.type regex
livecheck.url ${master_sites}
livecheck.regex "${real_name}-(\\d+(?:\\.\\d+)*)${extract.suffix}"
Added: trunk/dports/multimedia/audacious-core/files/patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff
===================================================================
--- trunk/dports/multimedia/audacious-core/files/patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff (rev 0)
+++ trunk/dports/multimedia/audacious-core/files/patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff 2015-04-13 16:24:21 UTC (rev 135031)
@@ -0,0 +1,22 @@
+--- acinclude.m4.orig
++++ acinclude.m4
+@@ -83,8 +83,8 @@ AC_REQUIRE([AC_SYS_LARGEFILE])
+ if test "x$GCC" = "xyes"; then
+ CFLAGS="$CFLAGS -std=gnu99 -ffast-math -Wall -pipe"
+ if test "x$HAVE_DARWIN" = "xyes"; then
+- CXXFLAGS="$CXXFLAGS -stdlib=libc++ -std=gnu++11 -ffast-math -Wall -pipe"
+- LDFLAGS="$LDFLAGS -lc++ -stdlib=libc++"
++ CXXFLAGS="$CXXFLAGS -std=c++11 -ffast-math -Wall -pipe"
++ LDFLAGS="$LDFLAGS"
+ else
+ CXXFLAGS="$CXXFLAGS -std=gnu++11 -ffast-math -Wall -pipe"
+ fi
+@@ -101,7 +101,7 @@ if test "x$HAVE_DARWIN" = "xyes"; then
+ AC_PROG_OBJCXX
+ AC_PROG_OBJCXXCPP
+
+- OBJCXXFLAGS="$OBJCXXFLAGS -stdlib=libc++ -std=c++11"
++ OBJCXXFLAGS="$OBJCXXFLAGS -std=c++11"
+ fi
+
+ dnl Enable "-Wl,-z,defs" only on Linux
Modified: trunk/dports/multimedia/audacious-core/files/patch-buildsys.diff
===================================================================
--- trunk/dports/multimedia/audacious-core/files/patch-buildsys.diff 2015-04-13 16:07:33 UTC (rev 135030)
+++ trunk/dports/multimedia/audacious-core/files/patch-buildsys.diff 2015-04-13 16:24:21 UTC (rev 135031)
@@ -1,4 +1,4 @@
---- buildsys.mk.in.old
+--- buildsys.mk.in.orig
+++ buildsys.mk.in
@@ -107,19 +107,24 @@ PLUGIN_OBJS = ${OBJS:.o=.plugin.o}
@@ -383,22 +383,23 @@
+
+.CURDIR ?= .
+include ${.CURDIR}/.deps
---- m4/buildsys.m4.old
+--- m4/buildsys.m4.orig
+++ m4/buildsys.m4
-@@ -109,14 +109,14 @@ AC_DEFUN([BUILDSYS_SHARED_LIB], [
+@@ -108,13 +108,13 @@ AC_DEFUN([BUILDSYS_SHARED_LIB], [
+ case "$host_os" in
darwin*)
AC_MSG_RESULT(Darwin)
- LIB_CFLAGS='-fPIC -DPIC'
-- LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR}'
+- LIB_CFLAGS='-fPIC -DPIC -mmacosx-version-min=10.7'
+- LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR} -mmacosx-version-min=10.7 -install_name "${libdir}/$$(i=${SHARED_LIB}; echo $${i%${LIB_SUFFIX}}).${LIB_MAJOR}${LIB_SUFFIX}"'
++ LIB_CFLAGS='-fPIC -DPIC'
+ LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR} -Wl,-install_name,${libdir}/$${out%.dylib}.${LIB_MAJOR}.dylib'
LIB_PREFIX='lib'
LIB_SUFFIX='.dylib'
LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CFLAGS='-fPIC -DPIC'
- PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup'
+- PLUGIN_CFLAGS='-fPIC -DPIC -mmacosx-version-min=10.7'
+- PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup -mmacosx-version-min=10.7'
++ PLUGIN_CFLAGS='-fPIC -DPIC'
++ PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup'
PLUGIN_SUFFIX='.bundle'
-- INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && install_name_tool -id ${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
-+ INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
+ INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib'
- CLEAN_LIB=''
- ;;
Added: trunk/dports/multimedia/audacious-core/files/patch-gtk3.diff
===================================================================
--- trunk/dports/multimedia/audacious-core/files/patch-gtk3.diff (rev 0)
+++ trunk/dports/multimedia/audacious-core/files/patch-gtk3.diff 2015-04-13 16:24:21 UTC (rev 135031)
@@ -0,0 +1,1009 @@
+--- acinclude.m4.old
++++ acinclude.m4
+@@ -164,7 +164,7 @@ AC_ARG_ENABLE(gtk,
+ USE_GTK=$enableval, USE_GTK=yes)
+
+ if test $USE_GTK = yes ; then
+- PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.24)
++ PKG_CHECK_MODULES(GTK, gtk+-3.0 >= 3.4)
+ AC_DEFINE(USE_GTK, 1, [Define if GTK+ support enabled])
+ fi
+
+--- src/libaudgui/about.cc.old
++++ src/libaudgui/about.cc
+@@ -72,7 +72,7 @@ static GtkWidget * create_about_window ()
+
+ audgui_destroy_on_escape (about_window);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_add ((GtkContainer *) about_window, vbox);
+
+ StringBuf logo_path = filename_build ({data_dir, "images", "about-logo.png"});
+@@ -84,11 +84,9 @@ static GtkWidget * create_about_window ()
+ gtk_label_set_justify ((GtkLabel *) label, GTK_JUSTIFY_CENTER);
+ gtk_box_pack_start ((GtkBox *) vbox, label, false, false, 0);
+
+- GtkWidget * align = gtk_alignment_new (0.5, 0.5, 0, 0);
+- gtk_box_pack_start ((GtkBox *) vbox, align, false, false, 0);
+-
+ GtkWidget * button = gtk_link_button_new (website);
+- gtk_container_add ((GtkContainer *) align, button);
++ gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
++ gtk_box_pack_start ((GtkBox *) vbox, button, false, false, 0);
+
+ char * credits, * license;
+
+--- src/libaudgui/equalizer.cc.old
++++ src/libaudgui/equalizer.cc
+@@ -63,13 +63,14 @@ static void slider_moved (GtkRange * slider)
+
+ static GtkWidget * create_slider (const char * name, int band, GtkWidget * hbox)
+ {
+- GtkWidget * vbox = gtk_vbox_new (false, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+
+ GtkWidget * label = gtk_label_new (name);
+ gtk_label_set_angle ((GtkLabel *) label, 90);
+ gtk_box_pack_start ((GtkBox *) vbox, label, true, false, 0);
+
+- GtkWidget * slider = gtk_vscale_new_with_range (-AUD_EQ_MAX_GAIN, AUD_EQ_MAX_GAIN, 1);
++ GtkWidget * slider = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL,
++ -AUD_EQ_MAX_GAIN, AUD_EQ_MAX_GAIN, 1);
+ gtk_scale_set_draw_value ((GtkScale *) slider, true);
+ gtk_scale_set_value_pos ((GtkScale *) slider, GTK_POS_BOTTOM);
+ gtk_range_set_inverted ((GtkRange *) slider, true);
+@@ -127,18 +128,19 @@ static GtkWidget * create_window ()
+ gtk_container_set_border_width ((GtkContainer *) window, 6);
+ audgui_destroy_on_escape (window);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_add ((GtkContainer *) window, vbox);
+
+ gtk_box_pack_start ((GtkBox *) vbox, create_on_off (), false, false, 0);
+
+- GtkWidget * hbox = gtk_hbox_new (false, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, false, false, 0);
+
+ GtkWidget * preamp = create_slider (_("Preamp"), -1, hbox);
+ g_object_set_data ((GObject *) window, "preamp", preamp);
+
+- gtk_box_pack_start ((GtkBox *) hbox, gtk_vseparator_new (), false, false, 0);
++ gtk_box_pack_start ((GtkBox *) hbox,
++ gtk_separator_new (GTK_ORIENTATION_VERTICAL), false, false, 0);
+
+ for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+ {
+--- src/libaudgui/file-opener.cc.old
++++ src/libaudgui/file-opener.cc
+@@ -96,9 +96,8 @@ static GtkWidget * create_filebrowser (gboolean open)
+ gtk_window_set_type_hint ((GtkWindow *) window, GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_window_set_title ((GtkWindow *) window, window_title);
+ gtk_window_set_default_size ((GtkWindow *) window, 700, 450);
+- gtk_container_set_border_width ((GtkContainer *) window, 10);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 0);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add ((GtkContainer *) window, vbox);
+
+ GtkWidget * chooser = gtk_file_chooser_widget_new (GTK_FILE_CHOOSER_ACTION_OPEN);
+@@ -108,17 +107,24 @@ static GtkWidget * create_filebrowser (gboolean open)
+ if (path[0])
+ gtk_file_chooser_set_current_folder ((GtkFileChooser *) chooser, path);
+
+- gtk_box_pack_start ((GtkBox *) vbox, chooser, true, true, 3);
++ gtk_box_pack_start ((GtkBox *) vbox, chooser, true, true, 0);
+
+- GtkWidget * hbox = gtk_hbox_new (false, 0);
+- gtk_box_pack_end ((GtkBox *) vbox, hbox, false, false, 3);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
++ gtk_box_pack_end ((GtkBox *) vbox, hbox, false, false, 0);
++
++#if GTK_CHECK_VERSION (3, 14, 0)
++ gtk_container_set_border_width ((GtkContainer *) hbox, 6);
++#else
++ gtk_widget_set_margin_top (hbox, 12);
++ gtk_container_set_border_width ((GtkContainer *) window, 12);
++#endif
+
+ GtkWidget * toggle = gtk_check_button_new_with_mnemonic (toggle_text);
+ gtk_toggle_button_set_active ((GtkToggleButton *) toggle, aud_get_bool ("audgui", option));
+ g_signal_connect (toggle, "toggled", (GCallback) toggled_cb, (void *) option);
+ gtk_box_pack_start ((GtkBox *) hbox, toggle, true, true, 0);
+
+- GtkWidget * bbox = gtk_hbutton_box_new ();
++ GtkWidget * bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_button_box_set_layout ((GtkButtonBox *) bbox, GTK_BUTTONBOX_END);
+ gtk_box_set_spacing ((GtkBox *) bbox, 6);
+ gtk_box_pack_end ((GtkBox *) hbox, bbox, true, true, 0);
+--- src/libaudgui/infopopup.cc.old
++++ src/libaudgui/infopopup.cc
+@@ -37,9 +37,6 @@
+
+ static void infopopup_move_to_mouse (GtkWidget * infopopup);
+
+-static const GdkColor gray = {0, 40960, 40960, 40960};
+-static const GdkColor white = {0, 65535, 65535, 65535};
+-
+ static struct {
+ GtkWidget * title_header, * title_label;
+ GtkWidget * artist_header, * artist_label;
+@@ -107,56 +104,21 @@ static gboolean infopopup_progress_cb (void *)
+ return true;
+ }
+
+-static void infopopup_realized (GtkWidget * widget)
+-{
+- GdkWindow * window = gtk_widget_get_window (widget);
+- gdk_window_set_back_pixmap (window, nullptr, false);
+- infopopup_move_to_mouse (widget);
+-}
+-
+-/* borrowed from the gtkui infoarea */
+-static gboolean infopopup_draw_bg (GtkWidget * widget)
+-{
+- GtkAllocation alloc;
+- gtk_widget_get_allocation (widget, & alloc);
+-
+- cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (widget));
+-
+- cairo_pattern_t * gradient = cairo_pattern_create_linear (0, 0, 0, alloc.height);
+- cairo_pattern_add_color_stop_rgb (gradient, 0, 0.25, 0.25, 0.25);
+- cairo_pattern_add_color_stop_rgb (gradient, 0.5, 0.15, 0.15, 0.15);
+- cairo_pattern_add_color_stop_rgb (gradient, 0.5, 0.1, 0.1, 0.1);
+- cairo_pattern_add_color_stop_rgb (gradient, 1, 0, 0, 0);
+-
+- cairo_set_source (cr, gradient);
+- cairo_rectangle (cr, 0, 0, alloc.width, alloc.height);
+- cairo_fill (cr);
+-
+- cairo_pattern_destroy (gradient);
+- cairo_destroy (cr);
+- return false;
+-}
+-
+ static void infopopup_add_category (GtkWidget * grid, int position,
+ const char * text, GtkWidget * * header, GtkWidget * * label)
+ {
+ * header = gtk_label_new (nullptr);
+ * label = gtk_label_new (nullptr);
+
+- gtk_misc_set_alignment ((GtkMisc *) * header, 1, 0.5);
+- gtk_misc_set_alignment ((GtkMisc *) * label, 0, 0.5);
+-
+- gtk_widget_modify_fg (* header, GTK_STATE_NORMAL, & gray);
+- gtk_widget_modify_fg (* label, GTK_STATE_NORMAL, & white);
++ gtk_widget_set_halign (* header, GTK_ALIGN_END);
++ gtk_widget_set_halign (* label, GTK_ALIGN_START);
+
+ char * markup = g_markup_printf_escaped ("<span style=\"italic\">%s</span>", text);
+ gtk_label_set_markup ((GtkLabel *) * header, markup);
+ g_free (markup);
+
+- gtk_table_attach ((GtkTable *) grid, * header, 0, 1, position, position + 1,
+- GTK_FILL, GTK_FILL, 0, 0);
+- gtk_table_attach ((GtkTable *) grid, * label, 1, 2, position, position + 1,
+- GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) grid, * header, 0, position, 1, 1);
++ gtk_grid_attach ((GtkGrid *) grid, * label, 1, position, 1, 1);
+
+ gtk_widget_set_no_show_all (* header, true);
+ gtk_widget_set_no_show_all (* label, true);
+@@ -185,7 +147,7 @@ static GtkWidget * infopopup_create ()
+ gtk_window_set_decorated ((GtkWindow *) infopopup, false);
+ gtk_container_set_border_width ((GtkContainer *) infopopup, 4);
+
+- GtkWidget * hbox = gtk_hbox_new (false, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_container_add ((GtkContainer *) infopopup, hbox);
+
+ widgets.image = gtk_image_new ();
+@@ -193,8 +155,8 @@ static GtkWidget * infopopup_create ()
+ gtk_box_pack_start ((GtkBox *) hbox, widgets.image, false, false, 0);
+ gtk_widget_set_no_show_all (widgets.image, true);
+
+- GtkWidget * grid = gtk_table_new (0, 0, false);
+- gtk_table_set_col_spacings ((GtkTable *) grid, 6);
++ GtkWidget * grid = gtk_grid_new ();
++ gtk_grid_set_column_spacing ((GtkGrid *) grid, 6);
+ gtk_box_pack_start ((GtkBox *) hbox, grid, true, true, 0);
+
+ infopopup_add_category (grid, 0, _("Title"), & widgets.title_header, & widgets.title_label);
+@@ -207,23 +169,15 @@ static GtkWidget * infopopup_create ()
+
+ /* track progress */
+ widgets.progress = gtk_progress_bar_new ();
++ gtk_widget_set_margin_top (widgets.progress, 6);
++ gtk_progress_bar_set_show_text ((GtkProgressBar *) widgets.progress, true);
+ gtk_progress_bar_set_text ((GtkProgressBar *) widgets.progress, "");
+- gtk_table_set_row_spacing ((GtkTable *) grid, 6, 4);
+- gtk_table_attach ((GtkTable *) grid, widgets.progress, 0, 2, 7, 8,
+- GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) grid, widgets.progress, 0, 7, 2, 1);
+
+ /* do not show the track progress */
+ gtk_widget_set_no_show_all (widgets.progress, true);
+
+- /* override background drawing */
+- gtk_widget_set_app_paintable (infopopup, true);
+-
+- GtkStyle * style = gtk_style_new ();
+- gtk_widget_set_style (infopopup, style);
+- g_object_unref (style);
+-
+- g_signal_connect (infopopup, "realize", (GCallback) infopopup_realized, nullptr);
+- g_signal_connect (infopopup, "expose-event", (GCallback) infopopup_draw_bg, nullptr);
++ g_signal_connect (infopopup, "realize", (GCallback) infopopup_move_to_mouse, nullptr);
+
+ return infopopup;
+ }
+--- src/libaudgui/infowin.cc.old
++++ src/libaudgui/infowin.cc
+@@ -132,7 +132,7 @@ static GtkWidget * small_label_new (const char * text)
+
+ GtkWidget * label = gtk_label_new (text);
+ gtk_label_set_attributes ((GtkLabel *) label, attrs);
+- gtk_misc_set_alignment ((GtkMisc *) label, 0, 0.5);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
+
+ return label;
+ }
+@@ -301,10 +301,11 @@ static void add_entry (GtkWidget * grid, const char * title, GtkWidget * entry,
+ {
+ GtkWidget * label = small_label_new (title);
+
+- gtk_table_attach ((GtkTable *) grid, label, x, x + span, y, y + 1,
+- GTK_FILL, GTK_FILL, 0, 0);
+- gtk_table_attach ((GtkTable *) grid, entry, x, x + span, y + 1, y + 2,
+- GTK_FILL, GTK_FILL, 0, 0);
++ if (y > 0)
++ gtk_widget_set_margin_top (label, 6);
++
++ gtk_grid_attach ((GtkGrid *) grid, label, x, y, span, 1);
++ gtk_grid_attach ((GtkGrid *) grid, entry, x, y + 1, span, 1);
+
+ g_signal_connect (entry, "changed", (GCallback) entry_changed, nullptr);
+ }
+@@ -317,44 +318,41 @@ static void create_infowin ()
+ gtk_window_set_type_hint ((GtkWindow *) infowin,
+ GDK_WINDOW_TYPE_HINT_DIALOG);
+
+- GtkWidget * main_grid = gtk_table_new (0, 0, false);
+- gtk_table_set_col_spacings ((GtkTable *) main_grid, 6);
+- gtk_table_set_row_spacings ((GtkTable *) main_grid, 6);
++ GtkWidget * main_grid = gtk_grid_new ();
++ gtk_grid_set_column_spacing ((GtkGrid *) main_grid, 6);
++ gtk_grid_set_row_spacing ((GtkGrid *) main_grid, 6);
+ gtk_container_add ((GtkContainer *) infowin, main_grid);
+
+ widgets.image = audgui_scaled_image_new (nullptr);
+- gtk_table_attach_defaults ((GtkTable *) main_grid, widgets.image, 0, 1, 0, 1);
++ gtk_widget_set_hexpand (widgets.image, true);
++ gtk_widget_set_vexpand (widgets.image, true);
++ gtk_grid_attach ((GtkGrid *) main_grid, widgets.image, 0, 0, 1, 1);
+
+ widgets.location = gtk_label_new ("");
+- gtk_widget_set_size_request (widgets.location, 200, -1);
++ gtk_label_set_max_width_chars ((GtkLabel *) widgets.location, 40);
+ gtk_label_set_line_wrap ((GtkLabel *) widgets.location, true);
+ gtk_label_set_line_wrap_mode ((GtkLabel *) widgets.location, PANGO_WRAP_WORD_CHAR);
+ gtk_label_set_selectable ((GtkLabel *) widgets.location, true);
+- gtk_table_attach ((GtkTable *) main_grid, widgets.location, 0, 1, 1, 2,
+- GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) main_grid, widgets.location, 0, 1, 1, 1);
+
+- GtkWidget * codec_grid = gtk_table_new (0, 0, false);
+- gtk_table_set_row_spacings ((GtkTable *) codec_grid, 2);
+- gtk_table_set_col_spacings ((GtkTable *) codec_grid, 12);
+- gtk_table_attach ((GtkTable *) main_grid, codec_grid, 0, 1, 2, 3,
+- GTK_FILL, GTK_FILL, 0, 0);
++ GtkWidget * codec_grid = gtk_grid_new ();
++ gtk_grid_set_row_spacing ((GtkGrid *) codec_grid, 3);
++ gtk_grid_set_column_spacing ((GtkGrid *) codec_grid, 12);
++ gtk_grid_attach ((GtkGrid *) main_grid, codec_grid, 0, 2, 1, 1);
+
+ for (int row = 0; row < CODEC_ITEMS; row ++)
+ {
+ GtkWidget * label = small_label_new (_(codec_labels[row]));
+- gtk_table_attach ((GtkTable *) codec_grid, label, 0, 1, row, row + 1,
+- GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) codec_grid, label, 0, row, 1, 1);
+
+ widgets.codec[row] = small_label_new (nullptr);
+- gtk_table_attach ((GtkTable *) codec_grid, widgets.codec[row], 1, 2, row, row + 1,
+- GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) codec_grid, widgets.codec[row], 1, row, 1, 1);
+ }
+
+- GtkWidget * grid = gtk_table_new (0, 0, false);
+- gtk_table_set_row_spacings ((GtkTable *) grid, 2);
+- gtk_table_set_col_spacings ((GtkTable *) grid, 6);
+- gtk_table_attach ((GtkTable *) main_grid, grid, 1, 2, 0, 3,
+- GTK_FILL, GTK_FILL, 0, 0);
++ GtkWidget * grid = gtk_grid_new ();
++ gtk_grid_set_column_homogeneous ((GtkGrid *) grid, true);
++ gtk_grid_set_column_spacing ((GtkGrid *) grid, 6);
++ gtk_grid_attach ((GtkGrid *) main_grid, grid, 1, 0, 1, 3);
+
+ widgets.title = gtk_entry_new ();
+ add_entry (grid, _("Title"), widgets.title, 0, 0, 2);
+@@ -381,9 +379,8 @@ static void create_infowin ()
+ widgets.track = gtk_entry_new ();
+ add_entry (grid, _("Track Number"), widgets.track, 1, 12, 1);
+
+- GtkWidget * bottom_hbox = gtk_hbox_new (false, 6);
+- gtk_table_attach ((GtkTable *) main_grid, bottom_hbox, 0, 2, 3, 4,
+- GTK_FILL, GTK_FILL, 0, 0);
++ GtkWidget * bottom_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
++ gtk_grid_attach ((GtkGrid *) main_grid, bottom_hbox, 0, 3, 2, 1);
+
+ widgets.clear = gtk_check_button_new_with_mnemonic
+ (_("Clea_r fields when moving to next song"));
+--- src/libaudgui/jump-to-track.cc.old
++++ src/libaudgui/jump-to-track.cc
+@@ -31,6 +31,10 @@
+ #include "list.h"
+ #include "jump-to-track-cache.h"
+
++#if GTK_CHECK_VERSION (3, 12, 0)
++#define gtk_widget_set_margin_left gtk_widget_set_margin_start
++#endif
++
+ static void update_cb (void * data, void *);
+ static void activate_cb (void * data, void *);
+
+@@ -243,7 +247,7 @@ static GtkWidget * create_window ()
+ gtk_container_set_border_width ((GtkContainer *) jump_to_track_win, 10);
+ gtk_window_set_default_size ((GtkWindow *) jump_to_track_win, 600, 500);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_add ((GtkContainer *) jump_to_track_win, vbox);
+
+ treeview = audgui_list_new (& callbacks, nullptr, 0);
+@@ -256,7 +260,7 @@ static GtkWidget * create_window ()
+ "changed", (GCallback) selection_changed, nullptr);
+ g_signal_connect (treeview, "row-activated", (GCallback) do_jump, nullptr);
+
+- GtkWidget * hbox = gtk_hbox_new (false, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, false, false, 3);
+
+ /* filter box */
+@@ -280,17 +284,14 @@ static GtkWidget * create_window ()
+ gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) scrollwin, GTK_SHADOW_IN);
+ gtk_box_pack_start ((GtkBox *) vbox, scrollwin, true, true, 0);
+
+- GtkWidget * hbox2 = gtk_hbox_new (false, 0);
++ GtkWidget * hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_end ((GtkBox *) vbox, hbox2, false, false, 0);
+
+- GtkWidget * bbox = gtk_hbutton_box_new ();
++ GtkWidget * bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_button_box_set_layout ((GtkButtonBox *) bbox, GTK_BUTTONBOX_END);
++ gtk_widget_set_margin_left (bbox, 6);
+ gtk_box_set_spacing ((GtkBox *) bbox, 6);
+-
+- GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+- gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 6, 0);
+- gtk_container_add ((GtkContainer *) alignment, bbox);
+- gtk_box_pack_end ((GtkBox *) hbox2, alignment, true, true, 0);
++ gtk_box_pack_end ((GtkBox *) hbox2, bbox, true, true, 0);
+
+ /* close dialog toggle */
+ GtkWidget * toggle = gtk_check_button_new_with_mnemonic (_("C_lose on jump"));
+--- src/libaudgui/list.cc.old
++++ src/libaudgui/list.cc
+@@ -386,7 +386,7 @@ static gboolean autoscroll (GtkWidget * widget)
+ ListModel * model = (ListModel *) gtk_tree_view_get_model
+ ((GtkTreeView *) widget);
+
+- GtkAdjustment * adj = gtk_tree_view_get_vadjustment ((GtkTreeView *) widget);
++ GtkAdjustment * adj = gtk_scrollable_get_vadjustment ((GtkScrollable *) widget);
+ if (! adj)
+ {
+ stop_autoscroll (model);
+@@ -458,7 +458,7 @@ static gboolean drag_motion (GtkWidget * widget, GdkDragContext * context,
+
+ int height;
+ gdk_window_get_geometry (gtk_tree_view_get_bin_window ((GtkTreeView *)
+- widget), nullptr, nullptr, nullptr, & height, nullptr);
++ widget), nullptr, nullptr, nullptr, & height);
+ gtk_tree_view_convert_widget_to_bin_window_coords ((GtkTreeView *) widget,
+ x, y, & x, & y);
+
+@@ -534,6 +534,10 @@ static void drag_data_received (GtkWidget * widget, GdkDragContext * context, in
+
+ static void destroy_cb (GtkWidget * list, ListModel * model)
+ {
++ /* workaround for Gnome bug #679291 */
++ g_signal_handlers_disconnect_matched (list, G_SIGNAL_MATCH_DATA, 0, 0, NULL,
++ NULL, model);
++
+ stop_autoscroll (model);
+ g_list_free (model->column_types);
+ g_object_unref (model);
+--- src/libaudgui/menu.cc.old
++++ src/libaudgui/menu.cc
+@@ -23,6 +23,10 @@
+ #include <libaudcore/i18n.h>
+ #include <libaudcore/runtime.h>
+
++/* we still use GtkImageMenuItem until there is a good alternative */
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
++
+ static GtkWidget * image_menu_item_new (const char * text, const char * icon)
+ {
+ GtkWidget * widget = gtk_image_menu_item_new_with_mnemonic (text);
+@@ -36,6 +40,8 @@ static GtkWidget * image_menu_item_new (const char * text, const char * icon)
+ return widget;
+ }
+
++#pragma GCC diagnostic pop
++
+ static void toggled_cb (GtkCheckMenuItem * check, const AudguiMenuItem * item)
+ {
+ gboolean on = gtk_check_menu_item_get_active (check);
+--- src/libaudgui/plugin-prefs.cc.old
++++ src/libaudgui/plugin-prefs.cc
+@@ -168,7 +168,7 @@ EXPORT void audgui_show_plugin_prefs (PluginHandle * plugin)
+ }
+
+ GtkWidget * content = gtk_dialog_get_content_area ((GtkDialog *) window);
+- GtkWidget * box = gtk_vbox_new (false, 0);
++ GtkWidget * box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ audgui_create_widgets_with_domain (box, p->widgets, header->info.domain);
+ gtk_box_pack_start ((GtkBox *) content, box, true, true, 0);
+
+--- src/libaudgui/plugin-view.cc.old
++++ src/libaudgui/plugin-view.cc
+@@ -214,7 +214,7 @@ static void button_destroy (GtkWidget * b)
+
+ GtkWidget * plugin_view_new (PluginType type)
+ {
+- GtkWidget * vbox = gtk_vbox_new (false, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_set_border_width ((GtkContainer *) vbox, 6);
+
+ GtkWidget * scrolled = gtk_scrolled_window_new (nullptr, nullptr);
+@@ -229,7 +229,7 @@ GtkWidget * plugin_view_new (PluginType type)
+ g_signal_connect (tree, "realize", (GCallback) list_fill, aud::to_ptr (type));
+ g_signal_connect (tree, "destroy", (GCallback) list_destroy, nullptr);
+
+- GtkWidget * hbox = gtk_hbox_new (false, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, false, false, 0);
+
+ GtkWidget * config = audgui_button_new (_("_Settings"), "preferences-system", do_config, tree);
+--- src/libaudgui/prefs-widget.cc.old
++++ src/libaudgui/prefs-widget.cc
+@@ -28,6 +28,10 @@
+
+ #include "libaudgui-gtk.h"
+
++#if GTK_CHECK_VERSION (3, 12, 0)
++#define gtk_widget_set_margin_left gtk_widget_set_margin_start
++#endif
++
+ static void widget_changed (GtkWidget * widget, const PreferencesWidget * w)
+ {
+ switch (w->type)
+@@ -181,7 +185,7 @@ static void create_label (const PreferencesWidget * widget, GtkWidget * * label,
+ * label = gtk_label_new_with_mnemonic (dgettext (domain, widget->label));
+ gtk_label_set_use_markup ((GtkLabel *) * label, true);
+ gtk_label_set_line_wrap ((GtkLabel *) * label, true);
+- gtk_misc_set_alignment ((GtkMisc *) * label, 0, 0.5);
++ gtk_widget_set_halign (* label, GTK_ALIGN_START);
+ }
+
+ /* WIDGET_SPIN_BTN */
+@@ -206,13 +210,15 @@ void create_font_btn (const PreferencesWidget * widget, GtkWidget * * label,
+ GtkWidget * * font_btn, const char * domain)
+ {
+ * font_btn = gtk_font_button_new ();
++ gtk_widget_set_hexpand (* font_btn, true);
++
+ gtk_font_button_set_use_font ((GtkFontButton *) * font_btn, true);
+ gtk_font_button_set_use_size ((GtkFontButton *) * font_btn, true);
+
+ if (widget->label)
+ {
+ * label = gtk_label_new (dgettext (domain, widget->label));
+- gtk_misc_set_alignment ((GtkMisc *) * label, 1, 0.5);
++ gtk_widget_set_halign (* label, GTK_ALIGN_END);
+ }
+
+ if (widget->data.font_btn.title)
+@@ -228,12 +234,13 @@ static void create_entry (const PreferencesWidget * widget, GtkWidget * * label,
+ GtkWidget * * entry, const char * domain)
+ {
+ * entry = gtk_entry_new ();
++ gtk_widget_set_hexpand (* entry, true);
+ gtk_entry_set_visibility ((GtkEntry *) * entry, ! widget->data.entry.password);
+
+ if (widget->label)
+ {
+ * label = gtk_label_new (dgettext (domain, widget->label));
+- gtk_misc_set_alignment ((GtkMisc *) * label, 1, 0.5);
++ gtk_widget_set_halign (* label, GTK_ALIGN_END);
+ }
+
+ widget_init (* entry, widget);
+@@ -251,8 +258,7 @@ static void combobox_update (GtkWidget * combobox, const PreferencesWidget * wid
+
+ g_object_set_data ((GObject *) combobox, "comboitems", (void *) items.data);
+
+- /* no gtk_combo_box_text_clear()? */
+- gtk_list_store_clear ((GtkListStore *) gtk_combo_box_get_model ((GtkComboBox *) combobox));
++ gtk_combo_box_text_remove_all ((GtkComboBoxText *) combobox);
+
+ for (const ComboItem & item : items)
+ gtk_combo_box_text_append_text ((GtkComboBoxText *) combobox,
+@@ -306,7 +312,6 @@ static void fill_table (GtkWidget * table,
+ for (const PreferencesWidget & w : widgets)
+ {
+ GtkWidget * widget_left = nullptr, * widget_middle = nullptr, * widget_right = nullptr;
+- GtkAttachOptions middle_policy = (GtkAttachOptions) (GTK_FILL);
+
+ switch (w.type)
+ {
+@@ -321,17 +326,14 @@ static void fill_table (GtkWidget * table,
+
+ case PreferencesWidget::FontButton:
+ create_font_btn (& w, & widget_left, & widget_middle, domain);
+- middle_policy = (GtkAttachOptions) (GTK_EXPAND | GTK_FILL);
+ break;
+
+ case PreferencesWidget::Entry:
+ create_entry (& w, & widget_left, & widget_middle, domain);
+- middle_policy = (GtkAttachOptions) (GTK_EXPAND | GTK_FILL);
+ break;
+
+ case PreferencesWidget::ComboBox:
+ create_cbox (& w, & widget_left, & widget_middle, domain);
+- middle_policy = (GtkAttachOptions) (GTK_EXPAND | GTK_FILL);
+ break;
+
+ default:
+@@ -341,16 +343,13 @@ static void fill_table (GtkWidget * table,
+ int i = & w - widgets.data;
+
+ if (widget_left)
+- gtk_table_attach ((GtkTable *) table, widget_left, 0, 1, i, i + 1,
+- GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) table, widget_left, 0, i, 1, 1);
+
+ if (widget_middle)
+- gtk_table_attach ((GtkTable *) table, widget_middle, 1, 2, i, i + 1,
+- middle_policy, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) table, widget_middle, 1, i, 1, 1);
+
+ if (widget_right)
+- gtk_table_attach ((GtkTable *) table, widget_right, 2, 3, i, i + 1,
+- GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) table, widget_right, 2, i, 1, 1);
+ }
+ }
+
+@@ -371,13 +370,11 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+ {
+ if (! child_box)
+ {
+- child_box = gtk_vbox_new (false, 0);
++ child_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ g_object_set_data ((GObject *) widget, "child", child_box);
+
+- GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+- gtk_box_pack_start ((GtkBox *) box, alignment, false, false, 0);
+- gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 12, 0);
+- gtk_container_add ((GtkContainer *) alignment, child_box);
++ gtk_widget_set_margin_left (child_box, 12);
++ gtk_box_pack_start ((GtkBox *) box, child_box, false, false, 0);
+
+ if (GTK_IS_TOGGLE_BUTTON (widget))
+ gtk_widget_set_sensitive (child_box,
+@@ -387,15 +384,13 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+ else
+ child_box = nullptr;
+
+- GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+- gtk_alignment_set_padding ((GtkAlignment *) alignment, 6, 0, 12, 0);
+- gtk_box_pack_start ((GtkBox *) (child_box ? child_box : box), alignment, false, false, 0);
+-
+ widget = nullptr;
+
+ if (radio_btn_group && w.type != PreferencesWidget::RadioButton)
+ radio_btn_group = nullptr;
+
++ int pad_left = 12, pad_top = 6;
++
+ switch (w.type)
+ {
+ case PreferencesWidget::Button:
+@@ -410,22 +405,24 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+
+ case PreferencesWidget::Label:
+ {
+- if (strstr (w.label, "<b>"))
+- gtk_alignment_set_padding ((GtkAlignment *) alignment,
+- (& w == widgets.data) ? 0 : 12, 0, 0, 0);
+-
+ GtkWidget * icon = nullptr;
+ create_label (& w, & label, & icon, domain);
+
+ if (icon)
+ {
+- widget = gtk_hbox_new (false, 6);
++ widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) widget, icon, false, false, 0);
+ gtk_box_pack_start ((GtkBox *) widget, label, false, false, 0);
+ }
+ else
+ widget = label;
+
++ if (strstr (w.label, "<b>"))
++ {
++ pad_left = 0;
++ pad_top = (& w == widgets.data) ? 0 : 12;
++ }
++
+ break;
+ }
+
+@@ -438,7 +435,7 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+
+ case PreferencesWidget::SpinButton:
+ {
+- widget = gtk_hbox_new (false, 6);
++ widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+
+ GtkWidget * label_pre = nullptr, * spin_btn = nullptr, * label_past = nullptr;
+ create_spin_button (& w, & label_pre, & spin_btn, & label_past, domain);
+@@ -461,7 +458,7 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+
+ case PreferencesWidget::FontButton:
+ {
+- widget = gtk_hbox_new (false, 6);
++ widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+
+ GtkWidget * font_btn = nullptr;
+ create_font_btn (& w, & label, & font_btn, domain);
+@@ -475,9 +472,9 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+ }
+
+ case PreferencesWidget::Table:
+- widget = gtk_table_new (0, 0, false);
+- gtk_table_set_col_spacings ((GtkTable *) widget, 6);
+- gtk_table_set_row_spacings ((GtkTable *) widget, 6);
++ widget = gtk_grid_new ();
++ gtk_grid_set_column_spacing ((GtkGrid *) widget, 6);
++ gtk_grid_set_row_spacing ((GtkGrid *) widget, 6);
+
+ fill_table (widget, w.data.table.widgets, domain);
+
+@@ -485,7 +482,7 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+
+ case PreferencesWidget::Entry:
+ {
+- widget = gtk_hbox_new (false, 6);
++ widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+
+ GtkWidget * entry = nullptr;
+ create_entry (& w, & label, & entry, domain);
+@@ -500,7 +497,7 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+
+ case PreferencesWidget::ComboBox:
+ {
+- widget = gtk_hbox_new (false, 6);
++ widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+
+ GtkWidget * combo = nullptr;
+ create_cbox (& w, & label, & combo, domain);
+@@ -515,9 +512,9 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+
+ case PreferencesWidget::Box:
+ if (w.data.box.horizontal)
+- widget = gtk_hbox_new (false, 6);
++ widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ else
+- widget = gtk_vbox_new (false, 0);
++ widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+
+ audgui_create_widgets_with_domain (widget, w.data.box.widgets, domain);
+
+@@ -531,13 +528,11 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+ break;
+
+ case PreferencesWidget::Notebook:
+- gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 0, 0);
+-
+ widget = gtk_notebook_new ();
+
+ for (const NotebookTab & tab : w.data.notebook.tabs)
+ {
+- GtkWidget * vbox = gtk_vbox_new (false, 0);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_set_border_width ((GtkContainer *) vbox, 6);
+
+ audgui_create_widgets_with_domain (vbox, tab.widgets, domain);
+@@ -546,11 +541,13 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+ gtk_label_new (dgettext (domain, tab.name)));
+ }
+
++ pad_top = 0;
++
+ break;
+
+ case PreferencesWidget::Separator:
+- widget = w.data.separator.horizontal ?
+- gtk_hseparator_new () : gtk_vseparator_new ();
++ widget = gtk_separator_new (w.data.separator.horizontal
++ ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL);
+ break;
+
+ default:
+@@ -560,11 +557,14 @@ void audgui_create_widgets_with_domain (GtkWidget * box,
+ if (widget)
+ {
+ /* use uniform spacing for horizontal boxes */
+- if (gtk_orientable_get_orientation ((GtkOrientable *) box) ==
++ if (gtk_orientable_get_orientation ((GtkOrientable *) box) !=
+ GTK_ORIENTATION_HORIZONTAL)
+- gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 0, 0);
++ {
++ gtk_widget_set_margin_left (widget, pad_left);
++ gtk_widget_set_margin_top (widget, pad_top);
++ }
+
+- gtk_container_add ((GtkContainer *) alignment, widget);
++ gtk_box_pack_start ((GtkBox *) (child_box ? child_box : box), widget, false, false, 0);
+ }
+ }
+ }
+--- src/libaudgui/prefs-window.cc.old
++++ src/libaudgui/prefs-window.cc
+@@ -498,29 +498,32 @@ static void create_titlestring_widgets (GtkWidget * * cbox, GtkWidget * * entry)
+
+ static void * create_titlestring_table ()
+ {
+- GtkWidget * grid = gtk_table_new (0, 0, false);
+- gtk_table_set_row_spacings ((GtkTable *) grid, 6);
+- gtk_table_set_col_spacings ((GtkTable *) grid, 6);
++ GtkWidget * grid = gtk_grid_new ();
++ gtk_grid_set_row_spacing ((GtkGrid *) grid, 4);
++ gtk_grid_set_column_spacing ((GtkGrid *) grid, 12);
+
+ GtkWidget * label = gtk_label_new (_("Title format:"));
+- gtk_misc_set_alignment ((GtkMisc *) label, 1, 0.5);
+- gtk_table_attach ((GtkTable *) grid, label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) grid, label, 0, 0, 1, 1);
++ gtk_label_set_justify ((GtkLabel *) label, GTK_JUSTIFY_RIGHT);
++ gtk_widget_set_halign (label, GTK_ALIGN_END);
+
+ label = gtk_label_new (_("Custom string:"));
+- gtk_misc_set_alignment ((GtkMisc *) label, 1, 0.5);
+- gtk_table_attach ((GtkTable *) grid, label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) grid, label, 0, 1, 1, 1);
++ gtk_label_set_justify ((GtkLabel *) label, GTK_JUSTIFY_RIGHT);
++ gtk_widget_set_halign (label, GTK_ALIGN_END);
+
+ GtkWidget * titlestring_cbox;
+ create_titlestring_widgets (& titlestring_cbox, & titlestring_entry);
+- gtk_table_attach_defaults ((GtkTable *) grid, titlestring_cbox, 1, 2, 0, 1);
+- gtk_table_attach_defaults ((GtkTable *) grid, titlestring_entry, 1, 2, 1, 2);
++ gtk_widget_set_hexpand (titlestring_cbox, true);
++ gtk_widget_set_hexpand (titlestring_entry, true);
++ gtk_grid_attach ((GtkGrid *) grid, titlestring_cbox, 1, 0, 1, 1);
++ gtk_grid_attach ((GtkGrid *) grid, titlestring_entry, 1, 1, 1, 1);
+
+ GtkWidget * titlestring_help_button = gtk_button_new ();
+ gtk_widget_set_can_focus (titlestring_help_button, false);
+ gtk_button_set_focus_on_click ((GtkButton *) titlestring_help_button, false);
+ gtk_button_set_relief ((GtkButton *) titlestring_help_button, GTK_RELIEF_HALF);
+- gtk_table_attach ((GtkTable *) grid, titlestring_help_button, 2, 3, 1, 2,
+- GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach ((GtkGrid *) grid, titlestring_help_button, 2, 1, 1, 1);
+
+ GtkWidget * titlestring_tag_menu = create_titlestring_tag_menu ();
+
+@@ -535,14 +538,14 @@ static void * create_titlestring_table ()
+
+ static void create_playlist_category ()
+ {
+- GtkWidget * vbox = gtk_vbox_new (false, 0);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add ((GtkContainer *) category_notebook, vbox);
+ audgui_create_widgets (vbox, playlist_page_widgets);
+ }
+
+ static void create_song_info_category ()
+ {
+- GtkWidget * vbox = gtk_vbox_new (false, 0);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add ((GtkContainer *) category_notebook, vbox);
+ audgui_create_widgets (vbox, song_info_page_widgets);
+ }
+@@ -593,14 +596,14 @@ static ArrayRef<ComboItem> iface_combo_fill ()
+
+ static void * iface_create_prefs_box ()
+ {
+- iface_prefs_box = gtk_vbox_new (false, 0);
++ iface_prefs_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ iface_fill_prefs_box ();
+ return iface_prefs_box;
+ }
+
+ static void create_appearance_category ()
+ {
+- GtkWidget * vbox = gtk_vbox_new (false, 0);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add ((GtkContainer *) category_notebook, vbox);
+ audgui_create_widgets (vbox, appearance_page_widgets);
+ }
+@@ -666,17 +669,17 @@ static void * output_create_about_button ()
+
+ static void create_audio_category ()
+ {
+- GtkWidget * audio_page_vbox = gtk_vbox_new (false, 0);
++ GtkWidget * audio_page_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ audgui_create_widgets (audio_page_vbox, audio_page_widgets);
+ gtk_container_add ((GtkContainer *) category_notebook, audio_page_vbox);
+ }
+
+ static void create_connectivity_category ()
+ {
+- GtkWidget * connectivity_page_vbox = gtk_vbox_new (false, 0);
++ GtkWidget * connectivity_page_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add ((GtkContainer *) category_notebook, connectivity_page_vbox);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 0);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_pack_start ((GtkBox *) connectivity_page_vbox, vbox, true, true, 0);
+
+ audgui_create_widgets (vbox, connectivity_page_widgets);
+@@ -711,10 +714,10 @@ static void create_prefs_window ()
+ gtk_window_set_title ((GtkWindow *) prefswin, _("Audacious Settings"));
+ gtk_window_set_default_size ((GtkWindow *) prefswin, 680, 400);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 0);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add ((GtkContainer *) prefswin, vbox);
+
+- GtkWidget * hbox = gtk_hbox_new (false, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, true, true, 0);
+
+ GtkWidget * scrolledwindow = gtk_scrolled_window_new (nullptr, nullptr);
+@@ -744,17 +747,17 @@ static void create_prefs_window ()
+ create_song_info_category ();
+ create_plugin_category ();
+
+- GtkWidget * hseparator = gtk_hseparator_new ();
++ GtkWidget * hseparator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start ((GtkBox *) vbox, hseparator, false, false, 6);
+
+- hbox = gtk_hbox_new (false, 0);
++ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, false, false, 0);
+
+ GtkWidget * audversionlabel = gtk_label_new (aud_version_string);
+ gtk_box_pack_start ((GtkBox *) hbox, audversionlabel, false, false, 0);
+ gtk_label_set_use_markup ((GtkLabel *) audversionlabel, true);
+
+- GtkWidget * prefswin_button_box = gtk_hbutton_box_new ();
++ GtkWidget * prefswin_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start ((GtkBox *) hbox, prefswin_button_box, true, true, 0);
+ gtk_button_box_set_layout ((GtkButtonBox *) prefswin_button_box, GTK_BUTTONBOX_END);
+ gtk_box_set_spacing ((GtkBox *) prefswin_button_box, 6);
+--- src/libaudgui/scaled-image.cc.old
++++ src/libaudgui/scaled-image.cc
+@@ -59,7 +59,7 @@ static GdkPixbuf * get_scaled (GtkWidget * widget, int maxwidth, int maxheight)
+ return scaled;
+ }
+
+-static int expose_cb (GtkWidget * widget, GdkEventExpose * event)
++static gboolean draw_cb (GtkWidget * widget, GdkEventExpose * event)
+ {
+ GdkRectangle rect;
+ gtk_widget_get_allocation (widget, & rect);
+@@ -107,7 +107,7 @@ EXPORT GtkWidget * audgui_scaled_image_new (GdkPixbuf * pixbuf)
+ {
+ GtkWidget * widget = gtk_drawing_area_new ();
+
+- g_signal_connect (widget, "expose-event", (GCallback) expose_cb, nullptr);
++ g_signal_connect (widget, "draw", (GCallback) draw_cb, nullptr);
+ g_signal_connect (widget, "destroy", (GCallback) destroy_cb, nullptr);
+
+ audgui_scaled_image_set (widget, pixbuf);
+--- src/libaudgui/status.cc.old
++++ src/libaudgui/status.cc
+@@ -37,7 +37,7 @@ static void create_progress_window ()
+ gtk_window_set_resizable ((GtkWindow *) progress_window, false);
+ gtk_container_set_border_width ((GtkContainer *) progress_window, 6);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_add ((GtkContainer *) progress_window, vbox);
+
+ progress_label = gtk_label_new (nullptr);
+--- src/libaudgui/util.cc.old
++++ src/libaudgui/util.cc
+@@ -46,12 +46,27 @@ EXPORT int audgui_get_digit_width (GtkWidget * widget)
+
+ EXPORT void audgui_get_mouse_coords (GtkWidget * widget, int * x, int * y)
+ {
+- gtk_widget_get_pointer (widget, x, y);
++ int xwin, ywin;
++ GdkRectangle alloc;
++
++ GdkWindow * window = gtk_widget_get_window (widget);
++ GdkDisplay * display = gdk_window_get_display (window);
++ GdkDeviceManager * manager = gdk_display_get_device_manager (display);
++ GdkDevice * device = gdk_device_manager_get_client_pointer (manager);
++
++ gdk_window_get_device_position (window, device, & xwin, & ywin, nullptr);
++ gtk_widget_get_allocation (widget, & alloc);
++
++ * x = xwin - alloc.x;
++ * y = ywin - alloc.y;
+ }
+
+ EXPORT void audgui_get_mouse_coords (GdkScreen * screen, int * x, int * y)
+ {
+- gdk_display_get_pointer (gdk_screen_get_display (screen), nullptr, x, y, nullptr);
++ GdkDisplay * display = gdk_screen_get_display (screen);
++ GdkDeviceManager * manager = gdk_display_get_device_manager (display);
++ GdkDevice * device = gdk_device_manager_get_client_pointer (manager);
++ gdk_device_get_position (device, nullptr, x, y);
+ }
+
+ EXPORT void audgui_get_monitor_geometry (GdkScreen * screen, int x, int y, GdkRectangle * geom)
+@@ -105,6 +120,22 @@ EXPORT GtkWidget * audgui_button_new (const char * text, const char * icon,
+ return button;
+ }
+
++static const char * icon_for_message_type (GtkMessageType type)
++{
++ switch (type)
++ {
++ case GTK_MESSAGE_INFO: return "dialog-information";
++ case GTK_MESSAGE_WARNING: return "dialog-warning";
++ case GTK_MESSAGE_QUESTION: return "dialog-question";
++ case GTK_MESSAGE_ERROR: return "dialog-error";
++ default: return nullptr;
++ }
++}
++
++/* style choices should not be enforced by deprecating API functions */
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
++
+ EXPORT GtkWidget * audgui_dialog_new (GtkMessageType type, const char * title,
+ const char * text, GtkWidget * button1, GtkWidget * button2)
+ {
+@@ -112,6 +143,13 @@ EXPORT GtkWidget * audgui_dialog_new (GtkMessageType type, const char * title,
+ GTK_BUTTONS_NONE, "%s", text);
+ gtk_window_set_title ((GtkWindow *) dialog, title);
+
++ const char * icon = icon_for_message_type (type);
++ if (icon)
++ {
++ GtkWidget * image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_DIALOG);
++ gtk_message_dialog_set_image ((GtkMessageDialog *) dialog, image);
++ }
++
+ if (button2)
+ {
+ gtk_dialog_add_action_widget ((GtkDialog *) dialog, button2, GTK_RESPONSE_NONE);
+@@ -127,6 +165,8 @@ EXPORT GtkWidget * audgui_dialog_new (GtkMessageType type, const char * title,
+ return dialog;
+ }
+
++#pragma GCC diagnostic pop
++
+ EXPORT void audgui_dialog_add_widget (GtkWidget * dialog, GtkWidget * widget)
+ {
+ GtkWidget * box = gtk_message_dialog_get_message_area ((GtkMessageDialog *) dialog);
Modified: trunk/dports/multimedia/audacious-plugins/Portfile
===================================================================
--- trunk/dports/multimedia/audacious-plugins/Portfile 2015-04-13 16:07:33 UTC (rev 135030)
+++ trunk/dports/multimedia/audacious-plugins/Portfile 2015-04-13 16:24:21 UTC (rev 135031)
@@ -3,12 +3,13 @@
PortSystem 1.0
PortGroup conflicts_build 1.0
+PortGroup compiler_blacklist_versions 1.0
name audacious-plugins
# Please keep audacious, audacious-core and audacious-plugins synchronized.
-version 3.5.2
-revision 3
+version 3.6.1
+revision 0
# FIXME: probably more licenses involved here...
license BSD GPL-2+
@@ -27,13 +28,15 @@
master_sites http://distfiles.audacious-media-player.org
use_bzip2 yes
-checksums rmd160 2cf98e4fbf0e778672d509cd486274a8f7e4f10d \
- sha256 179600d7f8ae31a7d9c5785ce6fa7e09184dbd1271e0adb8c57760432c6a4cd9
+checksums rmd160 68d302c3cb9d1dce98fa801e6ed220fa48e17e03 \
+ sha256 0ae17d573dd094b3124e0bbec0c059c4ca668436830c922eb00f0b7eb9745195
+universal_variant no
+
conflicts_build ${name}
patchfiles patch-buildsys.diff \
- patch-configure.ac-select-libsdl.diff
+ patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff
depends_build path:bin/pkg-config:pkgconfig \
path:bin/aclocal:automake \
@@ -43,29 +46,33 @@
port:gettext\
port:libxml2 \
path:lib/pkgconfig/glib-2.0.pc:glib2 \
- path:lib/pkgconfig/gtk-3.0.pc:gtk3 \
- path:lib/pkgconfig/gdk-x11-3.0.pc:gtk3 \
port:neon
depends_run port:unzip
# Note: rpath is required on Mac OS X.
# sdlout is the only working audio output plugin at the moment on OS X.
+# coreaudio is always enabled on OS X.
# Try PulseAudio at your own risk.
+# --with-system-libxml2 enables or disables usage of libxml2 in /usr.
+# Play it safe and use our libxml2 port.
+# mac-media-keys is currently broken.
configure.args --enable-nls \
+ --disable-gtk \
+ --disable-qt \
+ --with-system-libxml2=no \
--enable-xsf \
--enable-psf \
--enable-hotkey \
--enable-songchange \
- --enable-statusicon \
--enable-neon \
--enable-filewriter \
--enable-rpath \
- --enable-gtkui \
- --enable-skins \
--enable-lyricwiki \
--disable-console \
+ --disable-qtaudio \
--disable-pulse \
+ --enable-coreaudio \
--disable-sdlout \
--disable-mp3 \
--disable-gnomeshortcuts \
@@ -99,7 +106,13 @@
--disable-resample \
--disable-speedpitch \
--disable-soxr \
- --disable-glspectrum
+ --disable-glspectrum \
+ --disable-qtglspectrum \
+ --enable-vtx \
+ --enable-ladspa \
+ --enable-blur-scope \
+ --enable-cairo-spectrum \
+ --disable-mac-media-keys
default_variants +full
@@ -107,23 +120,53 @@
autoreconf.cmd ./autogen.sh
autoreconf.args
+# A compiler supporting C++11 is required to build audacious and its plugins.
+# The newer, the merrier.
+# Compilers supporting C++11 are GCC >= 4.6 and clang >= 3.3.
+# We do not know what "cc" is, so blacklist it as well.
+compiler.blacklist-append {*gcc-4.[0-5]} {clang < 500} macports-clang-2.* \
+ {macports-clang-3.[0-2]} cc
+
platform darwin {
- if {${configure.cxx_stdlib} ne {} &&
- [string equal ${configure.cxx_stdlib} "libc++"]} {
- if {${os.major} > 10} {
- configure.ldflags-append "-mmacosx-version-min=10.7"
+ if {${os.major} >= 13} {
+ if {${configure.cxx_stdlib} ne {} &&
+ [string equal ${configure.cxx_stdlib} "libc++"]} {
+ # Blacklist all GCC compilers to not accidentally pull in libstdc++.
+ compiler.blacklist-append {*gcc*}
+
+ # Make sure binary runs on 10.9+ only.
+ configure.ldflags-append "-mmacosx-version-min=10.9"
} else {
- ui_error "libc++ is only supported on OS X 10.7 and up for this port."
- error "libc++ supported on >= 10.7 only."
+ ui_error "The system libraries in OS X 10.9 and higher use libc++. Thus, libstdc++ is not supported for this port."
+ error "libstdc++ supported on <= 10.8 only."
}
} else {
- configure.ldflags-append "-mmacosx-version-min=10.5"
+ if {${configure.cxx_stdlib} ne {} &&
+ [string equal ${configure.cxx_stdlib} "libc++"]} {
+ ui_error "The system libraries in OS X 10.8 and lower use libstdc++. Thus, libstdc++ is not supported for this port."
+ error "libc++ supported on >= 10.9 only."
+ } else {
+ # Shameless copy from rust.
+ depends_lib-append {path:lib/libstdc\\+\\+.6.dylib:libgcc}
+
+ # Force GCC 4.9.
+ compiler.blacklist-append {*clang*}
+ compiler.fallback-append macports-gcc-4.9
+
+ # Make sure binary runs on 10.5+ only.
+ configure.ldflags-append "-mmacosx-version-min=10.5"
+
+ notes-append {
+ Upstream for some reason requires libc++.
+ Your build will use libstdc++. The maintainer assumes this
+ to be OK, but you're on your own if stuff breaks.\
+ }
+ }
}
}
post-destroot {
xinstall -d -m 0755 ${destroot}${prefix}/share/doc/${name}
- xinstall -m 0644 ${worksrcpath}/AUTHORS ${destroot}${prefix}/share/doc/${name}
xinstall -m 0644 ${worksrcpath}/COPYING ${destroot}${prefix}/share/doc/${name}
}
@@ -251,13 +294,13 @@
--enable-amidiplug
}
-# libcdio-paranoia not ported yet
-#variant cdaudio description {Add support for CDAudio-NG} {
-# depends_lib-append port:libcdio \
-# port:libcddb
-# configure.args-replace --disable-cdaudio \
-# --enable-cdaudio
-#}
+variant cdaudio description {Add support for CDAudio-NG} {
+ depends_lib-append port:libcdio \
+ port:libcdio-paranoia \
+ port:libcddb
+ configure.args-replace --disable-cdaudio \
+ --enable-cdaudio
+}
variant lastfm description {Add support for last.fm} {
depends_lib-append port:curl
@@ -318,9 +361,47 @@
configure.args-append --with-libsdl=2
}
+variant qt5 description {Add Qt5 support} {
+ PortGroup qt5 1.0
+
+ configure.args-replace --disable-qt \
+ --enable-qt
+
+ if {[variant_isset opengl]} {
+ configure.args-replace --disable-qtglspectrum \
+ --enable-qtglspectrum
+ }
+
+ configure.args-replace --disable-qtaudio \
+ --enable-qtaudio
+
+ notes-append {
+ Qt5 support is optional and untested.
+ If it breaks, you've got to keep the pieces.\
+ }
+}
+
+variant gtk2 conflicts gtk3 description {Add GTK2 support} {
+ depends_lib-append path:lib/pkgconfig/gtk-2.0.pc:gtk2 \
+ path:lib/pkgconfig/gdk-x11-2.0.pc:gtk2
+
+ configure.args-replace --disable-gtk \
+ --enable-gtk
+}
+
+variant gtk3 conflicts gtk2 description {Add GTK3 support} {
+ depends_lib-append path:lib/pkgconfig/gtk-3.0.pc:gtk3 \
+ path:lib/pkgconfig/gdk-x11-3.0.pc:gtk3
+
+ patchfiles-append patch-gtk3.diff
+
+ configure.args-replace --disable-gtk \
+ --enable-gtk
+}
+
variant full requires console mp3 dbus lirc osd osd_composite notifications \
- vorbis flac wavpack aac sndfile modplug midi lastfm mms \
- cue lame transform opengl \
+ vorbis flac wavpack aac sndfile modplug midi cdaudio \
+ lastfm mms cue lame transform opengl \
description {Build all plugins, except additional sound output plugins and potentially conflicting variants} {}
if {[variant_isset jack]} {
@@ -328,7 +409,7 @@
You have selected the JACK audio output plugin.
To use this plugin, jackd needs to be started manually.
The plugin is known to have issues leading to crackling sound output.
- Please don't report bugs against this plugin.
+ Please don't report bugs against this plugin.\
}
}
@@ -336,6 +417,11 @@
default_variants-append +sdl1 +ffmpeg
}
+# Need either one of gtk2 or gtk3. Default to gtk2, which is preferred by upstream.
+if {![variant_isset gtk2] && ![variant_isset gtk3]} {
+ default_variants-append +gtk2
+}
+
livecheck.type regex
livecheck.url ${master_sites}
livecheck.regex "${name}-(\\d+(?:\\.\\d+)*)${extract.suffix}"
Added: trunk/dports/multimedia/audacious-plugins/files/patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff
===================================================================
--- trunk/dports/multimedia/audacious-plugins/files/patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff (rev 0)
+++ trunk/dports/multimedia/audacious-plugins/files/patch-acinclude.m4-drop-libc++-switch-from-gnu++11-to-c++11.diff 2015-04-13 16:24:21 UTC (rev 135031)
@@ -0,0 +1,22 @@
+--- acinclude.m4.orig
++++ acinclude.m4
+@@ -83,8 +83,8 @@ AC_REQUIRE([AC_SYS_LARGEFILE])
+ if test "x$GCC" = "xyes"; then
+ CFLAGS="$CFLAGS -std=gnu99 -ffast-math -Wall -pipe"
+ if test "x$HAVE_DARWIN" = "xyes"; then
+- CXXFLAGS="$CXXFLAGS -stdlib=libc++ -std=gnu++11 -ffast-math -Wall -pipe"
+- LDFLAGS="$LDFLAGS -lc++ -stdlib=libc++"
++ CXXFLAGS="$CXXFLAGS -std=c++11 -ffast-math -Wall -pipe"
++ LDFLAGS="$LDFLAGS"
+ else
+ CXXFLAGS="$CXXFLAGS -std=gnu++11 -ffast-math -Wall -pipe"
+ fi
+@@ -101,7 +101,7 @@ if test "x$HAVE_DARWIN" = "xyes"; then
+ AC_PROG_OBJCXX
+ AC_PROG_OBJCXXCPP
+
+- OBJCXXFLAGS="$OBJCXXFLAGS -stdlib=libc++ -std=c++11"
++ OBJCXXFLAGS="$OBJCXXFLAGS -std=c++11"
+ fi
+
+ dnl Enable "-Wl,-z,defs" only on Linux
Modified: trunk/dports/multimedia/audacious-plugins/files/patch-buildsys.diff
===================================================================
--- trunk/dports/multimedia/audacious-plugins/files/patch-buildsys.diff 2015-04-13 16:07:33 UTC (rev 135030)
+++ trunk/dports/multimedia/audacious-plugins/files/patch-buildsys.diff 2015-04-13 16:24:21 UTC (rev 135031)
@@ -1,4 +1,4 @@
---- buildsys.mk.in.old
+--- buildsys.mk.in.orig
+++ buildsys.mk.in
@@ -107,19 +107,24 @@ PLUGIN_OBJS = ${OBJS:.o=.plugin.o}
@@ -383,22 +383,23 @@
+
+.CURDIR ?= .
+include ${.CURDIR}/.deps
---- m4/buildsys.m4.old
+--- m4/buildsys.m4.orig
+++ m4/buildsys.m4
-@@ -109,14 +109,14 @@ AC_DEFUN([BUILDSYS_SHARED_LIB], [
+@@ -108,13 +108,13 @@ AC_DEFUN([BUILDSYS_SHARED_LIB], [
+ case "$host_os" in
darwin*)
AC_MSG_RESULT(Darwin)
- LIB_CFLAGS='-fPIC -DPIC'
-- LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR}'
+- LIB_CFLAGS='-fPIC -DPIC -mmacosx-version-min=10.7'
+- LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR} -mmacosx-version-min=10.7 -install_name "${libdir}/$$(i=${SHARED_LIB}; echo $${i%${LIB_SUFFIX}}).${LIB_MAJOR}${LIB_SUFFIX}"'
++ LIB_CFLAGS='-fPIC -DPIC'
+ LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR} -Wl,-install_name,${libdir}/$${out%.dylib}.${LIB_MAJOR}.dylib'
LIB_PREFIX='lib'
LIB_SUFFIX='.dylib'
LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CFLAGS='-fPIC -DPIC'
- PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup'
+- PLUGIN_CFLAGS='-fPIC -DPIC -mmacosx-version-min=10.7'
+- PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup -mmacosx-version-min=10.7'
++ PLUGIN_CFLAGS='-fPIC -DPIC'
++ PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup'
PLUGIN_SUFFIX='.bundle'
-- INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && install_name_tool -id ${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
-+ INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
+ INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib'
- CLEAN_LIB=''
- ;;
Deleted: trunk/dports/multimedia/audacious-plugins/files/patch-configure.ac-select-libsdl.diff
===================================================================
--- trunk/dports/multimedia/audacious-plugins/files/patch-configure.ac-select-libsdl.diff 2015-04-13 16:07:33 UTC (rev 135030)
+++ trunk/dports/multimedia/audacious-plugins/files/patch-configure.ac-select-libsdl.diff 2015-04-13 16:24:21 UTC (rev 135031)
@@ -1,57 +0,0 @@
---- configure.ac.old
-+++ configure.ac
-@@ -578,17 +578,47 @@ AC_ARG_ENABLE(sdlout,
- [AS_HELP_STRING([--disable-sdlout], [disable SDL output plugin])],
- [enable_sdlout=$enableval], [enable_sdlout=auto])
-
-+if test "x$enable_sdlout" != "xno"; then
-+ AC_ARG_WITH(libsdl,
-+ [AS_HELP_STRING([--with-libsdl=VER], [select which SDL version to use. Set VER to 1 for libsdl1, to 2 for libsdl2. @<:@default=check@:>@])],
-+ [case "x$withval" in
-+ x1) ;;
-+ x2) ;;
-+ x*) withval=check;;
-+ esac
-+ with_libsdl=$withval], [with_libsdl=check])
-+fi
-+
-+libsdl1_min="1.2.11";
-+libsdl2_min="2.0";
-+
- have_sdlout=no
- if test "x$enable_sdlout" != "xno"; then
-- PKG_CHECK_MODULES([SDL], [sdl2 >= 2.0],
-- [have_sdlout=yes
-- OUTPUT_PLUGINS="$OUTPUT_PLUGINS sdlout"],
-- [PKG_CHECK_MODULES([SDL], [sdl >= 1.2.11],
-+ if test "x$with_libsdl" = "xcheck"; then
-+ PKG_CHECK_MODULES([SDL], [sdl2 >= $libsdl2_min],
- [have_sdlout=yes
- OUTPUT_PLUGINS="$OUTPUT_PLUGINS sdlout"],
-- [if test "x$enable_sdlout" = "xyes"; then
-- AC_MSG_ERROR([Cannot find SDL development files (ver >= 1.2.11), but compilation of SDL output plugin has been explicitly requested; please install SDL dev files and run configure again])
-- fi])])
-+ [PKG_CHECK_MODULES([SDL], [sdl >= $libsdl1_min],
-+ [have_sdlout=yes
-+ OUTPUT_PLUGINS="$OUTPUT_PLUGINS sdlout"],
-+ [if test "x$enable_sdlout" = "xyes"; then
-+ AC_MSG_ERROR([Cannot find SDL development files (ver >= $libsdl1_min), but compilation of SDL output plugin has been explicitly requested; please install SDL dev files and run configure again])
-+ fi])])
-+ elif test "x$with_libsdl" = "x1"; then
-+ PKG_CHECK_MODULES([SDL], [sdl >= $libsdl1_min],
-+ [have_sdlout=yes
-+ OUTPUT_PLUGINS="$OUTPUT_PLUGINS sdlout"],
-+ [if test "x$enable_sdlout" = "xyes"; then
-+ AC_MSG_ERROR([Cannot find SDL1 development files (ver >= $libsdl1_min), but compilation of SDL output plugin has been explicitly requested; please install SDL1 dev files and run configure again])
-+ fi])
-+ elif test "x$with_libsdl" = "x2"; then
-+ PKG_CHECK_MODULES([SDL], [sdl2 >= $libsdl2_min],
-+ [have_sdlout=yes
-+ OUTPUT_PLUGINS="$OUTPUT_PLUGINS sdlout"],
-+ [if test "x$enable_sdlout" = "xyes"; then
-+ AC_MSG_ERROR([Cannot find SDL2 development files (ver >= $libsdl2_min), but compilation of SDL output plugin has been explicitly requested; please install SDL2 dev files and run configure again])
-+ fi])
-+ fi
- fi
-
- dnl *** sndio output
Added: trunk/dports/multimedia/audacious-plugins/files/patch-gtk3.diff
===================================================================
--- trunk/dports/multimedia/audacious-plugins/files/patch-gtk3.diff (rev 0)
+++ trunk/dports/multimedia/audacious-plugins/files/patch-gtk3.diff 2015-04-13 16:24:21 UTC (rev 135031)
@@ -0,0 +1,2362 @@
+--- acinclude.m4.old
++++ acinclude.m4
+@@ -164,7 +164,7 @@ AC_ARG_ENABLE(gtk,
+ USE_GTK=$enableval, USE_GTK=yes)
+
+ if test $USE_GTK = yes ; then
+- PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.24)
++ PKG_CHECK_MODULES(GTK, gtk+-3.0 >= 3.4)
+ AC_DEFINE(USE_GTK, 1, [Define if GTK+ support enabled])
+ fi
+
+--- configure.ac.old
++++ configure.ac
+@@ -72,7 +72,7 @@ CONTAINER_PLUGINS="asx asx3 audpl m3u pls xspf"
+ TRANSPORT_PLUGINS="gio"
+
+ if test "x$USE_GTK" = "xyes" ; then
+- GENERAL_PLUGINS="$GENERAL_PLUGINS alarm albumart delete-files playlist-manager search-tool statusicon"
++ GENERAL_PLUGINS="$GENERAL_PLUGINS alarm albumart delete-files playlist-manager search-tool"
+ GENERAL_PLUGINS="$GENERAL_PLUGINS gtkui skins"
+ fi
+
+@@ -204,11 +204,11 @@ AC_ARG_ENABLE(hotkey,
+
+ have_hotkey=no
+ if test "x$enable_hotkey" != "xno"; then
+- PKG_CHECK_MODULES(GDKX11, [gdk-x11-2.0],
++ PKG_CHECK_MODULES(GDKX11, [gdk-x11-3.0],
+ [have_hotkey="yes"
+ GENERAL_PLUGINS="$GENERAL_PLUGINS hotkey"],
+ [if test "x$enable_hotkey" = "xyes"; then
+- AC_MSG_ERROR([Cannot find gdk-x11-2.0 development files, but compilation of X11 Global Hotkey plugin has been explicitly requested; please install gdk-x11-2.0 dev files and run configure again])
++ AC_MSG_ERROR([Cannot find gdk-x11-3.0 development files, but compilation of X11 Global Hotkey plugin has been explicitly requested; please install gdk-x11-3.0 dev files and run configure again])
+ fi]
+ )
+ else
+@@ -271,6 +271,17 @@ if test "x$enable_songchange" != "xno"; then
+ )
+ fi
+
++dnl Status Icon
++dnl ===========
++
++AC_ARG_ENABLE(statusicon,
++ [AS_HELP_STRING([--enable-statusicon], [enable X11 Status Icon plugin (default=disabled)])],
++ [have_statusicon=$enableval], [have_statusicon="no"])
++
++if test "x$have_statusicon" != "xno"; then
++ GENERAL_PLUGINS="$GENERAL_PLUGINS statusicon"
++fi
++
+ dnl *** Audacious OSD plugin (pangocairo-based)
+
+ AC_ARG_ENABLE(aosd,
+@@ -1170,7 +1181,7 @@ echo " MPRIS 2 Server: $have_mpris2"
+ echo " Playlist Manager: $USE_GTK"
+ echo " Search Tool: $USE_GTK"
+ echo " Song Change: $have_songchange"
+-echo " Status Icon: $USE_GTK"
++echo " Status Icon: $have_statusicon"
+ echo " Audacious OSD: $have_aosd"
+ echo " -> X Composite support: $have_aosd_xcomp"
+ echo " libnotify OSD: $have_notify"
+--- src/alarm/interface.cc.old
++++ src/alarm/interface.cc
+@@ -23,6 +23,10 @@
+
+ #include "callbacks.h"
+
++#if GTK_CHECK_VERSION (3, 12, 0)
++ #define gtk_widget_set_margin_right(w, m) gtk_widget_set_margin_end(w, m)
++#endif
++
+ const char *help[] =
+ {
+ N_("Time\n"
+@@ -169,62 +173,67 @@ GtkWidget *create_config_notebook (void)
+
+ /* Page 1 */
+ frame = gtk_frame_new (_("Time"));
+- gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+- grid = gtk_table_new (0, 0, FALSE);
+- gtk_table_set_col_spacings (GTK_TABLE (grid), 6);
+- gtk_table_set_row_spacings (GTK_TABLE (grid), 6);
+- gtk_container_set_border_width (GTK_CONTAINER (grid), 6);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
++ grid = gtk_grid_new ();
++ gtk_grid_set_column_spacing (GTK_GRID (grid), 3);
++ gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
++ gtk_container_set_border_width (GTK_CONTAINER (grid), 5);
+
+ label = gtk_label_new (_("Alarm at (default):"));
+- gtk_table_attach (GTK_TABLE (grid), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_widget_set_margin_right (label, 10);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
+
+- adjustment = (GtkAdjustment *) gtk_adjustment_new (6, 0, 23, 1, 10, 0);
++ adjustment = gtk_adjustment_new (6, 0, 23, 1, 10, 0);
+ alarm_h_spin = gtk_spin_button_new (adjustment, 1, 0);
+ g_object_set_data (G_OBJECT (notebook), "alarm_h_spin", alarm_h_spin);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (alarm_h_spin), GTK_UPDATE_IF_VALID);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (alarm_h_spin), TRUE);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (alarm_h_spin), TRUE);
+- gtk_table_attach (GTK_TABLE (grid), alarm_h_spin, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), alarm_h_spin, 1, 0, 1, 1);
+
+ label = gtk_label_new (":");
+- gtk_table_attach (GTK_TABLE (grid), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), label, 2, 0, 1, 1);
+
+- adjustment = (GtkAdjustment *) gtk_adjustment_new (30, 0, 59, 1, 10, 0);
++ adjustment = gtk_adjustment_new (30, 0, 59, 1, 10, 0);
+ alarm_m_spin = gtk_spin_button_new (adjustment, 1, 0);
+ g_object_set_data (G_OBJECT (notebook), "alarm_m_spin", alarm_m_spin);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (alarm_m_spin), GTK_UPDATE_IF_VALID);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (alarm_m_spin), TRUE);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (alarm_m_spin), TRUE);
+- gtk_table_attach (GTK_TABLE (grid), alarm_m_spin, 3, 4, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), alarm_m_spin, 3, 0, 1, 1);
+
+ label = gtk_label_new (_("h"));
+- gtk_table_attach (GTK_TABLE (grid), label, 4, 5, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_grid_attach (GTK_GRID (grid), label, 4, 0, 1, 1);
+
+ stop_checkb = gtk_check_button_new_with_label (_("Quiet after:"));
+ g_object_set_data (G_OBJECT (notebook), "stop_checkb", stop_checkb);
+- gtk_table_attach (GTK_TABLE (grid), stop_checkb, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_widget_set_margin_right (stop_checkb, 10);
++ gtk_widget_set_valign (stop_checkb, GTK_ALIGN_CENTER);
++ gtk_grid_attach (GTK_GRID (grid), stop_checkb, 0, 1, 1, 1);
+
+- adjustment = (GtkAdjustment *) gtk_adjustment_new (0, 0, 100, 1, 10, 0);
++ adjustment = gtk_adjustment_new (0, 0, 100, 1, 10, 0);
+ stop_h_spin = gtk_spin_button_new (adjustment, 1, 0);
+ g_object_set_data (G_OBJECT (notebook), "stop_h_spin", stop_h_spin);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (stop_h_spin), GTK_UPDATE_IF_VALID);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (stop_h_spin), TRUE);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_h_spin), TRUE);
+- gtk_table_attach (GTK_TABLE (grid), stop_h_spin, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), stop_h_spin, 1, 1, 1, 1);
+
+ label = gtk_label_new (_("hours"));
+- gtk_table_attach (GTK_TABLE (grid), label, 2, 3, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_widget_set_margin_right (label, 10);
++ gtk_grid_attach (GTK_GRID (grid), label, 2, 1, 1, 1);
+
+- adjustment = (GtkAdjustment *) gtk_adjustment_new (0, 0, 59, 1, 10, 0);
++ adjustment = gtk_adjustment_new (0, 0, 59, 1, 10, 0);
+ stop_m_spin = gtk_spin_button_new (adjustment, 1, 0);
+ g_object_set_data (G_OBJECT (notebook), "stop_m_spin", stop_m_spin);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (stop_m_spin), GTK_UPDATE_IF_VALID);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (stop_m_spin), TRUE);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_m_spin), TRUE);
+- gtk_table_attach (GTK_TABLE (grid), stop_m_spin, 3, 4, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), stop_m_spin, 3, 1, 1, 1);
+
+ label = gtk_label_new (_("minutes"));
+- gtk_table_attach (GTK_TABLE (grid), label, 4, 5, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), label, 4, 1, 1, 1);
+ gtk_container_add (GTK_CONTAINER (frame), grid);
+
+ label = gtk_label_new (_("Time"));
+@@ -233,24 +242,25 @@ GtkWidget *create_config_notebook (void)
+
+ /* Page 2 */
+ frame = gtk_frame_new (_("Choose the days for the alarm to come on"));
+- gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+- grid = gtk_table_new (0, 0, FALSE);
+- gtk_table_set_col_spacings (GTK_TABLE (grid), 6);
+- gtk_table_set_row_spacings (GTK_TABLE (grid), 6);
+- gtk_container_set_border_width (GTK_CONTAINER (grid), 6);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
++ grid = gtk_grid_new ();
++ gtk_grid_set_column_spacing (GTK_GRID (grid), 15);
++ gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
++ gtk_container_set_border_width (GTK_CONTAINER (grid), 5);
+
+ label = gtk_label_new (_("Day"));
+- gtk_table_attach (GTK_TABLE (grid), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
+
+ label = gtk_label_new (_("Time"));
+- gtk_table_attach (GTK_TABLE (grid), label, 2, 5, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), label, 2, 0, 3, 1);
+
+ for (i = 0; i < 7; i ++)
+ {
+ widget[i] = gtk_check_button_new_with_label (weekdays[i]);
+ g_object_set_data (G_OBJECT (notebook), day_cb[i], widget[i]);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget[i]), TRUE);
+- gtk_table_attach (GTK_TABLE (grid), widget[i], 0, 1, i + 1, i + 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_widget_set_valign (widget[i], GTK_ALIGN_CENTER);
++ gtk_grid_attach (GTK_GRID (grid), widget[i], 0, i + 1, 1, 1);
+ }
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget[6]), FALSE);
+
+@@ -259,30 +269,31 @@ GtkWidget *create_config_notebook (void)
+ checkbutton = gtk_check_button_new_with_label (_("Default"));
+ g_object_set_data (G_OBJECT (notebook), day_def[i], checkbutton);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton), TRUE);
++ gtk_widget_set_valign (checkbutton, GTK_ALIGN_CENTER);
+ g_signal_connect (checkbutton, "toggled", G_CALLBACK (cb_def[i]), nullptr);
+- gtk_table_attach (GTK_TABLE (grid), checkbutton, 1, 2, i + 1, i + 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), checkbutton, 1, i + 1, 1, 1);
+ }
+
+ for (i = 7, j = 0; i < 14; i ++, j ++)
+ {
+- adjustment = (GtkAdjustment *) gtk_adjustment_new (6, 0, 23, 1, 10, 0);
++ adjustment = gtk_adjustment_new (6, 0, 23, 1, 10, 0);
+ widget[i] = gtk_spin_button_new (adjustment, 1, 0);
+ g_object_set_data (G_OBJECT (notebook), day_h[j], widget[i]);
+- gtk_table_attach (GTK_TABLE (grid), widget[i], 2, 3, j + 1, j + 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), widget[i], 2, j + 1, 1, 1);
+ }
+
+ for (i = 0; i < 7; i ++)
+ {
+ label = gtk_label_new (":");
+- gtk_table_attach (GTK_TABLE (grid), label, 3, 4, i + 1, i + 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), label, 3, i + 1, 1, 1);
+ }
+
+ for (i = 14, j = 0; i < 21; i ++, j ++)
+ {
+- adjustment = (GtkAdjustment *) gtk_adjustment_new (30, 0, 59, 1, 10, 0);
++ adjustment = gtk_adjustment_new (30, 0, 59, 1, 10, 0);
+ widget[i] = gtk_spin_button_new (adjustment, 1, 0);
+ g_object_set_data (G_OBJECT (notebook), day_m[j], widget[i]);
+- gtk_table_attach (GTK_TABLE (grid), widget[i], 4, 5, j + 1, j + 2, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_grid_attach (GTK_GRID (grid), widget[i], 4, j + 1, 1, 1);
+ }
+
+ label = gtk_label_new (_("Days"));
+@@ -291,110 +302,117 @@ GtkWidget *create_config_notebook (void)
+
+
+ /* Page 3 */
+- vbox = gtk_vbox_new (FALSE, 6);
+- hbox = gtk_hbox_new (FALSE, 6);
++ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
++ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+
+ frame = gtk_frame_new (_("Fading"));
+- gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+- gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
+- adjustment = (GtkAdjustment *) gtk_adjustment_new (120, 0, 3600, 1, 10, 0);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
++ gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
++ adjustment = gtk_adjustment_new (120, 0, 3600, 1, 10, 0);
+ fading_spin = gtk_spin_button_new (adjustment, 1, 0);
+ g_object_set_data (G_OBJECT (notebook), "fading_spin", fading_spin);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fading_spin), TRUE);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (fading_spin), GTK_UPDATE_IF_VALID);
+ label = gtk_label_new (_("seconds"));
+
+- gtk_box_pack_start (GTK_BOX (hbox), fading_spin, TRUE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (hbox), fading_spin);
++ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 3);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (vbox), frame);
+
+ frame = gtk_frame_new (_("Volume"));
+- vbox2 = gtk_vbox_new (FALSE, 6);
+- gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+- gtk_container_set_border_width (GTK_CONTAINER (vbox2), 6);
++ vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
++ gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
+
+ label = gtk_label_new (_("Start at"));
+- gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0);
++ gtk_widget_set_margin_bottom (label, 2);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_container_add (GTK_CONTAINER (vbox2), label);
+
+- quiet_vol_scale = gtk_hscale_new ((GtkAdjustment *) gtk_adjustment_new (20, 0, 100, 1, 5, 0));
++ quiet_vol_scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, gtk_adjustment_new (20, 0, 100, 1, 5, 0));
+ g_object_set_data (G_OBJECT (notebook), "quiet_vol_scale", quiet_vol_scale);
+ gtk_scale_set_value_pos (GTK_SCALE (quiet_vol_scale), GTK_POS_RIGHT);
+ gtk_scale_set_digits (GTK_SCALE (quiet_vol_scale), 0);
+ label = gtk_label_new ("%");
+- hbox2 = gtk_hbox_new (FALSE, 6);
++ hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+ gtk_box_pack_start (GTK_BOX (hbox2), quiet_vol_scale, TRUE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
+- gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (hbox2), label);
++ gtk_container_add (GTK_CONTAINER (vbox2), hbox2);
+
+- separator = gtk_hseparator_new ();
+- gtk_box_pack_start (GTK_BOX (vbox2), separator, FALSE, FALSE, 0);
++ separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
++ gtk_box_pack_start (GTK_BOX (vbox2), separator, FALSE, FALSE, 10);
+
+ label = gtk_label_new (_("Final"));
+- gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0);
++ gtk_widget_set_margin_bottom (label, 2);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
++ gtk_container_add (GTK_CONTAINER (vbox2), label);
+
+- vol_scale = gtk_hscale_new ((GtkAdjustment *) gtk_adjustment_new (80, 0, 100, 1, 5, 0));
++ vol_scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, gtk_adjustment_new (80, 0, 100, 1, 5, 0));
+ g_object_set_data (G_OBJECT (notebook), "vol_scale", vol_scale);
+ gtk_scale_set_value_pos (GTK_SCALE (vol_scale), GTK_POS_RIGHT);
+ gtk_scale_set_digits (GTK_SCALE (vol_scale), 0);
+ label = gtk_label_new ("%");
+- hbox2 = gtk_hbox_new (FALSE, 6);
++ hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+ gtk_box_pack_start (GTK_BOX (hbox2), vol_scale, TRUE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
+- gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (hbox2), label);
++ gtk_container_add (GTK_CONTAINER (vbox2), hbox2);
+
+ current_button = gtk_button_new_with_label (_("Current"));
++ gtk_widget_set_margin_top (current_button, 10);
++ gtk_widget_set_halign (current_button, GTK_ALIGN_END);
+ g_signal_connect (current_button, "clicked", G_CALLBACK (alarm_current_volume), nullptr);
+- gtk_box_pack_start (GTK_BOX (vbox2), current_button, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (vbox2), current_button);
+
+ gtk_container_add (GTK_CONTAINER (frame), vbox2);
+- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (vbox), frame);
+
+ label = gtk_label_new (_("Volume"));
+ gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+
+
+ /* Page 4 */
+- vbox = gtk_vbox_new (FALSE, 6);
++ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ frame = gtk_frame_new (_("Additional Command"));
+- hbox = gtk_hbox_new (FALSE, 6);
+- gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+- gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
++ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
++ gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
+ cmd_entry = gtk_entry_new ();
+ g_object_set_data (G_OBJECT (notebook), "cmd_entry", cmd_entry);
+ cmd_checkb = gtk_check_button_new_with_label (_("enable"));
+ g_object_set_data (G_OBJECT (notebook), "cmd_checkb", cmd_checkb);
+ gtk_box_pack_start (GTK_BOX (hbox), cmd_entry, TRUE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX (hbox), cmd_checkb, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (hbox), cmd_checkb);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (vbox), frame);
+
+ frame = gtk_frame_new (_("Playlist (optional)"));
+- hbox = gtk_hbox_new (FALSE, 6);
+- gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+- gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
++ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
++ gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
+ playlist_entry = gtk_entry_new ();
+ g_object_set_data (G_OBJECT (notebook), "playlist", playlist_entry);
+
+ file_chooser_button = gtk_file_chooser_button_new (_("Select a playlist"), GTK_FILE_CHOOSER_ACTION_OPEN);
++ gtk_widget_set_valign (file_chooser_button, GTK_ALIGN_CENTER);
+ g_signal_connect (file_chooser_button, "file-set", G_CALLBACK (file_set_cb), playlist_entry);
+ gtk_box_pack_start (GTK_BOX (hbox), playlist_entry, TRUE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX (hbox), file_chooser_button, TRUE, TRUE, 0);
++ gtk_container_add (GTK_CONTAINER (hbox), file_chooser_button);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (vbox), frame);
+
+ frame = gtk_frame_new (_("Reminder"));
+- hbox = gtk_hbox_new (FALSE, 6);
+- gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+- gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
++ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
++ gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
+ reminder_text = gtk_entry_new ();
+ reminder_checkb = gtk_check_button_new_with_label (_("enable"));
+ g_object_set_data (G_OBJECT (notebook), "reminder_text", reminder_text);
+ g_object_set_data (G_OBJECT (notebook), "reminder_cb", reminder_checkb);
+ gtk_box_pack_start (GTK_BOX (hbox), reminder_text, TRUE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX (hbox), reminder_checkb, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (hbox), reminder_checkb);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
++ gtk_container_add (GTK_CONTAINER (vbox), frame);
+
+ label = gtk_label_new (_("Options"));
+ gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+@@ -402,7 +420,7 @@ GtkWidget *create_config_notebook (void)
+
+ /* Page 5 */
+ frame = gtk_frame_new (_("What do these options mean?"));
+- gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
++ gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
+ view = gtk_text_view_new ();
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
+--- src/amidi-plug/i_configure-fluidsynth.cc.old
++++ src/amidi-plug/i_configure-fluidsynth.cc
+@@ -216,9 +216,8 @@ void * create_soundfont_list (void)
+ g_strfreev (sffiles);
+ }
+
+- soundfont_file_hbox = gtk_hbox_new (FALSE, 2);
++ soundfont_file_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+ soundfont_file_lv = gtk_tree_view_new_with_model (GTK_TREE_MODEL (soundfont_file_store));
+- gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (soundfont_file_lv), TRUE);
+ g_object_unref (soundfont_file_store);
+ soundfont_file_lv_text_rndr = gtk_cell_renderer_text_new();
+ soundfont_file_lv_fname_col = gtk_tree_view_column_new_with_attributes (
+@@ -241,7 +240,7 @@ void * create_soundfont_list (void)
+ gtk_container_add (GTK_CONTAINER (soundfont_file_lv_sw), soundfont_file_lv);
+
+ /* soundfont settings - soundfont files - buttonbox */
+- soundfont_file_bbox_vbox = gtk_vbox_new (FALSE, 0);
++ soundfont_file_bbox_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ soundfont_file_bbox_addbt = gtk_button_new();
+ gtk_button_set_image (GTK_BUTTON (soundfont_file_bbox_addbt),
+ gtk_image_new_from_icon_name ("list-add", GTK_ICON_SIZE_MENU));
+--- src/amidi-plug/i_fileinfo.cc.old
++++ src/amidi-plug/i_fileinfo.cc
+@@ -47,11 +47,14 @@ void i_fileinfo_grid_add_entry (char * field_text, char * value_text,
+ GtkWidget * field, *value;
+ field = gtk_label_new (field_text);
+ gtk_label_set_attributes (GTK_LABEL (field), attrlist);
+- gtk_misc_set_alignment (GTK_MISC (field), 0, 0);
+- gtk_table_attach (GTK_TABLE (grid), field, 0, 1, line, line + 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_widget_set_halign (field, GTK_ALIGN_START);
++ gtk_label_set_justify (GTK_LABEL (field), GTK_JUSTIFY_LEFT);
++ gtk_grid_attach (GTK_GRID (grid), field, 0, line, 1, 1);
+ value = gtk_label_new (value_text);
+- gtk_misc_set_alignment (GTK_MISC (value), 0, 0);
+- gtk_table_attach (GTK_TABLE (grid), value, 1, 2, line, line + 1, GTK_FILL, GTK_FILL, 0, 0);
++ gtk_widget_set_halign (value, GTK_ALIGN_START);
++ gtk_label_set_justify (GTK_LABEL (value), GTK_JUSTIFY_LEFT);
++ gtk_grid_attach (GTK_GRID (grid), value, 1, line, 1, 1);
++ return;
+ }
+
+
+@@ -139,7 +142,7 @@ void i_fileinfo_gui (const char * filename_uri, VFSFile & file)
+ g_signal_connect (G_OBJECT (fileinfowin), "destroy", G_CALLBACK (gtk_widget_destroyed), &fileinfowin);
+ gtk_container_set_border_width (GTK_CONTAINER (fileinfowin), 10);
+
+- fileinfowin_vbox = gtk_vbox_new (FALSE, 10);
++ fileinfowin_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
+ gtk_container_add (GTK_CONTAINER (fileinfowin), fileinfowin_vbox);
+
+ /* pango attributes */
+@@ -151,13 +154,12 @@ void i_fileinfo_gui (const char * filename_uri, VFSFile & file)
+
+ /******************
+ *** TITLE LINE ***/
+- title_hbox = gtk_hbox_new (FALSE, 5);
++ title_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_box_pack_start (GTK_BOX (fileinfowin_vbox), title_hbox, FALSE, FALSE, 0);
+
+ title_icon_pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) amidiplug_xpm_midiicon);
+ title_icon_image = gtk_image_new_from_pixbuf (title_icon_pixbuf);
+ g_object_unref (title_icon_pixbuf);
+- gtk_misc_set_alignment (GTK_MISC (title_icon_image), 0, 0);
+ gtk_box_pack_start (GTK_BOX (title_hbox), title_icon_image, FALSE, FALSE, 0);
+
+ title_name_f_label = gtk_label_new (_("Name:"));
+@@ -169,12 +171,12 @@ void i_fileinfo_gui (const char * filename_uri, VFSFile & file)
+ gtk_widget_set_size_request (GTK_WIDGET (title_name_v_entry), 200, -1);
+ gtk_box_pack_start (GTK_BOX (title_hbox), title_name_v_entry, TRUE, TRUE, 0);
+
+- fileinfowin_columns_hbox = gtk_hbox_new (FALSE, 2);
++ fileinfowin_columns_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+ gtk_box_pack_start (GTK_BOX (fileinfowin_vbox), fileinfowin_columns_hbox, TRUE, TRUE, 0);
+
+ /*********************
+ *** MIDI INFO BOX ***/
+- midiinfoboxes_vbox = gtk_vbox_new (FALSE, 2);
++ midiinfoboxes_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
+ gtk_box_pack_start (GTK_BOX (fileinfowin_columns_hbox), midiinfoboxes_vbox, FALSE, FALSE, 0);
+
+ info_frame_tl = gtk_label_new ("");
+@@ -183,10 +185,10 @@ void i_fileinfo_gui (const char * filename_uri, VFSFile & file)
+
+ info_frame = gtk_frame_new (nullptr);
+ gtk_box_pack_start (GTK_BOX (midiinfoboxes_vbox), info_frame, TRUE, TRUE, 0);
+- info_grid = gtk_table_new (0, 0, FALSE);
+- gtk_table_set_row_spacings (GTK_TABLE (info_grid), 2);
+- gtk_table_set_col_spacings (GTK_TABLE (info_grid), 6);
+- gtk_container_set_border_width (GTK_CONTAINER (info_grid), 6);
++ info_grid = gtk_grid_new();
++ gtk_grid_set_row_spacing (GTK_GRID (info_grid), 4);
++ gtk_grid_set_column_spacing (GTK_GRID (info_grid), 10);
++ gtk_container_set_border_width (GTK_CONTAINER (info_grid), 3);
+ gtk_container_add (GTK_CONTAINER (info_frame), info_grid);
+ value_gstring = g_string_new ("");
+
+@@ -223,7 +225,7 @@ void i_fileinfo_gui (const char * filename_uri, VFSFile & file)
+
+ /**********************************
+ *** MIDI COMMENTS/LYRICS BOXES ***/
+- miditextboxes_vbox = gtk_vbox_new (FALSE, 2);
++ miditextboxes_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
+ gtk_box_pack_start (GTK_BOX (fileinfowin_columns_hbox), miditextboxes_vbox, TRUE, TRUE, 0);
+
+ text_frame_tl = gtk_label_new ("");
+@@ -231,7 +233,7 @@ void i_fileinfo_gui (const char * filename_uri, VFSFile & file)
+ _("<span size=\"smaller\"> MIDI Comments and Lyrics </span>"));
+ gtk_box_pack_start (GTK_BOX (miditextboxes_vbox), text_frame_tl, FALSE, FALSE, 0);
+
+- miditextboxes_paned = gtk_vpaned_new ();
++ miditextboxes_paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
+ gtk_box_pack_start (GTK_BOX (miditextboxes_vbox), miditextboxes_paned, TRUE, TRUE, 0);
+
+ text_frame = gtk_frame_new (nullptr);
+@@ -295,7 +297,7 @@ void i_fileinfo_gui (const char * filename_uri, VFSFile & file)
+
+ /**************
+ *** FOOTER ***/
+- footer_hbbox = gtk_hbutton_box_new ();
++ footer_hbbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (footer_hbbox), GTK_BUTTONBOX_END);
+ footer_bclose = gtk_button_new_with_mnemonic (_("_Close"));
+ g_signal_connect (G_OBJECT (footer_bclose), "clicked", G_CALLBACK (i_fileinfo_ev_close), fileinfowin);
+--- src/aosd/aosd_ui.cc.old
++++ src/aosd/aosd_ui.cc
+@@ -33,25 +33,29 @@
+ #include "aosd_osd.h"
+
+
+-static void chooser_get_aosd_color (GtkColorButton * chooser, aosd_color_t * color)
++static void chooser_get_aosd_color (GtkColorChooser * chooser, aosd_color_t * color)
+ {
+- GdkColor gdk_color;
+- gtk_color_button_get_color (chooser, & gdk_color);
++ GdkRGBA rgba;
++ gtk_color_chooser_get_rgba (chooser, & rgba);
+
+- color->red = gdk_color.red;
+- color->green = gdk_color.green;
+- color->blue = gdk_color.blue;
+- color->alpha = gtk_color_button_get_alpha (chooser);
++ color->red = rint (rgba.red * 65535.0);
++ color->green = rint (rgba.green * 65535.0);
++ color->blue = rint (rgba.blue * 65535.0);
++ color->alpha = rint (rgba.alpha * 65535.0);
+ }
+
+
+-static void chooser_set_aosd_color (GtkColorButton * chooser, const aosd_color_t * color)
++static void chooser_set_aosd_color (GtkColorChooser * chooser, const aosd_color_t * color)
+ {
+- GdkColor gdk_color = {0, (uint16_t) color->red, (uint16_t) color->green, (uint16_t) color->blue};
+-
+- gtk_color_button_set_color (chooser, & gdk_color);
+- gtk_color_button_set_use_alpha (chooser, TRUE);
+- gtk_color_button_set_alpha (chooser, color->alpha);
++ GdkRGBA rgba = {
++ color->red / 65535.0,
++ color->green / 65535.0,
++ color->blue / 65535.0,
++ color->alpha / 65535.0
++ };
++
++ gtk_color_chooser_set_use_alpha (chooser, TRUE);
++ gtk_color_chooser_set_rgba (chooser, & rgba);
+ }
+
+
+@@ -80,16 +84,14 @@ aosd_callback_list_run ( aosd_cfg_t * cfg )
+
+ static gboolean
+ aosd_cb_configure_position_expose ( GtkWidget * darea ,
+- GdkEventExpose * event ,
++ cairo_t * cr ,
+ void * coord_gp )
+ {
+ int coord = GPOINTER_TO_INT(coord_gp);
+
+- cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (darea));
+ cairo_set_source_rgb ( cr , 0 , 0 , 0 );
+ cairo_rectangle ( cr , (coord % 3) * 10 , (coord / 3) * 16 , 20 , 8 );
+ cairo_fill ( cr );
+- cairo_destroy (cr);
+
+ return FALSE;
+ }
+@@ -157,16 +159,16 @@ aosd_ui_configure_position ( aosd_cfg_t * cfg )
+ int monitors_num = gdk_screen_get_n_monitors( gdk_screen_get_default() );
+ int i = 0;
+
+- pos_vbox = gtk_vbox_new( FALSE , 4 );
++ pos_vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL , 4 );
+ gtk_container_set_border_width( GTK_CONTAINER(pos_vbox) , 6 );
+
+ pos_placement_frame = gtk_frame_new( _("Placement") );
+- pos_placement_hbox = gtk_hbox_new( FALSE , 0 );
++ pos_placement_hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 0 );
+ gtk_container_set_border_width( GTK_CONTAINER(pos_placement_hbox) , 6 );
+ gtk_container_add( GTK_CONTAINER(pos_placement_frame) , pos_placement_hbox );
+ gtk_box_pack_start( GTK_BOX(pos_vbox) , pos_placement_frame , FALSE , FALSE , 0 );
+
+- pos_placement_grid = gtk_table_new (0, 0, FALSE);
++ pos_placement_grid = gtk_grid_new();
+ for ( i = 0 ; i < 9 ; i++ )
+ {
+ if ( i == 0 )
+@@ -177,10 +179,9 @@ aosd_ui_configure_position ( aosd_cfg_t * cfg )
+ pos_placement_bt_darea[i] = gtk_drawing_area_new();
+ gtk_widget_set_size_request( pos_placement_bt_darea[i] , 40 , 40 );
+ gtk_container_add( GTK_CONTAINER(pos_placement_bt[i]) , pos_placement_bt_darea[i] );
+- g_signal_connect( G_OBJECT(pos_placement_bt_darea[i]) , "expose-event" ,
++ g_signal_connect( G_OBJECT(pos_placement_bt_darea[i]) , "draw" ,
+ G_CALLBACK(aosd_cb_configure_position_expose) , GINT_TO_POINTER(i) );
+- gtk_table_attach_defaults( GTK_TABLE(pos_placement_grid) , pos_placement_bt[i] ,
+- (i % 3) , (i % 3) + 1 , (i / 3) , (i / 3) + 1 );
++ gtk_grid_attach( GTK_GRID(pos_placement_grid) , pos_placement_bt[i] , (i % 3) , (i / 3) , 1 , 1 );
+ g_object_set_data( G_OBJECT(pos_placement_bt[i]) , "value" , GINT_TO_POINTER(i+1) );
+ if ( cfg->position.placement == (i+1) )
+ gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(pos_placement_bt[i]) , TRUE );
+@@ -188,38 +189,38 @@ aosd_ui_configure_position ( aosd_cfg_t * cfg )
+ gtk_box_pack_start( GTK_BOX(pos_placement_hbox) , pos_placement_grid , FALSE , FALSE , 0 );
+ aosd_cb_list.append( pos_placement_grid , aosd_cb_configure_position_placement_commit );
+
+- gtk_box_pack_start( GTK_BOX(pos_placement_hbox) , gtk_vseparator_new() , FALSE , FALSE , 6 );
++ gtk_box_pack_start( GTK_BOX(pos_placement_hbox) , gtk_separator_new(GTK_ORIENTATION_VERTICAL) , FALSE , FALSE , 6 );
+
+- pos_offset_grid = gtk_table_new (0, 0, FALSE);
+- gtk_table_set_row_spacings( GTK_TABLE(pos_offset_grid) , 4 );
+- gtk_table_set_col_spacings( GTK_TABLE(pos_offset_grid) , 4 );
++ pos_offset_grid = gtk_grid_new();
++ gtk_grid_set_row_spacing( GTK_GRID(pos_offset_grid) , 4 );
++ gtk_grid_set_column_spacing( GTK_GRID(pos_offset_grid) , 4 );
+ pos_offset_x_label = gtk_label_new( _( "Relative X offset:" ) );
+- gtk_misc_set_alignment( GTK_MISC(pos_offset_x_label) , 0 , 0.5 );
+- gtk_table_attach_defaults( GTK_TABLE(pos_offset_grid) , pos_offset_x_label , 0 , 1 , 0 , 1 );
++ gtk_widget_set_halign( pos_offset_x_label , GTK_ALIGN_START );
++ gtk_grid_attach( GTK_GRID(pos_offset_grid) , pos_offset_x_label , 0 , 0 , 1 , 1 );
+ pos_offset_x_spinbt = gtk_spin_button_new_with_range( -9999 , 9999 , 1 );
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON(pos_offset_x_spinbt) , cfg->position.offset_x );
+- gtk_table_attach_defaults( GTK_TABLE(pos_offset_grid) , pos_offset_x_spinbt , 1 , 2 , 0 , 1 );
++ gtk_grid_attach( GTK_GRID(pos_offset_grid) , pos_offset_x_spinbt , 1 , 0 , 1 , 1 );
+ g_object_set_data( G_OBJECT(pos_offset_grid) , "offx" , pos_offset_x_spinbt );
+ pos_offset_y_label = gtk_label_new( _( "Relative Y offset:" ) );
+- gtk_misc_set_alignment( GTK_MISC(pos_offset_y_label) , 0 , 0.5 );
+- gtk_table_attach_defaults( GTK_TABLE(pos_offset_grid) , pos_offset_y_label , 0 , 1 , 1 , 2 );
++ gtk_widget_set_halign( pos_offset_y_label , GTK_ALIGN_START );
++ gtk_grid_attach( GTK_GRID(pos_offset_grid) , pos_offset_y_label , 0 , 1 , 1 , 1 );
+ pos_offset_y_spinbt = gtk_spin_button_new_with_range( -9999 , 9999 , 1 );
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON(pos_offset_y_spinbt) , cfg->position.offset_y );
+- gtk_table_attach_defaults( GTK_TABLE(pos_offset_grid) , pos_offset_y_spinbt , 1 , 2 , 1 , 2 );
++ gtk_grid_attach( GTK_GRID(pos_offset_grid) , pos_offset_y_spinbt , 1 , 1 , 1 , 1 );
+ g_object_set_data( G_OBJECT(pos_offset_grid) , "offy" , pos_offset_y_spinbt );
+ pos_maxsize_width_label = gtk_label_new( _("Max OSD width:") );
+- gtk_misc_set_alignment( GTK_MISC(pos_maxsize_width_label) , 0 , 0.5 );
+- gtk_table_attach_defaults( GTK_TABLE(pos_offset_grid) , pos_maxsize_width_label , 0 , 1 , 2 , 3 );
++ gtk_widget_set_halign( pos_maxsize_width_label , GTK_ALIGN_START );
++ gtk_grid_attach( GTK_GRID(pos_offset_grid) , pos_maxsize_width_label , 0 , 2 , 1 , 1 );
+ pos_maxsize_width_spinbt = gtk_spin_button_new_with_range( 0 , 99999 , 1 );
+ g_object_set_data( G_OBJECT(pos_offset_grid) , "maxsize_width" , pos_maxsize_width_spinbt );
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON(pos_maxsize_width_spinbt) , cfg->position.maxsize_width );
+- gtk_table_attach_defaults( GTK_TABLE(pos_offset_grid) , pos_maxsize_width_spinbt , 1 , 2 , 2 , 3 );
++ gtk_grid_attach( GTK_GRID(pos_offset_grid) , pos_maxsize_width_spinbt , 1 , 2 , 1 , 1 );
+ gtk_box_pack_start( GTK_BOX(pos_placement_hbox) , pos_offset_grid , FALSE , FALSE , 0 );
+ aosd_cb_list.append( pos_offset_grid , aosd_cb_configure_position_offset_commit );
+ aosd_cb_list.append( pos_offset_grid , aosd_cb_configure_position_maxsize_commit );
+
+ pos_multimon_frame = gtk_frame_new( _("Multi-Monitor options") );
+- pos_multimon_hbox = gtk_hbox_new( FALSE , 4 );
++ pos_multimon_hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 4 );
+ gtk_container_set_border_width( GTK_CONTAINER(pos_multimon_hbox) , 6 );
+ gtk_container_add( GTK_CONTAINER(pos_multimon_frame), pos_multimon_hbox );
+ pos_multimon_label = gtk_label_new( _("Display OSD using:") );
+@@ -245,7 +246,7 @@ static GtkWidget *
+ aosd_ui_configure_animation_timing ( char * label_string )
+ {
+ GtkWidget *hbox, *desc_label, *spinbt;
+- hbox = gtk_hbox_new( FALSE , 4 );
++ hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 4 );
+ desc_label = gtk_label_new( label_string );
+ spinbt = gtk_spin_button_new_with_range( 0 , 99999 , 1 );
+ gtk_box_pack_start( GTK_BOX(hbox) , desc_label , FALSE , FALSE , 0 );
+@@ -275,10 +276,10 @@ aosd_ui_configure_animation ( aosd_cfg_t * cfg )
+ GtkWidget *ani_timing_fadein_widget, *ani_timing_fadeout_widget, *ani_timing_stay_widget;
+ GtkSizeGroup *sizegroup;
+
+- ani_vbox = gtk_vbox_new( FALSE , 0 );
++ ani_vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL , 0 );
+ gtk_container_set_border_width( GTK_CONTAINER(ani_vbox) , 6 );
+
+- ani_timing_hbox = gtk_hbox_new( FALSE , 0 );
++ ani_timing_hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 0 );
+ ani_timing_frame = gtk_frame_new( _("Timing (ms)") );
+ gtk_container_set_border_width( GTK_CONTAINER(ani_timing_hbox) , 6 );
+ gtk_container_add( GTK_CONTAINER(ani_timing_frame) , ani_timing_hbox );
+@@ -288,12 +289,12 @@ aosd_ui_configure_animation ( aosd_cfg_t * cfg )
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON(g_object_get_data(
+ G_OBJECT(ani_timing_stay_widget),"spinbt")) , cfg->animation.timing_display );
+ gtk_box_pack_start( GTK_BOX(ani_timing_hbox) , ani_timing_stay_widget , TRUE , TRUE , 0 );
+- gtk_box_pack_start( GTK_BOX(ani_timing_hbox) , gtk_vseparator_new() , FALSE , FALSE , 4 );
++ gtk_box_pack_start( GTK_BOX(ani_timing_hbox) , gtk_separator_new(GTK_ORIENTATION_VERTICAL) , FALSE , FALSE , 4 );
+ ani_timing_fadein_widget = aosd_ui_configure_animation_timing( _("Fade in:") );
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON(g_object_get_data(
+ G_OBJECT(ani_timing_fadein_widget),"spinbt")) , cfg->animation.timing_fadein );
+ gtk_box_pack_start( GTK_BOX(ani_timing_hbox) , ani_timing_fadein_widget , TRUE , TRUE , 0 );
+- gtk_box_pack_start( GTK_BOX(ani_timing_hbox) , gtk_vseparator_new() , FALSE , FALSE , 4 );
++ gtk_box_pack_start( GTK_BOX(ani_timing_hbox) , gtk_separator_new(GTK_ORIENTATION_VERTICAL) , FALSE , FALSE , 4 );
+ ani_timing_fadeout_widget = aosd_ui_configure_animation_timing( _("Fade out:") );
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON(g_object_get_data(
+ G_OBJECT(ani_timing_fadeout_widget),"spinbt")) , cfg->animation.timing_fadeout );
+@@ -329,7 +330,7 @@ static void
+ aosd_cb_configure_text_font_commit ( GtkWidget * fontbt , aosd_cfg_t * cfg )
+ {
+ int fontnum = GPOINTER_TO_INT(g_object_get_data( G_OBJECT(fontbt) , "fontnum" ));
+- GtkColorButton * chooser;
++ GtkColorChooser * chooser;
+
+ cfg->text.fonts_name[fontnum] =
+ String (gtk_font_button_get_font_name (GTK_FONT_BUTTON (fontbt)));
+@@ -337,10 +338,10 @@ aosd_cb_configure_text_font_commit ( GtkWidget * fontbt , aosd_cfg_t * cfg )
+ cfg->text.fonts_draw_shadow[fontnum] = gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(fontbt),"use_shadow")) );
+
+- chooser = (GtkColorButton *) g_object_get_data ((GObject *) fontbt, "color");
++ chooser = (GtkColorChooser *) g_object_get_data ((GObject *) fontbt, "color");
+ chooser_get_aosd_color (chooser, & cfg->text.fonts_color[fontnum]);
+
+- chooser = (GtkColorButton *) g_object_get_data ((GObject *) fontbt, "shadow_color");
++ chooser = (GtkColorChooser *) g_object_get_data ((GObject *) fontbt, "shadow_color");
+ chooser_get_aosd_color (chooser, & cfg->text.fonts_shadow_color[fontnum]);
+ }
+
+@@ -355,14 +356,14 @@ aosd_ui_configure_text ( aosd_cfg_t * cfg )
+ GtkWidget *tex_font_shadow_colorbt[3];
+ int i = 0;
+
+- tex_vbox = gtk_vbox_new( FALSE , 4 );
++ tex_vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL , 4 );
+ gtk_container_set_border_width( GTK_CONTAINER(tex_vbox) , 6 );
+
+ tex_font_frame = gtk_frame_new( _("Fonts") );
+- tex_font_grid = gtk_table_new (0, 0, FALSE);
++ tex_font_grid = gtk_grid_new();
+ gtk_container_set_border_width( GTK_CONTAINER(tex_font_grid) , 6 );
+- gtk_table_set_row_spacings( GTK_TABLE(tex_font_grid) , 4 );
+- gtk_table_set_col_spacings( GTK_TABLE(tex_font_grid) , 4 );
++ gtk_grid_set_row_spacing ( GTK_GRID(tex_font_grid) , 4 );
++ gtk_grid_set_column_spacing ( GTK_GRID(tex_font_grid) , 4 );
+ for ( i = 0 ; i < AOSD_TEXT_FONTS_NUM ; i++ )
+ {
+ char *label_str = g_strdup_printf( _("Font %i:") , i+1 );
+@@ -374,16 +375,17 @@ aosd_ui_configure_text ( aosd_cfg_t * cfg )
+ gtk_font_button_set_use_font( GTK_FONT_BUTTON(tex_font_fontbt[i]) , FALSE );
+ gtk_font_button_set_use_size( GTK_FONT_BUTTON(tex_font_fontbt[i]) , FALSE );
+ gtk_font_button_set_font_name( GTK_FONT_BUTTON(tex_font_fontbt[i]) , cfg->text.fonts_name[i] );
++ gtk_widget_set_hexpand( tex_font_fontbt[i] , TRUE );
+
+ tex_font_colorbt[i] = gtk_color_button_new ();
+- chooser_set_aosd_color ((GtkColorButton *) tex_font_colorbt[i],
++ chooser_set_aosd_color ((GtkColorChooser *) tex_font_colorbt[i],
+ & cfg->text.fonts_color[i]);
+
+ tex_font_shadow_togglebt[i] = gtk_toggle_button_new_with_label( _("Shadow") );
+ gtk_toggle_button_set_mode( GTK_TOGGLE_BUTTON(tex_font_shadow_togglebt[i]) , FALSE );
+
+ tex_font_shadow_colorbt[i] = gtk_color_button_new ();
+- chooser_set_aosd_color ((GtkColorButton *) tex_font_shadow_colorbt[i],
++ chooser_set_aosd_color ((GtkColorChooser *) tex_font_shadow_colorbt[i],
+ & cfg->text.fonts_shadow_color[i]);
+
+ gtk_widget_set_sensitive( tex_font_shadow_colorbt[i] , FALSE );
+@@ -392,11 +394,11 @@ aosd_ui_configure_text ( aosd_cfg_t * cfg )
+ tex_font_shadow_colorbt[i] );
+ gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tex_font_shadow_togglebt[i]) ,
+ cfg->text.fonts_draw_shadow[i] );
+- gtk_table_attach_defaults( GTK_TABLE(tex_font_grid) , tex_font_label[i] , 0 , 1 , i , i + 1 );
+- gtk_table_attach_defaults( GTK_TABLE(tex_font_grid) , tex_font_fontbt[i] , 1 , 2 , i , i + 1 );
+- gtk_table_attach_defaults( GTK_TABLE(tex_font_grid) , tex_font_colorbt[i] , 2 , 3 , i , i + 1 );
+- gtk_table_attach_defaults( GTK_TABLE(tex_font_grid) , tex_font_shadow_togglebt[i] , 3 , 4 , i , i + 1 );
+- gtk_table_attach_defaults( GTK_TABLE(tex_font_grid) , tex_font_shadow_colorbt[i] , 4 , 5 , i , i + 1 );
++ gtk_grid_attach( GTK_GRID(tex_font_grid) , tex_font_label[i] , 0 , 0 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(tex_font_grid) , tex_font_fontbt[i] , 1 , 0 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(tex_font_grid) , tex_font_colorbt[i] , 2 , 0 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(tex_font_grid) , tex_font_shadow_togglebt[i] , 3 , 0 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(tex_font_grid) , tex_font_shadow_colorbt[i] , 4 , 0 , 1 , 1 );
+ g_object_set_data( G_OBJECT(tex_font_fontbt[i]) , "fontnum" , GINT_TO_POINTER(i) );
+ g_object_set_data( G_OBJECT(tex_font_fontbt[i]) , "color" , tex_font_colorbt[i] );
+ g_object_set_data( G_OBJECT(tex_font_fontbt[i]) , "use_shadow" , tex_font_shadow_togglebt[i] );
+@@ -430,7 +432,7 @@ static void
+ aosd_cb_configure_decoration_color_commit ( GtkWidget * colorbt , aosd_cfg_t * cfg )
+ {
+ aosd_color_t color;
+- chooser_get_aosd_color ((GtkColorButton *) colorbt, & color);
++ chooser_get_aosd_color ((GtkColorChooser *) colorbt, & color);
+
+ int colnum = GPOINTER_TO_INT( g_object_get_data( G_OBJECT(colorbt) , "colnum" ) );
+ cfg->decoration.colors[colnum] = color;
+@@ -451,7 +453,7 @@ aosd_ui_configure_decoration ( aosd_cfg_t * cfg )
+ GtkWidget *dec_rstyleopts_frame, *dec_rstyleopts_grid;
+ int colors_max_num = 0, i = 0;
+
+- dec_hbox = gtk_hbox_new( FALSE , 4 );
++ dec_hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 4 );
+ gtk_container_set_border_width( GTK_CONTAINER(dec_hbox) , 6 );
+
+ /* decoration style model
+@@ -495,31 +497,31 @@ aosd_ui_configure_decoration ( aosd_cfg_t * cfg )
+ gtk_box_pack_start( GTK_BOX(dec_hbox) , dec_rstyle_lv_frame , FALSE , FALSE , 0 );
+ aosd_cb_list.append( dec_rstyle_lv , aosd_cb_configure_decoration_style_commit );
+
+- dec_rstyle_hbox = gtk_vbox_new( FALSE , 4 );
++ dec_rstyle_hbox = gtk_box_new( GTK_ORIENTATION_VERTICAL , 4 );
+ gtk_box_pack_start( GTK_BOX(dec_hbox) , dec_rstyle_hbox , TRUE , TRUE , 0 );
+
+ /* in colors_max_num now there's the maximum number of colors used by decoration styles */
+ dec_rstyleopts_frame = gtk_frame_new( _("Colors") );
+- dec_rstyleopts_grid = gtk_table_new (0, 0, FALSE);
++ dec_rstyleopts_grid = gtk_grid_new();
+ gtk_container_set_border_width( GTK_CONTAINER(dec_rstyleopts_grid) , 6 );
+- gtk_table_set_row_spacings( GTK_TABLE(dec_rstyleopts_grid) , 4 );
+- gtk_table_set_col_spacings( GTK_TABLE(dec_rstyleopts_grid) , 8 );
++ gtk_grid_set_row_spacing( GTK_GRID(dec_rstyleopts_grid) , 4 );
++ gtk_grid_set_column_spacing( GTK_GRID(dec_rstyleopts_grid) , 8 );
+ gtk_container_add( GTK_CONTAINER(dec_rstyleopts_frame) , dec_rstyleopts_grid );
+ for ( i = 0 ; i < colors_max_num ; i++ )
+ {
+ GtkWidget *hbox, *label;
+ char *label_str = nullptr;
+- hbox = gtk_hbox_new( FALSE , 4 );
++ hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 4 );
+ label_str = g_strdup_printf( _("Color %i:") , i+1 );
+ label = gtk_label_new( label_str );
+ g_free( label_str );
+
+ GtkWidget * colorbt = gtk_color_button_new ();
+- chooser_set_aosd_color ((GtkColorButton *) colorbt, & cfg->decoration.colors[i]);
++ chooser_set_aosd_color ((GtkColorChooser *) colorbt, & cfg->decoration.colors[i]);
+
+ gtk_box_pack_start( GTK_BOX(hbox) , label , FALSE , FALSE , 0 );
+ gtk_box_pack_start( GTK_BOX(hbox) , colorbt , FALSE , FALSE , 0 );
+- gtk_table_attach_defaults( GTK_TABLE(dec_rstyleopts_grid) , hbox , (i % 3) , (i % 3) + 1, (i / 3) , (i / 3) + 1);
++ gtk_grid_attach( GTK_GRID(dec_rstyleopts_grid) , hbox , (i % 3) , (i / 3) , 1 , 1 );
+ g_object_set_data( G_OBJECT(colorbt) , "colnum" , GINT_TO_POINTER(i) );
+ aosd_cb_list.append( colorbt , aosd_cb_configure_decoration_color_commit );
+ }
+@@ -573,7 +575,7 @@ aosd_ui_configure_trigger ( aosd_cfg_t * cfg )
+ gtk_notebook_set_show_tabs( GTK_NOTEBOOK(tri_event_nb) , FALSE );
+ gtk_notebook_set_show_border( GTK_NOTEBOOK(tri_event_nb) , FALSE );
+
+- tri_hbox = gtk_hbox_new( FALSE , 4 );
++ tri_hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 4 );
+ gtk_container_set_border_width( GTK_CONTAINER(tri_hbox) , 6 );
+
+ /* trigger model
+@@ -591,19 +593,19 @@ aosd_ui_configure_trigger ( aosd_cfg_t * cfg )
+ gtk_list_store_set( tri_event_store , &iter ,
+ 0 , _(aosd_trigger_get_name( i )) ,
+ 1 , i , 2 , i , -1 );
+- vbox = gtk_vbox_new( FALSE , 0 );
++ vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL , 0 );
+ gtk_container_set_border_width( GTK_CONTAINER(vbox) , 6 );
+ label = gtk_label_new( _(aosd_trigger_get_desc( i )) );
+ gtk_label_set_line_wrap( GTK_LABEL(label) , TRUE );
+ gtk_label_set_max_width_chars( GTK_LABEL(label), 40 );
+- gtk_misc_set_alignment( GTK_MISC(label) , 0.0 , 0.0 );
++ gtk_widget_set_halign( label , GTK_ALIGN_START );
+ checkbt = gtk_check_button_new_with_label( _("Enable trigger") );
+ if ( cfg->trigger.enabled[i] )
+ gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(checkbt) , TRUE );
+ else
+ gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(checkbt) , FALSE );
+ gtk_box_pack_start( GTK_BOX(vbox) , checkbt , FALSE , FALSE , 0 );
+- gtk_box_pack_start( GTK_BOX(vbox) , gtk_hseparator_new() , FALSE , FALSE , 4 );
++ gtk_box_pack_start( GTK_BOX(vbox) , gtk_separator_new(GTK_ORIENTATION_HORIZONTAL) , FALSE , FALSE , 4 );
+ gtk_box_pack_start( GTK_BOX(vbox) , label , FALSE , FALSE , 0 );
+ frame = gtk_frame_new( nullptr );
+ gtk_container_add( GTK_CONTAINER(frame) , vbox );
+@@ -699,10 +701,10 @@ aosd_ui_configure_misc ( aosd_cfg_t * cfg )
+ GtkWidget *mis_transp_status_frame, *mis_transp_status_hbox;
+ GtkWidget *mis_transp_status_img, *mis_transp_status_label;
+
+- mis_vbox = gtk_vbox_new( FALSE , 0 );
++ mis_vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL , 0 );
+ gtk_container_set_border_width( GTK_CONTAINER(mis_vbox) , 6 );
+
+- mis_transp_vbox = gtk_vbox_new( FALSE , 0 );
++ mis_transp_vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL , 0 );
+ mis_transp_frame = gtk_frame_new( _("Transparency") );
+ gtk_container_set_border_width( GTK_CONTAINER(mis_transp_vbox) , 6 );
+ gtk_container_add( GTK_CONTAINER(mis_transp_frame) , mis_transp_vbox );
+@@ -719,16 +721,15 @@ aosd_ui_configure_misc ( aosd_cfg_t * cfg )
+ gtk_box_pack_start( GTK_BOX(mis_transp_vbox) , mis_transp_fake_rbt , TRUE , TRUE , 0 );
+ gtk_box_pack_start( GTK_BOX(mis_transp_vbox) , mis_transp_real_rbt , TRUE , TRUE , 0 );
+
+- mis_transp_status_hbox = gtk_hbox_new( FALSE , 4 );
++ mis_transp_status_hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 4 );
+ mis_transp_status_frame = gtk_frame_new( nullptr );
+ gtk_container_set_border_width( GTK_CONTAINER(mis_transp_status_hbox) , 3 );
+ gtk_container_add( GTK_CONTAINER(mis_transp_status_frame) , mis_transp_status_hbox );
+ gtk_box_pack_start( GTK_BOX(mis_transp_vbox) , mis_transp_status_frame , TRUE , TRUE , 0 );
+
+ mis_transp_status_img = gtk_image_new();
+- gtk_misc_set_alignment( GTK_MISC(mis_transp_status_img) , 0.5 , 0 );
+ mis_transp_status_label = gtk_label_new( "" );
+- gtk_misc_set_alignment( GTK_MISC(mis_transp_status_label) , 0 , 0.5 );
++ gtk_widget_set_halign( mis_transp_status_label , GTK_ALIGN_START );
+ gtk_label_set_line_wrap( GTK_LABEL(mis_transp_status_label) , TRUE );
+ gtk_box_pack_start( GTK_BOX(mis_transp_status_hbox) , mis_transp_status_img , FALSE , FALSE , 0 );
+ gtk_box_pack_start( GTK_BOX(mis_transp_status_hbox) , mis_transp_status_label , TRUE , TRUE , 0 );
+--- src/blur_scope/blur_scope.cc.old
++++ src/blur_scope/blur_scope.cc
+@@ -73,13 +73,14 @@ public:
+
+ private:
+ void resize (int w, int h);
++ void draw_to_cairo (cairo_t * cr);
+ void draw ();
+
+ void blur ();
+ void draw_vert_line (int x, int y1, int y2);
+
+ static gboolean configure_event (GtkWidget * widget, GdkEventConfigure * event, void * user);
+- static gboolean expose_event (GtkWidget * widget, GdkEventExpose * event, void * user);
++ static gboolean draw_cb (GtkWidget * widget, cairo_t * cr, void * user);
+
+ GtkWidget * area = nullptr;
+ int width = 0, height = 0, stride = 0, image_size = 0;
+@@ -115,17 +116,22 @@ void BlurScope::resize (int w, int h)
+ corner = image + stride + 1;
+ }
+
+-void BlurScope::draw ()
++void BlurScope::draw_to_cairo (cairo_t * cr)
+ {
+- if (! area || ! gtk_widget_get_window (area))
+- return;
+-
+- cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (area));
+ cairo_surface_t * surf = cairo_image_surface_create_for_data
+ ((unsigned char *) image, CAIRO_FORMAT_RGB24, width, height, stride << 2);
+ cairo_set_source_surface (cr, surf, 0, 0);
+ cairo_paint (cr);
+ cairo_surface_destroy (surf);
++}
++
++void BlurScope::draw ()
++{
++ if (! area || ! gtk_widget_get_window (area))
++ return;
++
++ cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (area));
++ draw_to_cairo (cr);
+ cairo_destroy (cr);
+ }
+
+@@ -135,9 +141,9 @@ gboolean BlurScope::configure_event (GtkWidget * widget, GdkEventConfigure * eve
+ return TRUE;
+ }
+
+-gboolean BlurScope::expose_event (GtkWidget * widget, GdkEventExpose * event, void * user)
++gboolean BlurScope::draw_cb (GtkWidget * widget, cairo_t * cr, void * user)
+ {
+- ((BlurScope *) user)->draw ();
++ ((BlurScope *) user)->draw_to_cairo (cr);
+ return TRUE;
+ }
+
+@@ -147,7 +153,7 @@ void * BlurScope::get_gtk_widget ()
+ gtk_widget_set_size_request (area, D_WIDTH, D_HEIGHT);
+ resize (D_WIDTH, D_HEIGHT);
+
+- g_signal_connect (area, "expose-event", (GCallback) expose_event, this);
++ g_signal_connect (area, "draw_cb", (GCallback) draw_cb, this);
+ g_signal_connect (area, "configure-event", (GCallback) configure_event, this);
+ g_signal_connect (area, "destroy", (GCallback) gtk_widget_destroyed, & area);
+
+@@ -216,17 +222,25 @@ void BlurScope::render_mono_pcm (const float * pcm)
+
+ static void color_set_cb (GtkWidget * chooser)
+ {
+- GdkColor gdk_color;
+- gtk_color_button_get_color ((GtkColorButton *) chooser, & gdk_color);
+- bscope_color = ((gdk_color.red & 0xff00) << 8) | (gdk_color.green & 0xff00) | (gdk_color.blue >> 8);
++ GdkRGBA rgba;
++ gtk_color_chooser_get_rgba ((GtkColorChooser *) chooser, & rgba);
++
++ int red = round (rgba.red * 255);
++ int green = round (rgba.green * 255);
++ int blue = round (rgba.blue * 255);
++ bscope_color = (red << 16) | (green << 8) | blue;
+ }
+
+ static void /* GtkWidget */ * bscope_get_color_chooser (void)
+ {
+- GdkColor gdk_color = {0, (uint16_t) ((bscope_color & 0xff0000) >> 8),
+- (uint16_t) (bscope_color & 0xff00), (uint16_t) ((bscope_color & 0xff) << 8)};
+- GtkWidget * chooser = gtk_color_button_new_with_color (& gdk_color);
+- gtk_color_button_set_use_alpha ((GtkColorButton *) chooser, FALSE);
++ GdkRGBA rgba = {
++ ((bscope_color & 0xff0000) >> 16) / 255.0,
++ ((bscope_color & 0xff00) >> 8) / 255.0,
++ (bscope_color & 0xff) / 255.0
++ };
++
++ GtkWidget * chooser = gtk_color_button_new_with_rgba (& rgba);
++ gtk_color_chooser_set_use_alpha ((GtkColorChooser *) chooser, false);
+
+ g_signal_connect (chooser, "color-set", (GCallback) color_set_cb, nullptr);
+
+--- src/cairo-spectrum/cairo-spectrum.cc.old
++++ src/cairo-spectrum/cairo-spectrum.cc
+@@ -183,12 +183,29 @@ static void hsv_to_rgb (float h, float s, float v, float * r, float * g, float *
+ * b = v * (1 - s * (1 - * b));
+ }
+
+-static void get_color (GtkWidget * widget, int i, float * r, float * g, float * b)
++static void get_color (gint i, gfloat * r, gfloat * g, gfloat * b)
+ {
+- GdkColor * c = (gtk_widget_get_style (widget))->base + GTK_STATE_SELECTED;
+- float h, s, v;
++ static GdkRGBA c;
++ static gboolean valid = FALSE;
++ gfloat h, s, v, n;
+
+- rgb_to_hsv (c->red / 65535.0, c->green / 65535.0, c->blue / 65535.0, & h, & s, & v);
++ if (! valid)
++ {
++ /* we want a color that matches the current theme
++ * selected color of a GtkEntry should be reasonable */
++ GtkStyleContext * style = gtk_style_context_new ();
++ GtkWidgetPath * path = gtk_widget_path_new ();
++ gtk_widget_path_append_type (path, GTK_TYPE_ENTRY);
++ gtk_style_context_set_path (style, path);
++ gtk_widget_path_free (path);
++ gtk_style_context_add_class (style, "entry");
++ gtk_style_context_get_background_color (style,
++ (GtkStateFlags) (GTK_STATE_FLAG_FOCUSED | GTK_STATE_FLAG_SELECTED), & c);
++ g_object_unref (style);
++ valid = TRUE;
++ }
++
++ rgb_to_hsv (c.red, c.green, c.blue, & h, & s, & v);
+
+ if (s < 0.1) /* monochrome theme? use blue instead */
+ {
+@@ -196,8 +213,9 @@ static void get_color (GtkWidget * widget, int i, float * r, float * g, float *
+ s = 0.75;
+ }
+
+- s = 1 - 0.9 * i / (bands - 1);
+- v = 0.75 + 0.25 * i / (bands - 1);
++ n = i / (gfloat) (bands - 1);
++ s = 1 - 0.9 * n;
++ v = 0.75 + 0.25 * n;
+
+ hsv_to_rgb (h, s, v, r, g, b);
+ }
+@@ -218,7 +236,7 @@ static void draw_visualizer (GtkWidget *widget, cairo_t *cr)
+ int x = ((width / bands) * i) + 2;
+ float r, g, b;
+
+- get_color (widget, i, & r, & g, & b);
++ get_color (i, & r, & g, & b);
+ cairo_set_source_rgb (cr, r, g, b);
+ cairo_rectangle (cr, x + 1, height - (bars[i] * height / 40),
+ (width / bands) - 1, (bars[i] * height / 40));
+@@ -239,14 +257,11 @@ static gboolean configure_event (GtkWidget * widget, GdkEventConfigure * event)
+ return TRUE;
+ }
+
+-static gboolean draw_event (GtkWidget * widget)
++static gboolean draw_event (GtkWidget * widget, cairo_t * cr, GtkWidget * area)
+ {
+- cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (widget));
+-
+ draw_background (widget, cr);
+ draw_visualizer (widget, cr);
+
+- cairo_destroy (cr);
+ return TRUE;
+ }
+
+@@ -255,7 +270,7 @@ void * CairoSpectrum::get_gtk_widget ()
+ GtkWidget *area = gtk_drawing_area_new();
+ spect_widget = area;
+
+- g_signal_connect(area, "expose-event", (GCallback) draw_event, nullptr);
++ g_signal_connect(area, "draw", (GCallback) draw_event, nullptr);
+ g_signal_connect(area, "configure-event", (GCallback) configure_event, nullptr);
+ g_signal_connect(area, "destroy", (GCallback) gtk_widget_destroyed, & spect_widget);
+
+--- src/filewriter/filewriter.cc.old
++++ src/filewriter/filewriter.cc
+@@ -378,9 +378,9 @@ static void filenamefromfilename_cb(GtkWidget *button, void * data)
+
+ static void * file_configure (void)
+ {
+- GtkWidget * configure_vbox = gtk_vbox_new (FALSE, 6);
++ GtkWidget * configure_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+
+- GtkWidget * fileext_hbox = gtk_hbox_new (FALSE, 5);
++ GtkWidget * fileext_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_box_pack_start(GTK_BOX(configure_vbox), fileext_hbox, FALSE, FALSE, 0);
+
+ GtkWidget * fileext_label = gtk_label_new (_("Output file format:"));
+@@ -404,9 +404,9 @@ static void * file_configure (void)
+ gtk_widget_set_sensitive(plugin_button, plugin->configure != nullptr);
+ gtk_box_pack_end(GTK_BOX(fileext_hbox), plugin_button, FALSE, FALSE, 0);
+
+- gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_hseparator_new(), FALSE, FALSE, 0);
++ gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 0);
+
+- GtkWidget * saveplace_hbox = gtk_hbox_new (FALSE, 5);
++ GtkWidget * saveplace_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_add(GTK_CONTAINER(configure_vbox), saveplace_hbox);
+
+ GtkWidget * saveplace1 = gtk_radio_button_new_with_label (nullptr,
+@@ -421,7 +421,7 @@ static void * file_configure (void)
+
+ gtk_box_pack_start ((GtkBox *) saveplace_hbox, saveplace2, FALSE, FALSE, 0);
+
+- path_hbox = gtk_hbox_new (FALSE, 5);
++ path_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_box_pack_start(GTK_BOX(configure_vbox), path_hbox, FALSE, FALSE, 0);
+
+ GtkWidget * path_label = gtk_label_new (_("Output file folder:"));
+@@ -436,9 +436,9 @@ static void * file_configure (void)
+ if (save_original)
+ gtk_widget_set_sensitive(path_hbox, FALSE);
+
+- gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_hseparator_new(), FALSE, FALSE, 0);
++ gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 0);
+
+- filenamefrom_hbox = gtk_hbox_new (FALSE, 5);
++ filenamefrom_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_add(GTK_CONTAINER(configure_vbox), filenamefrom_hbox);
+
+ filenamefrom_label = gtk_label_new(_("Generate file name from:"));
+@@ -463,7 +463,7 @@ static void * file_configure (void)
+ if (filenamefromtags)
+ gtk_widget_set_sensitive(use_suffix_toggle, FALSE);
+
+- gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_hseparator_new(), FALSE, FALSE, 0);
++ gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 0);
+
+ prependnumber_toggle = gtk_check_button_new_with_label(_("Prepend track number to file name"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prependnumber_toggle), prependnumber);
+--- src/filewriter/mp3.cc.old
++++ src/filewriter/mp3.cc
+@@ -669,10 +669,10 @@ static void mp3_configure(void)
+
+ /* Quality */
+
+- quality_vbox = gtk_vbox_new (FALSE, 5);
++ quality_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(quality_vbox), 5);
+
+- quality_hbox1 = gtk_hbox_new (FALSE, 5);
++ quality_hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_box_pack_start(GTK_BOX(quality_vbox), quality_hbox1, FALSE,
+ FALSE, 0);
+
+@@ -684,7 +684,7 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(quality_hbox1), alg_quality_frame,
+ FALSE, FALSE, 0);
+
+- alg_quality_hbox = gtk_hbox_new (FALSE, 5);
++ alg_quality_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(alg_quality_hbox),
+ 10);
+ gtk_container_add(GTK_CONTAINER(alg_quality_frame),
+@@ -708,7 +708,7 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(quality_hbox1), samplerate_frame, FALSE,
+ FALSE, 0);
+
+- samplerate_hbox = gtk_hbox_new (FALSE, 5);
++ samplerate_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(samplerate_hbox), 10);
+ gtk_container_add(GTK_CONTAINER(samplerate_frame),
+ samplerate_hbox);
+@@ -731,7 +731,7 @@ static void mp3_configure(void)
+ g_signal_connect (combo, "changed", (GCallback) samplerate_changed, nullptr);
+
+ samplerate_label = gtk_label_new(_("(Hz)"));
+- gtk_misc_set_alignment(GTK_MISC(samplerate_label), 0, 0.5);
++ gtk_widget_set_halign(samplerate_label, GTK_ALIGN_START);
+ gtk_box_pack_start(GTK_BOX(samplerate_hbox), samplerate_label,
+ FALSE, FALSE, 0);
+
+@@ -744,14 +744,14 @@ static void mp3_configure(void)
+ FALSE, 0);
+
+ // vbox sorrounding hbox1 and hbox2
+- enc_quality_vbox = gtk_vbox_new (FALSE, 5);
++ enc_quality_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(enc_quality_vbox), 10);
+
+ // pack vbox to frame
+ gtk_container_add(GTK_CONTAINER(enc_quality_frame), enc_quality_vbox);
+
+ // hbox1 for bitrate
+- hbox1 = gtk_hbox_new (FALSE, 5);
++ hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_add(GTK_CONTAINER(enc_quality_vbox), hbox1);
+
+ // radio 1
+@@ -781,7 +781,7 @@ static void mp3_configure(void)
+ g_signal_connect (combo, "changed", (GCallback) bitrate_changed, nullptr);
+
+ // hbox2 for compression ratio
+- hbox2 = gtk_hbox_new (FALSE, 5);
++ hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_add(GTK_CONTAINER(enc_quality_vbox), hbox2);
+
+ // radio 2
+@@ -822,7 +822,7 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(quality_vbox), mode_frame, FALSE, FALSE,
+ 0);
+
+- mode_hbox = gtk_hbox_new (FALSE, 10);
++ mode_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
+ gtk_container_set_border_width(GTK_CONTAINER(mode_hbox), 10);
+ gtk_container_add(GTK_CONTAINER(mode_frame), mode_hbox);
+
+@@ -847,7 +847,7 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(quality_vbox), misc_frame, FALSE, FALSE,
+ 0);
+
+- misc_vbox = gtk_vbox_new (FALSE, 5);
++ misc_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(misc_vbox), 5);
+ gtk_container_add(GTK_CONTAINER(misc_frame), misc_vbox);
+
+@@ -880,7 +880,7 @@ static void mp3_configure(void)
+
+ /* VBR/ABR */
+
+- vbr_vbox = gtk_vbox_new (FALSE, 5);
++ vbr_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbr_vbox), 5);
+
+ /* Toggle VBR */
+@@ -889,7 +889,7 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(vbr_vbox), vbr_toggle, FALSE, FALSE, 2);
+ g_signal_connect (vbr_toggle, "toggled", (GCallback) toggle_vbr, nullptr);
+
+- vbr_options_vbox = gtk_vbox_new (FALSE, 0);
++ vbr_options_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add(GTK_CONTAINER(vbr_vbox), vbr_options_vbox);
+ gtk_widget_set_sensitive(vbr_options_vbox, FALSE);
+
+@@ -900,7 +900,7 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(vbr_options_vbox), vbr_type_frame,
+ FALSE, FALSE, 2);
+
+- vbr_type_hbox = gtk_hbox_new (FALSE, 5);
++ vbr_type_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbr_type_hbox), 5);
+ gtk_container_add(GTK_CONTAINER(vbr_type_frame), vbr_type_hbox);
+
+@@ -933,19 +933,19 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(vbr_options_vbox), vbr_frame, FALSE,
+ FALSE, 2);
+
+- vbr_options_vbox2 = gtk_vbox_new (FALSE, 5);
++ vbr_options_vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbr_options_vbox2),
+ 5);
+ gtk_container_add(GTK_CONTAINER(vbr_frame), vbr_options_vbox2);
+
+- vbr_options_hbox1 = gtk_hbox_new (FALSE, 5);
++ vbr_options_hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbr_options_hbox1),
+ 5);
+ gtk_container_add(GTK_CONTAINER(vbr_options_vbox2),
+ vbr_options_hbox1);
+
+ vbr_min_label = gtk_label_new(_("Minimum bitrate (kbps):"));
+- gtk_misc_set_alignment(GTK_MISC(vbr_min_label), 0, 0.5);
++ gtk_widget_set_halign(vbr_min_label, GTK_ALIGN_START);
+ gtk_box_pack_start(GTK_BOX(vbr_options_hbox1), vbr_min_label, TRUE,
+ TRUE, 0);
+
+@@ -964,14 +964,14 @@ static void mp3_configure(void)
+ 0);
+ g_signal_connect (combo, "changed", (GCallback) vbr_min_changed, nullptr);
+
+- vbr_options_hbox2 = gtk_hbox_new (FALSE, 5);
++ vbr_options_hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbr_options_hbox2),
+ 5);
+ gtk_container_add(GTK_CONTAINER(vbr_options_vbox2),
+ vbr_options_hbox2);
+
+ vbr_max_label = gtk_label_new(_("Maximum bitrate (kbps):"));
+- gtk_misc_set_alignment(GTK_MISC(vbr_max_label), 0, 0.5);
++ gtk_widget_set_halign(vbr_max_label, GTK_ALIGN_START);
+ gtk_box_pack_start(GTK_BOX(vbr_options_hbox2), vbr_max_label, TRUE,
+ TRUE, 0);
+
+@@ -1010,12 +1010,12 @@ static void mp3_configure(void)
+ FALSE, 2);
+ gtk_widget_set_sensitive(abr_frame, FALSE);
+
+- abr_hbox = gtk_hbox_new (FALSE, 5);
++ abr_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(abr_hbox), 5);
+ gtk_container_add(GTK_CONTAINER(abr_frame), abr_hbox);
+
+ abr_label = gtk_label_new(_("Average bitrate (kbps):"));
+- gtk_misc_set_alignment(GTK_MISC(abr_label), 0, 0.5);
++ gtk_widget_set_halign(abr_label, GTK_ALIGN_START);
+ gtk_box_pack_start(GTK_BOX(abr_hbox), abr_label, TRUE, TRUE, 0);
+
+ combo = gtk_combo_box_text_new ();
+@@ -1035,14 +1035,14 @@ static void mp3_configure(void)
+
+ /* Quality Level */
+
+- vbr_options_hbox3 = gtk_hbox_new (FALSE, 5);
++ vbr_options_hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbr_options_hbox3),
+ 5);
+ gtk_container_add(GTK_CONTAINER(vbr_options_vbox),
+ vbr_options_hbox3);
+
+ vbr_quality_label = gtk_label_new(_("VBR quality level:"));
+- gtk_misc_set_alignment(GTK_MISC(vbr_quality_label), 0, 0.5);
++ gtk_widget_set_halign(vbr_quality_label, GTK_ALIGN_START);
+ gtk_box_pack_start(GTK_BOX(vbr_options_hbox3), vbr_quality_label,
+ TRUE, TRUE, 0);
+
+@@ -1077,7 +1077,7 @@ static void mp3_configure(void)
+
+ /* Tags */
+
+- tags_vbox = gtk_vbox_new (FALSE, 5);
++ tags_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(tags_vbox), 5);
+
+ /* Frame Params */
+@@ -1088,7 +1088,7 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(tags_vbox), tags_frames_frame, FALSE,
+ FALSE, 2);
+
+- tags_frames_hbox = gtk_hbox_new (FALSE, 5);
++ tags_frames_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(tags_frames_hbox), 5);
+ gtk_container_add(GTK_CONTAINER(tags_frames_frame),
+ tags_frames_hbox);
+@@ -1122,7 +1122,7 @@ static void mp3_configure(void)
+ gtk_box_pack_start(GTK_BOX(tags_vbox), tags_id3_frame, FALSE,
+ FALSE, 2);
+
+- tags_id3_vbox = gtk_vbox_new (FALSE, 5);
++ tags_id3_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(tags_id3_vbox), 5);
+ gtk_container_add(GTK_CONTAINER(tags_id3_frame), tags_id3_vbox);
+
+@@ -1134,7 +1134,7 @@ static void mp3_configure(void)
+ g_signal_connect (tags_force_id3v2_toggle, "toggled", (GCallback)
+ force_v2_toggle, nullptr);
+
+- tags_id3_hbox = gtk_hbox_new (FALSE, 5);
++ tags_id3_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_add(GTK_CONTAINER(tags_id3_vbox), tags_id3_hbox);
+
+ tags_only_v1_toggle =
+--- src/filewriter/vorbis.cc.old
++++ src/filewriter/vorbis.cc
+@@ -207,17 +207,17 @@ static void vorbis_configure(void)
+ gtk_container_set_border_width(GTK_CONTAINER(quality_frame), 5);
+ gtk_box_pack_start(GTK_BOX(vbox), quality_frame, FALSE, FALSE, 2);
+
+- quality_vbox = gtk_vbox_new (FALSE, 5);
++ quality_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(quality_vbox), 10);
+ gtk_container_add(GTK_CONTAINER(quality_frame), quality_vbox);
+
+ /* quality option: vbr level */
+- quality_hbox1 = gtk_hbox_new (FALSE, 5);
++ quality_hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(quality_hbox1), 10);
+ gtk_container_add(GTK_CONTAINER(quality_vbox), quality_hbox1);
+
+ quality_label = gtk_label_new(_("Quality level (0 - 10):"));
+- gtk_misc_set_alignment(GTK_MISC(quality_label), 0, 0.5);
++ gtk_widget_set_halign(quality_label, GTK_ALIGN_START);
+ gtk_box_pack_start(GTK_BOX(quality_hbox1), quality_label, TRUE, TRUE, 0);
+
+ quality_adj = (GtkAdjustment *) gtk_adjustment_new (5, 0, 10, 0.1, 1, 0);
+--- src/gl-spectrum/gl-spectrum.cc.old
++++ src/gl-spectrum/gl-spectrum.cc
+@@ -246,7 +246,7 @@ static void draw_bars ()
+ glPopMatrix ();
+ }
+
+-static gboolean draw_cb (GtkWidget * widget)
++static gboolean draw_cb (GtkWidget * widget, cairo_t * cr)
+ {
+ #ifdef GDK_WINDOWING_X11
+ if (! s_context)
+@@ -415,7 +415,7 @@ void * GLSpectrum::get_gtk_widget ()
+
+ s_widget = gtk_drawing_area_new ();
+
+- g_signal_connect (s_widget, "expose-event", (GCallback) draw_cb, nullptr);
++ g_signal_connect (s_widget, "draw", (GCallback) draw_cb, nullptr);
+ g_signal_connect (s_widget, "realize", (GCallback) widget_realized, nullptr);
+ g_signal_connect (s_widget, "destroy", (GCallback) widget_destroyed, nullptr);
+
+--- src/gtkui/columns.cc.old
++++ src/gtkui/columns.cc
+@@ -294,7 +294,7 @@ void * pw_col_create_chooser ()
+ avail.append (i, false);
+ }
+
+- GtkWidget * hbox = gtk_hbox_new (false, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_widget_set_size_request (hbox, -1, 160);
+
+ GtkWidget * scroll = gtk_scrolled_window_new (nullptr, nullptr);
+@@ -308,7 +308,7 @@ void * pw_col_create_chooser ()
+ audgui_list_add_column (avail_list, _("Available columns"), 0, G_TYPE_STRING, -1);
+ gtk_container_add ((GtkContainer *) scroll, avail_list);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start ((GtkBox *) hbox, vbox, false, false, 0);
+
+ GtkWidget * button = gtk_button_new ();
+--- src/gtkui/layout.cc.old
++++ src/gtkui/layout.cc
+@@ -97,8 +97,9 @@ static int item_by_name (Item * item, const char * name)
+ GtkWidget * layout_new ()
+ {
+ g_return_val_if_fail (! layout, nullptr);
+- layout = gtk_alignment_new (0, 0, 1, 1);
+- gtk_alignment_set_padding ((GtkAlignment *) layout, 3, 3, 3, 3);
++ layout = gtk_frame_new (NULL);
++ gtk_frame_set_shadow_type ((GtkFrame *) layout, GTK_SHADOW_NONE);
++ gtk_container_set_border_width ((GtkContainer *) layout, 3);
+ NULL_ON_DESTROY (layout);
+ return layout;
+ }
+@@ -187,7 +188,7 @@ static GtkWidget * vbox_new (GtkWidget * widget, const char * name)
+ {
+ g_return_val_if_fail (widget && name, nullptr);
+
+- GtkWidget * vbox = gtk_vbox_new (false, 2);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
+
+ GtkWidget * ebox = gtk_event_box_new ();
+ gtk_box_pack_start ((GtkBox *) vbox, ebox, false, false, 0);
+@@ -198,7 +199,7 @@ static GtkWidget * vbox_new (GtkWidget * widget, const char * name)
+ char * markup = g_markup_printf_escaped ("<small><b>%s</b></small>", name);
+ gtk_label_set_markup ((GtkLabel *) label, markup);
+ g_free (markup);
+- gtk_misc_set_alignment ((GtkMisc *) label, 0, 0);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ gtk_container_add ((GtkContainer *) ebox, label);
+
+ gtk_box_pack_start ((GtkBox *) vbox, widget, true, true, 0);
+@@ -229,10 +230,13 @@ static gboolean restore_size_cb (RestoreSizeData * d)
+
+ static GtkWidget * paned_new (bool vertical, bool after, int w, int h)
+ {
+- GtkWidget * paned = vertical ? gtk_vpaned_new () : gtk_hpaned_new ();
++ GtkWidget * paned = gtk_paned_new (vertical ? GTK_ORIENTATION_VERTICAL :
++ GTK_ORIENTATION_HORIZONTAL);
+
+- GtkWidget * mine = gtk_alignment_new (0, 0, 1, 1);
+- GtkWidget * next = gtk_alignment_new (0, 0, 1, 1);
++ GtkWidget * mine = gtk_frame_new (nullptr);
++ GtkWidget * next = gtk_frame_new (nullptr);
++ gtk_frame_set_shadow_type ((GtkFrame *) mine, GTK_SHADOW_NONE);
++ gtk_frame_set_shadow_type ((GtkFrame *) next, GTK_SHADOW_NONE);
+ gtk_paned_pack1 ((GtkPaned *) paned, after ? next : mine, after, false);
+ gtk_paned_pack2 ((GtkPaned *) paned, after ? mine : next, ! after, false);
+
+--- src/gtkui/ui_gtk.cc.old
++++ src/gtkui/ui_gtk.cc
+@@ -794,14 +794,16 @@ bool GtkUI::init ()
+ accel = gtk_accel_group_new ();
+ gtk_window_add_accel_group ((GtkWindow *) window, accel);
+
+- vbox_outer = gtk_vbox_new (false, 0);
++ vbox_outer = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add ((GtkContainer *) window, vbox_outer);
+
+- menu_box = gtk_hbox_new (false, 0);
++ menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start ((GtkBox *) vbox_outer, menu_box, false, false, 0);
+
+ toolbar = gtk_toolbar_new ();
+ gtk_toolbar_set_style ((GtkToolbar *) toolbar, GTK_TOOLBAR_ICONS);
++ GtkStyleContext * context = gtk_widget_get_style_context (toolbar);
++ gtk_style_context_add_class (context, GTK_STYLE_CLASS_PRIMARY_TOOLBAR);
+ gtk_box_pack_start ((GtkBox *) vbox_outer, toolbar, false, false, 0);
+
+ /* search button */
+@@ -827,12 +829,13 @@ bool GtkUI::init ()
+ gtk_tool_item_set_expand (boxitem1, true);
+ gtk_toolbar_insert ((GtkToolbar *) toolbar, boxitem1, -1);
+
+- GtkWidget * box1 = gtk_hbox_new (false, 0);
++ GtkWidget * box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_container_add ((GtkContainer *) boxitem1, box1);
+
+- slider = gtk_hscale_new (nullptr);
++ slider = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, nullptr);
+ gtk_scale_set_draw_value ((GtkScale *) slider, false);
+ gtk_widget_set_size_request (slider, 120, -1);
++ gtk_widget_set_valign (slider, GTK_ALIGN_CENTER);
+ gtk_widget_set_can_focus (slider, false);
+ gtk_box_pack_start ((GtkBox *) box1, slider, true, true, 6);
+
+@@ -854,7 +857,7 @@ bool GtkUI::init ()
+ GtkToolItem * boxitem2 = gtk_tool_item_new ();
+ gtk_toolbar_insert ((GtkToolbar *) toolbar, boxitem2, -1);
+
+- GtkWidget * box2 = gtk_hbox_new (false, 0);
++ GtkWidget * box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_container_add ((GtkContainer *) boxitem2, box2);
+
+ volume = gtk_volume_button_new ();
+@@ -874,7 +877,7 @@ bool GtkUI::init ()
+ GtkWidget * layout = layout_new ();
+ gtk_box_pack_start ((GtkBox *) vbox_outer, layout, true, true, 0);
+
+- vbox = gtk_vbox_new (false, 6);
++ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ layout_add_center (vbox);
+
+ ui_playlist_notebook_new ();
+@@ -969,15 +972,13 @@ void GtkUI::cleanup ()
+
+ static void menu_position_cb (GtkMenu * menu, int * x, int * y, int * push, void * button)
+ {
+- GtkAllocation alloc;
+ int xorig, yorig, xwin, ywin;
+
+- gtk_widget_get_allocation ((GtkWidget *) button, & alloc);
+ gdk_window_get_origin (gtk_widget_get_window (window), & xorig, & yorig);
+ gtk_widget_translate_coordinates ((GtkWidget *) button, window, 0, 0, & xwin, & ywin);
+
+ * x = xorig + xwin;
+- * y = yorig + ywin + alloc.height;
++ * y = yorig + ywin + gtk_widget_get_allocated_height ((GtkWidget *) button);
+ * push = true;
+ }
+
+--- src/gtkui/ui_infoarea.cc.old
++++ src/gtkui/ui_infoarea.cc
+@@ -232,12 +232,29 @@ static void hsv_to_rgb (float h, float s, float v, float * r, float * g,
+ * b = v * (1 - s * (1 - * b));
+ }
+
+-static void get_color (GtkWidget * widget, int i, float * r, float * g, float * b)
++static void get_color (int i, float * r, float * g, float * b)
+ {
+- GdkColor * c = (gtk_widget_get_style (widget))->base + GTK_STATE_SELECTED;
+- float h, s, v;
++ static GdkRGBA c;
++ static gboolean valid = FALSE;
++
++ if (! valid)
++ {
++ /* we want a color that matches the current theme
++ * selected color of a GtkEntry should be reasonable */
++ GtkStyleContext * style = gtk_style_context_new ();
++ GtkWidgetPath * path = gtk_widget_path_new ();
++ gtk_widget_path_append_type (path, GTK_TYPE_ENTRY);
++ gtk_style_context_set_path (style, path);
++ gtk_widget_path_free (path);
++ gtk_style_context_add_class (style, "entry");
++ gtk_style_context_get_background_color (style,
++ (GtkStateFlags) (GTK_STATE_FLAG_FOCUSED | GTK_STATE_FLAG_SELECTED), & c);
++ g_object_unref (style);
++ valid = TRUE;
++ }
+
+- rgb_to_hsv (c->red / 65535.0, c->green / 65535.0, c->blue / 65535.0, & h, & s, & v);
++ float h, s, v;
++ rgb_to_hsv (c.red, c.green, c.blue, & h, & s, & v);
+
+ if (s < 0.1) /* monochrome theme? use blue instead */
+ {
+@@ -251,10 +268,8 @@ static void get_color (GtkWidget * widget, int i, float * r, float * g, float *
+ hsv_to_rgb (h, s, v, r, g, b);
+ }
+
+-static int expose_vis_cb (GtkWidget * widget, GdkEventExpose * event)
++static gboolean draw_vis_cb (GtkWidget * widget, cairo_t * cr)
+ {
+- cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (widget));
+-
+ clear (widget, cr);
+
+ for (int i = 0; i < VIS_BANDS; i++)
+@@ -264,7 +279,7 @@ static int expose_vis_cb (GtkWidget * widget, GdkEventExpose * event)
+ int m = aud::min (VIS_CENTER + vis.bars[i], HEIGHT);
+
+ float r, g, b;
+- get_color (widget, i, & r, & g, & b);
++ get_color (i, & r, & g, & b);
+
+ cairo_set_source_rgb (cr, r, g, b);
+ cairo_rectangle (cr, x, t, 6, VIS_CENTER - t);
+@@ -275,7 +290,6 @@ static int expose_vis_cb (GtkWidget * widget, GdkEventExpose * event)
+ cairo_fill (cr);
+ }
+
+- cairo_destroy (cr);
+ return true;
+ }
+
+@@ -326,16 +340,15 @@ static void draw_title (cairo_t * cr)
+ 0.7, 0.7, area->last_alpha, "9", area->last_album);
+ }
+
+-static int expose_cb (GtkWidget * widget, GdkEventExpose * event)
++static gboolean draw_cb (GtkWidget * widget, cairo_t * cr)
+ {
+- cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (widget));
++ g_return_val_if_fail (area, FALSE);
+
+ clear (widget, cr);
+
+ draw_album_art (cr);
+ draw_title (cr);
+
+- cairo_destroy (cr);
+ return true;
+ }
+
+@@ -480,7 +493,7 @@ void ui_infoarea_show_vis (bool show)
+ gtk_widget_set_size_request (vis.widget, VIS_WIDTH + 2 * SPACING, HEIGHT);
+ gtk_box_pack_start ((GtkBox *) area->box, vis.widget, false, false, 0);
+
+- g_signal_connect (vis.widget, "expose-event", (GCallback) expose_vis_cb, nullptr);
++ g_signal_connect (vis.widget, "draw", (GCallback) draw_vis_cb, nullptr);
+ gtk_widget_show (vis.widget);
+
+ aud_visualizer_add (& vis);
+@@ -530,13 +543,13 @@ GtkWidget * ui_infoarea_new ()
+ g_return_val_if_fail (! area, nullptr);
+ area = new UIInfoArea ();
+
+- area->box = gtk_hbox_new (false, 0);
++ area->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+
+ area->main = gtk_drawing_area_new ();
+ gtk_widget_set_size_request (area->main, ICON_SIZE + 2 * SPACING, HEIGHT);
+ gtk_box_pack_start ((GtkBox *) area->box, area->main, true, true, 0);
+
+- g_signal_connect (area->main, "expose-event", (GCallback) expose_cb, nullptr);
++ g_signal_connect (area->main, "draw", (GCallback) draw_cb, nullptr);
+
+ hook_associate ("tuple change", (HookFunction) ui_infoarea_set_title, nullptr);
+ hook_associate ("playback ready", (HookFunction) ui_infoarea_playback_start, nullptr);
+--- src/gtkui/ui_playlist_notebook.cc.old
++++ src/gtkui/ui_playlist_notebook.cc
+@@ -48,6 +48,7 @@ void apply_column_widths (GtkWidget * treeview)
+ {
+ GtkTreeViewColumn * col = gtk_tree_view_get_column ((GtkTreeView *) treeview, i);
+ gtk_tree_view_column_set_fixed_width (col, pw_col_widths[pw_cols[i]]);
++ gtk_tree_view_column_set_expand (col, FALSE);
+ }
+ }
+
+@@ -110,14 +111,6 @@ static void close_button_cb (GtkWidget * button, void * id)
+ audgui_confirm_playlist_delete (aud_playlist_by_unique_id (GPOINTER_TO_INT (id)));
+ }
+
+-static void close_button_style_set (GtkWidget * button)
+-{
+- int w, h;
+- gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (button),
+- GTK_ICON_SIZE_MENU, & w, & h);
+- gtk_widget_set_size_request (button, w + 2, h + 2);
+-}
+-
+ static GtkWidget * make_close_button (GtkWidget * ebox, int list)
+ {
+ GtkWidget * button = gtk_button_new ();
+@@ -130,19 +123,22 @@ static GtkWidget * make_close_button (GtkWidget * ebox, int list)
+ g_signal_connect (button, "clicked", (GCallback) close_button_cb,
+ GINT_TO_POINTER (aud_playlist_get_unique_id (list)));
+
+- gtk_rc_parse_string (
+- "style \"gtkui-tab-close-button-style\" {"
+- " GtkButton::default-border = {0, 0, 0, 0}"
+- " GtkButton::default-outside-border = {0, 0, 0, 0}"
+- " GtkButton::inner-border = {0, 0, 0, 0}"
+- " GtkWidget::focus-padding = 0"
+- " GtkWidget::focus-line-width = 0"
+- " xthickness = 0"
+- " ythickness = 0 }"
+- "widget \"*.gtkui-tab-close-button\" style \"gtkui-tab-close-button-style\""
+- );
+-
+- g_signal_connect (button, "style-set", (GCallback) close_button_style_set, nullptr);
++ GtkCssProvider * provider = gtk_css_provider_new ();
++ gtk_css_provider_load_from_data (provider,
++ "#gtkui-tab-close-button {"
++ " -GtkButton-default-border: 0;"
++ " -GtkButton-default-outside-border: 0;"
++ " -GtkButton-inner-border: 0;"
++ " -GtkWidget-focus-padding: 0;"
++ " -GtkWidget-focus-line-width: 0;"
++ " margin: 0;"
++ " padding: 0; }",
++ -1, nullptr);
++
++ gtk_style_context_add_provider (gtk_widget_get_style_context (button),
++ GTK_STYLE_PROVIDER (provider),
++ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
++ g_object_unref (provider);
+
+ gtk_widget_show (button);
+
+@@ -304,7 +300,7 @@ void ui_playlist_notebook_create_tab (int playlist)
+ GtkWidget * ebox = gtk_event_box_new ();
+ gtk_event_box_set_visible_window ((GtkEventBox *) ebox, false);
+
+- GtkWidget * hbox = gtk_hbox_new (false, 2);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+
+ GtkWidget * label = gtk_label_new ("");
+ set_tab_label (playlist, (GtkLabel *) label);
+--- src/gtkui/ui_statusbar.cc.old
++++ src/gtkui/ui_statusbar.cc
+@@ -135,7 +135,7 @@ static void ui_statusbar_destroy_cb ()
+
+ GtkWidget * ui_statusbar_new ()
+ {
+- GtkWidget * hbox = gtk_hbox_new (false, 3);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
+ GtkWidget * status = gtk_widget_new (GTK_TYPE_LABEL, "xalign", 0.0, nullptr);
+ GtkWidget * length = gtk_widget_new (GTK_TYPE_LABEL, "xalign", 1.0, nullptr);
+
+--- src/hotkey/gui.cc.old
++++ src/hotkey/gui.cc
+@@ -324,16 +324,18 @@ KeyControls* add_event_controls(KeyControls* list,
+ }
+
+ controls->combobox = gtk_combo_box_text_new();
++ gtk_widget_set_hexpand(controls->combobox, TRUE);
+ for (i=0;i<EVENT_MAX;i++)
+ {
+ gtk_combo_box_text_append_text((GtkComboBoxText *) controls->combobox, _(event_desc[i]));
+ }
+ gtk_combo_box_set_active(GTK_COMBO_BOX(controls->combobox), controls->hotkey.event);
+- gtk_table_attach_defaults (GTK_TABLE (grid), controls->combobox, 0, 1, row, row + 1);
++ gtk_grid_attach (GTK_GRID (grid), controls->combobox, 0, row, 1, 1);
+
+
+ controls->keytext = gtk_entry_new ();
+- gtk_table_attach_defaults (GTK_TABLE (grid), controls->keytext, 1, 2, row, row + 1);
++ gtk_widget_set_hexpand (controls->keytext, TRUE);
++ gtk_grid_attach (GTK_GRID (grid), controls->keytext, 1, row, 1, 1);
+ gtk_editable_set_editable(GTK_EDITABLE(controls->keytext), FALSE);
+
+
+@@ -351,7 +353,7 @@ KeyControls* add_event_controls(KeyControls* list,
+ controls->button = gtk_button_new();
+ gtk_button_set_image (GTK_BUTTON (controls->button),
+ gtk_image_new_from_icon_name ("edit-delete", GTK_ICON_SIZE_BUTTON));
+- gtk_table_attach_defaults (GTK_TABLE (grid), controls->button, 2, 3, row, row + 1);
++ gtk_grid_attach (GTK_GRID (grid), controls->button, 2, row, 1, 1);
+ g_signal_connect (G_OBJECT (controls->button), "clicked",
+ G_CALLBACK (clear_keyboard), controls);
+
+@@ -363,7 +365,6 @@ void *make_config_widget ()
+ {
+ KeyControls *current_controls;
+ GtkWidget *main_vbox, *hbox;
+- GtkWidget *alignment;
+ GtkWidget *frame;
+ GtkWidget *label;
+ GtkWidget *image;
+@@ -379,18 +380,15 @@ void *make_config_widget ()
+
+ ungrab_keys();
+
+- main_vbox = gtk_vbox_new (FALSE, 4);
++ main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4);
+
+- alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+- gtk_box_pack_start (GTK_BOX (main_vbox), alignment, FALSE, TRUE, 0);
+- gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 4, 0, 0, 0);
+- hbox = gtk_hbox_new (FALSE, 2);
+- gtk_container_add (GTK_CONTAINER (alignment), hbox);
++ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
++ gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
+ image = gtk_image_new_from_icon_name ("dialog-information", GTK_ICON_SIZE_DIALOG);
+ gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, TRUE, 0);
+ label = gtk_label_new (_("Press a key combination inside a text field.\nYou can also bind mouse buttons."));
+ gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
+
+ label = gtk_label_new (nullptr);
+ gtk_label_set_markup (GTK_LABEL (label), _("Hotkeys:"));
+@@ -398,27 +396,23 @@ void *make_config_widget ()
+ gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+ gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
+- alignment = gtk_alignment_new (0, 0, 1, 0);
+- gtk_container_add (GTK_CONTAINER (frame), alignment);
+- gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 3, 3, 3, 3);
+
+- grid = gtk_table_new (0, 0, FALSE);
+- gtk_table_set_col_spacings (GTK_TABLE (grid), 2);
+- gtk_container_add (GTK_CONTAINER (alignment), grid);
++ grid = gtk_grid_new ();
++ gtk_container_set_border_width (GTK_CONTAINER (grid), 3);
++ gtk_grid_set_column_spacing (GTK_GRID (grid), 2);
++ gtk_container_add (GTK_CONTAINER (frame), grid);
+
+ label = gtk_label_new (nullptr);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
+- gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
+ gtk_label_set_markup (GTK_LABEL (label),
+ _("<b>Action:</b>"));
+- gtk_table_attach_defaults (GTK_TABLE (grid), label, 0, 1, 0, 1);
++ gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
+
+ label = gtk_label_new (nullptr);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
+- gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
+ gtk_label_set_markup (GTK_LABEL (label),
+ _("<b>Key Binding:</b>"));
+- gtk_table_attach_defaults (GTK_TABLE (grid), label, 1, 2, 0, 1);
++ gtk_grid_attach (GTK_GRID (grid), label, 1, 0, 1, 1);
+
+
+ hotkey = &(plugin_cfg->first);
+@@ -457,10 +451,10 @@ void *make_config_widget ()
+ add_event_controls(current_controls, grid, i, &temphotkey);
+
+
+- hbox = gtk_hbox_new (FALSE, 0);
++ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
+
+- button_box = gtk_hbutton_box_new ();
++ button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start (GTK_BOX (hbox), button_box, FALSE, TRUE, 0);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (button_box), GTK_BUTTONBOX_START);
+ gtk_box_set_spacing (GTK_BOX (button_box), 4);
+@@ -520,9 +514,9 @@ static void clear_keyboard (GtkWidget *widget, void * data)
+ gtk_container_remove( GTK_CONTAINER(c->grid) , c->keytext);
+ gtk_container_remove( GTK_CONTAINER(c->grid) , c->button);
+
+- gtk_table_attach_defaults (GTK_TABLE (c->grid), c->combobox, 0, 1, row, row + 1);
+- gtk_table_attach_defaults (GTK_TABLE (c->grid), c->keytext, 1, 2, row, row + 1);
+- gtk_table_attach_defaults (GTK_TABLE (c->grid), c->button, 2, 3, row, row + 1);
++ gtk_grid_attach (GTK_GRID (c->grid), c->combobox, 0, row, 1, 1);
++ gtk_grid_attach (GTK_GRID (c->grid), c->keytext, 1, row, 1, 1);
++ gtk_grid_attach (GTK_GRID (c->grid), c->button, 2, row, 1, 1);
+
+ g_object_unref(c->combobox);
+ g_object_unref(c->keytext);
+--- src/ladspa/plugin.cc.old
++++ src/ladspa/plugin.cc
+@@ -33,6 +33,10 @@
+
+ #include "plugin.h"
+
++#if GTK_CHECK_VERSION (3, 12, 0)
++#define gtk_widget_set_margin_left gtk_widget_set_margin_start
++#endif
++
+ const char * const LADSPAHost::defaults[] = {
+ "plugin_count", "0",
+ nullptr};
+@@ -423,7 +427,7 @@ static void configure_plugin (LoadedPlugin & loaded)
+ {
+ ControlData & control = plugin.controls[i];
+
+- GtkWidget * hbox = gtk_hbox_new (FALSE, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, 0, 0, 0);
+
+ if (control.is_toggle)
+@@ -469,10 +473,10 @@ static void configure_selected ()
+
+ static void * make_config_widget ()
+ {
+- GtkWidget * vbox = gtk_vbox_new (FALSE, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_widget_set_size_request (vbox, 480, 360);
+
+- GtkWidget * hbox = gtk_hbox_new (FALSE, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, 0, 0, 0);
+
+ GtkWidget * label = gtk_label_new (_("Module paths:"));
+@@ -483,17 +487,17 @@ static void * make_config_widget ()
+ _("<small>Separate multiple paths with a colon.\n"
+ "These paths are searched in addition to LADSPA_PATH.\n"
+ "After adding new paths, press Enter to scan for new plugins.</small>"));
+- gtk_misc_set_padding ((GtkMisc *) label, 12, 6);
+- gtk_misc_set_alignment ((GtkMisc *) label, 0, 0);
++ gtk_widget_set_margin_left (label, 12);
++ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ gtk_box_pack_start ((GtkBox *) vbox, label, 0, 0, 0);
+
+ GtkWidget * entry = gtk_entry_new ();
+ gtk_box_pack_start ((GtkBox *) hbox, entry, 1, 1, 0);
+
+- hbox = gtk_hbox_new (FALSE, 6);
++ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, 1, 1, 0);
+
+- GtkWidget * vbox2 = gtk_vbox_new (FALSE, 6);
++ GtkWidget * vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start ((GtkBox *) hbox, vbox2, 1, 1, 0);
+
+ label = gtk_label_new (_("Available plugins:"));
+@@ -506,13 +510,13 @@ static void * make_config_widget ()
+ plugin_list = create_plugin_list ();
+ gtk_container_add ((GtkContainer *) scrolled, plugin_list);
+
+- GtkWidget * hbox2 = gtk_hbox_new (FALSE, 6);
++ GtkWidget * hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) vbox2, hbox2, 0, 0, 0);
+
+ GtkWidget * enable_button = gtk_button_new_with_label (_("Enable"));
+ gtk_box_pack_end ((GtkBox *) hbox2, enable_button, 0, 0, 0);
+
+- vbox2 = gtk_vbox_new (FALSE, 6);
++ vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start ((GtkBox *) hbox, vbox2, 1, 1, 0);
+
+ label = gtk_label_new (_("Enabled plugins:"));
+@@ -525,7 +529,7 @@ static void * make_config_widget ()
+ loaded_list = create_loaded_list ();
+ gtk_container_add ((GtkContainer *) scrolled, loaded_list);
+
+- hbox2 = gtk_hbox_new (FALSE, 6);
++ hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start ((GtkBox *) vbox2, hbox2, 0, 0, 0);
+
+ GtkWidget * disable_button = gtk_button_new_with_label (_("Disable"));
+--- src/lyricwiki/lyricwiki.cc.old
++++ src/lyricwiki/lyricwiki.cc
+@@ -296,7 +296,7 @@ static GtkWidget *build_widget(void)
+ scrollview = gtk_scrolled_window_new(nullptr, nullptr);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollview), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollview), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+- vbox = gtk_vbox_new (FALSE, 10);
++ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
+
+ gtk_container_add(GTK_CONTAINER(scrollview), textview);
+
+--- src/playlist-manager/playlist-manager.cc.old
++++ src/playlist-manager/playlist-manager.cc
+@@ -218,7 +218,7 @@ static void destroy_cb (GtkWidget * window)
+
+ void * PlaylistManager::get_gtk_widget ()
+ {
+- GtkWidget * playman_vbox = gtk_vbox_new (false, 6);
++ GtkWidget * playman_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+
+ /* ListView */
+ GtkWidget * playman_pl_lv = audgui_list_new (& callbacks, nullptr, aud_playlist_count ());
+@@ -240,7 +240,7 @@ void * PlaylistManager::get_gtk_widget ()
+ gtk_box_pack_start ((GtkBox *) playman_vbox, playman_pl_lv_sw, true, true, 0);
+
+ /* ButtonBox */
+- GtkWidget * playman_button_hbox = gtk_hbox_new (false, 6);
++ GtkWidget * playman_button_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ GtkWidget * new_button = audgui_button_new (_("_New"), "document-new", new_cb, nullptr);
+ GtkWidget * delete_button = audgui_button_new (_("_Remove"), "edit-delete", delete_cb, nullptr);
+ GtkWidget * rename_button = audgui_button_new (_("Ren_ame"), "insert-text", rename_cb, nullptr);
+--- src/scrobbler2/config_window.cc.old
++++ src/scrobbler2/config_window.cc
+@@ -167,11 +167,11 @@ static void *config_status_checker () {
+ GtkWidget *details_box;
+ GtkWidget *additional_details_box;
+
+- config_box = gtk_vbox_new (FALSE, 15);
+- permission_box = gtk_hbox_new (FALSE, 0);
+- buttons_box = gtk_vbutton_box_new ();
+- details_box = gtk_vbox_new (FALSE, 0);
+- additional_details_box = gtk_hbox_new (FALSE, 7);
++ config_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
++ permission_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
++ buttons_box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL);
++ details_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
++ additional_details_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 7);
+
+ button = gtk_button_new_with_mnemonic(_("C_heck Permission"));
+ revoke_button = gtk_button_new_with_mnemonic(_("_Revoke Permission"));
+@@ -183,6 +183,9 @@ static void *config_status_checker () {
+ details_label_first = gtk_label_new ("");
+ url_button = gtk_link_button_new("");
+ details_label_second = gtk_label_new("");
++ gtk_widget_set_halign(details_label_first, GTK_ALIGN_CENTER);
++ gtk_widget_set_halign(url_button, GTK_ALIGN_CENTER);
++ gtk_widget_set_halign(details_label_second, GTK_ALIGN_CENTER);
+
+ gtk_widget_hide(url_button);
+ gtk_widget_set_no_show_all(url_button, TRUE);
+--- src/search-tool/search-tool.cc.old
++++ src/search-tool/search-tool.cc
+@@ -677,11 +677,11 @@ static void refresh_cb (GtkButton * button, GtkWidget * chooser)
+
+ void * SearchTool::get_gtk_widget ()
+ {
+- GtkWidget * vbox = gtk_vbox_new (FALSE, 6);
++ GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+
+ entry = gtk_entry_new ();
+ gtk_entry_set_icon_from_icon_name ((GtkEntry *) entry, GTK_ENTRY_ICON_PRIMARY, "edit-find");
+- (void) _("Search library"); // translated string is used in GTK3 branch
++ gtk_entry_set_placeholder_text ((GtkEntry *) entry, _("Search library"));
+ g_signal_connect (entry, "destroy", (GCallback) gtk_widget_destroyed, & entry);
+ gtk_box_pack_start ((GtkBox *) vbox, entry, FALSE, FALSE, 0);
+
+@@ -717,7 +717,7 @@ void * SearchTool::get_gtk_widget ()
+ gtk_widget_set_no_show_all (stats_label, TRUE);
+ gtk_box_pack_start ((GtkBox *) vbox, stats_label, FALSE, FALSE, 0);
+
+- GtkWidget * hbox = gtk_hbox_new (FALSE, 6);
++ GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_end ((GtkBox *) vbox, hbox, FALSE, FALSE, 0);
+
+ GtkWidget * chooser = gtk_file_chooser_button_new (_("Choose Folder"),
+--- src/skins/draw-compat.h.old
++++ src/skins/draw-compat.h
+@@ -27,22 +27,15 @@
+ static void widget_realized (GtkWidget * w)
+ {
+ GdkWindow * window = gtk_widget_get_window (w);
+- gdk_window_set_back_pixmap (window, nullptr, FALSE);
++ gdk_window_set_background_pattern (window, nullptr);
+ }
+
+-#define DRAW_SIGNAL "expose-event"
+-#define DRAW_FUNC_BEGIN(n) static int n (GtkWidget * wid, GdkEventExpose * ev) { \
+- cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (wid));
+-#define DRAW_FUNC_END cairo_destroy (cr); \
+- return TRUE; }
+-
+-/* We set None as the background pixmap in order to avoid flickering. Setting
+- * a blank GtkStyle prevents GTK 2.x from overriding this. */
++#define DRAW_SIGNAL "draw"
++#define DRAW_FUNC_BEGIN(n) static gboolean n (GtkWidget * wid, cairo_t * cr) { \
++ g_return_val_if_fail (wid && cr, FALSE);
++#define DRAW_FUNC_END return FALSE; }
+
+ #define DRAW_CONNECT(w,f) do { \
+- GtkStyle * style = gtk_style_new (); \
+- gtk_widget_set_style (w, style); \
+- g_object_unref (style); \
+ g_signal_connect (w, "realize", (GCallback) widget_realized, nullptr); \
+ g_signal_connect (w, DRAW_SIGNAL, (GCallback) f, nullptr); \
+ } while (0);
+--- src/skins/menus.cc.old
++++ src/skins/menus.cc
+@@ -290,7 +290,7 @@ static void position_menu (GtkMenu * menu, int * x, int * y, gboolean * push_in,
+ audgui_get_monitor_geometry (gtk_widget_get_screen ((GtkWidget *) menu), pos->x, pos->y, & geom);
+
+ GtkRequisition request;
+- gtk_widget_size_request ((GtkWidget *) menu, & request);
++ gtk_widget_get_preferred_size ((GtkWidget *) menu, NULL, & request);
+
+ if (pos->leftward)
+ * x = aud::max (pos->x - request.width, geom.x);
+--- src/skins/preset-list.cc.old
++++ src/skins/preset-list.cc
+@@ -259,7 +259,7 @@ static GtkWidget * equalizerwin_create_list_window
+
+ audgui_destroy_on_escape (* window);
+
+- vbox = gtk_vbox_new (FALSE, 10);
++ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
+ gtk_container_add(GTK_CONTAINER(*window), vbox);
+
+ scrolled_window = gtk_scrolled_window_new(nullptr, nullptr);
+@@ -299,7 +299,7 @@ static GtkWidget * equalizerwin_create_list_window
+ gtk_box_pack_start(GTK_BOX(vbox), *entry, FALSE, FALSE, 0);
+ }
+
+- bbox = gtk_hbutton_box_new();
++ bbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+ gtk_box_set_spacing(GTK_BOX(bbox), 5);
+ gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+--- src/skins/ui_playlist.cc.old
++++ src/skins/ui_playlist.cc
+@@ -221,40 +221,45 @@ playlistwin_select_search(void)
+ _("Cancel") , GTK_RESPONSE_REJECT , _("Search") , GTK_RESPONSE_ACCEPT , nullptr );
+
+ /* help text and logo */
+- searchdlg_hbox = gtk_hbox_new (FALSE, 6);
++ searchdlg_hbox = gtk_box_new( GTK_ORIENTATION_HORIZONTAL , 4 );
+ searchdlg_logo = gtk_image_new_from_icon_name( "edit-find" , GTK_ICON_SIZE_DIALOG );
+ searchdlg_helptext = gtk_label_new( _("Select entries in playlist by filling one or more "
+ "fields. Fields use regular expressions syntax, case-insensitive. If you don't know how "
+ "regular expressions work, simply insert a literal portion of what you're searching for.") );
++ gtk_label_set_max_width_chars( GTK_LABEL(searchdlg_helptext), 70 );
+ gtk_label_set_line_wrap( GTK_LABEL(searchdlg_helptext) , TRUE );
+ gtk_box_pack_start( GTK_BOX(searchdlg_hbox) , searchdlg_logo , FALSE , FALSE , 0 );
+ gtk_box_pack_start( GTK_BOX(searchdlg_hbox) , searchdlg_helptext , FALSE , FALSE , 0 );
+
+ /* title */
+ searchdlg_label_title = gtk_label_new( _("Title:") );
+- gtk_misc_set_alignment ((GtkMisc *) searchdlg_label_title, 1, 0.5);
+ searchdlg_entry_title = gtk_entry_new();
++ gtk_widget_set_hexpand( searchdlg_entry_title , TRUE );
++ gtk_widget_set_halign( searchdlg_label_title , GTK_ALIGN_START );
+ g_signal_connect( searchdlg_entry_title , "key-press-event" ,
+ G_CALLBACK(playlistwin_select_search_kp_cb) , searchdlg_win );
+
+ /* album */
+ searchdlg_label_album= gtk_label_new( _("Album:") );
+- gtk_misc_set_alignment ((GtkMisc *) searchdlg_label_album, 1, 0.5);
+ searchdlg_entry_album= gtk_entry_new();
++ gtk_widget_set_hexpand( searchdlg_entry_album , TRUE );
++ gtk_widget_set_halign( searchdlg_label_album , GTK_ALIGN_START );
+ g_signal_connect( searchdlg_entry_album , "key-press-event" ,
+ G_CALLBACK(playlistwin_select_search_kp_cb) , searchdlg_win );
+
+ /* artist */
+ searchdlg_label_performer = gtk_label_new( _("Artist:") );
+- gtk_misc_set_alignment ((GtkMisc *) searchdlg_label_performer, 1, 0.5);
+ searchdlg_entry_performer = gtk_entry_new();
++ gtk_widget_set_hexpand( searchdlg_entry_performer , TRUE );
++ gtk_widget_set_halign( searchdlg_label_performer , GTK_ALIGN_START );
+ g_signal_connect( searchdlg_entry_performer , "key-press-event" ,
+ G_CALLBACK(playlistwin_select_search_kp_cb) , searchdlg_win );
+
+ /* file name */
+ searchdlg_label_file_name = gtk_label_new( _("File Name:") );
+- gtk_misc_set_alignment ((GtkMisc *) searchdlg_label_file_name, 1, 0.5);
+ searchdlg_entry_file_name = gtk_entry_new();
++ gtk_widget_set_hexpand( searchdlg_entry_file_name , TRUE );
++ gtk_widget_set_halign( searchdlg_label_file_name , GTK_ALIGN_START );
+ g_signal_connect( searchdlg_entry_file_name , "key-press-event" ,
+ G_CALLBACK(playlistwin_select_search_kp_cb) , searchdlg_win );
+
+@@ -274,21 +279,22 @@ playlistwin_select_search(void)
+ G_CALLBACK(playlistwin_select_search_cbt_cb) , searchdlg_checkbt_autoenqueue );
+
+ /* place fields in searchdlg_grid */
+- searchdlg_grid = gtk_table_new (0, 0, FALSE);
+- gtk_table_set_row_spacings (GTK_TABLE (searchdlg_grid), 6);
+- gtk_table_set_col_spacings (GTK_TABLE (searchdlg_grid), 6);
+- gtk_table_attach_defaults (GTK_TABLE (searchdlg_grid), searchdlg_hbox, 0, 2, 0, 1);
+- gtk_table_attach (GTK_TABLE (searchdlg_grid), searchdlg_label_title, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
+- gtk_table_attach_defaults (GTK_TABLE (searchdlg_grid), searchdlg_entry_title, 1, 2, 1, 2);
+- gtk_table_attach (GTK_TABLE (searchdlg_grid), searchdlg_label_album, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
+- gtk_table_attach_defaults (GTK_TABLE (searchdlg_grid), searchdlg_entry_album, 1, 2, 2, 3);
+- gtk_table_attach (GTK_TABLE (searchdlg_grid), searchdlg_label_performer, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
+- gtk_table_attach_defaults (GTK_TABLE (searchdlg_grid), searchdlg_entry_performer, 1, 2, 3, 4);
+- gtk_table_attach (GTK_TABLE (searchdlg_grid), searchdlg_label_file_name, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0);
+- gtk_table_attach_defaults (GTK_TABLE (searchdlg_grid), searchdlg_entry_file_name, 1, 2, 4, 5);
+- gtk_table_attach_defaults (GTK_TABLE (searchdlg_grid), searchdlg_checkbt_clearprevsel, 0, 2, 5, 6);
+- gtk_table_attach_defaults (GTK_TABLE (searchdlg_grid), searchdlg_checkbt_autoenqueue, 0, 2, 6, 7);
+- gtk_table_attach_defaults (GTK_TABLE (searchdlg_grid), searchdlg_checkbt_newplaylist, 0, 2, 7, 8);
++ searchdlg_grid = gtk_grid_new();
++ gtk_grid_set_row_spacing( GTK_GRID(searchdlg_grid) , 2 );
++ gtk_widget_set_margin_bottom( searchdlg_hbox , 8 );
++ gtk_widget_set_margin_top( searchdlg_checkbt_clearprevsel , 8 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_hbox , 0 , 0 , 2 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_label_title , 0 , 1 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_entry_title , 1 , 1 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_label_album , 0 , 2 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_entry_album , 1 , 2 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_label_performer , 0 , 3 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_entry_performer , 1 , 3 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_label_file_name , 0 , 4 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_entry_file_name , 1 , 4 , 1 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_checkbt_clearprevsel , 0 , 5 , 2 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_checkbt_autoenqueue , 0 , 6 , 2 , 1 );
++ gtk_grid_attach( GTK_GRID(searchdlg_grid) , searchdlg_checkbt_newplaylist , 0 , 7 , 2 , 1 );
+
+ gtk_container_set_border_width( GTK_CONTAINER(searchdlg_grid) , 5 );
+ gtk_container_add ( GTK_CONTAINER(gtk_dialog_get_content_area
+--- src/skins/ui_skin.cc.old
++++ src/skins/ui_skin.cc
+@@ -517,7 +517,7 @@ skin_load_nolock(Skin * skin, const char * path, gboolean force)
+ return FALSE;
+ }
+
+- GdkRegion * masks[SKIN_MASK_COUNT];
++ cairo_region_t * masks[SKIN_MASK_COUNT];
+ skin_load_masks (skin, skin_path, masks);
+ window_set_shapes (mainwin, masks[SKIN_MASK_MAIN], masks[SKIN_MASK_MAIN_SHADE]);
+ window_set_shapes (equalizerwin, masks[SKIN_MASK_EQ], masks[SKIN_MASK_EQ_SHADE]);
+--- src/skins/ui_skin.h.old
++++ src/skins/ui_skin.h
+@@ -198,7 +198,7 @@ void skin_draw_mainwin_titlebar (cairo_t * cr, gboolean shaded, gboolean focus);
+ /* ui_skin_load_ini.c */
+ void skin_load_hints (Skin * skin, const char * path);
+ void skin_load_pl_colors (Skin * skin, const char * path);
+-void skin_load_masks (Skin * skin, const char * path, GdkRegion * masks[SKIN_MASK_COUNT]);
++void skin_load_masks (Skin * skin, const char * path, cairo_region_t * masks[SKIN_MASK_COUNT]);
+
+ static inline void set_cairo_color (cairo_t * cr, uint32_t c)
+ {
+--- src/skins/ui_skin_load_ini.cc.old
++++ src/skins/ui_skin_load_ini.cc
+@@ -248,7 +248,7 @@ private:
+ }
+ };
+
+-static GdkRegion * skin_create_mask (const GArray * num,
++static cairo_region_t * skin_create_mask (const GArray * num,
+ const GArray * point, int width, int height)
+ {
+ if (! num || ! point)
+@@ -257,7 +257,7 @@ static GdkRegion * skin_create_mask (const GArray * num,
+ width *= config.scale;
+ height *= config.scale;
+
+- GdkRegion * mask = nullptr;
++ cairo_region_t * mask = nullptr;
+
+ unsigned j = 0;
+ for (unsigned i = 0; i < num->len; i ++)
+@@ -281,12 +281,12 @@ static GdkRegion * skin_create_mask (const GArray * num,
+
+ if (xmax > xmin && ymax > ymin)
+ {
+- GdkRectangle rect = {xmin, ymin, xmax - xmin, ymax - ymin};
++ cairo_rectangle_int_t rect = {xmin, ymin, xmax - xmin, ymax - ymin};
+
+ if (mask)
+- gdk_region_union_with_rect (mask, & rect);
++ cairo_region_union_rectangle (mask, & rect);
+ else
+- mask = gdk_region_rectangle (& rect);
++ mask = cairo_region_create_rectangle (& rect);
+ }
+
+ j += n_points * 2;
+@@ -295,7 +295,7 @@ static GdkRegion * skin_create_mask (const GArray * num,
+ return mask;
+ }
+
+-void skin_load_masks (Skin * skin, const char * path, GdkRegion * masks[SKIN_MASK_COUNT])
++void skin_load_masks (Skin * skin, const char * path, cairo_region_t * masks[SKIN_MASK_COUNT])
+ {
+ int sizes[SKIN_MASK_COUNT][2] = {
+ {skin->properties.mainwin_width, skin->properties.mainwin_height},
+--- src/skins/ui_skinned_window.cc.old
++++ src/skins/ui_skinned_window.cc
+@@ -27,7 +27,7 @@
+ typedef struct {
+ void (* draw) (GtkWidget * window, cairo_t * cr);
+ GtkWidget * normal, * shaded;
+- GdkRegion * shape, * sshape;
++ cairo_region_t * shape, * sshape;
+ gboolean is_shaded, is_moving;
+ } WindowData;
+
+@@ -43,7 +43,7 @@ static void window_apply_shape (GtkWidget * window)
+ {
+ WindowData * data = (WindowData *) g_object_get_data ((GObject *) window, "windowdata");
+ g_return_if_fail (data);
+-
++
+ gdk_window_shape_combine_region (gtk_widget_get_window (window),
+ data->is_shaded ? data->sshape : data->shape, 0, 0);
+ }
+@@ -106,9 +106,9 @@ static void window_destroy (GtkWidget * window)
+ g_object_unref (data->shaded);
+
+ if (data->shape)
+- gdk_region_destroy (data->shape);
++ cairo_region_destroy (data->shape);
+ if (data->sshape)
+- gdk_region_destroy (data->sshape);
++ cairo_region_destroy (data->sshape);
+
+ g_free (data);
+ }
+@@ -168,19 +168,19 @@ void window_set_size (GtkWidget * window, int w, int h)
+ dock_set_size (window, w, h);
+ }
+
+-void window_set_shapes (GtkWidget * window, GdkRegion * shape, GdkRegion * sshape)
++void window_set_shapes (GtkWidget * window, cairo_region_t * shape, cairo_region_t * sshape)
+ {
+ WindowData * data = (WindowData *) g_object_get_data ((GObject *) window, "windowdata");
+ g_return_if_fail (data);
+
+ if (data->shape)
+- gdk_region_destroy (data->shape);
++ cairo_region_destroy (data->shape);
+ if (data->sshape)
+- gdk_region_destroy (data->sshape);
++ cairo_region_destroy (data->sshape);
+
+ data->shape = shape;
+ data->sshape = sshape;
+-
++
+ if (gtk_widget_get_realized (window))
+ window_apply_shape (window);
+ }
+@@ -205,7 +205,7 @@ void window_set_shaded (GtkWidget * window, gboolean shaded)
+ }
+
+ data->is_shaded = shaded;
+-
++
+ if (gtk_widget_get_realized (window))
+ window_apply_shape (window);
+ }
+--- src/skins/ui_skinned_window.h.old
++++ src/skins/ui_skinned_window.h
+@@ -27,7 +27,7 @@
+ GtkWidget * window_new (int * x, int * y, int w, int h, gboolean main,
+ gboolean shaded, void (* draw) (GtkWidget * window, cairo_t * cr));
+ void window_set_size (GtkWidget * window, int w, int h);
+-void window_set_shapes (GtkWidget * window, GdkRegion * shape, GdkRegion * sshape);
++void window_set_shapes (GtkWidget * window, cairo_region_t * shape, cairo_region_t * sshape);
+ void window_set_shaded (GtkWidget * window, gboolean shaded);
+ void window_put_widget (GtkWidget * window, gboolean shaded, GtkWidget * widget,
+ int x, int y);
+--- src/skins/ui_skinselector.cc.old
++++ src/skins/ui_skinselector.cc
+@@ -339,6 +339,10 @@ skin_view_on_cursor_changed(GtkTreeView * treeview,
+
+ selection = gtk_tree_view_get_selection(treeview);
+
++ /* workaround for Gnome bug #679291 */
++ if (! selection)
++ return;
++
+ if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+ return;
+
+@@ -366,7 +370,6 @@ skin_view_realize(GtkTreeView * treeview)
+
+ gtk_widget_show_all(GTK_WIDGET(treeview));
+
+- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
+
+ store = gtk_list_store_new(SKIN_VIEW_N_COLS, GDK_TYPE_PIXBUF,
+--- src/song_change/song_change.cc.old
++++ src/song_change/song_change.cc
+@@ -334,7 +334,7 @@ static void * custom_warning (void)
+ GtkWidget *bbox_hbox;
+ char * temp;
+
+- bbox_hbox = gtk_hbox_new (FALSE, 6);
++ bbox_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
+
+ cmd_warn_img = gtk_image_new_from_icon_name("dialog-warning", GTK_ICON_SIZE_MENU);
+ gtk_box_pack_start(GTK_BOX(bbox_hbox), cmd_warn_img, FALSE, FALSE, 0);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/macports-changes/attachments/20150413/f4ac1963/attachment-0001.html>
More information about the macports-changes
mailing list