Mercurial > pidgin
diff src/buddy_chat.c @ 1692:a312d64a995d
[gaim-migrate @ 1702]
and i thought i couldn't do it.
committer: Tailor Script <tailor@pidgin.im>
| author | Eric Warmenhoven <eric@warmenhoven.org> |
|---|---|
| date | Sun, 08 Apr 2001 09:26:00 +0000 |
| parents | 171c64f70b66 |
| children | 02653161cbce |
line wrap: on
line diff
--- a/src/buddy_chat.c Sun Apr 08 01:27:24 2001 +0000 +++ b/src/buddy_chat.c Sun Apr 08 09:26:00 2001 +0000 @@ -51,6 +51,10 @@ static int community; extern int state_lock; +GList *chats = NULL; +GtkWidget *all_chats = NULL; +GtkWidget *chat_notebook = NULL; + static void destroy_join_chat() { if (joinchat) @@ -709,11 +713,37 @@ gtk_widget_show(list_item); } +static gint delete_all_chats(GtkWidget *w, GdkEventAny *e, gpointer d) +{ + while (chats) { + struct conversation *c = chats->data; + close_callback(c->close, c); + } + return FALSE; +} +static void chat_switch(GtkNotebook *notebook, GtkWidget *page, gint page_num, gpointer data) +{ + GtkWidget *label = gtk_notebook_get_tab_label(GTK_NOTEBOOK(chat_notebook), + gtk_notebook_get_nth_page(GTK_NOTEBOOK(chat_notebook), page_num)); + GtkStyle *style; + struct conversation *b = g_list_nth_data(chats, page_num); + if (b && b->window && b->entry) + gtk_window_set_focus(GTK_WINDOW(b->window), b->entry); + if (!GTK_WIDGET_REALIZED(label)) + return; + style = gtk_style_new(); + gdk_font_unref(style->font); + style->font = gdk_font_ref(label->style->font); + gtk_widget_set_style(label, style); + gtk_style_unref(style); + b->unseen = FALSE; +} void show_new_buddy_chat(struct conversation *b) { GtkWidget *win; + GtkWidget *cont; GtkWidget *text; GtkWidget *send; GtkWidget *list; @@ -735,21 +765,49 @@ int dispstyle = set_dispstyle(1); - win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - b->window = win; - gtk_object_set_user_data(GTK_OBJECT(win), b); - gtk_window_set_wmclass(GTK_WINDOW(win), "buddy_chat", "Gaim"); - gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE); - gtk_container_border_width(GTK_CONTAINER(win), 10); - g_snprintf(buf, sizeof(buf), "Gaim - %s (chat)", b->name); - gtk_window_set_title(GTK_WINDOW(win), buf); - gtk_signal_connect(GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(close_callback), b); - gtk_widget_realize(win); - aol_icon(win->window); + if (display_options & OPT_DISP_ONE_CHAT_WINDOW) { + if (!all_chats) { + win = all_chats = b->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_wmclass(GTK_WINDOW(win), "buddy_chat", "Gaim"); + gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE); + gtk_container_border_width(GTK_CONTAINER(win), 0); + gtk_widget_realize(win); + aol_icon(win->window); + gtk_window_set_title(GTK_WINDOW(win), _("Gaim - Group Chats")); + gtk_signal_connect(GTK_OBJECT(win), "delete_event", + GTK_SIGNAL_FUNC(delete_all_chats), NULL); + + chat_notebook = gtk_notebook_new(); + gtk_notebook_set_scrollable(GTK_NOTEBOOK(chat_notebook), TRUE); + gtk_notebook_popup_enable(GTK_NOTEBOOK(chat_notebook)); + gtk_container_add(GTK_CONTAINER(win), chat_notebook); + gtk_signal_connect(GTK_OBJECT(chat_notebook), "switch-page", + GTK_SIGNAL_FUNC(chat_switch), NULL); + gtk_widget_show(chat_notebook); + } else + win = b->window = all_chats; + + cont = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(cont), 5); + gtk_notebook_append_page(GTK_NOTEBOOK(chat_notebook), cont, gtk_label_new(b->name)); + gtk_widget_show(cont); + } else { + cont = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + b->window = win; + gtk_object_set_user_data(GTK_OBJECT(win), b); + gtk_window_set_wmclass(GTK_WINDOW(win), "buddy_chat", "Gaim"); + gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE); + gtk_container_border_width(GTK_CONTAINER(win), 10); + gtk_widget_realize(win); + aol_icon(win->window); + g_snprintf(buf, sizeof(buf), "Gaim - %s (chat)", b->name); + gtk_window_set_title(GTK_WINDOW(win), buf); + gtk_signal_connect(GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(close_callback), b); + } vpaned = gtk_vpaned_new(); gtk_paned_set_gutter_size(GTK_PANED(vpaned), 15); - gtk_container_add(GTK_CONTAINER(win), vpaned); + gtk_container_add(GTK_CONTAINER(cont), vpaned); gtk_widget_show(vpaned); hpaned = gtk_hpaned_new(); @@ -758,6 +816,7 @@ gtk_widget_show(hpaned); sw = gtk_scrolled_window_new(NULL, NULL); + b->sw = sw; gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_paned_pack1(GTK_PANED(hpaned), sw, TRUE, TRUE); gtk_widget_set_usize(sw, 320, 160); @@ -820,6 +879,8 @@ chatentry = gtk_text_new(NULL, NULL); b->entry = chatentry; + if (!(display_options & OPT_DISP_ONE_CHAT_WINDOW)) + gtk_window_set_focus(GTK_WINDOW(b->window), b->entry); toolbar = build_conv_toolbar(b); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); @@ -1038,3 +1099,47 @@ bcs = bcs->next; } } + +void chat_tabize() +{ + /* evil, evil i tell you! evil! */ + if (display_options & OPT_DISP_ONE_CHAT_WINDOW) { + GList *x = chats; + while (x) { + struct conversation *c = x->data; + GtkWidget *imhtml, *win; + + imhtml = c->text; + win = c->window; + show_new_buddy_chat(c); + gtk_widget_destroy(c->text); + gtk_widget_reparent(imhtml, c->sw); + c->text = imhtml; + gtk_signal_disconnect_by_func(GTK_OBJECT(win), + GTK_SIGNAL_FUNC(close_callback), c); + gtk_widget_destroy(win); + + x = x->next; + } + } else { + GList *x, *m; + x = m = chats; + chats = NULL; + while (x) { + struct conversation *c = x->data; + GtkWidget *imhtml; + + imhtml = c->text; + show_new_buddy_chat(c); + gtk_widget_destroy(c->text); + gtk_widget_reparent(imhtml, c->sw); + c->text = imhtml; + + x = x->next; + } + if (all_chats) + gtk_widget_destroy(all_chats); + all_chats = NULL; + chats = m; + } +}
