summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Rietveld <kris@gtk.org>2003-08-25 21:25:52 +0000
committerKristian Rietveld <kristian@src.gnome.org>2003-08-25 21:25:52 +0000
commitaa43d0302675ac46b26b9398c7cc8cfdb4463a0b (patch)
treed6279d10f79649e9abf51166d47ea65dcdb1fb14
parent29a2f31f239ee2b29b8512850042e95f02415e95 (diff)
downloadgdk-pixbuf-aa43d0302675ac46b26b9398c7cc8cfdb4463a0b.tar.gz
Fixes #115871, reported by Michael Natterer.
Mon Aug 25 23:21:43 2003 Kristian Rietveld <kris@gtk.org> Fixes #115871, reported by Michael Natterer. * gtk/gtktreeprivate.h: added GtkTreeSelectMode enum, added ctrl_pressed and shift_pressed bitfields, (_gtk_tree_selection_internal_select_node): replace GdkModifierType arg with GtkTreeSelectMode. * gtk/gtktreeselection.c (gtk_tree_selection_set_mode), (gtk_tree_selection_select_path), (gtk_tree_selection_unselect_path), (_gtk_tree_selection_internal_select_node): all updated for GdkModifierType -> GtkTreeSelectMode move. * gtk/gtktreeview.c (gtk_tree_view_button_press): set ctrl_pressed and shift_pressed around selection handling block, (gtk_tree_view_real_select_cursor_row), (gtk_tree_view_real_toggle_cursor_row), (gtk_tree_view_real_selection_cursor_parent), (gtk_tree_view_real_set_cursor): use ctrl_pressed and shift_pressed, instead of checking the event state. And also updates for the GdkModifierType -> GtkTreeSelectMode move.
-rw-r--r--ChangeLog23
-rw-r--r--ChangeLog.pre-2-1023
-rw-r--r--ChangeLog.pre-2-423
-rw-r--r--ChangeLog.pre-2-623
-rw-r--r--ChangeLog.pre-2-823
-rw-r--r--gtk/gtktreeprivate.h12
-rw-r--r--gtk/gtktreeselection.c23
-rw-r--r--gtk/gtktreeview.c52
8 files changed, 173 insertions, 29 deletions
diff --git a/ChangeLog b/ChangeLog
index a34180dc1..157da0be6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+Mon Aug 25 23:21:43 2003 Kristian Rietveld <kris@gtk.org>
+
+ Fixes #115871, reported by Michael Natterer.
+
+ * gtk/gtktreeprivate.h: added GtkTreeSelectMode enum,
+ added ctrl_pressed and shift_pressed bitfields,
+ (_gtk_tree_selection_internal_select_node): replace GdkModifierType
+ arg with GtkTreeSelectMode.
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_set_mode),
+ (gtk_tree_selection_select_path), (gtk_tree_selection_unselect_path),
+ (_gtk_tree_selection_internal_select_node): all updated for
+ GdkModifierType -> GtkTreeSelectMode move.
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): set ctrl_pressed
+ and shift_pressed around selection handling block,
+ (gtk_tree_view_real_select_cursor_row),
+ (gtk_tree_view_real_toggle_cursor_row),
+ (gtk_tree_view_real_selection_cursor_parent),
+ (gtk_tree_view_real_set_cursor): use ctrl_pressed and shift_pressed,
+ instead of checking the event state. And also updates for the
+ GdkModifierType -> GtkTreeSelectMode move.
+
Wed Aug 20 21:26:49 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtkplug.c (gtk_plug_focus): Send the focus on
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index a34180dc1..157da0be6 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,26 @@
+Mon Aug 25 23:21:43 2003 Kristian Rietveld <kris@gtk.org>
+
+ Fixes #115871, reported by Michael Natterer.
+
+ * gtk/gtktreeprivate.h: added GtkTreeSelectMode enum,
+ added ctrl_pressed and shift_pressed bitfields,
+ (_gtk_tree_selection_internal_select_node): replace GdkModifierType
+ arg with GtkTreeSelectMode.
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_set_mode),
+ (gtk_tree_selection_select_path), (gtk_tree_selection_unselect_path),
+ (_gtk_tree_selection_internal_select_node): all updated for
+ GdkModifierType -> GtkTreeSelectMode move.
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): set ctrl_pressed
+ and shift_pressed around selection handling block,
+ (gtk_tree_view_real_select_cursor_row),
+ (gtk_tree_view_real_toggle_cursor_row),
+ (gtk_tree_view_real_selection_cursor_parent),
+ (gtk_tree_view_real_set_cursor): use ctrl_pressed and shift_pressed,
+ instead of checking the event state. And also updates for the
+ GdkModifierType -> GtkTreeSelectMode move.
+
Wed Aug 20 21:26:49 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtkplug.c (gtk_plug_focus): Send the focus on
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index a34180dc1..157da0be6 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,26 @@
+Mon Aug 25 23:21:43 2003 Kristian Rietveld <kris@gtk.org>
+
+ Fixes #115871, reported by Michael Natterer.
+
+ * gtk/gtktreeprivate.h: added GtkTreeSelectMode enum,
+ added ctrl_pressed and shift_pressed bitfields,
+ (_gtk_tree_selection_internal_select_node): replace GdkModifierType
+ arg with GtkTreeSelectMode.
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_set_mode),
+ (gtk_tree_selection_select_path), (gtk_tree_selection_unselect_path),
+ (_gtk_tree_selection_internal_select_node): all updated for
+ GdkModifierType -> GtkTreeSelectMode move.
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): set ctrl_pressed
+ and shift_pressed around selection handling block,
+ (gtk_tree_view_real_select_cursor_row),
+ (gtk_tree_view_real_toggle_cursor_row),
+ (gtk_tree_view_real_selection_cursor_parent),
+ (gtk_tree_view_real_set_cursor): use ctrl_pressed and shift_pressed,
+ instead of checking the event state. And also updates for the
+ GdkModifierType -> GtkTreeSelectMode move.
+
Wed Aug 20 21:26:49 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtkplug.c (gtk_plug_focus): Send the focus on
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index a34180dc1..157da0be6 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,26 @@
+Mon Aug 25 23:21:43 2003 Kristian Rietveld <kris@gtk.org>
+
+ Fixes #115871, reported by Michael Natterer.
+
+ * gtk/gtktreeprivate.h: added GtkTreeSelectMode enum,
+ added ctrl_pressed and shift_pressed bitfields,
+ (_gtk_tree_selection_internal_select_node): replace GdkModifierType
+ arg with GtkTreeSelectMode.
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_set_mode),
+ (gtk_tree_selection_select_path), (gtk_tree_selection_unselect_path),
+ (_gtk_tree_selection_internal_select_node): all updated for
+ GdkModifierType -> GtkTreeSelectMode move.
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): set ctrl_pressed
+ and shift_pressed around selection handling block,
+ (gtk_tree_view_real_select_cursor_row),
+ (gtk_tree_view_real_toggle_cursor_row),
+ (gtk_tree_view_real_selection_cursor_parent),
+ (gtk_tree_view_real_set_cursor): use ctrl_pressed and shift_pressed,
+ instead of checking the event state. And also updates for the
+ GdkModifierType -> GtkTreeSelectMode move.
+
Wed Aug 20 21:26:49 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtkplug.c (gtk_plug_focus): Send the focus on
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index a34180dc1..157da0be6 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,26 @@
+Mon Aug 25 23:21:43 2003 Kristian Rietveld <kris@gtk.org>
+
+ Fixes #115871, reported by Michael Natterer.
+
+ * gtk/gtktreeprivate.h: added GtkTreeSelectMode enum,
+ added ctrl_pressed and shift_pressed bitfields,
+ (_gtk_tree_selection_internal_select_node): replace GdkModifierType
+ arg with GtkTreeSelectMode.
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_set_mode),
+ (gtk_tree_selection_select_path), (gtk_tree_selection_unselect_path),
+ (_gtk_tree_selection_internal_select_node): all updated for
+ GdkModifierType -> GtkTreeSelectMode move.
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): set ctrl_pressed
+ and shift_pressed around selection handling block,
+ (gtk_tree_view_real_select_cursor_row),
+ (gtk_tree_view_real_toggle_cursor_row),
+ (gtk_tree_view_real_selection_cursor_parent),
+ (gtk_tree_view_real_set_cursor): use ctrl_pressed and shift_pressed,
+ instead of checking the event state. And also updates for the
+ GdkModifierType -> GtkTreeSelectMode move.
+
Wed Aug 20 21:26:49 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtkplug.c (gtk_plug_focus): Send the focus on
diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h
index 37bdcb621..f99b10b2b 100644
--- a/gtk/gtktreeprivate.h
+++ b/gtk/gtktreeprivate.h
@@ -43,6 +43,13 @@ typedef enum
GTK_TREE_VIEW_IN_COLUMN_DRAG = 1 << 7
} GtkTreeViewFlags;
+typedef enum
+{
+ GTK_TREE_SELECT_MODE_TOGGLE = 1 << 0,
+ GTK_TREE_SELECT_MODE_EXTEND = 1 << 1
+}
+GtkTreeSelectMode;
+
enum
{
DRAG_COLUMN_WINDOW_STATE_UNSET = 0,
@@ -184,6 +191,9 @@ struct _GtkTreeViewPrivate
/* hint to display rows in alternating colors */
guint has_rules : 1;
guint mark_rows_col_dirty : 1;
+
+ guint ctrl_pressed : 1;
+ guint shift_pressed : 1;
/* interactive search */
guint enable_search : 1;
@@ -287,7 +297,7 @@ void _gtk_tree_selection_internal_select_node (GtkTreeSelection *select
GtkRBNode *node,
GtkRBTree *tree,
GtkTreePath *path,
- GdkModifierType state,
+ GtkTreeSelectMode mode,
gboolean override_browse_mode);
gboolean _gtk_tree_view_find_node (GtkTreeView *tree_view,
GtkTreePath *path,
diff --git a/gtk/gtktreeselection.c b/gtk/gtktreeselection.c
index 9edac5271..67c37ef35 100644
--- a/gtk/gtktreeselection.c
+++ b/gtk/gtktreeselection.c
@@ -241,7 +241,7 @@ gtk_tree_selection_set_mode (GtkTreeSelection *selection,
node,
tree,
anchor_path,
- 0,
+ 0,
FALSE);
if (anchor_path)
gtk_tree_path_free (anchor_path);
@@ -771,8 +771,8 @@ gtk_tree_selection_select_path (GtkTreeSelection *selection,
{
GtkRBNode *node;
GtkRBTree *tree;
- GdkModifierType state = 0;
gboolean ret;
+ GtkTreeSelectMode mode = 0;
g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
g_return_if_fail (selection->tree_view != NULL);
@@ -788,13 +788,13 @@ gtk_tree_selection_select_path (GtkTreeSelection *selection,
return;
if (selection->type == GTK_SELECTION_MULTIPLE)
- state = GDK_CONTROL_MASK;
+ mode = GTK_TREE_SELECT_MODE_TOGGLE;
_gtk_tree_selection_internal_select_node (selection,
node,
tree,
path,
- state,
+ mode,
FALSE);
}
@@ -830,7 +830,7 @@ gtk_tree_selection_unselect_path (GtkTreeSelection *selection,
node,
tree,
path,
- GDK_CONTROL_MASK,
+ GTK_TREE_SELECT_MODE_TOGGLE,
TRUE);
}
@@ -1289,7 +1289,7 @@ _gtk_tree_selection_internal_select_node (GtkTreeSelection *selection,
GtkRBNode *node,
GtkRBTree *tree,
GtkTreePath *path,
- GdkModifierType state,
+ GtkTreeSelectMode mode,
gboolean override_browse_mode)
{
gint flags;
@@ -1314,7 +1314,7 @@ _gtk_tree_selection_internal_select_node (GtkTreeSelection *selection,
else if (selection->type == GTK_SELECTION_SINGLE &&
anchor_path && gtk_tree_path_compare (path, anchor_path) == 0)
{
- if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
+ if ((mode & GTK_TREE_SELECT_MODE_TOGGLE) == GTK_TREE_SELECT_MODE_TOGGLE)
{
dirty = gtk_tree_selection_real_unselect_all (selection);
}
@@ -1376,7 +1376,8 @@ _gtk_tree_selection_internal_select_node (GtkTreeSelection *selection,
}
else if (selection->type == GTK_SELECTION_MULTIPLE)
{
- if (((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) && (anchor_path == NULL))
+ if ((mode & GTK_TREE_SELECT_MODE_EXTEND) == GTK_TREE_SELECT_MODE_EXTEND
+ && (anchor_path == NULL))
{
if (selection->tree_view->priv->anchor)
gtk_tree_row_reference_free (selection->tree_view->priv->anchor);
@@ -1385,13 +1386,13 @@ _gtk_tree_selection_internal_select_node (GtkTreeSelection *selection,
gtk_tree_row_reference_new_proxy (G_OBJECT (selection->tree_view), selection->tree_view->priv->model, path);
dirty = gtk_tree_selection_real_select_node (selection, tree, node, TRUE);
}
- else if ((state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) == (GDK_SHIFT_MASK|GDK_CONTROL_MASK))
+ else if ((mode & (GTK_TREE_SELECT_MODE_EXTEND | GTK_TREE_SELECT_MODE_TOGGLE)) == (GTK_TREE_SELECT_MODE_EXTEND | GTK_TREE_SELECT_MODE_TOGGLE))
{
gtk_tree_selection_select_range (selection,
anchor_path,
path);
}
- else if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
+ else if ((mode & GTK_TREE_SELECT_MODE_TOGGLE) == GTK_TREE_SELECT_MODE_TOGGLE)
{
flags = node->flags;
if (selection->tree_view->priv->anchor)
@@ -1405,7 +1406,7 @@ _gtk_tree_selection_internal_select_node (GtkTreeSelection *selection,
else
dirty |= gtk_tree_selection_real_select_node (selection, tree, node, TRUE);
}
- else if ((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)
+ else if ((mode & GTK_TREE_SELECT_MODE_EXTEND) == GTK_TREE_SELECT_MODE_EXTEND)
{
dirty = gtk_tree_selection_real_unselect_all (selection);
dirty |= gtk_tree_selection_real_modify_range (selection,
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 0cfe21d1e..27bdb7a5a 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -2061,6 +2061,11 @@ gtk_tree_view_button_press (GtkWidget *widget,
*/
if (event->type == GDK_BUTTON_PRESS && event->button == 1)
{
+ if ((event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
+ tree_view->priv->ctrl_pressed = TRUE;
+ if ((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)
+ tree_view->priv->shift_pressed = TRUE;
+
focus_cell = _gtk_tree_view_column_get_cell_at_pos (column, event->x - background_area.x);
if (focus_cell)
gtk_tree_view_column_focus_cell (column, focus_cell);
@@ -2079,6 +2084,9 @@ gtk_tree_view_button_press (GtkWidget *widget,
{
gtk_tree_view_real_set_cursor (tree_view, path, TRUE, TRUE);
}
+
+ tree_view->priv->ctrl_pressed = FALSE;
+ tree_view->priv->shift_pressed = FALSE;
}
/* the treeview may have been scrolled because of _set_cursor,
@@ -7686,8 +7694,7 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
GtkRBTree *cursor_tree = NULL;
GtkRBNode *cursor_node = NULL;
GtkTreePath *cursor_path = NULL;
- GdkModifierType state = 0;
- cursor_path = NULL;
+ GtkTreeSelectMode mode = 0;
if (! GTK_WIDGET_HAS_FOCUS (tree_view))
return FALSE;
@@ -7707,10 +7714,7 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
return FALSE;
}
- gtk_get_current_event_state (&state);
-
- if (! (state & GDK_SHIFT_MASK) &&
- start_editing &&
+ if (!tree_view->priv->shift_pressed && start_editing &&
tree_view->priv->focus_column)
{
if (gtk_tree_view_start_editing (tree_view, cursor_path))
@@ -7719,11 +7723,17 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
return TRUE;
}
}
+
+ if (tree_view->priv->ctrl_pressed)
+ mode |= GTK_TREE_SELECT_MODE_TOGGLE;
+ if (tree_view->priv->shift_pressed)
+ mode |= GTK_TREE_SELECT_MODE_EXTEND;
+
_gtk_tree_selection_internal_select_node (tree_view->priv->selection,
cursor_node,
cursor_tree,
cursor_path,
- state,
+ mode,
FALSE);
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
@@ -7731,8 +7741,9 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
_gtk_tree_view_queue_draw_node (tree_view, cursor_tree, cursor_node, NULL);
- if (! (state & GDK_SHIFT_MASK))
- gtk_tree_view_row_activated (tree_view, cursor_path, tree_view->priv->focus_column);
+ if (!tree_view->priv->shift_pressed)
+ gtk_tree_view_row_activated (tree_view, cursor_path,
+ tree_view->priv->focus_column);
gtk_tree_path_free (cursor_path);
@@ -7768,7 +7779,7 @@ gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
cursor_node,
cursor_tree,
cursor_path,
- GDK_CONTROL_MASK,
+ GTK_TREE_SELECT_MODE_TOGGLE,
FALSE);
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
@@ -7854,7 +7865,7 @@ gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view)
cursor_node,
cursor_tree,
cursor_path,
- 0,
+ 0,
FALSE);
}
@@ -9850,7 +9861,6 @@ gtk_tree_view_real_set_cursor (GtkTreeView *tree_view,
{
GtkRBTree *tree = NULL;
GtkRBNode *node = NULL;
- GdkModifierType state = 0;
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
{
@@ -9861,7 +9871,6 @@ gtk_tree_view_real_set_cursor (GtkTreeView *tree_view,
}
gtk_tree_row_reference_free (tree_view->priv->cursor);
- gtk_get_current_event_state (&state);
tree_view->priv->cursor = gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view),
tree_view->priv->model,
@@ -9872,10 +9881,19 @@ gtk_tree_view_real_set_cursor (GtkTreeView *tree_view,
GtkRBTree *new_tree = NULL;
GtkRBNode *new_node = NULL;
- if (clear_and_select && !((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK))
- _gtk_tree_selection_internal_select_node (tree_view->priv->selection,
- node, tree, path,
- state, FALSE);
+ if (clear_and_select && !tree_view->priv->ctrl_pressed)
+ {
+ GtkTreeSelectMode mode = 0;
+
+ if (tree_view->priv->ctrl_pressed)
+ mode |= GTK_TREE_SELECT_MODE_TOGGLE;
+ if (tree_view->priv->shift_pressed)
+ mode |= GTK_TREE_SELECT_MODE_EXTEND;
+
+ _gtk_tree_selection_internal_select_node (tree_view->priv->selection,
+ node, tree, path, mode,
+ FALSE);
+ }
/* We have to re-find tree and node here again, somebody might have
* cleared the node or the whole tree in the GtkTreeSelection::changed