src/gtkstatusbox.c

changeset 12262
91aa0bd039aa
parent 12256
2ad29826207a
child 12269
6e0a4c36e9da
equal deleted inserted replaced
12261:672e2d392a73 12262:91aa0bd039aa
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,

mercurial