Index: plugins/display_plugin/display_plugin.c =================================================================== --- plugins/display_plugin/display_plugin.c (revision 19136) +++ plugins/display_plugin/display_plugin.c (working copy) @@ -55,6 +55,9 @@ #define RCFILE "display.xml" /* */ +#define CONFIRM_TIMEOUT 15 + +/* */ enum { NAME_COLUMN, @@ -123,6 +126,60 @@ return; } } + +static gboolean +confirm_timeout_cb (gpointer user_data) +{ + gint timeout; + GtkWidget *msgdlg = user_data; + + timeout = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (msgdlg), "timeout")); + + if (!--timeout) + { + gtk_dialog_response (GTK_DIALOG (msgdlg), GTK_RESPONSE_NO); + return FALSE; + } + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (msgdlg), + _("Old settings will be restored in %d seconds"), + timeout); + g_object_set_data (G_OBJECT (msgdlg), "timeout", GINT_TO_POINTER (timeout)); + + return TRUE; +} + +static gboolean +confirm_display_mode (GtkWidget * parent) +{ + GtkWidget *msgdlg; + gint response; + guint timeout_id; + + msgdlg = gtk_message_dialog_new (GTK_WINDOW (parent), + GTK_DIALOG_MODAL | + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + _("Display settings have been changed. " + "Would you like to keep these settings?")); + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (msgdlg), + _("Old settings will be restored in %d seconds"), + CONFIRM_TIMEOUT); + + gtk_window_set_position (GTK_WINDOW (msgdlg), GTK_WIN_POS_CENTER_ALWAYS); + + g_object_set_data (G_OBJECT (msgdlg), "timeout", GINT_TO_POINTER (CONFIRM_TIMEOUT)); + timeout_id = g_timeout_add (1000, confirm_timeout_cb, msgdlg); + + response = gtk_dialog_run (GTK_DIALOG (msgdlg)); + + g_source_remove (timeout_id); + gtk_widget_destroy (msgdlg); + + return response == GTK_RESPONSE_YES; +} #endif #ifdef USE_XF86VM @@ -317,22 +374,51 @@ XRRScreenConfiguration *sc; GtkTreeModel *store; GtkTreeIter iter; + int newsize, newrate; if (!gtk_tree_selection_get_selected (selection, &store, &iter)) return; - gtk_tree_model_get (store, &iter, RATE_COLUMN, &rateIndex, SIZE_COLUMN, &sizeIndex, -1); + gtk_tree_model_get (store, &iter, RATE_COLUMN, &newrate, SIZE_COLUMN, &newsize, -1); /* apply settings */ sc = XRRGetScreenInfo (GDK_DISPLAY (), GDK_ROOT_WINDOW ()); - change_size_and_rate (sc, sizeIndex, rateIndex); + change_size_and_rate (sc, newsize, newrate); + + if (newsize != sizeIndex || newrate != rateIndex) + { + if (confirm_display_mode (dialog)) + { + /* and remember the settings */ + rateIndex = newrate; + sizeIndex = newsize; + + mcs_manager_set_int (plugin->manager, "XDisplay/rate", CHANNEL, newrate); + mcs_manager_set_int (plugin->manager, "XDisplay/size", CHANNEL, newsize); + mcs_manager_notify (plugin->manager, CHANNEL); + save_settings (plugin); + } + else + { + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) + { + do { + gtk_tree_model_get (store, &iter, + RATE_COLUMN, &newrate, + SIZE_COLUMN, &newsize, + -1); + + if (newrate == rateIndex && newsize == sizeIndex) + { + gtk_tree_selection_select_iter (selection, &iter); + break; + } + } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + } + } + } + XRRFreeScreenConfigInfo (sc); - - /* and remember the settings */ - mcs_manager_set_int (plugin->manager, "XDisplay/rate", CHANNEL, rateIndex); - mcs_manager_set_int (plugin->manager, "XDisplay/size", CHANNEL, sizeIndex); - mcs_manager_notify (plugin->manager, CHANNEL); - save_settings (plugin); } #endif Index: configure.ac =================================================================== --- configure.ac (revision 19136) +++ configure.ac (working copy) @@ -200,7 +200,7 @@ AC_SUBST([XCURSOR_LIBS]) dnl Check for required packages -XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.2.0]) +XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.6.0]) XDT_CHECK_PACKAGE([LIBXFCEGUI4], [libxfcegui4-1.0], [4.2.0]) dnl configure for mcs plugins