| 46 static gboolean gtk_gaim_status_box_expose_event (GtkWidget *widget, GdkEventExpose *event); |
46 static gboolean gtk_gaim_status_box_expose_event (GtkWidget *widget, GdkEventExpose *event); |
| 47 static void gtk_gaim_status_box_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); |
47 static void gtk_gaim_status_box_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); |
| 48 |
48 |
| 49 static void (*combo_box_size_request)(GtkWidget *widget, GtkRequisition *requisition); |
49 static void (*combo_box_size_request)(GtkWidget *widget, GtkRequisition *requisition); |
| 50 static void (*combo_box_size_allocate)(GtkWidget *widget, GtkAllocation *allocation); |
50 static void (*combo_box_size_allocate)(GtkWidget *widget, GtkAllocation *allocation); |
| 51 static gboolean (*combo_box_expose_event)(GtkWidget *widget, GdkEventExpose *event); |
|
| 52 static void (*combo_box_forall) (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); |
51 static void (*combo_box_forall) (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); |
| 53 |
52 |
| 54 enum { |
53 enum { |
| 55 TYPE_COLUMN, /* A GtkGaimStatusBoxItemType */ |
54 TYPE_COLUMN, /* A GtkGaimStatusBoxItemType */ |
| 56 ICON_COLUMN, /* This is a GdkPixbuf (the other columns are strings) */ |
55 ICON_COLUMN, /* This is a GdkPixbuf (the other columns are strings) */ |
| 207 widget_class = (GtkWidgetClass*)klass; |
206 widget_class = (GtkWidgetClass*)klass; |
| 208 combo_box_size_request = widget_class->size_request; |
207 combo_box_size_request = widget_class->size_request; |
| 209 widget_class->size_request = gtk_gaim_status_box_size_request; |
208 widget_class->size_request = gtk_gaim_status_box_size_request; |
| 210 combo_box_size_allocate = widget_class->size_allocate; |
209 combo_box_size_allocate = widget_class->size_allocate; |
| 211 widget_class->size_allocate = gtk_gaim_status_box_size_allocate; |
210 widget_class->size_allocate = gtk_gaim_status_box_size_allocate; |
| 212 combo_box_expose_event = widget_class->expose_event; |
|
| 213 widget_class->expose_event = gtk_gaim_status_box_expose_event; |
211 widget_class->expose_event = gtk_gaim_status_box_expose_event; |
| 214 |
212 |
| 215 combo_box_forall = container_class->forall; |
213 combo_box_forall = container_class->forall; |
| 216 container_class->forall = gtk_gaim_status_box_forall; |
214 container_class->forall = gtk_gaim_status_box_forall; |
| 217 |
215 |
| 467 gaim_account_get_active_status(box->account)); |
465 gaim_account_get_active_status(box->account)); |
| 468 else |
466 else |
| 469 update_to_reflect_current_status(box); |
467 update_to_reflect_current_status(box); |
| 470 } |
468 } |
| 471 |
469 |
| 472 static void status_box_clicked_cb(GtkWidget *w, GdkEventButton *event, GtkGaimStatusBox *box) |
470 static gboolean button_released_cb(GtkWidget *widget, GdkEventButton *event, GtkGaimStatusBox *box) |
| 473 { |
471 { |
| 474 if (box->imhtml_visible) |
472 gtk_combo_box_popdown(GTK_COMBO_BOX(box)); |
| 475 return; |
473 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), FALSE); |
| 476 g_signal_emit_by_name(G_OBJECT(box), "changed", NULL, NULL); |
474 if (!box->imhtml_visible) |
| |
475 g_signal_emit_by_name(G_OBJECT(box), "changed", NULL, NULL); |
| |
476 return TRUE; |
| |
477 } |
| |
478 |
| |
479 static gboolean button_pressed_cb(GtkWidget *widget, GdkEventButton *event, GtkGaimStatusBox *box) |
| |
480 { |
| |
481 gtk_combo_box_popup(GTK_COMBO_BOX(box)); |
| |
482 // released_cb is getting short-circuited gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), TRUE); |
| |
483 return TRUE; |
| 477 } |
484 } |
| 478 |
485 |
| 479 static void |
486 static void |
| 480 gtk_gaim_status_box_init (GtkGaimStatusBox *status_box) |
487 gtk_gaim_status_box_init (GtkGaimStatusBox *status_box) |
| 481 { |
488 { |
| 492 status_box->imhtml_visible = FALSE; |
499 status_box->imhtml_visible = FALSE; |
| 493 status_box->connecting = FALSE; |
500 status_box->connecting = FALSE; |
| 494 status_box->typing = FALSE; |
501 status_box->typing = FALSE; |
| 495 status_box->title = NULL; |
502 status_box->title = NULL; |
| 496 status_box->pixbuf = NULL; |
503 status_box->pixbuf = NULL; |
| |
504 status_box->toggle_button = gtk_toggle_button_new(); |
| |
505 status_box->hbox = gtk_hbox_new(FALSE, 6); |
| 497 status_box->cell_view = gtk_cell_view_new(); |
506 status_box->cell_view = gtk_cell_view_new(); |
| 498 gtk_widget_show (status_box->cell_view); |
507 status_box->vsep = gtk_vseparator_new(); |
| 499 |
508 status_box->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE); |
| |
509 |
| 500 status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); |
510 status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); |
| 501 status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); |
511 status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); |
| 502 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
512 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
| 503 gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store)); |
513 gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store)); |
| 504 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(status_box), 0); |
514 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(status_box), 0); |
| 506 gtk_gaim_status_box_refresh(status_box); |
516 gtk_gaim_status_box_refresh(status_box); |
| 507 path = gtk_tree_path_new_from_string("0"); |
517 path = gtk_tree_path_new_from_string("0"); |
| 508 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); |
518 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); |
| 509 gtk_tree_path_free(path); |
519 gtk_tree_path_free(path); |
| 510 |
520 |
| 511 status_box->event = gtk_event_box_new(); |
521 gtk_container_add(GTK_CONTAINER(status_box->toggle_button), status_box->hbox); |
| 512 gtk_widget_show(status_box->event); |
522 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->cell_view, TRUE, TRUE, 0); |
| 513 g_signal_connect(G_OBJECT(status_box->event), "button_press_event", G_CALLBACK(status_box_clicked_cb), status_box); |
523 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->vsep, FALSE, 0, 0); |
| 514 gtk_container_add(GTK_CONTAINER(status_box->event), status_box->cell_view); |
524 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->arrow, FALSE, 0, 0); |
| 515 |
525 gtk_widget_show_all(status_box->toggle_button); |
| 516 gtk_container_add(GTK_CONTAINER(status_box), status_box->event); |
526 #if GTK_CHECK_VERSION(2,4,0) |
| |
527 gtk_button_set_focus_on_click(GTK_BUTTON(status_box->toggle_button), FALSE); |
| |
528 #endif |
| |
529 gtk_container_add(GTK_CONTAINER(status_box), status_box->toggle_button); |
| 517 |
530 |
| 518 status_box->icon_rend = gtk_cell_renderer_pixbuf_new(); |
531 status_box->icon_rend = gtk_cell_renderer_pixbuf_new(); |
| 519 status_box->text_rend = gtk_cell_renderer_text_new(); |
532 status_box->text_rend = gtk_cell_renderer_text_new(); |
| 520 |
533 |
| 521 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), icon_rend, FALSE); |
534 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), icon_rend, FALSE); |
| 526 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); |
539 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); |
| 527 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); |
540 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); |
| 528 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); |
541 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); |
| 529 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); |
542 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); |
| 530 |
543 |
| |
544 g_object_set(G_OBJECT(status_box->icon_rend), "xpad", 6, NULL); |
| |
545 |
| 531 status_box->vbox = gtk_vbox_new(0, FALSE); |
546 status_box->vbox = gtk_vbox_new(0, FALSE); |
| 532 status_box->imhtml = gtk_imhtml_new(NULL, NULL); |
547 status_box->imhtml = gtk_imhtml_new(NULL, NULL); |
| 533 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); |
548 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); |
| |
549 g_signal_connect(G_OBJECT(status_box->toggle_button), "button-press-event", G_CALLBACK(button_pressed_cb), status_box); |
| |
550 g_signal_connect(G_OBJECT(status_box->toggle_button), "button-release-event", G_CALLBACK(button_released_cb), status_box); |
| 534 g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK(imhtml_changed_cb), status_box); |
551 g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK(imhtml_changed_cb), status_box); |
| 535 g_signal_connect_swapped(G_OBJECT(status_box->imhtml), "message_send", G_CALLBACK(remove_typing_cb), status_box); |
552 g_signal_connect_swapped(G_OBJECT(status_box->imhtml), "message_send", G_CALLBACK(remove_typing_cb), status_box); |
| 536 gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); |
553 gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); |
| 537 gtk_widget_set_parent(status_box->vbox, GTK_WIDGET(status_box)); |
554 gtk_widget_set_parent(status_box->vbox, GTK_WIDGET(status_box)); |
| |
555 gtk_widget_set_parent(status_box->toggle_button, GTK_WIDGET(status_box)); |
| 538 status_box->sw = gtk_scrolled_window_new(NULL, NULL); |
556 status_box->sw = gtk_scrolled_window_new(NULL, NULL); |
| 539 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(status_box->sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
557 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(status_box->sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
| 540 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(status_box->sw), GTK_SHADOW_IN); |
558 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(status_box->sw), GTK_SHADOW_IN); |
| 541 gtk_container_add(GTK_CONTAINER(status_box->sw), status_box->imhtml); |
559 gtk_container_add(GTK_CONTAINER(status_box->sw), status_box->imhtml); |
| 542 gtk_box_pack_start(GTK_BOX(status_box->vbox), status_box->sw, TRUE, TRUE, 0); |
560 gtk_box_pack_start(GTK_BOX(status_box->vbox), status_box->sw, TRUE, TRUE, 0); |
| 621 parent_alc.width -= 6; |
639 parent_alc.width -= 6; |
| 622 parent_alc.x += 3; |
640 parent_alc.x += 3; |
| 623 parent_alc.y += 3; |
641 parent_alc.y += 3; |
| 624 |
642 |
| 625 combo_box_size_allocate(widget, &parent_alc); |
643 combo_box_size_allocate(widget, &parent_alc); |
| |
644 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->toggle_button, &parent_alc); |
| 626 widget->allocation = *allocation; |
645 widget->allocation = *allocation; |
| 627 } |
646 } |
| 628 |
647 |
| 629 |
648 |
| 630 static gboolean |
649 static gboolean |
| 631 gtk_gaim_status_box_expose_event(GtkWidget *widget, |
650 gtk_gaim_status_box_expose_event(GtkWidget *widget, |
| 632 GdkEventExpose *event) |
651 GdkEventExpose *event) |
| 633 { |
652 { |
| 634 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(widget); |
653 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(widget); |
| 635 combo_box_expose_event(widget, event); |
654 gtk_widget_send_expose(status_box->toggle_button, (GdkEvent*)(event)); |
| 636 |
655 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->vbox, event); |
| 637 gtk_container_propagate_expose(GTK_CONTAINER(widget), |
|
| 638 status_box->vbox, event); |
|
| 639 return FALSE; |
656 return FALSE; |
| 640 } |
657 } |
| 641 |
658 |
| 642 static void |
659 static void |
| 643 gtk_gaim_status_box_forall(GtkContainer *container, |
660 gtk_gaim_status_box_forall(GtkContainer *container, |