[Xfce4-commits] <xfce4-settings:bluesabre/display-settings> Hook up the reworked minimal dialog

Nick Schermer noreply at xfce.org
Mon Dec 9 12:56:36 CET 2013


Updating branch refs/heads/bluesabre/display-settings
         to 7f506412224f57f93020b15a9e69ffbb64f82889 (commit)
       from 6575a0c1c9726c30d0cb39f307d597a323762423 (commit)

commit 7f506412224f57f93020b15a9e69ffbb64f82889
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Thu Oct 4 12:24:11 2012 +0200

    Hook up the reworked minimal dialog

 dialogs/display-settings/main.c |  288 ++++++++++++++++++++++++---------------
 1 file changed, 179 insertions(+), 109 deletions(-)

diff --git a/dialogs/display-settings/main.c b/dialogs/display-settings/main.c
index 0640404..c22ffea 100644
--- a/dialogs/display-settings/main.c
+++ b/dialogs/display-settings/main.c
@@ -113,7 +113,7 @@ static gboolean       bound_to_channel = FALSE;
 XfceRandr *xfce_randr = NULL;
 
 static void
-display_settings_minimal_extend_left_toggled (GtkToggleButton *button,
+display_settings_minimal_only_display1_toggled (GtkToggleButton *button,
                                               GtkBuilder *builder);
                                               
 static void
@@ -123,7 +123,10 @@ display_settings_minimal_mirror_displays_toggled (GtkToggleButton *button,
 static void
 display_settings_minimal_extend_right_toggled (GtkToggleButton *button,
                                               GtkBuilder *builder);
-
+                                              
+static void
+display_settings_minimal_only_display2_toggled (GtkToggleButton *button,
+                                              GtkBuilder *builder);
 
 
 static guint
@@ -1363,134 +1366,193 @@ display_settings_dialog_new (GtkBuilder *builder)
 }
 
 static void
-display_settings_minimal_extend_left_toggled (GtkToggleButton *button,
+display_settings_minimal_only_display1_toggled (GtkToggleButton *button,
                                               GtkBuilder *builder)
 {
-    GObject *mirror_displays;
-    GObject *extend_right;
-    
-    gint selected_x, selected_y;
-    XfceRRMode   *current_mode;
+    GObject *mirror_displays, *extend_right, *only_display2;
     
     mirror_displays = gtk_builder_get_object(builder, "mirror");
     extend_right = gtk_builder_get_object(builder, "extend_right");
-    
+    only_display2 = gtk_builder_get_object(builder, "display2");
+
+    /* Lock everything in the dialog to prevent bad things from happening */
     g_object_disconnect (mirror_displays, "any_signal::toggled",
                          display_settings_minimal_mirror_displays_toggled,
                          builder, NULL);
-                         
     g_object_disconnect (extend_right, "any_signal::toggled",
                          display_settings_minimal_extend_right_toggled,
                          builder, NULL);
+    g_object_disconnect (only_display2, "any_signal::toggled",
+                         display_settings_minimal_only_display2_toggled,
+                         builder, NULL);
                          
     gtk_widget_set_sensitive( GTK_WIDGET(mirror_displays), FALSE );
     gtk_widget_set_sensitive( GTK_WIDGET(extend_right), FALSE );
-    
-    /* Since this signal will only be called when a toggle button is activated. */
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display2), FALSE );
+
     gtk_toggle_button_set_active (button, TRUE);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(mirror_displays), FALSE);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(extend_right), FALSE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(only_display2), FALSE);
     
-    /* Change active output to secondary display. */
-    xfce_randr->active_output = 1;
-    
-    current_mode = xfce_randr_find_mode_by_id (xfce_randr, xfce_randr->active_output, XFCE_RANDR_MODE (xfce_randr));
-    
-    /* Change active output to primary display. */
-    xfce_randr->active_output = 0;
+    if (!xfce_randr)
+        return;
+
+    if (xfce_randr->noutput <= 1)
+        return;
+
+    if (gtk_toggle_button_get_active (button))
+    {
+		/* Put Display1 in its preferred mode and deactivate Display2 */
+        XFCE_RANDR_MODE (xfce_randr) = xfce_randr_preferred_mode (xfce_randr, 0);
+        xfce_randr->active_output = 1;
+        XFCE_RANDR_MODE (xfce_randr) = None;
+        /* Apply the changes */
+        xfce_randr_save_output (xfce_randr, "Default", display_channel,0);
+        xfce_randr_save_output (xfce_randr, "Default", display_channel,1);
+        xfce_randr_apply (xfce_randr, "Default", display_channel);
+    }
     
-    /* Move the secondary to where the primary is... */
-    selected_x = XFCE_RANDR_POS_X (xfce_randr);
-    selected_y = XFCE_RANDR_POS_Y (xfce_randr);
-    xfce_randr->active_output = 1;
-    XFCE_RANDR_POS_X (xfce_randr) = selected_x;
-    XFCE_RANDR_POS_Y (xfce_randr) = selected_y;
+    gtk_widget_set_sensitive( GTK_WIDGET(mirror_displays), TRUE );
+    gtk_widget_set_sensitive( GTK_WIDGET(extend_right), TRUE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display2), TRUE );
+
+    /* Reconnect the signals */
+    g_signal_connect (mirror_displays, "toggled", G_CALLBACK (display_settings_minimal_mirror_displays_toggled),
+                      builder);
+    g_signal_connect (extend_right, "toggled", G_CALLBACK (display_settings_minimal_extend_right_toggled),
+                      builder);
+    g_signal_connect (only_display2, "toggled", G_CALLBACK (display_settings_minimal_only_display2_toggled),
+                      builder);
+}
+
+static void
+display_settings_minimal_only_display2_toggled (GtkToggleButton *button,
+                                              GtkBuilder *builder)
+{
+    GObject *mirror_displays, *extend_right, *only_display1;
     
-    /* Move the primary display to the right of the secondary display. */
-    xfce_randr->active_output = 0;
-    XFCE_RANDR_POS_X (xfce_randr) = current_mode->width;
+    mirror_displays = gtk_builder_get_object(builder, "mirror");
+    extend_right = gtk_builder_get_object(builder, "extend_right");
+    only_display1 = gtk_builder_get_object(builder, "display1");
+
+    /* Lock everything in the dialog to prevent bad things from happening */
+    g_object_disconnect (mirror_displays, "any_signal::toggled",
+                         display_settings_minimal_mirror_displays_toggled,
+                         builder, NULL);
+    g_object_disconnect (extend_right, "any_signal::toggled",
+                         display_settings_minimal_extend_right_toggled,
+                         builder, NULL);
+    g_object_disconnect (only_display1, "any_signal::toggled",
+                         display_settings_minimal_only_display1_toggled,
+                         builder, NULL);
+                         
+    gtk_widget_set_sensitive( GTK_WIDGET(mirror_displays), FALSE );
+    gtk_widget_set_sensitive( GTK_WIDGET(extend_right), FALSE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display1), FALSE );
+
+    gtk_toggle_button_set_active (button, TRUE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(mirror_displays), FALSE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(extend_right), FALSE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(only_display1), FALSE);
     
-    /* Save changes to secondary display */
-    xfce_randr->active_output = 1;
-    xfce_randr_save_output (xfce_randr, "Default", display_channel,
-                            xfce_randr->active_output);
+    if (!xfce_randr)
+        return;
 
-    /* Save changes to primary display */
-    xfce_randr->active_output = 0;
-    xfce_randr_save_output (xfce_randr, "Default", display_channel,
-                            xfce_randr->active_output);
-                            
-    /* Apply all changes */
-    xfce_randr_apply (xfce_randr, "Default", display_channel);
+    if (xfce_randr->noutput <= 1)
+        return;
+
+    if (gtk_toggle_button_get_active (button))
+    {
+        /* Put Display2 in its preferred mode and deactivate Display1 */
+        XFCE_RANDR_MODE (xfce_randr) = xfce_randr_preferred_mode (xfce_randr, 1);
+        xfce_randr->active_output = 0;
+        XFCE_RANDR_MODE (xfce_randr) = None;
+        /* Apply the changes */
+        xfce_randr_save_output (xfce_randr, "Default", display_channel,0);
+        xfce_randr_save_output (xfce_randr, "Default", display_channel,1);
+        xfce_randr_apply (xfce_randr, "Default", display_channel);
+    }
     
     gtk_widget_set_sensitive( GTK_WIDGET(mirror_displays), TRUE );
     gtk_widget_set_sensitive( GTK_WIDGET(extend_right), TRUE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display1), TRUE );
 
     /* Reconnect the signals */
     g_signal_connect (mirror_displays, "toggled", G_CALLBACK (display_settings_minimal_mirror_displays_toggled),
                       builder);
-                      
     g_signal_connect (extend_right, "toggled", G_CALLBACK (display_settings_minimal_extend_right_toggled),
                       builder);
+    g_signal_connect (only_display1, "toggled", G_CALLBACK (display_settings_minimal_only_display1_toggled),
+                      builder);
 }
 
 static void
 display_settings_minimal_mirror_displays_toggled (GtkToggleButton *button,
                                               GtkBuilder *builder)
 {
-    GObject *extend_left;
-    GObject *extend_right;
+    GObject *extend_right, *only_display1, *only_display2;
     
     gint selected_x, selected_y;
+    guint n;
     
-    extend_left = gtk_builder_get_object(builder, "extend_left");
+    only_display1 = gtk_builder_get_object(builder, "display1");
+    only_display2 = gtk_builder_get_object(builder, "display2");
     extend_right = gtk_builder_get_object(builder, "extend_right");
-    
-    g_object_disconnect (extend_left, "any_signal::toggled",
-                         display_settings_minimal_extend_left_toggled,
+
+    /* Lock everything in the dialog to prevent bad things from happening */
+    g_object_disconnect (only_display1, "any_signal::toggled",
+                         display_settings_minimal_only_display1_toggled,
+                         builder, NULL);
+    g_object_disconnect (only_display2, "any_signal::toggled",
+                         display_settings_minimal_only_display2_toggled,
                          builder, NULL);
-                         
     g_object_disconnect (extend_right, "any_signal::toggled",
                          display_settings_minimal_extend_right_toggled,
                          builder, NULL);
                          
-    gtk_widget_set_sensitive( GTK_WIDGET(extend_left), FALSE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display1), FALSE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display2), FALSE );
     gtk_widget_set_sensitive( GTK_WIDGET(extend_right), FALSE );
-    
-    /* Since this signal will only be called when a toggle button is activated. */
+
     gtk_toggle_button_set_active (button, TRUE);
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(extend_left), FALSE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(only_display1), FALSE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(only_display2), FALSE);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(extend_right), FALSE);
-    
-    xfce_randr->active_output = 0;
-    
+
+	/* Activate all inactive displays */
+	for (n = 0; n < xfce_randr->noutput; ++n)
+    {
+        if (xfce_randr->mode[n] == None)
+        {
+            XFCE_RANDR_MODE (xfce_randr) = xfce_randr_preferred_mode (xfce_randr, n);
+        }
+    }
+
+	/* Save changes to primary display */
+	xfce_randr->active_output = 0;
     selected_x = XFCE_RANDR_POS_X (xfce_randr);
     selected_y = XFCE_RANDR_POS_Y (xfce_randr);
+    xfce_randr_save_output (xfce_randr, "Default", display_channel, 0);
     
+    /* Save changes to secondary display */
     xfce_randr->active_output = 1;
     XFCE_RANDR_POS_X (xfce_randr) = selected_x;
     XFCE_RANDR_POS_Y (xfce_randr) = selected_y;
-    
-    /* Save changes to secondary display */
-    xfce_randr->active_output = 1;
-    xfce_randr_save_output (xfce_randr, "Default", display_channel,
-                            xfce_randr->active_output);
-
-    /* Save changes to primary display */
-    xfce_randr->active_output = 0;
-    xfce_randr_save_output (xfce_randr, "Default", display_channel,
-                            xfce_randr->active_output);
+    xfce_randr_save_output (xfce_randr, "Default", display_channel, 1);
                             
     /* Apply all changes */
     xfce_randr_apply (xfce_randr, "Default", display_channel);
     
-    gtk_widget_set_sensitive( GTK_WIDGET(extend_left), TRUE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display1), TRUE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display2), TRUE );
     gtk_widget_set_sensitive( GTK_WIDGET(extend_right), TRUE );
 
     /* Reconnect the signals */
-    g_signal_connect (extend_left, "toggled", G_CALLBACK (display_settings_minimal_extend_left_toggled),
+    g_signal_connect (only_display1, "toggled", G_CALLBACK (display_settings_minimal_only_display1_toggled),
+                      builder);
+    g_signal_connect (only_display2, "toggled", G_CALLBACK (display_settings_minimal_only_display2_toggled),
                       builder);
-                      
     g_signal_connect (extend_right, "toggled", G_CALLBACK (display_settings_minimal_extend_right_toggled),
                       builder);
 }
@@ -1499,71 +1561,75 @@ static void
 display_settings_minimal_extend_right_toggled (GtkToggleButton *button,
                                               GtkBuilder *builder)
 {
-    GObject *mirror_displays;
-    GObject *extend_left;
-    
-    gint selected_x, selected_y;
+    GObject *mirror_displays, *only_display1, *only_display2;
+    guint n;
     
     XfceRRMode   *current_mode;
     
     mirror_displays = gtk_builder_get_object(builder, "mirror");
-    extend_left = gtk_builder_get_object(builder, "extend_left");
-    
+    only_display1 = gtk_builder_get_object(builder, "display1");
+    only_display2 = gtk_builder_get_object(builder, "display2");
+
+    /* Lock everything in the dialog to prevent bad things from happening */
     g_object_disconnect (mirror_displays, "any_signal::toggled",
                          display_settings_minimal_mirror_displays_toggled,
                          builder, NULL);
-                         
-    g_object_disconnect (extend_left, "any_signal::toggled",
-                         display_settings_minimal_extend_left_toggled,
+    g_object_disconnect (only_display1, "any_signal::toggled",
+                         display_settings_minimal_only_display1_toggled,
+                         builder, NULL);
+    g_object_disconnect (only_display2, "any_signal::toggled",
+                         display_settings_minimal_only_display2_toggled,
                          builder, NULL);
                          
     gtk_widget_set_sensitive( GTK_WIDGET(mirror_displays), FALSE );
-    gtk_widget_set_sensitive( GTK_WIDGET(extend_left), FALSE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display1), FALSE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display2), FALSE );
     
-    /* Since this signal will only be called when a toggle button is activated. */
     gtk_toggle_button_set_active (button, TRUE);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(mirror_displays), FALSE);
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(extend_left), FALSE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(only_display1), FALSE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(only_display2), FALSE);
+
+	/* Activate all inactive displays */
+	for (n = 0; n < xfce_randr->noutput; ++n)
+    {
+        if (xfce_randr->mode[n] == None)
+        {
+            XFCE_RANDR_MODE (xfce_randr) = xfce_randr_preferred_mode (xfce_randr, n);
+        }
+    }
+
+    /* Retrieve mode of Display1 */
+    current_mode = xfce_randr_find_mode_by_id (xfce_randr, 0, XFCE_RANDR_MODE (xfce_randr));
     
+    /* (Re)set Display1 to 0x0 */
     xfce_randr->active_output = 0;
+    XFCE_RANDR_POS_X (xfce_randr) = 0;
+    XFCE_RANDR_POS_Y (xfce_randr) = 0;
     
-    current_mode = xfce_randr_find_mode_by_id (xfce_randr, xfce_randr->active_output, XFCE_RANDR_MODE (xfce_randr));
-            
-    /* Change active output to secondary display. */
-    xfce_randr->active_output = 1;
-    
-    /* Move the primary to where the secondary is... */
-    selected_x = XFCE_RANDR_POS_X (xfce_randr);
-    selected_y = XFCE_RANDR_POS_Y (xfce_randr);
-    xfce_randr->active_output = 0;
-    XFCE_RANDR_POS_X (xfce_randr) = selected_x;
-    XFCE_RANDR_POS_Y (xfce_randr) = selected_y;
-    
-    /* Move the secondary display to the right of the primary display. */
+    /* Move Display2 right of Display2 */
     xfce_randr->active_output = 1;
     XFCE_RANDR_POS_X (xfce_randr) = current_mode->width;
-    
-    /* Save changes to secondary display */
-    xfce_randr->active_output = 1;
-    xfce_randr_save_output (xfce_randr, "Default", display_channel,
-                            xfce_randr->active_output);
 
-    /* Save changes to primary display */
-    xfce_randr->active_output = 0;
-    xfce_randr_save_output (xfce_randr, "Default", display_channel,
-                            xfce_randr->active_output);
+    /* Move the secondary display to the right of the primary display. */
+    
+    /* Save changes to both displays */
+    xfce_randr_save_output (xfce_randr, "Default", display_channel, 0);
+    xfce_randr_save_output (xfce_randr, "Default", display_channel, 1);
                             
     /* Apply all changes */
     xfce_randr_apply (xfce_randr, "Default", display_channel);
-    
+
+    /* Unlock the dialog and reconnect the signals */    
     gtk_widget_set_sensitive( GTK_WIDGET(mirror_displays), TRUE );
-    gtk_widget_set_sensitive( GTK_WIDGET(extend_left), TRUE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display1), TRUE );
+    gtk_widget_set_sensitive( GTK_WIDGET(only_display2), TRUE );
 
-    /* Reconnect the signals */
     g_signal_connect (mirror_displays, "toggled", G_CALLBACK (display_settings_minimal_mirror_displays_toggled),
                       builder);
-                      
-    g_signal_connect (extend_left, "toggled", G_CALLBACK (display_settings_minimal_extend_left_toggled),
+    g_signal_connect (only_display1, "toggled", G_CALLBACK (display_settings_minimal_only_display1_toggled),
+                      builder);
+    g_signal_connect (only_display2, "toggled", G_CALLBACK (display_settings_minimal_only_display2_toggled),
                       builder);
 }
 
@@ -1781,7 +1847,8 @@ main (gint argc, gchar **argv)
             if (gtk_builder_add_from_string (builder, minimal_display_dialog_ui,
                                              minimal_display_dialog_ui_length, &error) != 0)
             {
-                GObject *extend_left;
+                GObject *only_display1;
+                GObject *only_display2;
                 GObject *mirror_displays;
                 GObject *extend_right;
 
@@ -1791,16 +1858,19 @@ main (gint argc, gchar **argv)
                 g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
                 g_signal_connect (cancel, "clicked", G_CALLBACK (gtk_main_quit), NULL);
                 
-                extend_left = gtk_builder_get_object (builder, "extend_left");
+                only_display1 = gtk_builder_get_object (builder, "display1");
                 mirror_displays = gtk_builder_get_object (builder, "mirror");
                 extend_right = gtk_builder_get_object (builder, "extend_right");
+                only_display2 = gtk_builder_get_object (builder, "display2");
                 
-                g_signal_connect (extend_left, "toggled", G_CALLBACK (display_settings_minimal_extend_left_toggled),
+                g_signal_connect (only_display1, "toggled", G_CALLBACK (display_settings_minimal_only_display1_toggled),
                       builder);
                 g_signal_connect (mirror_displays, "toggled", G_CALLBACK (display_settings_minimal_mirror_displays_toggled),
                       builder);
                 g_signal_connect (extend_right, "toggled", G_CALLBACK (display_settings_minimal_extend_right_toggled),
                       builder);
+                g_signal_connect (only_display2, "toggled", G_CALLBACK (display_settings_minimal_only_display2_toggled),
+                      builder);
 
                 /* Show the minimal dialog and start the main loop */
                 gtk_window_present (GTK_WINDOW (dialog));


More information about the Xfce4-commits mailing list