summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkcellarea.c30
-rw-r--r--gtk/gtkcellarea.h6
-rw-r--r--gtk/gtktreeview.c12
-rw-r--r--tests/cellareascaffold.c3
4 files changed, 36 insertions, 15 deletions
diff --git a/gtk/gtkcellarea.c b/gtk/gtkcellarea.c
index b006d11edf..c21fdcd013 100644
--- a/gtk/gtkcellarea.c
+++ b/gtk/gtkcellarea.c
@@ -401,7 +401,8 @@ static gboolean gtk_cell_area_real_activate (GtkCellArea
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags);
+ GtkCellRendererState flags,
+ gboolean edit_only);
/* GtkCellLayoutIface */
static void gtk_cell_area_cell_layout_init (GtkCellLayoutIface *iface);
@@ -1254,14 +1255,23 @@ gtk_cell_area_real_activate (GtkCellArea *area,
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags)
+ GtkCellRendererState flags,
+ gboolean edit_only)
{
GtkCellAreaPrivate *priv = area->priv;
GdkRectangle renderer_area;
GtkCellRenderer *activate_cell = NULL;
+ GtkCellRendererMode mode;
if (priv->focus_cell)
- activate_cell = priv->focus_cell;
+ {
+ g_object_get (priv->focus_cell, "mode", &mode, NULL);
+
+ if (gtk_cell_renderer_get_visible (priv->focus_cell) &&
+ (edit_only ? mode == GTK_CELL_RENDERER_MODE_EDITABLE :
+ mode != GTK_CELL_RENDERER_MODE_INERT))
+ activate_cell = priv->focus_cell;
+ }
else
{
GList *cells, *l;
@@ -1274,12 +1284,15 @@ gtk_cell_area_real_activate (GtkCellArea *area,
{
GtkCellRenderer *renderer = l->data;
- if (gtk_cell_renderer_is_activatable (renderer))
+ g_object_get (renderer, "mode", &mode, NULL);
+
+ if (gtk_cell_renderer_get_visible (renderer) &&
+ (edit_only ? mode == GTK_CELL_RENDERER_MODE_EDITABLE :
+ mode != GTK_CELL_RENDERER_MODE_INERT))
activate_cell = renderer;
}
g_list_free (cells);
}
-
if (activate_cell)
{
@@ -2813,6 +2826,8 @@ gtk_cell_area_focus (GtkCellArea *area,
* @widget: the #GtkWidget that @area is rendering on
* @cell_area: the size and location of @area relative to @widget's allocation
* @flags: the #GtkCellRendererState flags for @area for this row of data.
+ * @edit_only: if %TRUE then only cell renderers that are %GTK_CELL_RENDERER_MODE_EDITABLE
+ * will be activated.
*
* Activates @area, usually by activating the currently focused
* cell, however some subclasses which embed widgets in the area
@@ -2827,11 +2842,12 @@ gtk_cell_area_activate (GtkCellArea *area,
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags)
+ GtkCellRendererState flags,
+ gboolean edit_only)
{
g_return_val_if_fail (GTK_IS_CELL_AREA (area), FALSE);
- return GTK_CELL_AREA_GET_CLASS (area)->activate (area, context, widget, cell_area, flags);
+ return GTK_CELL_AREA_GET_CLASS (area)->activate (area, context, widget, cell_area, flags, edit_only);
}
diff --git a/gtk/gtkcellarea.h b/gtk/gtkcellarea.h
index 15d2856711..8c54b053d2 100644
--- a/gtk/gtkcellarea.h
+++ b/gtk/gtkcellarea.h
@@ -246,7 +246,8 @@ struct _GtkCellAreaClass
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags);
+ GtkCellRendererState flags,
+ gboolean edit_only);
/*< private >*/
@@ -398,7 +399,8 @@ gboolean gtk_cell_area_activate (GtkCellArea
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags);
+ GtkCellRendererState flags,
+ gboolean edit_only);
gboolean gtk_cell_area_focus (GtkCellArea *area,
GtkDirectionType direction);
void gtk_cell_area_set_focus_cell (GtkCellArea *area,
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 1eeb5e0d72..04055d5ab4 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -874,7 +874,8 @@ static void gtk_tree_view_put (GtkTreeView *tree_
gint width,
gint height);
static gboolean gtk_tree_view_start_editing (GtkTreeView *tree_view,
- GtkTreePath *cursor_path);
+ GtkTreePath *cursor_path,
+ gboolean edit_only);
static void gtk_tree_view_stop_editing (GtkTreeView *tree_view,
gboolean cancel_editing);
static gboolean gtk_tree_view_real_start_interactive_search (GtkTreeView *tree_view,
@@ -10615,7 +10616,7 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
if (!tree_view->priv->shift_pressed && start_editing &&
tree_view->priv->focus_column)
{
- if (gtk_tree_view_start_editing (tree_view, cursor_path))
+ if (gtk_tree_view_start_editing (tree_view, cursor_path, FALSE))
{
gtk_tree_path_free (cursor_path);
return TRUE;
@@ -13348,7 +13349,7 @@ gtk_tree_view_set_cursor_on_cell (GtkTreeView *tree_view,
if (focus_cell)
gtk_tree_view_column_focus_cell (focus_column, focus_cell);
if (start_editing)
- gtk_tree_view_start_editing (tree_view, path);
+ gtk_tree_view_start_editing (tree_view, path, TRUE);
}
}
@@ -15374,7 +15375,8 @@ _gtk_tree_view_remove_editable (GtkTreeView *tree_view,
static gboolean
gtk_tree_view_start_editing (GtkTreeView *tree_view,
- GtkTreePath *cursor_path)
+ GtkTreePath *cursor_path,
+ gboolean edit_only)
{
GtkTreeIter iter;
GdkRectangle cell_area;
@@ -15414,7 +15416,7 @@ gtk_tree_view_start_editing (GtkTreeView *tree_view,
_gtk_tree_view_column_get_context (focus_column),
GTK_WIDGET (tree_view),
&cell_area,
- flags))
+ flags, edit_only))
retval = TRUE;
return retval;
diff --git a/tests/cellareascaffold.c b/tests/cellareascaffold.c
index b753ca9260..c623b20acd 100644
--- a/tests/cellareascaffold.c
+++ b/tests/cellareascaffold.c
@@ -848,7 +848,8 @@ cell_area_scaffold_activate (CellAreaScaffold *scaffold)
cell_area.height = data->size;
gtk_cell_area_apply_attributes (priv->area, priv->model, &iter, FALSE, FALSE);
- gtk_cell_area_activate (priv->area, priv->context, widget, &cell_area, GTK_CELL_RENDERER_FOCUSED);
+ gtk_cell_area_activate (priv->area, priv->context, widget, &cell_area,
+ GTK_CELL_RENDERER_FOCUSED, FALSE);
break;
}