Mercurial > pidgin.yaz
comparison src/gtkblist.c @ 14168:fa4fc7e5d93d
[gaim-migrate @ 16818]
Remove a g_main_iteration, replace with an idle handler.
Fixes the thread freeze on expanding contacts
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Thu, 17 Aug 2006 21:16:50 +0000 |
parents | f96ff06f6dcc |
children | cdc1850eb4ab |
comparison
equal
deleted
inserted
replaced
14167:8160857cd958 | 14168:fa4fc7e5d93d |
---|---|
865 } else if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | 865 } else if (GAIM_BLIST_NODE_IS_CONTACT(node)) { |
866 gaim_gtkdialogs_remove_contact((GaimContact*)node); | 866 gaim_gtkdialogs_remove_contact((GaimContact*)node); |
867 } | 867 } |
868 } | 868 } |
869 | 869 |
870 struct _expand { | |
871 GtkTreeView *treeview; | |
872 GtkTreePath *path; | |
873 GaimBlistNode *node; | |
874 }; | |
875 | |
876 static gboolean | |
877 scroll_to_expanded_cell(struct _expand *ex) | |
878 { | |
879 gtk_tree_view_scroll_to_cell(ex->treeview, ex->path, NULL, FALSE, 0, 0); | |
880 gaim_gtk_blist_update_contact(NULL, ex->node); | |
881 | |
882 gtk_tree_path_free(ex->path); | |
883 g_free(ex); | |
884 | |
885 return FALSE; | |
886 } | |
887 | |
870 static void | 888 static void |
871 gaim_gtk_blist_expand_contact_cb(GtkWidget *w, GaimBlistNode *node) | 889 gaim_gtk_blist_expand_contact_cb(GtkWidget *w, GaimBlistNode *node) |
872 { | 890 { |
873 struct _gaim_gtk_blist_node *gtknode; | 891 struct _gaim_gtk_blist_node *gtknode; |
874 GtkTreeIter iter, parent; | 892 GtkTreeIter iter, parent; |
875 GaimBlistNode *bnode; | 893 GaimBlistNode *bnode; |
876 GtkTreePath *path; | 894 GtkTreePath *path; |
877 | 895 |
896 struct _expand *ex = g_new0(struct _expand, 1); | |
897 | |
878 if(!GAIM_BLIST_NODE_IS_CONTACT(node)) | 898 if(!GAIM_BLIST_NODE_IS_CONTACT(node)) |
879 return; | 899 return; |
880 | 900 |
881 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | 901 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
882 | 902 |
889 /* This ensures that the bottom buddy is visible, i.e. not scrolled off the alignment */ | 909 /* This ensures that the bottom buddy is visible, i.e. not scrolled off the alignment */ |
890 get_iter_from_node(node, &parent); | 910 get_iter_from_node(node, &parent); |
891 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(gtkblist->treemodel), &iter, &parent, | 911 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(gtkblist->treemodel), &iter, &parent, |
892 gtk_tree_model_iter_n_children(GTK_TREE_MODEL(gtkblist->treemodel), &parent) -1); | 912 gtk_tree_model_iter_n_children(GTK_TREE_MODEL(gtkblist->treemodel), &parent) -1); |
893 path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); | 913 path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); |
914 | |
894 /* Let the treeview draw so it knows where to scroll */ | 915 /* Let the treeview draw so it knows where to scroll */ |
895 while (gtk_events_pending()) | 916 ex->treeview = GTK_TREE_VIEW(gtkblist->treeview); |
896 gtk_main_iteration(); | 917 ex->path = path; |
897 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(gtkblist->treeview), path, NULL, FALSE, 0, 0); | 918 ex->node = node->child; |
898 | 919 g_idle_add(scroll_to_expanded_cell, ex); |
899 gaim_gtk_blist_update_contact(NULL, node->child); | |
900 gtk_tree_path_free(path); | |
901 } | 920 } |
902 | 921 |
903 static void | 922 static void |
904 gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node) | 923 gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node) |
905 { | 924 { |
3931 gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS, | 3950 gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS, |
3932 GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN, | 3951 GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN, |
3933 G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER); | 3952 G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER); |
3934 | 3953 |
3935 gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel)); | 3954 gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel)); |
3955 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(gtkblist->treeview), TRUE); | |
3956 | |
3936 gtk_widget_show(gtkblist->treeview); | 3957 gtk_widget_show(gtkblist->treeview); |
3937 gtk_widget_set_name(gtkblist->treeview, "gaim_gtkblist_treeview"); | 3958 gtk_widget_set_name(gtkblist->treeview, "gaim_gtkblist_treeview"); |
3938 | 3959 |
3939 /* Set up selection stuff */ | 3960 /* Set up selection stuff */ |
3940 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | 3961 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); |