[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 <jeff_bar...@earthlink.net> 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 maemo-developers@maemo.org https://lists.maemo.org/mailman/listinfo/maemo-developers