Beispiel #1
0
static gboolean
clicked_icon (GtkTreeView  *tv,
              gint          x,
              gint          y,
              GtkTreePath **path)
{
  GtkTreeViewColumn *col;
  gint cell_x, cell_y;
  gint cell_pos, cell_width;
  GList *cells, *l;
  gint depth;
  gint level_indentation;
  gint expander_size;
  gint indent;

  if (gtk_tree_view_get_path_at_pos (tv, x, y, path, &col, &cell_x, &cell_y))
    {
      cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (col));

#if 1
      /* ugly workaround to fix the problem:
       * manually calculate the indent for the row
       */
      depth = gtk_tree_path_get_depth (*path);
      level_indentation = gtk_tree_view_get_level_indentation (tv);
      gtk_widget_style_get (GTK_WIDGET (tv), "expander-size", &expander_size, NULL);
      expander_size += 4;
      indent = (depth - 1) * level_indentation + depth * expander_size;
#else
      indent = 0;
#endif

      for (l = cells; l; l = l->next)
        {
          gtk_tree_view_column_cell_get_position (col, l->data, &cell_pos, &cell_width);
          if (cell_pos + indent <= cell_x && cell_x <= cell_pos + indent + cell_width)
            {
              g_print ("clicked in %s\n", g_type_name_from_instance (l->data));
              if (GTK_IS_CELL_RENDERER_PIXBUF (l->data))
                {
                  g_list_free (cells);
                  return TRUE;
                }
            }
        }

      g_list_free (cells);
    }

  return FALSE;
}
Beispiel #2
0
GtkCellRenderer *
gitg_utils_find_cell_at_pos (GtkTreeView *tree_view, GtkTreeViewColumn *column, GtkTreePath *path, gint x)
{
    GList *cells;
    GList *item;
    GtkTreeIter iter;
    GtkTreeModel *model = gtk_tree_view_get_model (tree_view);

    gtk_tree_model_get_iter (model, &iter, path);

    gtk_tree_view_column_cell_set_cell_data (column, model, &iter, FALSE, FALSE);

    cells = gtk_tree_view_column_get_cell_renderers (column);
    GtkCellRenderer *ret = NULL;

    for (item = cells; item; item = g_list_next (item))
    {
        GtkCellRenderer *renderer = GTK_CELL_RENDERER (item->data);
        gint start;
        gint width;

        if (!gtk_tree_view_column_cell_get_position (column, renderer, &start, &width))
        {
            continue;
        }

        gtk_cell_renderer_get_size (renderer, GTK_WIDGET (tree_view), NULL, NULL, NULL, &width, 0);

        if (x >= start && x <= start + width)
        {
            ret = renderer;
            break;
        }
    }

    g_list_free (cells);
    return ret;
}
Beispiel #3
0
gboolean on_button_release(GtkWidget* widget, GdkEventButton* evt)
{
    FmPlacesView* view = FM_PLACES_VIEW(widget);
    if(view->clicked_row)
    {
        if(evt->button == 1)
        {
            GtkTreePath* tp;
            GtkTreeViewColumn* col;
            int cell_x;
            if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), evt->x, evt->y, &tp, &col, &cell_x, NULL))
            {
                /* check if we release the button on the row we previously clicked. */
                if(gtk_tree_path_compare(tp, view->clicked_row) == 0)
                {
                    /* check if we click on the "eject" icon. */
                    int start, cell_w;
                    gtk_tree_view_column_cell_get_position(col, view->mount_indicator_renderer,
                                                           &start, &cell_w);
                    if(cell_x > start && cell_x < (start + cell_w)) /* click on eject icon */
                    {
                        GtkTreeIter it;
                        /* do eject if needed */
                        if(gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &it, tp))
                        {
                            FmPlaceItem* item;
                            gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1);
                            if(item && item->vol_mounted)
                            {
                                GtkWidget* toplevel = gtk_widget_get_toplevel(view);
                                /* eject the volume */
                                if(g_volume_can_eject(item->vol))
                                    fm_eject_volume(toplevel, item->vol, TRUE);
                                else /* not ejectable, do unmount */
                                {
                                    GMount* mnt = g_volume_get_mount(item->vol);
                                    if(mnt)
                                    {
                                        fm_unmount_mount(toplevel, mnt, TRUE);
                                        g_object_unref(mnt);
                                    }
                                }
                                gtk_tree_path_free(tp);

                                gtk_tree_path_free(view->clicked_row);
                                view->clicked_row = NULL;
                                return TRUE;
                            }
                        }
                    }
                    /* activate the clicked row. */
                    gtk_tree_view_row_activated(GTK_TREE_VIEW(view), view->clicked_row, col);
                }
                gtk_tree_path_free(tp);
            }
        }

        gtk_tree_path_free(view->clicked_row);
        view->clicked_row = NULL;
    }
    return GTK_WIDGET_CLASS(fm_places_view_parent_class)->button_release_event(widget, evt);
}