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));