]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktreeview.c
treeview: don't use gtk_render_focus() for dnd indicator
[~andy/gtk] / gtk / gtktreeview.c
index 7d2711ce4c43b125de9ab3e3337c63eba6983c93..43add5427c7a180b60905d658d0ae91e8e3a11de 100644 (file)
@@ -2906,7 +2906,7 @@ gtk_tree_view_button_press (GtkWidget      *widget,
           tree_view->priv->arrow_prelit &&
          gtk_tree_view_draw_expanders (tree_view))
        {
-         if (event->button == 1)
+         if (event->button == GDK_BUTTON_PRIMARY)
            {
              gtk_grab_add (widget);
              tree_view->priv->button_pressed_node = tree_view->priv->prelight_node;
@@ -2998,10 +2998,10 @@ gtk_tree_view_button_press (GtkWidget      *widget,
          return FALSE;
        }
 
-      tree_view->priv->focus_column = column;
+      _gtk_tree_view_set_focus_column (tree_view, column);
 
       /* decide if we edit */
-      if (event->type == GDK_BUTTON_PRESS && event->button == 1 &&
+      if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_PRIMARY &&
          !(event->state & gtk_accelerator_get_default_mod_mask ()))
        {
          GtkTreePath *anchor;
@@ -3138,7 +3138,7 @@ gtk_tree_view_button_press (GtkWidget      *widget,
         }
 
       /* Test if a double click happened on the same row. */
-      if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
+      if (event->button == GDK_BUTTON_PRIMARY && event->type == GDK_BUTTON_PRESS)
         {
           int double_click_time, double_click_distance;
 
@@ -3365,7 +3365,7 @@ gtk_tree_view_button_release (GtkWidget      *widget,
   if (tree_view->priv->button_pressed_node == NULL)
     return FALSE;
 
-  if (event->button == 1)
+  if (event->button == GDK_BUTTON_PRIMARY)
     {
       if (tree_view->priv->button_pressed_node == tree_view->priv->prelight_node &&
           tree_view->priv->arrow_prelit)
@@ -4556,17 +4556,10 @@ draw_empty_focus (GtkTreeView *tree_view, cairo_t *cr)
   if (w > 0 && h > 0)
     {
       GtkStyleContext *context;
-      GtkStateFlags state;
 
       context = gtk_widget_get_style_context (widget);
-      state = gtk_widget_get_state_flags (widget);
-
-      gtk_style_context_save (context);
-      gtk_style_context_set_state (context, state);
 
       gtk_render_focus (context, cr, 1, 1, w, h);
-
-      gtk_style_context_restore (context);
     }
 }
 
@@ -4700,7 +4693,6 @@ gtk_tree_view_bin_draw (GtkWidget      *widget,
   GList *first_column, *last_column;
   gint vertical_separator;
   gint horizontal_separator;
-  gint focus_line_width;
   gboolean allow_rules;
   gboolean has_can_focus_cell;
   gboolean rtl;
@@ -4708,18 +4700,15 @@ gtk_tree_view_bin_draw (GtkWidget      *widget,
   gint grid_line_width;
   gboolean draw_vgrid_lines, draw_hgrid_lines;
   GtkStyleContext *context;
-  GtkStateFlags state;
   gboolean parity;
 
   rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
   context = gtk_widget_get_style_context (widget);
-  state = gtk_widget_get_state_flags (widget);
 
   gtk_widget_style_get (widget,
                        "horizontal-separator", &horizontal_separator,
                        "vertical-separator", &vertical_separator,
                        "allow-rules", &allow_rules,
-                       "focus-line-width", &focus_line_width,
                        NULL);
 
   if (tree_view->priv->tree == NULL)
@@ -4744,7 +4733,6 @@ gtk_tree_view_bin_draw (GtkWidget      *widget,
   if (tree_view->priv->height < bin_window_height)
     {
       gtk_style_context_save (context);
-      gtk_style_context_set_state (context, state);
       gtk_style_context_add_class (context, GTK_STYLE_CLASS_CELL);
 
       gtk_render_background (context, cr,
@@ -5186,6 +5174,9 @@ gtk_tree_view_bin_draw (GtkWidget      *widget,
          GtkRBTree *tree = NULL;
          GtkRBNode *node = NULL;
 
+          gtk_style_context_save (context);
+          gtk_style_context_add_class (context, GTK_STYLE_CLASS_DND);
+
           switch (tree_view->priv->drag_dest_pos)
             {
             case GTK_TREE_VIEW_DROP_BEFORE:
@@ -5205,12 +5196,10 @@ gtk_tree_view_bin_draw (GtkWidget      *widget,
              if (tree == NULL)
                break;
 
-              gtk_render_focus (context, cr,
-                               0, gtk_tree_view_get_row_y_offset (tree_view, tree, node)
-                                  - focus_line_width / 2,
-                               gdk_window_get_width (tree_view->priv->bin_window),
-                                gtk_tree_view_get_row_height (tree_view, node)
-                                  - focus_line_width + 1);
+              gtk_render_frame (context, cr,
+                                0, gtk_tree_view_get_row_y_offset (tree_view, tree, node),
+                                gdk_window_get_width (tree_view->priv->bin_window),
+                                gtk_tree_view_get_row_height (tree_view, node));
               break;
             }
 
@@ -5223,6 +5212,8 @@ gtk_tree_view_bin_draw (GtkWidget      *widget,
                                        rtl ? 0 : bin_window_width,
                                        highlight_y);
             }
+
+          gtk_style_context_restore (context);
         }
 
       /* draw the big row-spanning focus rectangle, if needed */
@@ -8330,7 +8321,7 @@ gtk_tree_view_header_focus (GtkTreeView      *tree_view,
       for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
        if (gtk_tree_view_column_get_button (GTK_TREE_VIEW_COLUMN (tmp_list->data)) == focus_child)
          {
-           tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (tmp_list->data);
+            _gtk_tree_view_set_focus_column (tree_view, GTK_TREE_VIEW_COLUMN (tmp_list->data));
            break;
          }
 
@@ -8499,7 +8490,7 @@ gtk_tree_view_set_focus_child (GtkContainer *container,
     {
       if (gtk_tree_view_column_get_button (GTK_TREE_VIEW_COLUMN (list->data)) == child)
        {
-         tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (list->data);
+          _gtk_tree_view_set_focus_column (tree_view, GTK_TREE_VIEW_COLUMN (list->data));
          break;
        }
     }
@@ -8742,6 +8733,8 @@ gtk_tree_view_row_changed (GtkTreeModel *model,
   if (tree == NULL)
     goto done;
 
+  _gtk_tree_view_accessible_changed (tree_view, tree, node);
+
   if (tree_view->priv->fixed_height_mode
       && tree_view->priv->fixed_height >= 0)
     {
@@ -8870,6 +8863,8 @@ gtk_tree_view_row_inserted (GtkTreeModel *model,
       tmpnode = _gtk_rbtree_insert_after (tree, tmpnode, height, FALSE);
     }
 
+  _gtk_tree_view_accessible_add (tree_view, tree, tmpnode);
+
  done:
   if (height > 0)
     {
@@ -8930,9 +8925,15 @@ gtk_tree_view_row_has_child_toggled (GtkTreeModel *model,
     goto done;
 
   if (has_child)
-    GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_PARENT);
+    {
+      GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_PARENT);
+      _gtk_tree_view_accessible_add_state (tree_view, tree, node, GTK_CELL_RENDERER_EXPANDABLE);
+    }
   else
-    GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_PARENT);
+    {
+      GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_PARENT);
+      _gtk_tree_view_accessible_remove_state (tree_view, tree, node, GTK_CELL_RENDERER_EXPANDABLE);
+    }
 
   if (has_child && tree_view->priv->is_list)
     {
@@ -9025,7 +9026,8 @@ gtk_tree_view_row_deleted (GtkTreeModel *model,
   /* If the cursor row got deleted, move the cursor to the next row */
   if (tree_view->priv->cursor_node &&
       (tree_view->priv->cursor_node == node ||
-       (node->children &&  _gtk_rbtree_contains (node->children, tree_view->priv->cursor_tree))))
+       (node->children && (tree_view->priv->cursor_tree == node->children ||
+                           _gtk_rbtree_contains (node->children, tree_view->priv->cursor_tree)))))
     {
       GtkTreePath *cursor_path;
 
@@ -9081,6 +9083,9 @@ gtk_tree_view_row_deleted (GtkTreeModel *model,
       if (tree_view->priv->tree == tree)
        tree_view->priv->tree = NULL;
 
+      _gtk_tree_view_accessible_remove_state (tree_view,
+                                              tree->parent_tree, tree->parent_node,
+                                              GTK_CELL_RENDERER_EXPANDED);
       _gtk_tree_view_accessible_remove (tree_view, tree, NULL);
       _gtk_rbtree_remove (tree);
     }
@@ -9625,7 +9630,7 @@ gtk_tree_view_unref_tree_helper (GtkTreeModel *model,
          if (!gtk_tree_model_iter_children (model, &child, iter))
            return FALSE;
 
-         retval = retval || gtk_tree_view_unref_tree_helper (model, &child, new_tree, new_node);
+         retval = gtk_tree_view_unref_tree_helper (model, &child, new_tree, new_node) | retval;
        }
 
       if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
@@ -9849,7 +9854,7 @@ _gtk_tree_view_column_start_drag (GtkTreeView       *tree_view,
   send_event->button.y = -1;
   send_event->button.axes = NULL;
   send_event->button.state = 0;
-  send_event->button.button = 1;
+  send_event->button.button = GDK_BUTTON_PRIMARY;
   send_event->button.x_root = 0;
   send_event->button.y_root = 0;
   gdk_event_set_device (send_event, device);
@@ -10005,17 +10010,50 @@ _gtk_tree_view_get_rbtree (GtkTreeView *tree_view)
   return tree_view->priv->tree;
 }
 
+gboolean
+_gtk_tree_view_get_cursor_node (GtkTreeView  *tree_view,
+                                GtkRBTree   **tree,
+                                GtkRBNode   **node)
+{
+  GtkTreeViewPrivate *priv;
+
+  priv = tree_view->priv;
+
+  if (priv->cursor_node == NULL)
+    return FALSE;
+
+  *tree = priv->cursor_tree;
+  *node = priv->cursor_node;
+
+  return TRUE;
+}
+
 GdkWindow *
 _gtk_tree_view_get_header_window (GtkTreeView *tree_view)
 {
   return tree_view->priv->header_window;
 }
 
+GtkTreeViewColumn *
+_gtk_tree_view_get_focus_column (GtkTreeView *tree_view)
+{
+  return tree_view->priv->focus_column;
+}
+
 void
 _gtk_tree_view_set_focus_column (GtkTreeView       *tree_view,
                                 GtkTreeViewColumn *column)
 {
+  GtkTreeViewColumn *old_column = tree_view->priv->focus_column;
+
+  if (old_column == column)
+    return;
+
   tree_view->priv->focus_column = column;
+
+  _gtk_tree_view_accessible_update_focus_column (tree_view, 
+                                                 old_column,
+                                                 column);
 }
 
 
@@ -10049,7 +10087,7 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
   gint x2;
   gint vertical_separator;
   gint expander_size;
-  GtkCellRendererState flags;
+  GtkCellRendererState flags = 0;
 
   widget = GTK_WIDGET (tree_view);
   context = gtk_widget_get_style_context (widget);
@@ -10071,24 +10109,19 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
   area.height = gtk_tree_view_get_cell_area_height (tree_view, node,
                                                     vertical_separator);
 
-  if (!gtk_widget_get_sensitive (widget))
-    state |= GTK_STATE_FLAG_INSENSITIVE;
-  else
-    {
-      flags = 0;
-
-      if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
-        flags |= GTK_CELL_RENDERER_SELECTED;
+  if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
+    flags |= GTK_CELL_RENDERER_SELECTED;
 
-      state = gtk_cell_renderer_get_state (NULL, widget, flags);
+  if (node == tree_view->priv->prelight_node &&
+      tree_view->priv->arrow_prelit)
+    flags |= GTK_CELL_RENDERER_PRELIT;
 
-      if (node == tree_view->priv->prelight_node &&
-          tree_view->priv->arrow_prelit)
-       state |= GTK_STATE_FLAG_PRELIGHT;
-    }
+  state = gtk_cell_renderer_get_state (NULL, widget, flags);
 
   if (node->children != NULL)
     state |= GTK_STATE_FLAG_ACTIVE;
+  else
+    state &= ~(GTK_STATE_FLAG_ACTIVE);
 
   gtk_style_context_save (context);
 
@@ -10135,8 +10168,7 @@ gtk_tree_view_focus_to_cursor (GtkTreeView *tree_view)
       if (selected_rows)
        {
           cursor_path = gtk_tree_path_copy((const GtkTreePath *)(selected_rows->data));
-         g_list_foreach (selected_rows, (GFunc)gtk_tree_path_free, NULL);
-         g_list_free (selected_rows);
+         g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free);
         }
       else
        {
@@ -10170,7 +10202,7 @@ gtk_tree_view_focus_to_cursor (GtkTreeView *tree_view)
                {
                  GtkCellArea *cell_area;
 
-                 tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (list->data);
+                  _gtk_tree_view_set_focus_column (tree_view, GTK_TREE_VIEW_COLUMN (list->data));
 
                  /* This happens when the treeview initially grabs focus and there
                   * is no column in focus, here we explicitly focus into the first cell */
@@ -10515,7 +10547,7 @@ gtk_tree_view_move_cursor_left_right (GtkTreeView *tree_view,
       cell_area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (column));
       if (gtk_cell_area_focus (cell_area, direction))
        {
-         tree_view->priv->focus_column = column;
+          _gtk_tree_view_set_focus_column (tree_view, column);
          found_column = TRUE;
          break;
        }
@@ -10723,8 +10755,6 @@ gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
 {
   GtkRBTree *new_tree = NULL;
   GtkRBNode *new_node = NULL;
-  GtkRBTree *cursor_tree = NULL;
-  GtkRBNode *cursor_node = NULL;
   GtkTreePath *cursor_path = NULL;
 
   if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
@@ -10737,8 +10767,8 @@ gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
                                                 tree_view->priv->cursor_node);
 
   _gtk_tree_selection_internal_select_node (tree_view->priv->selection,
-                                           cursor_node,
-                                           cursor_tree,
+                                           tree_view->priv->cursor_node,
+                                           tree_view->priv->cursor_tree,
                                            cursor_path,
                                             GTK_TREE_SELECT_MODE_TOGGLE,
                                            FALSE);
@@ -11389,8 +11419,6 @@ gtk_tree_view_set_model (GtkTreeView  *tree_view,
 
       gtk_tree_row_reference_free (tree_view->priv->drag_dest_row);
       tree_view->priv->drag_dest_row = NULL;
-      tree_view->priv->cursor_tree = NULL;
-      tree_view->priv->cursor_node = NULL;
       gtk_tree_row_reference_free (tree_view->priv->anchor);
       tree_view->priv->anchor = NULL;
       gtk_tree_row_reference_free (tree_view->priv->top_row);
@@ -11466,6 +11494,7 @@ gtk_tree_view_set_model (GtkTreeView  *tree_view,
        {
          tree_view->priv->tree = _gtk_rbtree_new ();
          gtk_tree_view_build_tree (tree_view, tree_view->priv->tree, &iter, 1, FALSE);
+          _gtk_tree_view_accessible_add (tree_view, tree_view->priv->tree, NULL);
        }
       gtk_tree_path_free (path);
 
@@ -11473,6 +11502,8 @@ gtk_tree_view_set_model (GtkTreeView  *tree_view,
       install_presize_handler (tree_view);
     }
 
+  gtk_tree_view_real_set_cursor (tree_view, NULL, CURSOR_INVALID);
+
   g_object_notify (G_OBJECT (tree_view), "model");
 
   if (tree_view->priv->selection)
@@ -11931,7 +11962,7 @@ gtk_tree_view_remove_column (GtkTreeView       *tree_view,
   g_return_val_if_fail (gtk_tree_view_column_get_tree_view (column) == GTK_WIDGET (tree_view), -1);
 
   if (tree_view->priv->focus_column == column)
-    tree_view->priv->focus_column = NULL;
+    _gtk_tree_view_set_focus_column (tree_view, NULL);
 
   if (tree_view->priv->edited_column == column)
     {
@@ -12749,7 +12780,10 @@ gtk_tree_view_real_expand_row (GtkTreeView *tree_view,
                            gtk_tree_path_get_depth (path) + 1,
                            open_all);
 
-  _gtk_tree_view_accessible_expanded (tree_view, tree, node);
+  _gtk_tree_view_accessible_add (tree_view, node->children, NULL);
+  _gtk_tree_view_accessible_add_state (tree_view,
+                                       tree, node,
+                                       GTK_CELL_RENDERER_EXPANDED);
 
   if (animate)
     {
@@ -12898,6 +12932,8 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
       cursor_changed = (node->children == tree_view->priv->cursor_tree)
                        || _gtk_rbtree_contains (node->children, tree_view->priv->cursor_tree);
     }
+  else
+    cursor_changed = FALSE;
 
   if (gtk_tree_row_reference_valid (tree_view->priv->anchor))
     {
@@ -12917,6 +12953,9 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
   tree_view->priv->last_button_y = -1;
 
   _gtk_tree_view_accessible_remove (tree_view, node->children, NULL);
+  _gtk_tree_view_accessible_remove_state (tree_view,
+                                          tree, node,
+                                          GTK_CELL_RENDERER_EXPANDED);
 
   _gtk_rbtree_remove (node->children);
 
@@ -13174,6 +13213,10 @@ gtk_tree_view_real_set_cursor (GtkTreeView     *tree_view,
 {
   if (!(flags & CURSOR_INVALID) && tree_view->priv->cursor_node)
     {
+      _gtk_tree_view_accessible_remove_state (tree_view,
+                                              tree_view->priv->cursor_tree,
+                                              tree_view->priv->cursor_node,
+                                              GTK_CELL_RENDERER_FOCUSED);
       _gtk_tree_view_queue_draw_node (tree_view,
                                       tree_view->priv->cursor_tree,
                                       tree_view->priv->cursor_node,
@@ -13186,7 +13229,8 @@ gtk_tree_view_real_set_cursor (GtkTreeView     *tree_view,
    * path maps to a non-existing path and we will silently bail out.
    * We unset tree and node to avoid further processing.
    */
-  if (row_is_separator (tree_view, NULL, path)
+  if (path == NULL || 
+      row_is_separator (tree_view, NULL, path)
       || _gtk_tree_view_find_node (tree_view,
                                    path,
                                    &tree_view->priv->cursor_tree,
@@ -13235,6 +13279,11 @@ gtk_tree_view_real_set_cursor (GtkTreeView     *tree_view,
                                           tree_view->priv->cursor_node,
                                           NULL);
        }
+
+      _gtk_tree_view_accessible_add_state (tree_view,
+                                           tree_view->priv->cursor_tree,
+                                           tree_view->priv->cursor_node,
+                                           GTK_CELL_RENDERER_FOCUSED);
     }
 
   g_signal_emit (tree_view, tree_view_signals[CURSOR_CHANGED], 0);
@@ -13370,7 +13419,7 @@ gtk_tree_view_set_cursor_on_cell (GtkTreeView       *tree_view,
            break;
          }
       g_return_if_fail (column_in_tree);
-      tree_view->priv->focus_column = focus_column;
+      _gtk_tree_view_set_focus_column (tree_view, focus_column);
       if (focus_cell)
        gtk_tree_view_column_focus_cell (focus_column, focus_cell);
       if (start_editing)
@@ -14511,7 +14560,6 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView  *tree_view,
   GtkRBTree    *tree;
   GtkRBNode    *node;
   GtkStyleContext *context;
-  GtkStateFlags state;
   gint cell_offset;
   GList *list;
   GdkRectangle background_area;
@@ -14552,9 +14600,6 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView  *tree_view,
 
   gtk_style_context_save (context);
 
-  state = gtk_widget_get_state_flags (widget);
-  gtk_style_context_set_state (context, state);
-
   gtk_style_context_add_class (context, GTK_STYLE_CLASS_VIEW);
   gtk_style_context_add_region (context, GTK_STYLE_REGION_COLUMN, 0);
 
@@ -14692,6 +14737,8 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView  *tree_view,
  * This function should almost never be used.  It is meant for private use by
  * ATK for determining the number of visible children that are removed when the
  * user collapses a row, or a row is deleted.
+ *
+ * Deprecated: 3.4: Accessibility does not need the function anymore.
  **/
 void
 gtk_tree_view_set_destroy_count_func (GtkTreeView             *tree_view,
@@ -15034,7 +15081,7 @@ gtk_tree_view_search_position_func (GtkTreeView *tree_view,
   GdkRectangle monitor;
 
   monitor_num = gdk_screen_get_monitor_at_window (screen, tree_window);
-  gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
+  gdk_screen_get_monitor_workarea (screen, monitor_num, &monitor);
 
   gtk_widget_realize (search_dialog);