--- 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 @@ -74,7 +74,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"}); @@ -86,11 +86,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/eq-preset.cc.old +++ src/libaudgui/eq-preset.cc @@ -240,16 +240,16 @@ static GtkWidget * create_eq_preset_window () g_signal_connect (window, "destroy", (GCallback) cleanup_eq_preset_window, nullptr); - GtkWidget * outer = gtk_vbox_new (false, 0); + GtkWidget * outer = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add ((GtkContainer *) window, outer); gtk_box_pack_start ((GtkBox *) outer, create_menu_bar (), false, false, 0); - GtkWidget * vbox = gtk_vbox_new (false, 6); + GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_container_set_border_width ((GtkContainer *) vbox, 6); gtk_box_pack_start ((GtkBox *) outer, vbox, true, true, 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); entry = gtk_entry_new (); @@ -274,7 +274,7 @@ static GtkWidget * create_eq_preset_window () audgui_list_add_column (list, nullptr, 0, G_TYPE_STRING, -1); gtk_container_add ((GtkContainer *) scrolled, list); - GtkWidget * hbox2 = gtk_hbox_new (false, 6); + GtkWidget * hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_box_pack_start ((GtkBox *) vbox, hbox2, false, false, 0); GtkWidget * remove = audgui_button_new (_("Delete Selected"), "edit-delete", --- src/libaudgui/equalizer.cc.old +++ src/libaudgui/equalizer.cc @@ -68,13 +68,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); @@ -132,10 +133,10 @@ 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); - GtkWidget * top_row = gtk_hbox_new (false, 6); + GtkWidget * top_row = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_box_pack_start ((GtkBox *) vbox, top_row, false, false, 0); gtk_box_pack_start ((GtkBox *) top_row, create_on_off (), false, false, 0); @@ -148,13 +149,14 @@ static GtkWidget * create_window () (AudguiCallback) reset_to_zero, nullptr); gtk_box_pack_end ((GtkBox *) top_row, zero, 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 @@ -98,9 +98,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, 7 * dpi, 5 * dpi); - 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); @@ -111,17 +110,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 @@ -35,9 +35,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; @@ -102,56 +99,21 @@ static void infopopup_progress_cb (void *) gtk_widget_hide (widgets.progress); } -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 ("%s", 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); @@ -178,7 +140,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 (); @@ -186,8 +148,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); @@ -200,23 +162,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 @@ -134,7 +134,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; } @@ -286,10 +286,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); } @@ -304,44 +305,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, 2 * dpi, -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 (); gtk_widget_set_size_request (widgets.title, 3 * dpi, -1); @@ -369,9 +367,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 *); @@ -245,7 +249,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, 6 * dpi, 5 * dpi); - 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); @@ -258,7 +262,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 */ @@ -282,17 +286,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 @@ -389,7 +389,7 @@ static void autoscroll (void * 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); g_return_if_fail (adj); int pos, end; @@ -406,7 +406,7 @@ static void autoscroll (void * widget) static void start_autoscroll (ListModel * model, GtkWidget * widget, int speed) { - GtkAdjustment * adj = gtk_tree_view_get_vadjustment ((GtkTreeView *) widget); + GtkAdjustment * adj = gtk_scrollable_get_vadjustment ((GtkScrollable *) widget); g_return_if_fail (adj); int pos, end; @@ -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, list); g_list_free (model->column_types); g_object_unref (model); --- src/libaudgui/menu.cc.old +++ src/libaudgui/menu.cc @@ -23,6 +23,10 @@ #include #include +/* 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) @@ -200,7 +204,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 */ @@ -212,7 +216,7 @@ static void create_spin_button (const PreferencesWidget * widget, if (widget->label) { * label_pre = gtk_label_new (dgettext (domain, widget->label)); - gtk_misc_set_alignment ((GtkMisc *) * label_pre, 1, 0.5); + gtk_widget_set_halign (* label_pre, GTK_ALIGN_END); } * spin_btn = gtk_spin_button_new_with_range (widget->data.spin_btn.min, @@ -221,7 +225,7 @@ static void create_spin_button (const PreferencesWidget * widget, if (widget->data.spin_btn.right_label) { * label_past = gtk_label_new (dgettext (domain, widget->data.spin_btn.right_label)); - gtk_misc_set_alignment ((GtkMisc *) * label_past, 0, 0.5); + gtk_widget_set_halign (* label_past, GTK_ALIGN_START); } widget_init (* spin_btn, widget); @@ -233,13 +237,14 @@ void create_font_btn (const PreferencesWidget * widget, GtkWidget * * label, GtkWidget * * font_btn, const char * domain) { * font_btn = gtk_font_button_new (); + 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) @@ -255,12 +260,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); @@ -282,10 +288,12 @@ static void create_file_entry (const PreferencesWidget * widget, break; } + gtk_widget_set_hexpand (* entry, 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); } widget_init (* entry, widget); @@ -303,8 +311,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, @@ -346,7 +353,7 @@ static void create_cbox (const PreferencesWidget * widget, GtkWidget * * label, 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); } g_object_set_data ((GObject *) * combobox, "combodomain", (void *) domain); @@ -361,7 +368,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) { @@ -380,12 +386,10 @@ static void fill_table (GtkWidget * table, case PreferencesWidget::Entry: create_entry (& w, & widget_left, & widget_middle, domain); - middle_policy = (GtkAttachOptions) (GTK_EXPAND | GTK_FILL); break; case PreferencesWidget::FileEntry: create_file_entry (& w, & widget_left, & widget_middle, domain); - middle_policy = (GtkAttachOptions) (GTK_EXPAND | GTK_FILL); break; case PreferencesWidget::ComboBox: @@ -399,16 +403,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); } } @@ -433,13 +434,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 (disable_child) gtk_widget_set_sensitive (child_box, false); @@ -448,10 +447,6 @@ 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, spacing, 0, indent, 0); - gtk_box_pack_start ((GtkBox *) (child_box ? child_box : box), alignment, false, false, 0); - widget = nullptr; disable_child = false; @@ -461,6 +456,9 @@ void audgui_create_widgets_with_domain (GtkWidget * box, if (! w.child) radio_btn_group[true] = nullptr; + int pad_left = indent; + int pad_top = spacing; + switch (w.type) { case PreferencesWidget::Button: @@ -479,7 +477,8 @@ void audgui_create_widgets_with_domain (GtkWidget * box, if (strstr (w.label, "")) { /* headings get double spacing and no indent */ - gtk_alignment_set_padding ((GtkAlignment *) alignment, 2 * spacing, 0, 0, 0); + pad_left = 0; + pad_top = 2 * spacing; /* set indent for items below the heading */ indent = 12; @@ -490,7 +489,7 @@ void audgui_create_widgets_with_domain (GtkWidget * box, 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); } @@ -510,7 +509,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); @@ -533,7 +532,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); @@ -547,9 +546,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); @@ -558,7 +557,7 @@ void audgui_create_widgets_with_domain (GtkWidget * box, case PreferencesWidget::Entry: case PreferencesWidget::FileEntry: { - widget = gtk_hbox_new (false, 6); + widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); GtkWidget * entry = nullptr; @@ -577,7 +576,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); @@ -592,9 +591,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); @@ -608,13 +607,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); @@ -623,11 +620,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: @@ -635,7 +634,11 @@ void audgui_create_widgets_with_domain (GtkWidget * box, } if (widget) - gtk_container_add ((GtkContainer *) alignment, widget); + { + gtk_widget_set_margin_left (widget, pad_left); + gtk_widget_set_margin_top (widget, pad_top); + gtk_box_pack_start ((GtkBox *) (child_box ? child_box : box), widget, false, false, 0); + } /* wait till after first widget to set item spacing */ if (gtk_orientable_get_orientation ((GtkOrientable *) box) == GTK_ORIENTATION_VERTICAL) --- src/libaudgui/prefs-window.cc.old +++ src/libaudgui/prefs-window.cc @@ -528,29 +528,31 @@ 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 (); @@ -565,14 +567,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); } @@ -615,14 +617,14 @@ static ArrayRef 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); } @@ -753,17 +755,17 @@ static void record_update (void * = nullptr, void * = nullptr) 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); @@ -772,6 +774,7 @@ static void create_connectivity_category () static void create_plugin_category () { plugin_notebook = gtk_notebook_new (); + gtk_notebook_set_scrollable ((GtkNotebook *) plugin_notebook, true); gtk_container_add ((GtkContainer *) category_notebook, plugin_notebook); for (const PluginCategory & category : plugin_categories) @@ -799,10 +802,10 @@ static void create_prefs_window () gtk_container_set_border_width ((GtkContainer *) prefswin, 12); gtk_window_set_title ((GtkWindow *) prefswin, _("Audacious Settings")); - 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); @@ -832,17 +835,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 @@ -88,12 +88,40 @@ 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); + +#if GTK_CHECK_VERSION (3, 20, 0) + GdkSeat * seat = gdk_display_get_default_seat (display); + GdkDevice * device = gdk_seat_get_pointer (seat); +#else + GdkDeviceManager * manager = gdk_display_get_device_manager (display); + GdkDevice * device = gdk_device_manager_get_client_pointer (manager); +#endif + + 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); + +#if GTK_CHECK_VERSION (3, 20, 0) + GdkSeat * seat = gdk_display_get_default_seat (display); + GdkDevice * device = gdk_seat_get_pointer (seat); +#else + GdkDeviceManager * manager = gdk_display_get_device_manager (display); + GdkDevice * device = gdk_device_manager_get_client_pointer (manager); +#endif + + gdk_device_get_position (device, nullptr, x, y); } EXPORT void audgui_get_monitor_geometry (GdkScreen * screen, int x, int y, GdkRectangle * geom) @@ -227,6 +255,22 @@ EXPORT void audgui_file_entry_set_uri (GtkWidget * entry, const char * uri) gtk_editable_set_position ((GtkEditable *) entry, -1); } +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) { @@ -234,6 +278,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); @@ -249,6 +300,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);