[gtksourceview/wip/chergert/gsv-gtk4: 105/197] completion: use gdk_surface_move_to_rect()



commit d9aefd73f8d16f2131586c1529863d620f631488
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jan 15 14:11:55 2020 -0800

    completion: use gdk_surface_move_to_rect()
    
    This avoids manual control over placement and instead relies on the
    window manager (or GDK on X11) to place the window in an appropriate
    place using relative gravity of windows.

 gtksourceview/gtksourcecompletion.c | 56 ++++++++++++++-----------------------
 1 file changed, 21 insertions(+), 35 deletions(-)
---
diff --git a/gtksourceview/gtksourcecompletion.c b/gtksourceview/gtksourcecompletion.c
index 9b407b6f..d6ac4f47 100644
--- a/gtksourceview/gtksourcecompletion.c
+++ b/gtksourceview/gtksourcecompletion.c
@@ -738,34 +738,34 @@ gtk_source_completion_activate_proposal (GtkSourceCompletion *completion)
 static void
 update_info_position (GtkSourceCompletion *completion)
 {
-       GdkDisplay *display;
-       GdkMonitor *monitor;
-       GdkWindow *window;
+       GdkSurface *main_surface;
+       GdkSurface *info_surface;
        GdkRectangle geom;
-       gint x, y;
-       gint width, height;
-       gint info_width;
 
-       gtk_window_get_position (GTK_WINDOW (completion->main_window), &x, &y);
-       gtk_window_get_size (GTK_WINDOW (completion->main_window), &width, &height);
-       gtk_window_get_size (GTK_WINDOW (completion->info_window), &info_width, NULL);
-
-       display = gtk_widget_get_display (GTK_WIDGET (completion->main_window));
-       window = gtk_widget_get_window (GTK_WIDGET (completion->main_window));
-       monitor = gdk_display_get_monitor_at_window (display, window);
-       gdk_monitor_get_geometry (monitor, &geom);
-
-       /* Determine on which side to place it */
-       if (x + width + info_width >= geom.width)
+       if (!GTK_IS_NATIVE (completion->main_window) ||
+           !GTK_IS_NATIVE (completion->info_window))
        {
-               x -= info_width;
+               return;
        }
-       else
+
+       main_surface = gtk_native_get_surface (GTK_NATIVE (completion->main_window));
+       info_surface = gtk_native_get_surface (GTK_NATIVE (completion->info_window));
+
+       if (main_surface == NULL || info_surface == NULL)
        {
-               x += width;
+               return;
        }
 
-       gtk_window_move (GTK_WINDOW (completion->info_window), x, y);
+       gdk_surface_get_position (main_surface, &geom.x, &geom.y);
+       geom.width = gdk_surface_get_width (main_surface);
+       geom.height = gdk_surface_get_height (main_surface);
+
+       gdk_surface_move_to_rect (info_surface,
+                                 &geom,
+                                 GDK_GRAVITY_NORTH_EAST,
+                                 GDK_GRAVITY_NORTH_WEST,
+                                 GDK_ANCHOR_FLIP_X,
+                                 0, 0);
 }
 
 static GtkSourceCompletionProvider *
@@ -1261,15 +1261,6 @@ selection_changed_cb (GtkTreeSelection    *selection,
        }
 }
 
-static gboolean
-gtk_source_completion_configure_event (GtkWidget           *widget,
-                                       GdkEventConfigure   *event,
-                                       GtkSourceCompletion *completion)
-{
-       update_info_position (completion);
-       return FALSE;
-}
-
 static gboolean
 hide_completion_cb (GtkSourceCompletion *completion)
 {
@@ -2182,11 +2173,6 @@ init_main_window (GtkSourceCompletion *completion,
        gtk_window_set_attached_to (GTK_WINDOW (completion->main_window),
                                    GTK_WIDGET (completion->view));
 
-       g_signal_connect (completion->main_window,
-                         "configure-event",
-                         G_CALLBACK (gtk_source_completion_configure_event),
-                         completion);
-
        g_signal_connect_swapped (completion->main_window,
                                  "size-allocate",
                                  G_CALLBACK (update_window_position),


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