comparison src/prpl.c @ 5936:1b56a833d665

[gaim-migrate @ 6376] Moved do_proto_menu() from prpl.[ch] to gaim_gtk_blist_update_protocol_actions() in gtkblist.[ch]. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Sat, 21 Jun 2003 08:38:33 +0000
parents e11b904c5bd7
children 023c5f380b5c
comparison
equal deleted inserted replaced
5935:e11b904c5bd7 5936:1b56a833d665
55 return plugin; 55 return plugin;
56 } 56 }
57 } 57 }
58 58
59 return NULL; 59 return NULL;
60 }
61
62 static void proto_act(GtkObject *obj, struct proto_actions_menu *pam)
63 {
64 if (pam->callback && pam->gc)
65 pam->callback(pam->gc);
66 }
67
68 void do_proto_menu()
69 {
70 GtkWidget *menuitem;
71 GtkWidget *submenu;
72 GaimPluginProtocolInfo *prpl_info = NULL;
73 GList *l;
74 GList *c;
75 struct proto_actions_menu *pam;
76 GaimConnection *gc = NULL;
77 int count = 0;
78 char buf[256];
79
80 if (!protomenu)
81 return;
82
83 l = gtk_container_get_children(GTK_CONTAINER(protomenu));
84 while (l) {
85 menuitem = l->data;
86 pam = g_object_get_data(G_OBJECT(menuitem), "proto_actions_menu");
87 if (pam)
88 g_free(pam);
89 gtk_container_remove(GTK_CONTAINER(protomenu), GTK_WIDGET(menuitem));
90 l = l->next;
91 }
92
93 for (c = gaim_connections_get_all(); c != NULL; c = c->next) {
94 gc = c->data;
95
96 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl);
97
98 if (prpl_info->actions && gc->login_time)
99 count++;
100 }
101
102 if (!count) {
103 g_snprintf(buf, sizeof(buf), _("No actions available"));
104 menuitem = gtk_menu_item_new_with_label(buf);
105 gtk_menu_shell_append(GTK_MENU_SHELL(protomenu), menuitem);
106 gtk_widget_show(menuitem);
107 return;
108 }
109
110 if (count == 1) {
111 GList *act;
112
113 for (c = gaim_connections_get_all(); c != NULL; c = c->next) {
114 gc = c->data;
115
116 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl);
117
118 if (prpl_info->actions && gc->login_time)
119 break;
120 }
121
122 act = prpl_info->actions(gc);
123
124 while (act) {
125 if (act->data) {
126 struct proto_actions_menu *pam = act->data;
127 menuitem = gtk_menu_item_new_with_label(pam->label);
128 gtk_menu_shell_append(GTK_MENU_SHELL(protomenu), menuitem);
129 g_signal_connect(G_OBJECT(menuitem), "activate",
130 G_CALLBACK(proto_act), pam);
131 g_object_set_data(G_OBJECT(menuitem), "proto_actions_menu", pam);
132 gtk_widget_show(menuitem);
133 } else {
134 gaim_separator(protomenu);
135 }
136 act = g_list_next(act);
137 }
138 } else {
139 for (c = gaim_connections_get_all(); c != NULL; c = c->next) {
140 GaimAccount *account;
141 GList *act;
142 GdkPixbuf *pixbuf, *scale;
143 GtkWidget *image;
144
145 gc = c->data;
146
147 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl);
148
149 if (!prpl_info->actions || !gc->login_time)
150 continue;
151
152 account = gaim_connection_get_account(gc);
153
154 g_snprintf(buf, sizeof(buf), "%s (%s)",
155 gaim_account_get_username(account),
156 gc->prpl->info->name);
157
158 menuitem = gtk_image_menu_item_new_with_label(buf);
159
160 pixbuf = create_prpl_icon(gc->account);
161 if(pixbuf) {
162 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16,
163 GDK_INTERP_BILINEAR);
164 image = gtk_image_new_from_pixbuf(scale);
165 g_object_unref(G_OBJECT(pixbuf));
166 g_object_unref(G_OBJECT(scale));
167 gtk_widget_show(image);
168 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
169 }
170
171 gtk_menu_shell_append(GTK_MENU_SHELL(protomenu), menuitem);
172 gtk_widget_show(menuitem);
173
174 submenu = gtk_menu_new();
175 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
176 gtk_widget_show(submenu);
177
178 act = prpl_info->actions(gc);
179
180 while (act) {
181 if (act->data) {
182 struct proto_actions_menu *pam = act->data;
183 menuitem = gtk_menu_item_new_with_label(pam->label);
184 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
185 g_signal_connect(G_OBJECT(menuitem), "activate",
186 G_CALLBACK(proto_act), pam);
187 g_object_set_data(G_OBJECT(menuitem), "proto_actions_menu",
188 pam);
189 gtk_widget_show(menuitem);
190 } else {
191 gaim_separator(submenu);
192 }
193 act = g_list_next(act);
194 }
195 }
196 }
197 } 60 }
198 61
199 struct icon_data { 62 struct icon_data {
200 GaimConnection *gc; 63 GaimConnection *gc;
201 char *who; 64 char *who;