# HG changeset patch # User Sean Egan # Date 1047685646 0 # Node ID b6f33ba0a0c025f8af0fa719772c283d69fe5d96 # Parent 5d4243c013a2c4fd19402cc624d10af0e766dff9 [gaim-migrate @ 5101] Things this does: - dragging a buddy into a conversation window will actually put it in that window. - drag buddies and groups around in your buddy list to your heart's desire committer: Tailor Script diff -r 5d4243c013a2 -r b6f33ba0a0c0 src/buddy.c --- a/src/buddy.c Fri Mar 14 23:46:32 2003 +0000 +++ b/src/buddy.c Fri Mar 14 23:47:26 2003 +0000 @@ -319,7 +319,7 @@ guint time, gpointer *null) { - if (data->target == gdk_atom_intern("GAIM_BUDDY", FALSE)) { + if (data->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { GtkTreeRowReference *ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref); GtkTreeIter iter; @@ -328,26 +328,25 @@ gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, sourcerow); gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); node = g_value_get_pointer(&val); - if (GAIM_BLIST_NODE_IS_BUDDY(node)) - gtk_selection_data_set (data, - gdk_atom_intern ("GAIM_BUDDY", FALSE), - 8, /* bits */ - (void*)&node, - sizeof (node)); - + gtk_selection_data_set (data, + gdk_atom_intern ("GAIM_BLIST_NODE", FALSE), + 8, /* bits */ + (void*)&node, + sizeof (node)); + gtk_tree_path_free(sourcerow); } - + } static void gaim_gtk_blist_drag_data_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, GtkSelectionData *sd, guint info, guint t) { - if (sd->target == gdk_atom_intern("GAIM_BUDDY", FALSE)) { - struct buddy *b = NULL; + if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE) && sd->data) { + GaimBlistNode *n = NULL; GtkTreePath *path = NULL; GtkTreeViewDropPosition position; - memcpy(&b, sd->data, sizeof(b)); + memcpy(&n, sd->data, sizeof(n)); if(gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), x, y, &path, &position)) { /* if we're here, I think it means the drop is ok */ GtkTreeIter iter; @@ -356,15 +355,36 @@ gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); node = g_value_get_pointer(&val); - if (GAIM_BLIST_NODE_IS_BUDDY(node)) { - if (position == GTK_TREE_VIEW_DROP_AFTER) { - gaim_blist_add_buddy(b, (struct group *)node->parent, node); - } else if (position == GTK_TREE_VIEW_DROP_BEFORE) { - gaim_blist_add_buddy(b, (struct group *)node->parent, node->prev); + + if (GAIM_BLIST_NODE_IS_BUDDY(n)) { + struct buddy *b = (struct buddy*)n; + if (GAIM_BLIST_NODE_IS_BUDDY(node)) { + if (position == GTK_TREE_VIEW_DROP_AFTER) { + gaim_blist_add_buddy(b, (struct group*)node->parent, node); + } else if (position == GTK_TREE_VIEW_DROP_BEFORE) { + gaim_blist_add_buddy(b, (struct group*)node->parent, node->prev); + } + } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { + gaim_blist_add_buddy(b, (struct group*)node, NULL); + } + } else if (GAIM_BLIST_NODE_IS_GROUP(n)) { + struct group *g = (struct group*)n; + if (GAIM_BLIST_NODE_IS_GROUP(node)) { + switch (position) { + case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: + case GTK_TREE_VIEW_DROP_AFTER: + gaim_blist_add_group(g, node); + break; + case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: + case GTK_TREE_VIEW_DROP_BEFORE: + gaim_blist_add_group(g, node->prev); + break; + } + } - } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { - gaim_blist_add_buddy(b, (struct group *)node, NULL); + } + gtk_tree_path_free(path); } } @@ -883,7 +903,7 @@ GtkWidget *sw; GtkWidget *button; GtkSizeGroup *sg; - GtkTargetEntry gte[] = {{"GAIM_BUDDY", GTK_TARGET_SAME_APP, DRAG_ROW}, + GtkTargetEntry gte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, {"application/x-im-contact", 0, DRAG_BUDDY}}; if (gtkblist && gtkblist->window) { @@ -1231,6 +1251,12 @@ gaim_gtk_blist_remove(list, node); if (blist_options & OPT_BLIST_POPUP) gtk_window_present(GTK_WINDOW(gtkblist->window)); + } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { + GaimBlistNode *afsad = node->child; + while (afsad) { + gaim_gtk_blist_update(list, afsad); + afsad = afsad->next; + } } } diff -r 5d4243c013a2 -r b6f33ba0a0c0 src/gtkconv.c --- a/src/gtkconv.c Fri Mar 14 23:46:32 2003 +0000 +++ b/src/gtkconv.c Fri Mar 14 23:47:26 2003 +0000 @@ -3258,12 +3258,17 @@ static void conv_dnd_recv(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, - GtkSelectionData *sd, guint info, guint t) + GtkSelectionData *sd, guint info, guint t, struct gaim_conversation *conv) { - if (sd->target == gdk_atom_intern("GAIM_BUDDY", FALSE)) { - struct buddy *b = NULL; - memcpy(&b, sd->data, sizeof(b)); - gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); + struct gaim_window *win = conv->window; + struct gaim_conversation *c; + if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { + GaimBlistNode *n = NULL; + memcpy(&n, sd->data, sizeof(n)); + if (!GAIM_BLIST_NODE_IS_BUDDY(n)) + return; + c = gaim_conversation_new(GAIM_CONV_IM, ((struct buddy*)n)->account, ((struct buddy*)n)->name); + gaim_window_add_conversation (win, c); } /* do_error_dialog("MWAHAHAHA! I AM A TROLL! I AM GOING TO EAT YOU!", @@ -3402,7 +3407,7 @@ { {"text/plain", 0, 0}, {"text/uri-list", 0, 1}, - {"GAIM_BUDDY", 0, 2}, + {"GAIM_BLIST_NODE", 0, 2}, {"STRING", 0, 3} }; diff -r 5d4243c013a2 -r b6f33ba0a0c0 src/list.c --- a/src/list.c Fri Mar 14 23:46:32 2003 +0000 +++ b/src/list.c Fri Mar 14 23:47:26 2003 +0000 @@ -313,7 +313,8 @@ void gaim_blist_add_group (struct group *group, GaimBlistNode *node) { struct gaim_blist_ui_ops *ops; - + gboolean save; + if (!gaimbuddylist) gaimbuddylist = gaim_blist_new(); ops = gaimbuddylist->ui_ops; @@ -323,18 +324,32 @@ return; } - if (gaim_find_group(group->name)) - return; - + if (!node) node = gaim_blist_get_last_sibling(gaimbuddylist->root); + + if (gaim_find_group(group->name)) { + /* This is just being moved */ + GaimBlistNode *node2 = ((GaimBlistNode*)group)->next; + GaimBlistNode *node3 = ((GaimBlistNode*)group)->prev; + ops->remove(gaimbuddylist, (GaimBlistNode*)group); + + if (node2) + node2->prev = node3; + if (node3) + node3->next = node2; + save = TRUE; + } + ((GaimBlistNode*)group)->next = node ? node->next : NULL; ((GaimBlistNode*)group)->prev = node; node->next = (GaimBlistNode*)group; if (ops) ops->update(gaimbuddylist, (GaimBlistNode*)group); + if (save) + gaim_blist_save(); } void gaim_blist_remove_buddy (struct buddy *buddy)