| 438 static gpointer |
438 static gpointer |
| 439 aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item) |
439 aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item) |
| 440 { |
440 { |
| 441 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); |
441 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); |
| 442 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); |
442 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); |
| 443 if (NULL != p_item) |
443 if (p_item) |
| 444 (*p_item) = item; |
444 (*p_item) = item; |
| 445 return g_object_get_data(G_OBJECT(item), "aop_per_item_data"); |
445 return g_object_get_data(G_OBJECT(item), "aop_per_item_data"); |
| 446 } |
446 } |
| 447 |
447 |
| 448 static void |
448 static void |
| 468 |
468 |
| 469 item = g_object_new(GTK_TYPE_MENU_ITEM, "visible", TRUE, NULL); |
469 item = g_object_new(GTK_TYPE_MENU_ITEM, "visible", TRUE, NULL); |
| 470 hbox = g_object_new(GTK_TYPE_HBOX, "visible", TRUE, "homogeneous", FALSE, "spacing", 4, NULL); |
470 hbox = g_object_new(GTK_TYPE_HBOX, "visible", TRUE, "homogeneous", FALSE, "spacing", 4, NULL); |
| 471 |
471 |
| 472 /* Create the image */ |
472 /* Create the image */ |
| 473 if (NULL == pixbuf) |
473 if (pixbuf) |
| 474 image = g_object_new(GTK_TYPE_IMAGE, "visible", TRUE, NULL); |
474 image = g_object_new(GTK_TYPE_IMAGE, "visible", TRUE, NULL); |
| 475 else |
475 else |
| 476 image = g_object_new(GTK_TYPE_IMAGE, "visible", TRUE, "pixbuf", pixbuf, NULL); |
476 image = g_object_new(GTK_TYPE_IMAGE, "visible", TRUE, "pixbuf", pixbuf, NULL); |
| 477 |
477 |
| 478 if (NULL != sg) |
478 if (sg) |
| 479 gtk_size_group_add_widget(sg, image); |
479 gtk_size_group_add_widget(sg, image); |
| 480 |
480 |
| 481 /* Create the label */ |
481 /* Create the label */ |
| 482 label = g_object_new(GTK_TYPE_LABEL, "visible", TRUE, "justify", GTK_JUSTIFY_LEFT, "xalign", (gdouble)0.0, "yalign", (gdouble)0.5, "label", lbl, NULL); |
482 label = g_object_new(GTK_TYPE_LABEL, "visible", TRUE, "justify", GTK_JUSTIFY_LEFT, "xalign", (gdouble)0.0, "yalign", (gdouble)0.5, "label", lbl, NULL); |
| 483 |
483 |
| 511 } |
511 } |
| 512 |
512 |
| 513 static void |
513 static void |
| 514 aop_option_menu_replace_menu(GtkWidget *optmenu, AOP_MENU *new_aop_menu) |
514 aop_option_menu_replace_menu(GtkWidget *optmenu, AOP_MENU *new_aop_menu) |
| 515 { |
515 { |
| 516 if (NULL != gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu))) |
516 if (gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu))) |
| 517 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu)); |
517 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu)); |
| 518 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu); |
518 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu); |
| 519 if (-1 != new_aop_menu->default_item) |
519 if (new_aop_menu->default_item != -1) |
| 520 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item); |
520 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item); |
| 521 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); |
521 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); |
| 522 } |
522 } |
| 523 |
523 |
| 524 static void |
524 static void |
| 526 { |
526 { |
| 527 guint idx; |
527 guint idx; |
| 528 GList *llItr = NULL; |
528 GList *llItr = NULL; |
| 529 |
529 |
| 530 for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU (optmenu)))->children; |
530 for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU (optmenu)))->children; |
| 531 llItr != NULL; |
531 llItr != NULL; |
| 532 llItr = llItr->next, idx++) |
532 llItr = llItr->next, idx++) |
| |
533 { |
| 533 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) |
534 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) |
| 534 { |
535 { |
| 535 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); |
536 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); |
| 536 break; |
537 break; |
| 537 } |
538 } |
| |
539 } |
| 538 } |
540 } |
| 539 |
541 |
| 540 static GdkPixbuf * |
542 static GdkPixbuf * |
| 541 get_prpl_pixbuf(PurplePluginProtocolInfo *prpl_info) |
543 get_prpl_pixbuf(PurplePluginProtocolInfo *prpl_info) |
| 542 { |
544 { |
| 544 GdkPixbuf *pixbuf = NULL; |
546 GdkPixbuf *pixbuf = NULL; |
| 545 char *filename; |
547 char *filename; |
| 546 char buf[256]; |
548 char buf[256]; |
| 547 |
549 |
| 548 proto_name = prpl_info->list_icon(NULL, NULL); |
550 proto_name = prpl_info->list_icon(NULL, NULL); |
| 549 if (NULL == proto_name) return NULL; |
551 g_return_val_if_fail(proto_name != NULL, NULL); |
| 550 |
552 |
| 551 g_snprintf(buf, sizeof(buf), "%s.png", proto_name); |
553 g_snprintf(buf, sizeof(buf), "%s.png", proto_name); |
| 552 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "16", buf, NULL); |
554 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "16", buf, NULL); |
| 553 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
555 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
| 554 g_free(filename); |
556 g_free(filename); |
| 580 p = p->next, i++) { |
582 p = p->next, i++) { |
| 581 |
583 |
| 582 plugin = (PurplePlugin *)p->data; |
584 plugin = (PurplePlugin *)p->data; |
| 583 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); |
585 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); |
| 584 |
586 |
| 585 if (NULL != gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { |
587 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) |
| |
588 { |
| 586 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
589 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
| 587 "16", "google-talk.png", NULL); |
590 "16", "google-talk.png", NULL); |
| 588 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
591 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
| 589 g_free(filename); |
592 g_free(filename); |
| 590 |
593 |
| 591 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
594 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
| 592 aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber")); |
595 aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber")); |
| 593 |
596 |
| 594 if (NULL != pixbuf) |
597 if (pixbuf) |
| 595 g_object_unref(pixbuf); |
598 g_object_unref(pixbuf); |
| 596 |
599 |
| 597 gtalk_name = NULL; |
600 gtalk_name = NULL; |
| 598 } |
601 } |
| 599 |
602 |
| 600 pixbuf = get_prpl_pixbuf(prpl_info); |
603 pixbuf = get_prpl_pixbuf(prpl_info); |
| 601 |
604 |
| 602 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
605 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
| 603 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id)); |
606 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id)); |
| 604 if (NULL != pixbuf) |
607 if (pixbuf) |
| 605 g_object_unref(pixbuf); |
608 g_object_unref(pixbuf); |
| 606 |
609 |
| 607 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) |
610 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) |
| 608 aop_menu->default_item = i; |
611 aop_menu->default_item = i; |
| 609 } |
612 } |
| 694 } |
697 } |
| 695 |
698 |
| 696 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
699 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
| 697 aop_menu_item_new(sg, pixbuf, buf, account)); |
700 aop_menu_item_new(sg, pixbuf, buf, account)); |
| 698 |
701 |
| 699 if (NULL != pixbuf) |
702 if (pixbuf) |
| 700 g_object_unref(pixbuf); |
703 g_object_unref(pixbuf); |
| 701 |
704 |
| 702 if (default_account != NULL && account == default_account) |
705 if (default_account != NULL && account == default_account) |
| 703 aop_menu->default_item = i; |
706 aop_menu->default_item = i; |
| 704 } |
707 } |