[I'm CC'ing maemo-developers as it is clearly not a Python specific
issue; see below for details]
On Wed, Jan 6, 2010 at 2:11 PM, Jeffrey Barish
<[email protected]> wrote:
> Well, it took a little more than a few days, but here is a test program. It
> works on Ubuntu and N810, but not N900.
Well, I tested your example on Maemo and Ubuntu, and indeed the drag &
drop only worked on Ubuntu. Additionally, this error is shown on
console:
/tmp/dndtest.py:77: Warning: g_object_set_data_full: assertion
`G_IS_OBJECT (object)' failed
gtk.main()
So I went further and translated your example to C (please note I'm no
GTK expert, I'm only trying to help debugging the problem). And the
same behavior is presented: the drag does not work and this message is
shown on console:
dndtest[9349]: GLIB CRITICAL ** GLib-GObject - g_object_set_data_full:
assertion `G_IS_OBJECT (object)' failed
That means the problem is not related to Python or PyGTK at all, but
some GTK limitation/bug on Maemo 5.
The translated C example is attached.
Any ideas anyone? Regards,
--
Anderson Lizardo
OpenBossa Labs - INdT
Manaus - Brazil
#include <gtk/gtk.h>
gboolean on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
gtk_main_quit();
return FALSE;
}
void on_drag_data_received(GtkWidget *treeview,
GdkDragContext *drag_context,
gint x,
gint y,
GtkSelectionData *data,
guint info,
guint time,
gpointer user_data)
{
gboolean ret;
GtkWidget *source_widget = gtk_drag_get_source_widget(drag_context);
GtkTreeModel *model;
gchar *source_row[2];
if (source_widget == treeview) {
GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
GtkTreeIter iter;
ret = gtk_tree_selection_get_selected(selection, &model, &iter);
g_assert(ret == TRUE);
gtk_tree_model_get(model, &iter, 0, &source_row[0], 1, &source_row[1], -1);
} else {
model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
source_row[0] = "9";
source_row[1] = "newrow";
}
GtkTreePath *path;
GtkTreeViewDropPosition position;
ret = gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(treeview), x, y, &path, &position);
if (ret) {
GtkTreeIter iter;
ret = gtk_tree_model_get_iter(model, &iter, path);
if (position == GTK_TREE_VIEW_DROP_BEFORE || position == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE) {
GtkTreeIter new_iter;
gtk_list_store_insert_before(GTK_LIST_STORE(model), &new_iter, &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &new_iter, 0, source_row[0], 1, source_row[1], -1);
} else {
GtkTreeIter new_iter;
gtk_list_store_insert_after(GTK_LIST_STORE(model), &new_iter, &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &new_iter, 0, source_row[0], 1, source_row[1], -1);
}
} else {
GtkTreeIter iter;
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, source_row[0], 1, source_row[1], -1);
}
if (drag_context->action == GDK_ACTION_MOVE) {
gtk_drag_finish(drag_context, TRUE, TRUE, (guint32)data);
}
}
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "DND Test");
gtk_widget_set_size_request(window, 200, 300);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(on_delete_event), NULL);
GtkWidget *button = gtk_button_new_with_label("Text on the button");
GtkListStore *liststore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
GtkTreeIter iter;
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, "0", 1, "zero", -1);
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, "1", 1, "one", -1);
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, "2", 1, "two", -1);
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, "3", 1, "three", -1);
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, "4", 1, "four", -1);
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, "5", 1, "five", -1);
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, "6", 1, "six", -1);
GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
g_signal_connect(G_OBJECT(treeview), "drag-data-received", G_CALLBACK(on_drag_data_received), NULL);
GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes("Int", renderer, "text", 0, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
column = gtk_tree_view_column_new_with_attributes("Str", renderer, "text", 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
GtkTargetEntry targets[] = {
{ "tree_model_row_from_button", GTK_TARGET_SAME_APP, 0 },
};
gtk_drag_source_set(button, GDK_BUTTON1_MASK, targets, 1, GDK_ACTION_MOVE);
GtkTargetEntry source_targets[] = {
{ "tree_model_row", GTK_TARGET_SAME_WIDGET, 1 },
};
gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(treeview), GDK_BUTTON1_MASK, source_targets, 1, GDK_ACTION_MOVE);
GtkTargetEntry dest_targets[] = {
{ "tree_model_row", 0, 1 },
{ "tree_model_row_from_button", 0, 0 },
};
gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(treeview), dest_targets, 2, GDK_ACTION_DEFAULT);
GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), treeview, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
_______________________________________________
maemo-developers mailing list
[email protected]
https://lists.maemo.org/mailman/listinfo/maemo-developers