Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}