[gnome-control-center/gbsneto/gtk4: 52/72] search: Port to GTK4




commit 502d7b966a06df7fb9f5cd2b2b34ed5b276f6711
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Wed Oct 20 16:56:11 2021 -0300

    search: Port to GTK4
    
    This one was the first panel ported that used Drag n' Drop, and
    we can see how much of an improvement GTK4 is compared to GTK3
    when handling DnD.

 panels/meson.build                          |   2 +-
 panels/search/cc-search-locations-dialog.c  |  70 ++++++++-------
 panels/search/cc-search-locations-dialog.ui |  71 +++++----------
 panels/search/cc-search-panel-row.c         | 124 ++++++++++++--------------
 panels/search/cc-search-panel-row.h         |   4 +-
 panels/search/cc-search-panel-row.ui        | 133 ++++++++++++----------------
 panels/search/cc-search-panel.c             |  68 +++++++-------
 panels/search/cc-search-panel.ui            |   5 +-
 shell/cc-panel-loader.c                     |   4 +-
 9 files changed, 210 insertions(+), 271 deletions(-)
---
diff --git a/panels/meson.build b/panels/meson.build
index 0e09f4ab1..04d22d758 100644
--- a/panels/meson.build
+++ b/panels/meson.build
@@ -22,7 +22,7 @@ panels = [
 #  'printers',
 #  'region',
   'removable-media',
-#  'search',
+  'search',
 #  'sharing',
   'sound',
   'universal-access',
diff --git a/panels/search/cc-search-locations-dialog.c b/panels/search/cc-search-locations-dialog.c
index 764016ffc..73455c5ae 100644
--- a/panels/search/cc-search-locations-dialog.c
+++ b/panels/search/cc-search-locations-dialog.c
@@ -19,7 +19,6 @@
  */
 
 #include "cc-search-locations-dialog.h"
-#include "list-box-helper.h"
 
 #include <glib/gi18n.h>
 
@@ -457,10 +456,9 @@ place_query_info_ready (GObject *source,
                         GAsyncResult *res,
                         gpointer user_data)
 {
+  g_autoptr(GFileInfo) info = NULL;
   GtkWidget *row, *box, *w;
   Place *place;
-  g_autoptr(GFileInfo) info = NULL;
-  g_autofree gchar *path = NULL;
 
   info = g_file_query_info_finish (G_FILE (source), res, NULL);
   if (!info)
@@ -470,23 +468,22 @@ place_query_info_ready (GObject *source,
   place = g_object_get_data (G_OBJECT (row), "place");
   g_clear_object (&place->cancellable);
 
-  box = gtk_bin_get_child (GTK_BIN (row));
-  gtk_widget_show (box);
-
-  w = gtk_label_new (place->display_name);
-  gtk_widget_show (w);
-  gtk_container_add (GTK_CONTAINER (box), w);
+  box = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (row));
 
   w = gtk_switch_new ();
-  gtk_widget_show (w);
   gtk_widget_set_valign (w, GTK_ALIGN_CENTER);
-  gtk_box_pack_end (GTK_BOX (box), w, FALSE, FALSE, 0);
+  gtk_box_prepend (GTK_BOX (box), w);
   g_settings_bind_with_mapping (place->dialog->tracker_preferences, place->settings_key,
                                 w, "active",
                                 G_SETTINGS_BIND_DEFAULT,
                                 switch_tracker_get_mapping,
                                 switch_tracker_set_mapping,
                                 place, NULL);
+
+  w = gtk_label_new (place->display_name);
+  gtk_label_set_xalign (GTK_LABEL (w), 0.0);
+  gtk_widget_set_hexpand (w, TRUE);
+  gtk_box_prepend (GTK_BOX (box), w);
 }
 
 static void
@@ -541,22 +538,25 @@ create_row_for_place (CcSearchLocationsDialog *self, Place *place)
   GtkWidget *child, *row, *remove_button;
 
   row = gtk_list_box_row_new ();
-  gtk_widget_show (row);
   gtk_list_box_row_set_selectable (GTK_LIST_BOX_ROW (row), FALSE);
   gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
+
   child = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-  gtk_widget_show (child);
-  gtk_container_add (GTK_CONTAINER (row), child);
-  g_object_set (row, "margin", 5, "margin-left", 16, NULL);
+  gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), child);
+  g_object_set (row,
+                "margin-top", 6,
+                "margin-bottom", 6,
+                "margin-start", 16,
+                "margin-end", 6,
+                NULL);
   g_object_set_data_full (G_OBJECT (row), "place", place, (GDestroyNotify) place_free);
 
   if (place->place_type == PLACE_OTHER)
     {
-      remove_button = gtk_button_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU);
-      gtk_widget_show (remove_button);
+      remove_button = gtk_button_new_from_icon_name ("window-close-symbolic");
       g_object_set_data (G_OBJECT (remove_button), "place", place);
       gtk_style_context_add_class (gtk_widget_get_style_context (remove_button), "flat");
-      gtk_box_pack_end (GTK_BOX (child), remove_button, FALSE, FALSE, 2);
+      gtk_box_append (GTK_BOX (child), remove_button);
 
       g_signal_connect_swapped (remove_button, "clicked",
                                 G_CALLBACK (remove_button_clicked), self);
@@ -587,13 +587,13 @@ populate_list_boxes (CcSearchLocationsDialog *self)
       switch (place->place_type)
         {
           case PLACE_XDG:
-            gtk_container_add (GTK_CONTAINER (self->places_list), row);
+            gtk_list_box_append (GTK_LIST_BOX (self->places_list), row);
             break;
           case PLACE_BOOKMARKS:
-            gtk_container_add (GTK_CONTAINER (self->bookmarks_list), row);
+            gtk_list_box_append (GTK_LIST_BOX (self->bookmarks_list), row);
             break;
           case PLACE_OTHER:
-            gtk_container_add (GTK_CONTAINER (self->others_list), row);
+            gtk_list_box_append (GTK_LIST_BOX (self->others_list), row);
             break;
           default:
             g_assert_not_reached ();
@@ -611,7 +611,7 @@ add_file_chooser_response (CcSearchLocationsDialog *self,
 
   if (response != GTK_RESPONSE_OK)
     {
-      gtk_widget_destroy (GTK_WIDGET (widget));
+      gtk_window_destroy (GTK_WINDOW (widget));
       return;
     }
 
@@ -625,7 +625,7 @@ add_file_chooser_response (CcSearchLocationsDialog *self,
   new_values = place_get_new_settings_values (self, place, FALSE);
   g_settings_set_strv (self->tracker_preferences, place->settings_key, (const gchar **) new_values->pdata);
 
-  gtk_widget_destroy (GTK_WIDGET (widget));
+  gtk_window_destroy (GTK_WINDOW (widget));
 }
 
 static void
@@ -634,7 +634,7 @@ add_button_clicked (CcSearchLocationsDialog *self)
   GtkWidget *file_chooser;
 
   file_chooser = gtk_file_chooser_dialog_new (_("Select Location"),
-                                              GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))),
+                                              GTK_WINDOW (self),
                                               GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
                                               _("_Cancel"), GTK_RESPONSE_CANCEL,
                                               _("_OK"), GTK_RESPONSE_OK,
@@ -642,7 +642,7 @@ add_button_clicked (CcSearchLocationsDialog *self)
   gtk_window_set_modal (GTK_WINDOW (file_chooser), TRUE);
   g_signal_connect_swapped (file_chooser, "response",
                             G_CALLBACK (add_file_chooser_response), self);
-  gtk_widget_show (file_chooser);
+  gtk_window_present (GTK_WINDOW (file_chooser));
 }
 
 static void
@@ -650,20 +650,23 @@ other_places_refresh (CcSearchLocationsDialog *self)
 {
   g_autoptr(GList) places = NULL;
   GList *l;
-  Place *place;
-  GtkWidget *row;
+  GtkWidget *widget;
 
-  gtk_container_foreach (GTK_CONTAINER (self->others_list), (GtkCallback) gtk_widget_destroy, NULL);
+  while ((widget = gtk_widget_get_first_child (self->others_list)) != NULL)
+    gtk_list_box_remove (GTK_LIST_BOX (self->others_list), widget);
 
   places = get_places_list (self);
   for (l = places; l != NULL; l = l->next)
     {
+      GtkWidget *row;
+      Place *place;
+
       place = l->data;
       if (place->place_type != PLACE_OTHER)
         continue;
 
       row = create_row_for_place (self, place);
-      gtk_container_add (GTK_CONTAINER (self->others_list), row);
+      gtk_list_box_append (GTK_LIST_BOX (self->others_list), row);
     }
 }
 
@@ -673,6 +676,8 @@ cc_search_locations_dialog_new (CcSearchPanel *panel)
   CcSearchLocationsDialog *self;
   GSettingsSchemaSource *source;
   g_autoptr(GSettingsSchema) schema = NULL;
+  GtkWidget *toplevel;
+  CcShell *shell;
 
   self = g_object_new (CC_SEARCH_LOCATIONS_DIALOG_TYPE,
                        "use-header-bar", TRUE,
@@ -690,13 +695,12 @@ cc_search_locations_dialog_new (CcSearchPanel *panel)
   gtk_list_box_set_sort_func (GTK_LIST_BOX (self->others_list),
                               (GtkListBoxSortFunc)place_compare_func, NULL, NULL);
 
-  gtk_list_box_set_header_func (GTK_LIST_BOX (self->others_list), cc_list_box_update_header_func, NULL, 
NULL);
-
   g_signal_connect_swapped (self->tracker_preferences, "changed::" TRACKER_KEY_RECURSIVE_DIRECTORIES,
                             G_CALLBACK (other_places_refresh), self);
 
-  gtk_window_set_transient_for (GTK_WINDOW (self),
-                                GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (panel))));
+  shell = cc_panel_get_shell (CC_PANEL (panel));
+  toplevel = cc_shell_get_toplevel (shell);
+  gtk_window_set_transient_for (GTK_WINDOW (self), GTK_WINDOW (toplevel));
 
   return self;
 }
diff --git a/panels/search/cc-search-locations-dialog.ui b/panels/search/cc-search-locations-dialog.ui
index 147829e36..9549d0b22 100644
--- a/panels/search/cc-search-locations-dialog.ui
+++ b/panels/search/cc-search-locations-dialog.ui
@@ -2,31 +2,27 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CcSearchLocationsDialog" parent="GtkDialog">
-    <property name="can_focus">False</property>
     <property name="default_height">400</property>
     <property name="default_width">360</property>
     <property name="modal">True</property>
     <property name="title" translatable="yes">Search Locations</property>
-    <property name="type_hint">dialog</property>
     <property name="use_header_bar">1</property>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox1">
-        <property name="can_focus">False</property>
+    <child>
+      <object class="GtkBox">
         <property name="orientation">vertical</property>
-        <property name="border-width">0</property>
         <child>
           <object class="GtkNotebook">
             <property name="show-border">False</property>
-            <property name="visible">True</property>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
                 <property name="vexpand">True</property>
-                <property name="border-width">35</property>
+                <property name="margin-top">35</property>
+                <property name="margin-bottom">35</property>
+                <property name="margin-start">35</property>
+                <property name="margin-end">35</property>
                 <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkLabel">
-                    <property name="visible">True</property>
                     <property name="wrap">True</property>
                     <property name="margin-bottom">35</property>
                     <property name="label" translatable="yes">Folders which are searched by system 
applications, such as Files, Photos and Videos.</property>
@@ -34,36 +30,29 @@
                 </child>
                 <child>
                   <object class="GtkListBox" id="places_list">
-                    <property name="visible">True</property>
-                    <property name="expand">True</property>
-                    <child>
-                      <placeholder/>
-                    </child>
+                    <property name="hexpand">True</property>
+                    <property name="vexpand">True</property>
                   </object>
                 </child>
               </object>
-              <packing>
-                <property name="tab-expand">True</property>
-              </packing>
             </child>
             <child type="tab">
               <object class="GtkLabel">
-                <property name="visible">True</property>
                 <property name="label" translatable="yes">Places</property>
               </object>
             </child>
             <child>
               <object class="GtkScrolledWindow">
-                <property name="visible">True</property>
                 <child>
                   <object class="GtkBox">
-                    <property name="visible">True</property>
                     <property name="vexpand">True</property>
-                    <property name="border-width">35</property>
+                    <property name="margin-top">35</property>
+                    <property name="margin-bottom">35</property>
+                    <property name="margin-start">35</property>
+                    <property name="margin-end">35</property>
                     <property name="orientation">vertical</property>
                     <child>
                       <object class="GtkLabel">
-                        <property name="visible">True</property>
                         <property name="wrap">True</property>
                         <property name="margin-bottom">35</property>
                         <property name="label" translatable="yes">Folders which are searched by system 
applications, such as Files, Photos and Videos.</property>
@@ -71,64 +60,53 @@
                     </child>
                     <child>
                       <object class="GtkListBox" id="bookmarks_list">
-                        <property name="visible">True</property>
-                        <property name="expand">True</property>
-                        <child>
-                          <placeholder/>
-                        </child>
+                        <property name="hexpand">True</property>
+                        <property name="vexpand">True</property>
                       </object>
                     </child>
                   </object>
                 </child>
               </object>
-              <packing>
-                <property name="tab-expand">True</property>
-              </packing>
             </child>
             <child type="tab">
               <object class="GtkLabel">
-                <property name="visible">True</property>
                 <property name="label" translatable="yes">Bookmarks</property>
               </object>
             </child>
             <child>
               <object class="GtkScrolledWindow">
-                <property name="visible">True</property>
                 <child>
                   <object class="GtkBox">
-                    <property name="visible">True</property>
                     <property name="vexpand">True</property>
                     <property name="orientation">vertical</property>
                     <child>
                       <object class="GtkLabel">
-                        <property name="visible">True</property>
                         <property name="wrap">True</property>
-                        <property name="margin">35</property>
+                        <property name="margin-top">35</property>
+                        <property name="margin-bottom">35</property>
+                        <property name="margin-start">35</property>
+                        <property name="margin-end">35</property>
                         <property name="label" translatable="yes">Folders which are searched by system 
applications, such as Files, Photos and Videos.</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkListBox" id="others_list">
-                        <property name="visible">True</property>
-                        <child>
-                          <placeholder/>
-                        </child>
                       </object>
                     </child>
                     <child>
                       <object class="GtkSeparator">
-                        <property name="visible">True</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkButton" id="locations_add">
-                        <property name="visible">True</property>
                         <property name="halign">center</property>
-                        <property name="margin">5</property>
+                        <property name="margin-top">6</property>
+                        <property name="margin-bottom">6</property>
+                        <property name="margin-start">6</property>
+                        <property name="margin-end">6</property>
                         <signal name="clicked" handler="add_button_clicked" object="CcSearchLocationsDialog" 
swapped="yes"/>
                         <child>
                           <object class="GtkImage">
-                            <property name="visible">True</property>
                             <property name="icon-name">list-add-symbolic</property>
                             <property name="icon-size">1</property>
                           </object>
@@ -140,19 +118,14 @@
                     </child>
                     <child>
                       <object class="GtkSeparator">
-                        <property name="visible">True</property>
                       </object>
                     </child>
                   </object>
                 </child>
               </object>
-              <packing>
-                <property name="tab-expand">True</property>
-              </packing>
             </child>
             <child type="tab">
               <object class="GtkLabel">
-                <property name="visible">True</property>
                 <property name="label" translatable="yes">Other</property>
               </object>
             </child>
diff --git a/panels/search/cc-search-panel-row.c b/panels/search/cc-search-panel-row.c
index e8ae5fb85..f3cb3a199 100644
--- a/panels/search/cc-search-panel-row.c
+++ b/panels/search/cc-search-panel-row.c
@@ -21,19 +21,20 @@
 
 struct _CcSearchPanelRow
 {
-  GtkListBoxRow  parent_instance;
+  AdwBin         parent_instance;
 
   GAppInfo      *app_info;
 
-  GtkEventBox   *drag_handle;
   GtkImage      *icon;
   GtkLabel      *app_name;
   GtkSwitch     *switcher;
 
   GtkListBox    *drag_widget;
+  gdouble        drag_x;
+  gdouble        drag_y;
 };
 
-G_DEFINE_TYPE (CcSearchPanelRow, cc_search_panel_row, GTK_TYPE_LIST_BOX_ROW)
+G_DEFINE_TYPE (CcSearchPanelRow, cc_search_panel_row, ADW_TYPE_BIN)
 
 enum
 {
@@ -77,78 +78,70 @@ move_down_button_clicked (GtkButton    *button,
                  self);
 }
 
+static GdkContentProvider *
+drag_prepare_cb (GtkDragSource    *source,
+                 double            x,
+                 double            y,
+                 CcSearchPanelRow *self)
+{
+  self->drag_x = x;
+  self->drag_y = y;
+
+  return gdk_content_provider_new_typed (CC_TYPE_SEARCH_PANEL_ROW, self);
+}
+
 static void
-drag_begin_cb (CcSearchPanelRow *self,
-               GdkDragContext   *drag_context)
+drag_begin_cb (GtkDragSource    *source,
+               GdkDrag          *drag,
+               CcSearchPanelRow *self)
 {
-  CcSearchPanelRow *drag_row;
+  CcSearchPanelRow *panel_row;
   GtkAllocation alloc;
-  gint x = 0, y = 0;
+  GtkWidget *drag_icon;
+  GtkWidget *row;
 
   gtk_widget_get_allocation (GTK_WIDGET (self), &alloc);
 
-  gdk_window_get_device_position (gtk_widget_get_window (GTK_WIDGET (self)),
-                                  gdk_drag_context_get_device (drag_context),
-                                  &x, &y, NULL);
-
   self->drag_widget = GTK_LIST_BOX (gtk_list_box_new ());
-  gtk_widget_show (GTK_WIDGET (self->drag_widget));
   gtk_widget_set_size_request (GTK_WIDGET (self->drag_widget), alloc.width, alloc.height);
 
-  drag_row = cc_search_panel_row_new (self->app_info);
-  gtk_switch_set_active (drag_row->switcher, gtk_switch_get_active (self->switcher));
-  gtk_widget_show (GTK_WIDGET (drag_row));
-  gtk_container_add (GTK_CONTAINER (self->drag_widget), GTK_WIDGET (drag_row));
-  gtk_list_box_drag_highlight_row (self->drag_widget, GTK_LIST_BOX_ROW (drag_row));
+  panel_row = cc_search_panel_row_new (self->app_info);
+  gtk_switch_set_active (panel_row->switcher, gtk_switch_get_active (self->switcher));
 
-  gtk_drag_set_icon_widget (drag_context, GTK_WIDGET (self->drag_widget), x - alloc.x, y - alloc.y);
-}
+  row = gtk_list_box_row_new ();
+  gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), GTK_WIDGET (panel_row));
+  gtk_list_box_append (GTK_LIST_BOX (self->drag_widget), row);
+  gtk_list_box_drag_highlight_row (self->drag_widget, GTK_LIST_BOX_ROW (row));
 
-static void
-drag_end_cb (CcSearchPanelRow *self)
-{
-  g_clear_pointer ((GtkWidget **) &self->drag_widget, gtk_widget_destroy);
-}
+  drag_icon = gtk_drag_icon_get_for_drag (drag);
+  gtk_drag_icon_set_child (GTK_DRAG_ICON (drag_icon), GTK_WIDGET (self->drag_widget));
+  gdk_drag_set_hotspot (drag, self->drag_x, self->drag_y);
 
-static void
-drag_data_get_cb (CcSearchPanelRow *self,
-                  GdkDragContext   *context,
-                  GtkSelectionData *selection_data,
-                  guint             info,
-                  guint             time_)
-{
-  gtk_selection_data_set (selection_data,
-                          gdk_atom_intern_static_string ("GTK_LIST_BOX_ROW"),
-                          32,
-                          (const guchar *)&self,
-                          sizeof (gpointer));
 }
 
-static void
-drag_data_received_cb (CcSearchPanelRow *self,
-                       GdkDragContext   *context,
-                       gint              x,
-                       gint              y,
-                       GtkSelectionData *selection_data,
-                       guint             info,
-                       guint             time_)
+static gboolean
+drop_cb (GtkDropTarget    *drop_target,
+         const GValue     *value,
+         gdouble           x,
+         gdouble           y,
+         CcSearchPanelRow *self)
 {
   CcSearchPanelRow *source;
 
-  source = *((CcSearchPanelRow **) gtk_selection_data_get_data (selection_data));
-  if (source == self)
-    return;
+  g_message ("Drop");
+
+  if (!G_VALUE_HOLDS (value, CC_TYPE_SEARCH_PANEL_ROW))
+    return FALSE;
+
+  source = g_value_get_object (value);
 
   g_signal_emit (source,
                  signals[SIGNAL_MOVE_ROW],
                  0,
                  self);
-}
 
-static GtkTargetEntry entries[] =
-{
-  { "GTK_LIST_BOX_ROW", GTK_TARGET_SAME_APP, 0 }
-};
+  return TRUE;
+}
 
 static void
 cc_search_panel_row_class_init (CcSearchPanelRowClass *klass)
@@ -158,15 +151,10 @@ cc_search_panel_row_class_init (CcSearchPanelRowClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/search/cc-search-panel-row.ui");
 
-  gtk_widget_class_bind_template_child (widget_class, CcSearchPanelRow, drag_handle);
   gtk_widget_class_bind_template_child (widget_class, CcSearchPanelRow, icon);
   gtk_widget_class_bind_template_child (widget_class, CcSearchPanelRow, app_name);
   gtk_widget_class_bind_template_child (widget_class, CcSearchPanelRow, switcher);
 
-  gtk_widget_class_bind_template_callback (widget_class, drag_begin_cb);
-  gtk_widget_class_bind_template_callback (widget_class, drag_end_cb);
-  gtk_widget_class_bind_template_callback (widget_class, drag_data_get_cb);
-  gtk_widget_class_bind_template_callback (widget_class, drag_data_received_cb);
   gtk_widget_class_bind_template_callback (widget_class, move_up_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, move_down_button_clicked);
 
@@ -184,10 +172,21 @@ cc_search_panel_row_class_init (CcSearchPanelRowClass *klass)
 static void
 cc_search_panel_row_init (CcSearchPanelRow *self)
 {
+  GtkDragSource *drag_source;
+  GtkDropTarget *drop_target;
+
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  gtk_drag_source_set (GTK_WIDGET (self->drag_handle), GDK_BUTTON1_MASK, entries, 1, GDK_ACTION_MOVE);
-  gtk_drag_dest_set (GTK_WIDGET (self), GTK_DEST_DEFAULT_ALL, entries, 1, GDK_ACTION_MOVE);
+  drag_source = gtk_drag_source_new ();
+  gtk_drag_source_set_actions (drag_source, GDK_ACTION_MOVE);
+  g_signal_connect (drag_source, "prepare", G_CALLBACK (drag_prepare_cb), self);
+  g_signal_connect (drag_source, "drag-begin", G_CALLBACK (drag_begin_cb), self);
+  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (drag_source));
+
+  drop_target = gtk_drop_target_new (CC_TYPE_SEARCH_PANEL_ROW, GDK_ACTION_MOVE);
+  gtk_drop_target_set_preload (drop_target, TRUE);
+  g_signal_connect (drop_target, "drop", G_CALLBACK (drop_cb), self);
+  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (drop_target));
 }
 
 CcSearchPanelRow *
@@ -195,7 +194,6 @@ cc_search_panel_row_new (GAppInfo *app_info)
 {
   CcSearchPanelRow *self;
   g_autoptr(GIcon) gicon = NULL;
-  gint width, height;
 
   self = g_object_new (CC_TYPE_SEARCH_PANEL_ROW, NULL);
   self->app_info = g_object_ref (app_info);
@@ -205,14 +203,10 @@ cc_search_panel_row_new (GAppInfo *app_info)
     gicon = g_themed_icon_new ("application-x-executable");
   else
     g_object_ref (gicon);
-  gtk_image_set_from_gicon (self->icon, gicon, GTK_ICON_SIZE_DND);
-  gtk_icon_size_lookup (GTK_ICON_SIZE_DND, &width, &height);
-  gtk_image_set_pixel_size (self->icon, MAX (width, height));
+  gtk_image_set_from_gicon (self->icon, gicon);
 
   gtk_label_set_text (self->app_name, g_app_info_get_name (app_info));
 
-  gtk_drag_source_set (GTK_WIDGET (self->drag_handle), GDK_BUTTON1_MASK, entries, 1, GDK_ACTION_MOVE);
-
   return self;
 }
 
diff --git a/panels/search/cc-search-panel-row.h b/panels/search/cc-search-panel-row.h
index 97fe9f117..c9c83cb2c 100644
--- a/panels/search/cc-search-panel-row.h
+++ b/panels/search/cc-search-panel-row.h
@@ -20,13 +20,13 @@
 #pragma once
 
 #include <gio/gdesktopappinfo.h>
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define CC_TYPE_SEARCH_PANEL_ROW (cc_search_panel_row_get_type())
 
-G_DECLARE_FINAL_TYPE (CcSearchPanelRow, cc_search_panel_row, CC, SEARCH_PANEL_ROW, GtkListBoxRow)
+G_DECLARE_FINAL_TYPE (CcSearchPanelRow, cc_search_panel_row, CC, SEARCH_PANEL_ROW, AdwBin)
 
 
 CcSearchPanelRow *cc_search_panel_row_new          (GAppInfo *app_info);
diff --git a/panels/search/cc-search-panel-row.ui b/panels/search/cc-search-panel-row.ui
index dc53aad05..3a50d06f1 100644
--- a/panels/search/cc-search-panel-row.ui
+++ b/panels/search/cc-search-panel-row.ui
@@ -1,74 +1,55 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <template class="CcSearchPanelRow" parent="GtkListBoxRow">
-    <property name="visible">True</property>
-    <property name="can-focus">True</property>
-    <property name="selectable">False</property>
-    <signal name="drag_data_received" handler="drag_data_received_cb" object="CcSearchPanelRow" 
swapped="yes"/>
+  <template class="CcSearchPanelRow" parent="AdwBin">
     <child>
-      <object class="GtkEventBox" id="drag_handle">
-        <property name="visible">True</property>
-        <signal name="drag_data_get" handler="drag_data_get_cb" object="CcSearchPanelRow" swapped="yes"/>
-        <signal name="drag-begin" handler="drag_begin_cb" object="CcSearchPanelRow" swapped="yes"/>
-        <signal name="drag_end" handler="drag_end_cb" object="CcSearchPanelRow" swapped="yes"/>
+      <object class="GtkBox">
+        <property name="spacing">12</property>
+        <property name="margin-top">12</property>
+        <property name="margin-bottom">12</property>
+        <property name="margin-start">12</property>
+        <property name="margin-end">12</property>
+        <child>
+          <object class="GtkImage">
+            <property name="icon-name">list-drag-handle-symbolic</property>
+            <style>
+              <class name="drag-handle"/>
+            </style>
+          </object>
+        </child>
+        <child>
+          <object class="GtkImage" id="icon">
+            <style>
+              <class name="lowres-icon"/>
+            </style>
+          </object>
+        </child>
+        <child>
+          <object class="GtkLabel" id="app_name">
+            <property name="hexpand">True</property>
+            <property name="ellipsize">end</property>
+            <property name="xalign">0.0</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkSwitch" id="switcher">
+            <property name="valign">center</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkSeparator">
+            <property name="orientation">vertical</property>
+          </object>
+        </child>
         <child>
-          <object class="GtkBox">
-            <property name="visible">True</property>
-            <property name="spacing">10</property>
-            <property name="border-width">10</property>
+          <object class="GtkMenuButton">
+            <property name="popover">move_row_menu</property>
+            <style>
+              <class name="flat"/>
+            </style>
             <child>
               <object class="GtkImage">
-                <property name="visible">True</property>
-                <property name="icon-name">list-drag-handle-symbolic</property>
-                <style>
-                  <class name="drag-handle"/>
-                </style>
-              </object>
-            </child>
-            <child>
-              <object class="GtkImage" id="icon">
-                <property name="visible">True</property>
-                <style>
-                  <class name="lowres-icon"/>
-                </style>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="app_name">
-                <property name="visible">True</property>
-                <property name="hexpand">True</property>
-                <property name="ellipsize">end</property>
-                <property name="xalign">0.0</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkSwitch" id="switcher">
-                <property name="visible">True</property>
-                <property name="valign">center</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkSeparator">
-                <property name="visible">True</property>
-                <property name="orientation">vertical</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkMenuButton">
-                <property name="visible">True</property>
-                <property name="can-focus">True</property>
-                <property name="popover">move_row_menu</property>
-                <style>
-                  <class name="flat"/>
-                </style>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="can-focus">False</property>
-                    <property name="icon-name">view-more-symbolic</property>
-                  </object>
-                </child>
+                <property name="icon-name">view-more-symbolic</property>
               </object>
             </child>
           </object>
@@ -78,31 +59,27 @@
   </template>
 
   <!-- Move Row Menu -->
-  <object class="GtkPopoverMenu" id="move_row_menu">
+  <object class="GtkPopover" id="move_row_menu">
+    <style>
+      <class name="menu" />
+    </style>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can-focus">False</property>
-        <property name="margin">12</property>
+        <property name="margin-top">12</property>
+        <property name="margin-bottom">12</property>
+        <property name="margin-start">12</property>
+        <property name="margin-end">12</property>
         <property name="spacing">6</property>
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkModelButton">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Move Up</property>
-            <property name="can-focus">True</property>
-            <property name="receives-default">True</property>
-            <property name="xalign">0.0</property>
+            <property name="text" translatable="yes">Move Up</property>
             <signal name="clicked" handler="move_up_button_clicked"/>
           </object>
         </child>
         <child>
           <object class="GtkModelButton">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Move Down</property>
-            <property name="can-focus">True</property>
-            <property name="receives-default">True</property>
-            <property name="xalign">0.0</property>
+            <property name="text" translatable="yes">Move Down</property>
             <signal name="clicked" handler="move_down_button_clicked"/>
           </object>
         </child>
diff --git a/panels/search/cc-search-panel.c b/panels/search/cc-search-panel.c
index 6b2b9416a..2de905734 100644
--- a/panels/search/cc-search-panel.c
+++ b/panels/search/cc-search-panel.c
@@ -22,7 +22,6 @@
 #include "cc-search-panel-row.h"
 #include "cc-search-locations-dialog.h"
 #include "cc-search-resources.h"
-#include "list-box-helper.h"
 
 #include <gio/gdesktopappinfo.h>
 #include <glib/gi18n.h>
@@ -52,13 +51,16 @@ list_sort_func (gconstpointer a,
                 gpointer user_data)
 {
   CcSearchPanel *self = user_data;
+  GtkWidget *panel_row_a, *panel_row_b;
   GAppInfo *app_a, *app_b;
   const gchar *id_a, *id_b;
   gint idx_a, idx_b;
   gpointer lookup;
 
-  app_a = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW ((gpointer*)a));
-  app_b = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW ((gpointer*)b));
+  panel_row_a = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW ((gpointer*)a));
+  panel_row_b = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW ((gpointer*)b));
+  app_a = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (panel_row_a));
+  app_b = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (panel_row_b));
 
   id_a = g_app_info_get_id (app_a);
   id_b = g_app_info_get_id (app_b);
@@ -143,48 +145,39 @@ search_panel_propagate_sort_order (CcSearchPanel *self)
 static void
 search_panel_set_no_providers (CcSearchPanel *self)
 {
-  GtkWidget *w;
-
   /* center the list box in the scrolled window */
   gtk_widget_set_valign (self->list_box, GTK_ALIGN_CENTER);
 
-  w = gtk_label_new (_("No applications found"));
-  gtk_widget_show (w);
-
-  gtk_container_add (GTK_CONTAINER (self->list_box), w);
+  gtk_list_box_append (GTK_LIST_BOX (self->list_box),
+                       gtk_label_new (_("No applications found")));
 }
 
 static void
 search_panel_move_selected (CcSearchPanel *self,
                             gboolean down)
 {
-  GtkListBoxRow *row, *other_row;
+  GtkListBoxRow *other_row;
   GAppInfo *app_info, *other_app_info;
   const gchar *app_id, *other_app_id;
   const gchar *last_good_app, *target_app;
+  GtkWidget *panel_row;
+  GtkWidget *aux;
   gint idx, other_idx;
   gpointer idx_ptr;
   gboolean found;
-  g_autoptr(GList) children = NULL;
-  GList *l, *other;
 
-  row = GTK_LIST_BOX_ROW (self->selected_row);
-  app_info = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (row));
+  app_info = cc_search_panel_row_get_app_info (self->selected_row);
   app_id = g_app_info_get_id (app_info);
 
-  children = gtk_container_get_children (GTK_CONTAINER (self->list_box));
-
   /* The assertions are valid only as long as we don't move the first
      or the last item. */
 
-  l = g_list_find (children, row);
-  g_assert (l != NULL);
-
-  other = down ? g_list_next(l) : g_list_previous(l);
-  g_assert (other != NULL);
+  aux = gtk_widget_get_parent (GTK_WIDGET (self->selected_row));
+  other_row = down ? GTK_LIST_BOX_ROW (gtk_widget_get_next_sibling (aux)) :
+                     GTK_LIST_BOX_ROW (gtk_widget_get_prev_sibling (aux));
 
-  other_row = other->data;
-  other_app_info = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (other_row));
+  panel_row = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (other_row));
+  other_app_info = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (panel_row));
   other_app_id = g_app_info_get_id (other_app_info);
 
   g_assert (other_app_id != NULL);
@@ -203,14 +196,15 @@ search_panel_move_selected (CcSearchPanel *self,
       GAppInfo *tmp;
       const char *tmp_id;
 
-      l = g_list_previous (l);
-      if (l == NULL)
+      aux = gtk_widget_get_prev_sibling (aux);
+      if (aux == NULL)
         {
           last_good_app = NULL;
           break;
         }
 
-      tmp = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (l->data));
+      panel_row = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (aux));
+      tmp = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (panel_row));
       tmp_id = g_app_info_get_id (tmp);
 
       last_good_app = tmp_id;
@@ -235,7 +229,7 @@ search_panel_move_selected (CcSearchPanel *self,
          Sort orders are 1 based, so that 0 (NULL) is not a valid value.
       */
       idx = 1;
-      l = children;
+      aux = gtk_widget_get_first_child (GTK_WIDGET (self->list_box));
     }
 
   while (last_good_app != target_app)
@@ -243,12 +237,13 @@ search_panel_move_selected (CcSearchPanel *self,
       GAppInfo *tmp;
       const char *tmp_id;
 
-      tmp = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (l->data));
+      panel_row = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (aux));
+      tmp = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (panel_row));
       tmp_id = g_app_info_get_id (tmp);
 
       g_hash_table_replace (self->sort_order, g_strdup (tmp_id), GINT_TO_POINTER (idx));
 
-      l = g_list_next (l);
+      aux = gtk_widget_get_next_sibling (aux);
       idx++;
       last_good_app = tmp_id;
     }
@@ -267,8 +262,10 @@ row_moved_cb (CcSearchPanel    *self,
               CcSearchPanelRow *dest_row,
               CcSearchPanelRow *row)
 {
-  gint source_idx = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (row));
-  gint dest_idx = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (dest_row));
+  GtkWidget *dest_listbox_row = gtk_widget_get_parent (GTK_WIDGET (dest_row));
+  GtkWidget *listbox_row = gtk_widget_get_parent (GTK_WIDGET (row));
+  gint source_idx = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (listbox_row));
+  gint dest_idx = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (dest_listbox_row));
   gboolean down;
 
   self->selected_row = row;
@@ -404,7 +401,6 @@ search_panel_add_one_app_info (CcSearchPanel *self,
                                gboolean default_enabled)
 {
   CcSearchPanelRow *row;
-  g_autoptr(GIcon) icon = NULL;
 
   /* gnome-control-center is special cased in the shell,
      and is not configurable */
@@ -420,7 +416,7 @@ search_panel_add_one_app_info (CcSearchPanel *self,
                            G_CALLBACK (row_moved_cb), self,
                            G_CONNECT_SWAPPED);
   g_object_set_data (G_OBJECT (row), "self", self);
-  gtk_container_add (GTK_CONTAINER (self->list_box), GTK_WIDGET (row));
+  gtk_list_box_append (GTK_LIST_BOX (self->list_box), GTK_WIDGET (row));
 
   if (default_enabled)
     {
@@ -618,7 +614,7 @@ cc_search_panel_finalize (GObject *object)
   g_hash_table_destroy (self->sort_order);
 
   if (self->locations_dialog)
-    gtk_widget_destroy (GTK_WIDGET (self->locations_dialog));
+    gtk_window_destroy (GTK_WINDOW (self->locations_dialog));
 
   G_OBJECT_CLASS (cc_search_panel_parent_class)->finalize (object);
 }
@@ -633,12 +629,10 @@ cc_search_panel_constructed (GObject *object)
 
   /* add the disable all switch */
   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-  gtk_widget_show (box);
 
   widget = gtk_switch_new ();
-  gtk_widget_show (widget);
   gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
-  gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 4);
+  gtk_box_append (GTK_BOX (box), widget);
 
   g_settings_bind (self->search_settings, "disable-external",
                    widget, "active",
diff --git a/panels/search/cc-search-panel.ui b/panels/search/cc-search-panel.ui
index 711c37527..6d601d607 100644
--- a/panels/search/cc-search-panel.ui
+++ b/panels/search/cc-search-panel.ui
@@ -3,15 +3,13 @@
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CcSearchPanel" parent="CcPanel">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
 
     <child>
       <object class="GtkScrolledWindow" id="search_vbox">
         <property name="visible">True</property>
         <property name="hscrollbar_policy">never</property>
-        <property name="can_focus">False</property>
         <child>
-          <object class="HdyClamp">
+          <object class="AdwClamp">
             <property name="visible">True</property>
             <property name="margin_top">32</property>
             <property name="margin_bottom">32</property>
@@ -53,7 +51,6 @@
   <!-- Header widget -->
   <object class="GtkButton" id="settings_button">
     <property name="visible">True</property>
-    <property name="can-focus">True</property>
     <property name="label" translatable="yes">Search Locations</property>
     <signal name="clicked" handler="settings_button_clicked" object="CcSearchPanel" swapped="no"/>
   </object>
diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
index 661807a2a..7cc02ef9c 100644
--- a/shell/cc-panel-loader.c
+++ b/shell/cc-panel-loader.c
@@ -54,7 +54,7 @@ extern GType cc_notifications_panel_get_type (void);
 //extern GType cc_printers_panel_get_type (void);
 //extern GType cc_region_panel_get_type (void);
 extern GType cc_removable_media_panel_get_type (void);
-//extern GType cc_search_panel_get_type (void);
+extern GType cc_search_panel_get_type (void);
 //extern GType cc_sharing_panel_get_type (void);
 extern GType cc_sound_panel_get_type (void);
 #ifdef BUILD_THUNDERBOLT
@@ -125,7 +125,7 @@ static CcPanelLoaderVtable default_panels[] =
   //PANEL_TYPE("printers",         cc_printers_panel_get_type,             NULL),
   //PANEL_TYPE("region",           cc_region_panel_get_type,               NULL),
   PANEL_TYPE("removable-media",  cc_removable_media_panel_get_type,      NULL),
-  //PANEL_TYPE("search",           cc_search_panel_get_type,               NULL),
+  PANEL_TYPE("search",           cc_search_panel_get_type,               NULL),
   //PANEL_TYPE("sharing",          cc_sharing_panel_get_type,              NULL),
   PANEL_TYPE("sound",            cc_sound_panel_get_type,                NULL),
 #ifdef BUILD_THUNDERBOLT


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