static gint on_right_click_in_the_view (G_GNUC_UNUSED GtkWidget* view, GdkEventButton* event, gpointer data) { HeapView* self = NULL; GtkTreeModel* model = NULL; GtkTreePath* path = NULL; GtkTreeIter iter; if (event->type != GDK_BUTTON_PRESS && event->type != GDK_2BUTTON_PRESS) return FALSE; self = HEAP_VIEW (data); model = gtk_tree_view_get_model (self->priv->view); if (gtk_tree_view_get_path_at_pos (self->priv->view, (gint)event->x, (gint)event->y, &path, NULL, NULL, NULL)) { if (gtk_tree_model_get_iter (model, &iter, path)) { gint column_type; gchar* name = NULL; Ekiga::Presentity* presentity = NULL; gtk_tree_model_get (model, &iter, COLUMN_TYPE, &column_type, COLUMN_NAME, &name, COLUMN_PRESENTITY, &presentity, -1); switch (column_type) { case TYPE_GROUP: if (event->type == GDK_BUTTON_PRESS && event->button == 3) on_clicked_show_group_menu (self, name, event); break; case TYPE_PRESENTITY: if (event->type == GDK_BUTTON_PRESS && event->button == 3) on_clicked_show_presentity_menu (self, presentity, event); break; default: g_assert_not_reached (); break; } g_free (name); } gtk_tree_path_free (path); } return TRUE; }
static gint on_view_event_after (GtkWidget *tree_view, GdkEventButton *event, gpointer data) { RosterViewGtk *self = NULL; GtkTreeModel *model = NULL; GtkTreePath *path = NULL; GtkTreeIter iter; // take into account only clicks and Enter keys if (event->type != GDK_BUTTON_PRESS && event->type != GDK_2BUTTON_PRESS && event->type != GDK_KEY_PRESS) return FALSE; if (event->type == GDK_KEY_PRESS && ((GdkEventKey*)event)->keyval != GDK_KEY_Return && ((GdkEventKey*)event)->keyval != GDK_KEY_KP_Enter) return FALSE; self = ROSTER_VIEW_GTK (data); model = gtk_tree_view_get_model (self->priv->tree_view); // get the line clicked or currently selected gboolean ret = true; if (event->type == GDK_KEY_PRESS) gtk_tree_view_get_cursor (GTK_TREE_VIEW (tree_view), &path, NULL); else ret = gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (tree_view), (gint) event->x, (gint) event->y, &path, NULL, NULL, NULL); if (!ret) return TRUE; // click on an empty line if (gtk_tree_model_get_iter (model, &iter, path)) { gint column_type; gchar *name = NULL; gchar *group_name = NULL; Ekiga::Heap *heap = NULL; Ekiga::Presentity *presentity = NULL; gtk_tree_model_get (model, &iter, COLUMN_NAME, &name, COLUMN_GROUP_NAME, &group_name, COLUMN_TYPE, &column_type, COLUMN_HEAP, &heap, COLUMN_PRESENTITY, &presentity, -1); switch (column_type) { case TYPE_HEAP: if (event->type == GDK_BUTTON_PRESS && event->button == 1 && name) on_clicked_fold (self, path, name); if (event->type == GDK_BUTTON_PRESS && event->button == 3) on_clicked_show_heap_menu (heap, event); break; case TYPE_GROUP: if (event->type == GDK_BUTTON_PRESS && event->button == 1 && group_name) on_clicked_fold (self, path, group_name); if (event->type == GDK_BUTTON_PRESS && event->button == 3) on_clicked_show_heap_group_menu (heap, group_name, event); break; case TYPE_PRESENTITY: if (event->type == GDK_BUTTON_PRESS && event->button == 3) on_clicked_show_presentity_menu (heap, presentity, event); if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_KEY_PRESS) on_clicked_trigger_presentity (presentity); break; default: g_assert_not_reached (); break; // shouldn't happen } g_free (name); } gtk_tree_path_free (path); return TRUE; }