pidgin/gtkconv.c

changeset 17370
79314c60ee3a
parent 17368
e2c6cb39043c
child 17388
8be39f0de528
equal deleted inserted replaced
17369:7337c06cf5cc 17370:79314c60ee3a
4162 gtk_widget_set_size_request(gtkconv->lower_hbox, -1, height + PIDGIN_HIG_BOX_SPACE); 4162 gtk_widget_set_size_request(gtkconv->lower_hbox, -1, height + PIDGIN_HIG_BOX_SPACE);
4163 g_idle_add(reset_auto_resize_cb, gtkconv); 4163 g_idle_add(reset_auto_resize_cb, gtkconv);
4164 } 4164 }
4165 } 4165 }
4166 4166
4167 static GtkWidget * 4167 static void
4168 setup_chat_pane(PidginConversation *gtkconv) 4168 setup_chat_topic(PidginConversation *gtkconv, GtkWidget *vbox)
4169 { 4169 {
4170 PurplePluginProtocolInfo *prpl_info;
4171 PurpleConversation *conv = gtkconv->active_conv; 4170 PurpleConversation *conv = gtkconv->active_conv;
4172 PidginChatPane *gtkchat; 4171 PurpleConnection *gc = purple_conversation_get_gc(conv);
4173 PurpleConnection *gc; 4172 PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
4174 GtkWidget *vpaned, *hpaned;
4175 GtkWidget *vbox, *hbox, *frame;
4176 GtkWidget *imhtml_sw;
4177 GtkPolicyType imhtml_sw_hscroll;
4178 GtkWidget *lbox;
4179 GtkWidget *label;
4180 GtkWidget *list;
4181 GtkWidget *sw;
4182 GtkListStore *ls;
4183 GtkCellRenderer *rend;
4184 GtkTreeViewColumn *col;
4185 void *blist_handle = purple_blist_get_handle();
4186 GList *focus_chain = NULL;
4187 int ul_width;
4188
4189 gtkchat = gtkconv->u.chat;
4190 gc = purple_conversation_get_gc(conv);
4191 g_return_val_if_fail(gc != NULL, NULL);
4192 g_return_val_if_fail(gc->prpl != NULL, NULL);
4193 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
4194
4195 /* Setup the outer pane. */
4196 vpaned = gtk_vpaned_new();
4197 gtk_widget_show(vpaned);
4198
4199 /* Setup the top part of the pane. */
4200 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4201 gtk_paned_pack1(GTK_PANED(vpaned), vbox, TRUE, TRUE);
4202 gtk_widget_show(vbox);
4203
4204 if (prpl_info->options & OPT_PROTO_CHAT_TOPIC) 4173 if (prpl_info->options & OPT_PROTO_CHAT_TOPIC)
4205 { 4174 {
4175 GtkWidget *hbox, *label;
4176 PidginChatPane *gtkchat = gtkconv->u.chat;
4177
4206 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4178 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4207 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 4179 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
4208 gtk_widget_show(hbox); 4180 gtk_widget_show(hbox);
4209 4181
4210 label = gtk_label_new(_("Topic:")); 4182 label = gtk_label_new(_("Topic:"));
4221 } 4193 }
4222 4194
4223 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); 4195 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0);
4224 gtk_widget_show(gtkchat->topic_text); 4196 gtk_widget_show(gtkchat->topic_text);
4225 } 4197 }
4226 4198 }
4227 /* Setup the horizontal pane. */ 4199
4228 hpaned = gtk_hpaned_new(); 4200 static void
4229 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0); 4201 setup_chat_userlist(PidginConversation *gtkconv, GtkWidget *hpaned)
4230 gtk_widget_show(hpaned); 4202 {
4231 4203 PidginChatPane *gtkchat = gtkconv->u.chat;
4232 /* Setup gtkihmtml. */ 4204 GtkWidget *lbox, *sw, *list;
4233 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw); 4205 GtkListStore *ls;
4234 gtk_widget_set_name(gtkconv->imhtml, "pidgin_conv_imhtml"); 4206 GtkCellRenderer *rend;
4235 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), TRUE); 4207 GtkTreeViewColumn *col;
4236 gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE); 4208 int ul_width;
4237 gtk_widget_show(frame); 4209 void *blist_handle = purple_blist_get_handle();
4238 gtk_scrolled_window_get_policy(GTK_SCROLLED_WINDOW(imhtml_sw), 4210 PurpleConversation *conv = gtkconv->active_conv;
4239 &imhtml_sw_hscroll, NULL);
4240 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(imhtml_sw),
4241 imhtml_sw_hscroll, GTK_POLICY_ALWAYS);
4242 gtk_widget_set_size_request(gtkconv->imhtml,
4243 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/default_width"),
4244 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/default_height"));
4245
4246 g_signal_connect(G_OBJECT(gtkconv->imhtml), "size-allocate",
4247 G_CALLBACK(size_allocate_cb), gtkconv);
4248
4249 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event",
4250 G_CALLBACK(entry_stop_rclick_cb), NULL);
4251 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_press_event",
4252 G_CALLBACK(refocus_entry_cb), gtkconv);
4253 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_release_event",
4254 G_CALLBACK(refocus_entry_cb), gtkconv);
4255 4211
4256 /* Build the right pane. */ 4212 /* Build the right pane. */
4257 lbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4213 lbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4258 gtk_paned_pack2(GTK_PANED(hpaned), lbox, FALSE, TRUE); 4214 gtk_paned_pack2(GTK_PANED(hpaned), lbox, FALSE, TRUE);
4259 gtk_widget_show(lbox); 4215 gtk_widget_show(lbox);
4297 G_CALLBACK(right_click_chat_cb), gtkconv); 4253 G_CALLBACK(right_click_chat_cb), gtkconv);
4298 g_signal_connect(G_OBJECT(list), "popup-menu", 4254 g_signal_connect(G_OBJECT(list), "popup-menu",
4299 G_CALLBACK(gtkconv_chat_popup_menu_cb), gtkconv); 4255 G_CALLBACK(gtkconv_chat_popup_menu_cb), gtkconv);
4300 g_signal_connect(G_OBJECT(lbox), "size-allocate", G_CALLBACK(lbox_size_allocate_cb), gtkconv); 4256 g_signal_connect(G_OBJECT(lbox), "size-allocate", G_CALLBACK(lbox_size_allocate_cb), gtkconv);
4301 4257
4302
4303 rend = gtk_cell_renderer_text_new(); 4258 rend = gtk_cell_renderer_text_new();
4304
4305 g_object_set(rend, 4259 g_object_set(rend,
4306 "foreground-set", TRUE, 4260 "foreground-set", TRUE,
4307 "weight-set", TRUE, 4261 "weight-set", TRUE,
4308 NULL); 4262 NULL);
4309 col = gtk_tree_view_column_new_with_attributes(NULL, rend, 4263 col = gtk_tree_view_column_new_with_attributes(NULL, rend,
4330 gtk_widget_show(list); 4284 gtk_widget_show(list);
4331 4285
4332 gtkchat->list = list; 4286 gtkchat->list = list;
4333 4287
4334 gtk_container_add(GTK_CONTAINER(sw), list); 4288 gtk_container_add(GTK_CONTAINER(sw), list);
4289 }
4290
4291 static GtkWidget *
4292 setup_common_pane(PidginConversation *gtkconv)
4293 {
4294 GtkWidget *paned, *vbox, *frame, *imhtml_sw;
4295 PurpleConversation *conv = gtkconv->active_conv;
4296 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT);
4297 GtkPolicyType imhtml_sw_hscroll;
4298
4299 paned = gtk_vpaned_new();
4300 gtk_widget_show(paned);
4301
4302 /* Setup the top part of the pane */
4303 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4304 gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE);
4305 gtk_widget_show(vbox);
4306
4307 /* Setup the gtkimhtml widget */
4308 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw);
4309 if (chat) {
4310 GtkWidget *hpaned;
4311
4312 /* Add the topic */
4313 setup_chat_topic(gtkconv, vbox);
4314
4315 /* Add the gtkimhtml frame */
4316 hpaned = gtk_hpaned_new();
4317 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0);
4318 gtk_widget_show(hpaned);
4319 gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE);
4320
4321 /* Now add the userlist */
4322 setup_chat_userlist(gtkconv, hpaned);
4323 } else {
4324 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
4325 }
4326 gtk_widget_show(frame);
4327
4328 gtk_widget_set_name(gtkconv->imhtml, "pidgin_conv_imhtml");
4329 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),TRUE);
4330
4331 gtk_scrolled_window_get_policy(GTK_SCROLLED_WINDOW(imhtml_sw),
4332 &imhtml_sw_hscroll, NULL);
4333 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(imhtml_sw),
4334 imhtml_sw_hscroll, GTK_POLICY_ALWAYS);
4335
4336 gtk_widget_set_size_request(gtkconv->imhtml,
4337 chat ? purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/default_width") :
4338 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/default_width"),
4339 chat ? purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/default_height") :
4340 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/default_height"));
4341
4342 g_signal_connect(G_OBJECT(gtkconv->imhtml), "size-allocate",
4343 G_CALLBACK(size_allocate_cb), gtkconv);
4344
4345 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event",
4346 G_CALLBACK(entry_stop_rclick_cb), NULL);
4347 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_press_event",
4348 G_CALLBACK(refocus_entry_cb), gtkconv);
4349 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_release_event",
4350 G_CALLBACK(refocus_entry_cb), gtkconv);
4335 4351
4336 /* Setup the bottom half of the conversation window */ 4352 /* Setup the bottom half of the conversation window */
4337 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4353 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4338 gtk_paned_pack2(GTK_PANED(vpaned), vbox, FALSE, TRUE); 4354 gtk_paned_pack2(GTK_PANED(paned), vbox, FALSE, TRUE);
4339 gtk_widget_show(vbox); 4355 gtk_widget_show(vbox);
4340 4356
4341 gtkconv->lower_hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4357 gtkconv->lower_hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4342 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->lower_hbox, TRUE, TRUE, 0); 4358 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->lower_hbox, TRUE, TRUE, 0);
4343 gtk_widget_show(gtkconv->lower_hbox); 4359 gtk_widget_show(gtkconv->lower_hbox);
4349 /* Setup the toolbar, entry widget and all signals */ 4365 /* Setup the toolbar, entry widget and all signals */
4350 frame = pidgin_create_imhtml(TRUE, &gtkconv->entry, &gtkconv->toolbar, NULL); 4366 frame = pidgin_create_imhtml(TRUE, &gtkconv->entry, &gtkconv->toolbar, NULL);
4351 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); 4367 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
4352 gtk_widget_show(frame); 4368 gtk_widget_show(frame);
4353 4369
4354 g_signal_connect(G_OBJECT(gtkconv->entry), "populate-popup",
4355 G_CALLBACK(entry_popup_menu_cb), gtkconv);
4356
4357 gtk_widget_set_name(gtkconv->entry, "pidgin_conv_entry"); 4370 gtk_widget_set_name(gtkconv->entry, "pidgin_conv_entry");
4358 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), 4371 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry),
4359 purple_account_get_protocol_name(conv->account)); 4372 purple_account_get_protocol_name(conv->account));
4360 gtk_widget_set_size_request(gtkconv->lower_hbox, -1, 4373 gtk_widget_set_size_request(gtkconv->lower_hbox, -1,
4361 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/entry_height")); 4374 chat ? purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/entry_height") :
4362 gtkconv->entry_buffer = 4375 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/entry_height"));
4363 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); 4376
4364 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", gtkconv); 4377 g_signal_connect(G_OBJECT(gtkconv->entry), "populate-popup",
4365 g_signal_connect_swapped(G_OBJECT(gtkconv->entry_buffer), "changed", 4378 G_CALLBACK(entry_popup_menu_cb), gtkconv);
4366 G_CALLBACK(resize_imhtml_cb), gtkconv);
4367
4368 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", 4379 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event",
4369 G_CALLBACK(entry_key_press_cb), gtkconv); 4380 G_CALLBACK(entry_key_press_cb), gtkconv);
4370 g_signal_connect_after(G_OBJECT(gtkconv->entry), "message_send", 4381 g_signal_connect_after(G_OBJECT(gtkconv->entry), "message_send",
4371 G_CALLBACK(send_cb), gtkconv); 4382 G_CALLBACK(send_cb), gtkconv);
4372 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", 4383 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event",
4373 G_CALLBACK(entry_stop_rclick_cb), NULL); 4384 G_CALLBACK(entry_stop_rclick_cb), NULL);
4374 g_signal_connect(G_OBJECT(gtkconv->lower_hbox), "size-allocate", 4385 g_signal_connect(G_OBJECT(gtkconv->lower_hbox), "size-allocate",
4375 G_CALLBACK(size_allocate_cb), gtkconv); 4386 G_CALLBACK(size_allocate_cb), gtkconv);
4376 4387
4377 default_formatize(gtkconv);
4378
4379 /*
4380 * Focus for chat windows should be as follows:
4381 * Tab title -> chat topic -> conversation scrollback -> user list ->
4382 * user list buttons -> entry -> buttons at bottom
4383 */
4384 focus_chain = g_list_prepend(focus_chain, gtkconv->entry);
4385 gtk_container_set_focus_chain(GTK_CONTAINER(vbox), focus_chain);
4386
4387 return vpaned;
4388 }
4389
4390 static GtkWidget *
4391 setup_im_pane(PidginConversation *gtkconv)
4392 {
4393 PurpleConversation *conv = gtkconv->active_conv;
4394 GtkWidget *frame;
4395 GtkWidget *imhtml_sw;
4396 GtkPolicyType imhtml_sw_hscroll;
4397 GtkWidget *paned;
4398 GtkWidget *vbox;
4399 GtkWidget *vbox2;
4400 GList *focus_chain = NULL;
4401
4402 /* Setup the outer pane */
4403 paned = gtk_vpaned_new();
4404 gtk_widget_show(paned);
4405
4406 /* Setup the top part of the pane */
4407 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4408 gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE);
4409 gtk_widget_show(vbox);
4410
4411 /* Setup the gtkimhtml widget */
4412 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw);
4413 gtk_widget_set_name(gtkconv->imhtml, "pidgin_conv_imhtml");
4414 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),TRUE);
4415 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
4416 gtk_widget_show(frame);
4417 gtk_scrolled_window_get_policy(GTK_SCROLLED_WINDOW(imhtml_sw),
4418 &imhtml_sw_hscroll, NULL);
4419 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(imhtml_sw),
4420 imhtml_sw_hscroll, GTK_POLICY_ALWAYS);
4421
4422 gtk_widget_set_size_request(gtkconv->imhtml,
4423 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/default_width"),
4424 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/default_height"));
4425
4426 g_signal_connect(G_OBJECT(gtkconv->imhtml), "size-allocate",
4427 G_CALLBACK(size_allocate_cb), gtkconv);
4428
4429 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event",
4430 G_CALLBACK(entry_stop_rclick_cb), NULL);
4431 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_press_event",
4432 G_CALLBACK(refocus_entry_cb), gtkconv);
4433 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_release_event",
4434 G_CALLBACK(refocus_entry_cb), gtkconv);
4435
4436 /* Setup the bottom half of the conversation window */
4437 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4438 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, TRUE);
4439 gtk_widget_show(vbox2);
4440
4441 gtkconv->lower_hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4442 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->lower_hbox, TRUE, TRUE, 0);
4443 gtk_widget_show(gtkconv->lower_hbox);
4444
4445 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4446 gtk_box_pack_end(GTK_BOX(gtkconv->lower_hbox), vbox2, TRUE, TRUE, 0);
4447 gtk_widget_show(vbox2);
4448
4449 /* Setup the toolbar, entry widget and all signals */
4450 frame = pidgin_create_imhtml(TRUE, &gtkconv->entry, &gtkconv->toolbar, NULL);
4451 gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, 0);
4452 gtk_widget_show(frame);
4453
4454 g_signal_connect(G_OBJECT(gtkconv->entry), "populate-popup",
4455 G_CALLBACK(entry_popup_menu_cb), gtkconv);
4456
4457 gtk_widget_set_name(gtkconv->entry, "pidgin_conv_entry");
4458 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry),
4459 purple_account_get_protocol_name(conv->account));
4460 gtk_widget_set_size_request(gtkconv->lower_hbox, -1,
4461 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/entry_height"));
4462 gtkconv->entry_buffer = 4388 gtkconv->entry_buffer =
4463 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); 4389 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry));
4464 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", gtkconv); 4390 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", gtkconv);
4465 4391
4466 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", 4392 if (!chat) {
4467 G_CALLBACK(entry_key_press_cb), gtkconv); 4393 /* For sending typing notifications for IMs */
4468 g_signal_connect_after(G_OBJECT(gtkconv->entry), "message_send", 4394 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "insert_text",
4469 G_CALLBACK(send_cb), gtkconv); 4395 G_CALLBACK(insert_text_cb), gtkconv);
4470 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", 4396 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "delete_range",
4471 G_CALLBACK(entry_stop_rclick_cb), NULL); 4397 G_CALLBACK(delete_text_cb), gtkconv);
4472 g_signal_connect(G_OBJECT(gtkconv->lower_hbox), "size-allocate", 4398 gtkconv->u.im->typing_timer = 0;
4473 G_CALLBACK(size_allocate_cb), gtkconv); 4399 gtkconv->u.im->animate = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/im/animate_buddy_icons");
4474 4400 gtkconv->u.im->show_icon = TRUE;
4475 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "insert_text", 4401 }
4476 G_CALLBACK(insert_text_cb), gtkconv); 4402
4477 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "delete_range",
4478 G_CALLBACK(delete_text_cb), gtkconv);
4479 g_signal_connect_swapped(G_OBJECT(gtkconv->entry_buffer), "changed", 4403 g_signal_connect_swapped(G_OBJECT(gtkconv->entry_buffer), "changed",
4480 G_CALLBACK(resize_imhtml_cb), gtkconv); 4404 G_CALLBACK(resize_imhtml_cb), gtkconv);
4481 4405
4482 /* had to move this after the imtoolbar is attached so that the
4483 * signals get fired to toggle the buttons on the toolbar as well.
4484 */
4485 default_formatize(gtkconv); 4406 default_formatize(gtkconv);
4486
4487 g_signal_connect_after(G_OBJECT(gtkconv->entry), "format_function_clear", 4407 g_signal_connect_after(G_OBJECT(gtkconv->entry), "format_function_clear",
4488 G_CALLBACK(clear_formatting_cb), gtkconv); 4408 G_CALLBACK(clear_formatting_cb), gtkconv);
4489 4409
4490 gtkconv->u.im->animate = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/im/animate_buddy_icons");
4491 gtkconv->u.im->show_icon = TRUE;
4492
4493 /*
4494 * Focus for IM windows should be as follows:
4495 * Tab title -> conversation scrollback -> entry
4496 */
4497 focus_chain = g_list_prepend(focus_chain, gtkconv->entry);
4498 gtk_container_set_focus_chain(GTK_CONTAINER(vbox2), focus_chain);
4499
4500 gtkconv->u.im->typing_timer = 0;
4501 return paned; 4410 return paned;
4502 } 4411 }
4503 4412
4504 static void 4413 static void
4505 conv_dnd_recv(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, 4414 conv_dnd_recv(GtkWidget *widget, GdkDragContext *dc, guint x, guint y,
4691 gtkconv->unseen_state = PIDGIN_UNSEEN_NONE; 4600 gtkconv->unseen_state = PIDGIN_UNSEEN_NONE;
4692 gtkconv->unseen_count = 0; 4601 gtkconv->unseen_count = 0;
4693 4602
4694 if (conv_type == PURPLE_CONV_TYPE_IM) { 4603 if (conv_type == PURPLE_CONV_TYPE_IM) {
4695 gtkconv->u.im = g_malloc0(sizeof(PidginImPane)); 4604 gtkconv->u.im = g_malloc0(sizeof(PidginImPane));
4696
4697 pane = setup_im_pane(gtkconv);
4698 } else if (conv_type == PURPLE_CONV_TYPE_CHAT) { 4605 } else if (conv_type == PURPLE_CONV_TYPE_CHAT) {
4699 gtkconv->u.chat = g_malloc0(sizeof(PidginChatPane)); 4606 gtkconv->u.chat = g_malloc0(sizeof(PidginChatPane));
4700 pane = setup_chat_pane(gtkconv); 4607 }
4701 } 4608 pane = setup_common_pane(gtkconv);
4702 4609
4703 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->imhtml), 4610 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->imhtml),
4704 gtk_imhtml_get_format_functions(GTK_IMHTML(gtkconv->imhtml)) | GTK_IMHTML_IMAGE); 4611 gtk_imhtml_get_format_functions(GTK_IMHTML(gtkconv->imhtml)) | GTK_IMHTML_IMAGE);
4705 4612
4706 if (pane == NULL) { 4613 if (pane == NULL) {

mercurial