[gnome-control-center] display: allow dragging top bar to set primary display



commit 7e5aecdf9837d318aba6d17ef381ab37aa444bef
Author: William Jon McCann <jmccann redhat com>
Date:   Sat Nov 20 20:38:04 2010 -0500

    display: allow dragging top bar to set primary display

 panels/display/scrollarea.c     |   28 ++++++++----
 panels/display/scrollarea.h     |    5 ++-
 panels/display/xrandr-capplet.c |   97 ++++++++++++++++++++++++++++++++++++++-
 3 files changed, 118 insertions(+), 12 deletions(-)
---
diff --git a/panels/display/scrollarea.c b/panels/display/scrollarea.c
index 3262e51..e3ec36a 100644
--- a/panels/display/scrollarea.c
+++ b/panels/display/scrollarea.c
@@ -763,9 +763,6 @@ emit_input (FooScrollArea *scroll_area,
   if (!func)
     return;
 
-  if (type != FOO_MOTION)
-    emit_input (scroll_area, FOO_MOTION, x, y, func, data);
-
   event.type = type;
   event.x = x;
   event.y = y;
@@ -789,7 +786,6 @@ process_event (FooScrollArea           *scroll_area,
       emit_input (scroll_area, input_type, x, y,
                   scroll_area->priv->grab_func,
                   scroll_area->priv->grab_data);
-      return;
     }
 
 #if 0
@@ -828,10 +824,20 @@ process_event (FooScrollArea           *scroll_area,
 
               if (inside)
                 {
-                  emit_input (scroll_area, input_type,
-                              x, y,
-                              path->func,
-                              path->data);
+                  if (scroll_area->priv->grabbed)
+                    {
+                      emit_input (scroll_area, FOO_DRAG_HOVER,
+                                  x, y,
+                                  path->func,
+                                  path->data);
+                    }
+                  else
+                    {
+                      emit_input (scroll_area, input_type,
+                                  x, y,
+                                  path->func,
+                                  path->data);
+                    }
                   return;
                 }
 
@@ -1322,13 +1328,17 @@ foo_scroll_area_begin_grab (FooScrollArea *scroll_area,
 }
 
 void
-foo_scroll_area_end_grab (FooScrollArea *scroll_area)
+foo_scroll_area_end_grab (FooScrollArea *scroll_area,
+                          FooScrollAreaEvent *event)
 {
   g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area));
 
   scroll_area->priv->grabbed = FALSE;
   scroll_area->priv->grab_func = NULL;
   scroll_area->priv->grab_data = NULL;
+
+  if (event != NULL)
+    process_event (scroll_area, FOO_DROP, event->x, event->y);
 }
 
 gboolean
diff --git a/panels/display/scrollarea.h b/panels/display/scrollarea.h
index b394c17..9d0fa0e 100644
--- a/panels/display/scrollarea.h
+++ b/panels/display/scrollarea.h
@@ -34,6 +34,8 @@ typedef enum
   {
     FOO_BUTTON_PRESS,
     FOO_BUTTON_RELEASE,
+    FOO_DRAG_HOVER,
+    FOO_DROP,
     FOO_MOTION
   } FooScrollAreaEventType;
 
@@ -115,7 +117,8 @@ void          foo_scroll_area_invalidate_rect (FooScrollArea *scroll_area,
 void foo_scroll_area_begin_grab (FooScrollArea *scroll_area,
                                  FooScrollAreaEventFunc func,
                                  gpointer       input_data);
-void foo_scroll_area_end_grab (FooScrollArea *scroll_area);
+void foo_scroll_area_end_grab (FooScrollArea *scroll_area,
+                               FooScrollAreaEvent *event);
 gboolean foo_scroll_area_is_grabbed (FooScrollArea *scroll_area);
 
 void foo_scroll_area_begin_auto_scroll (FooScrollArea *scroll_area);
diff --git a/panels/display/xrandr-capplet.c b/panels/display/xrandr-capplet.c
index 1919aff..2661718 100644
--- a/panels/display/xrandr-capplet.c
+++ b/panels/display/xrandr-capplet.c
@@ -1468,6 +1468,62 @@ set_cursor (GtkWidget *widget, GdkCursorType type)
 }
 
 static void
+set_top_bar_tooltip (App *app, gboolean is_dragging)
+{
+  const char *text;
+
+  if (is_dragging)
+    text = NULL;
+  else
+    text = _("Drag to change primary display.");
+
+  gtk_widget_set_tooltip_text (app->area, text);
+}
+
+static void
+on_top_bar_event (FooScrollArea *area,
+                  FooScrollAreaEvent *event,
+                  App *app)
+{
+  /* Ignore drops */
+  if (event->type == FOO_DROP)
+    return;
+
+  /* If the mouse is inside the top bar, set the cursor to "you can move me".  See
+   * on_canvas_event() for where we reset the cursor to the default if it
+   * exits the outputs' area.
+   */
+  if (!app->current_configuration->clone && get_n_connected (app) > 1)
+    set_cursor (GTK_WIDGET (area), GDK_FLEUR);
+
+  if (event->type == FOO_BUTTON_PRESS)
+    {
+      rebuild_gui (app);
+      set_top_bar_tooltip (app, TRUE);
+
+      if (!app->current_configuration->clone && get_n_connected (app) > 1)
+        {
+          foo_scroll_area_begin_grab (area, (FooScrollAreaEventFunc) on_top_bar_event, app);
+        }
+
+      foo_scroll_area_invalidate (area);
+    }
+  else
+    {
+      if (foo_scroll_area_is_grabbed (area))
+        {
+          if (event->type == FOO_BUTTON_RELEASE)
+            {
+              foo_scroll_area_end_grab (area, event);
+              set_top_bar_tooltip (app, FALSE);
+            }
+
+          foo_scroll_area_invalidate (area);
+        }
+    }
+}
+
+static void
 set_monitors_tooltip (App *app, gboolean is_dragging)
 {
   const char *text;
@@ -1481,6 +1537,27 @@ set_monitors_tooltip (App *app, gboolean is_dragging)
 }
 
 static void
+set_primary_output (App *app,
+                    GnomeOutputInfo *output)
+{
+  int i;
+
+  for (i = 0; app->current_configuration->outputs[i] != NULL; ++i)
+    {
+      GnomeOutputInfo *output2 = app->current_configuration->outputs[i];
+      if (output2 != output)
+        {
+          output2->primary = FALSE;
+        }
+      else
+        {
+          output2->primary = TRUE;
+        }
+    }
+
+}
+
+static void
 on_output_event (FooScrollArea *area,
                  FooScrollAreaEvent *event,
                  gpointer data)
@@ -1488,6 +1565,18 @@ on_output_event (FooScrollArea *area,
   GnomeOutputInfo *output = data;
   App *app = g_object_get_data (G_OBJECT (area), "app");
 
+  if (event->type == FOO_DRAG_HOVER)
+    {
+      set_primary_output (app, output);
+      return;
+    }
+
+  if (event->type == FOO_DROP)
+    {
+      /* Activate new primary? */
+      return;
+    }
+
   /* If the mouse is inside the outputs, set the cursor to "you can move me".  See
    * on_canvas_event() for where we reset the cursor to the default if it
    * exits the outputs' area.
@@ -1579,7 +1668,7 @@ on_output_event (FooScrollArea *area,
 
           if (event->type == FOO_BUTTON_RELEASE)
             {
-              foo_scroll_area_end_grab (area);
+              foo_scroll_area_end_grab (area, NULL);
               set_monitors_tooltip (app, FALSE);
 
               g_free (output->user_data);
@@ -1811,6 +1900,11 @@ paint_output (App *app, cairo_t *cr, int i)
       /* top bar */
       cairo_rectangle (cr, x, y, w * scale + 0.5, 20);
       cairo_set_source_rgb (cr, 0, 0, 0);
+      foo_scroll_area_add_input_from_fill (FOO_SCROLL_AREA (app->area),
+                                           cr,
+                                           (FooScrollAreaEventFunc) on_top_bar_event,
+                                           app);
+
       cairo_fill (cr);
 
       /* clock */
@@ -1846,7 +1940,6 @@ paint_output (App *app, cairo_t *cr, int i)
 
       pango_cairo_show_layout (cr, layout);
       g_object_unref (layout);
-
     }
 
   cairo_restore (cr);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]