Mercurial > pidgin.yaz
annotate src/gtkstock.c @ 12595:3169cd6727ad
[gaim-migrate @ 14925]
I've been meaning to spend the time to commit these changes separately, but it's been a couple days without me finding the time...
1. Allow the creation of GaimStatusTypes by passing NULL for the name and/or id. The core uses the default name and/or id. This eliminates quite a bit of duplication in the prpls.
2. Make statuses more consistent. For example, in some prpls, "Busy" was descended from the UNAVAILABLE primitive and on others it was a case of AWAY. Another example... "On Vacation" is definitely an EXTENDED_AWAY not an AWAY.
3. Rename some pixmaps to elminate some special cases. The names of the pixmaps should now match the primitive default IDs.
4. Rename the HIDDEN primitive to INVISIBLE, since we seem to be using that term everywhere. In conjunction with #1, more duplication was eliminated.
5. Add a MOBILE status primitive. It's not used now. It'll be needed in the (hopefully not-too-distant) future, so I'm planning ahead.
6. Shrink the status select for small blist folks. Now if someone can get rid of that stupid extra padding, we'll be set (well, after we deal with imhtml space issues). I've fought with this for many many hours over several days and I can't get it. It's clear that the combo box is requesting more space than is really necessary, but I don't know why.
This is really my first go at anything significant status-related. Everyone should check their favorite prpls carefully to make sure I didn't break anything.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 21 Dec 2005 08:24:17 +0000 |
parents | e0b512d67792 |
children | 851b0bd7eb52 |
rev | line source |
---|---|
10297 | 1 /** |
2 * @file gtkstock.c GTK+ Stock resources | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
7 * Gaim is the legal property of its developers, whose names are too numerous | |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 * | |
25 */ | |
26 #include "internal.h" | |
27 #include "gtkgaim.h" | |
28 | |
29 #include "gtkstock.h" | |
30 | |
31 static struct StockIcon | |
32 { | |
33 const char *name; | |
34 const char *dir; | |
35 const char *filename; | |
36 | |
37 } const stock_icons[] = | |
38 { | |
39 { GAIM_STOCK_ABOUT, "buttons", "about_menu.png" }, | |
40 { GAIM_STOCK_ACCOUNTS, "buttons", "accounts.png" }, | |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12170
diff
changeset
|
41 { GAIM_STOCK_ACTION, NULL, GTK_STOCK_EXECUTE }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
42 #if GTK_CHECK_VERSION(2,6,0) |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
43 { GAIM_STOCK_ALIAS, NULL, GTK_STOCK_EDIT }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
44 #else |
10297 | 45 { GAIM_STOCK_ALIAS, "buttons", "edit.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
46 #endif |
10297 | 47 { GAIM_STOCK_BGCOLOR, "buttons", "change-bgcolor-small.png" }, |
48 { GAIM_STOCK_BLOCK, NULL, GTK_STOCK_STOP }, | |
49 { GAIM_STOCK_CHAT, NULL, GTK_STOCK_JUMP_TO }, | |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
50 { GAIM_STOCK_CLEAR, NULL, GTK_STOCK_CLEAR }, |
12163
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
51 #if GTK_CHECK_VERSION(2,6,0) |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
52 { GAIM_STOCK_CONNECT, NULL, GTK_STOCK_CONNECT }, |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
53 #else |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
54 { GAIM_STOCK_CONNECT, "icons", "stock_connect_16.png" }, |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
55 #endif |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12170
diff
changeset
|
56 { GAIM_STOCK_DEBUG, NULL, GTK_STOCK_PROPERTIES }, |
10297 | 57 { GAIM_STOCK_DOWNLOAD, NULL, GTK_STOCK_GO_DOWN }, |
58 { GAIM_STOCK_DIALOG_AUTH, "dialogs", "gaim_auth.png" }, | |
59 { GAIM_STOCK_DIALOG_COOL, "dialogs", "gaim_cool.png" }, | |
60 { GAIM_STOCK_DIALOG_ERROR, "dialogs", "gaim_error.png" }, | |
61 { GAIM_STOCK_DIALOG_INFO, "dialogs", "gaim_info.png" }, | |
62 { GAIM_STOCK_DIALOG_QUESTION, "dialogs", "gaim_question.png" }, | |
63 { GAIM_STOCK_DIALOG_WARNING, "dialogs", "gaim_warning.png" }, | |
12163
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
64 #if GTK_CHECK_VERSION(2,6,0) |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
65 { GAIM_STOCK_DISCONNECT, NULL, GTK_STOCK_DISCONNECT }, |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
66 #else |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
67 { GAIM_STOCK_DISCONNECT, "icons", "stock_disconnect_16.png" }, |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
68 #endif |
10297 | 69 { GAIM_STOCK_FGCOLOR, "buttons", "change-fgcolor-small.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
70 #if GTK_CHECK_VERSION(2,6,0) |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
71 { GAIM_STOCK_EDIT, NULL, GTK_STOCK_EDIT }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
72 #else |
10297 | 73 { GAIM_STOCK_EDIT, "buttons", "edit.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
74 #endif |
10297 | 75 { GAIM_STOCK_FILE_CANCELED, NULL, GTK_STOCK_CANCEL }, |
76 { GAIM_STOCK_FILE_DONE, NULL, GTK_STOCK_APPLY }, | |
77 { GAIM_STOCK_FILE_TRANSFER, NULL, GTK_STOCK_REVERT_TO_SAVED }, | |
78 { GAIM_STOCK_ICON_AWAY, "icons", "away.png" }, | |
79 { GAIM_STOCK_ICON_AWAY_MSG, "icons", "msgpend.png" }, | |
80 { GAIM_STOCK_ICON_CONNECT, "icons", "connect.png" }, | |
81 { GAIM_STOCK_ICON_OFFLINE, "icons", "offline.png" }, | |
82 { GAIM_STOCK_ICON_ONLINE, "icons", "online.png" }, | |
83 { GAIM_STOCK_ICON_ONLINE_MSG, "icons", "msgunread.png" }, | |
84 { GAIM_STOCK_IGNORE, NULL, GTK_STOCK_DIALOG_ERROR }, | |
11271
b33eccbc3a10
[gaim-migrate @ 13454]
Richard Laager <rlaager@wiktel.com>
parents:
10871
diff
changeset
|
85 { GAIM_STOCK_IM, "buttons", "send-im.png" }, |
10297 | 86 { GAIM_STOCK_IMAGE, "buttons", "insert-image-small.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
87 #if GTK_CHECK_VERSION(2,8,0) |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
88 { GAIM_STOCK_INFO, NULL, GTK_STOCK_INFO }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
89 #else |
12255
e0b512d67792
[gaim-migrate @ 14557]
Richard Laager <rlaager@wiktel.com>
parents:
12191
diff
changeset
|
90 { GAIM_STOCK_INFO, "buttons", "info.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
91 #endif |
10297 | 92 { GAIM_STOCK_INVITE, NULL, GTK_STOCK_JUMP_TO }, |
93 { GAIM_STOCK_LINK, "buttons", "insert-link-small.png" }, | |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12170
diff
changeset
|
94 { GAIM_STOCK_LOG, NULL, GTK_STOCK_DND_MULTIPLE }, |
10297 | 95 { GAIM_STOCK_LOGO, "gaim", "logo.png" }, |
96 { GAIM_STOCK_MODIFY, NULL, GTK_STOCK_PREFERENCES }, | |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
97 #if GTK_CHECK_VERSION(2,6,0) |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
98 { GAIM_STOCK_PAUSE, NULL, GTK_STOCK_MEDIA_PAUSE }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
99 #else |
10297 | 100 { GAIM_STOCK_PAUSE, "buttons", "pause.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
101 #endif |
12170
51c194ca6016
[gaim-migrate @ 14471]
Richard Laager <rlaager@wiktel.com>
parents:
12163
diff
changeset
|
102 { GAIM_STOCK_PENDING, "buttons", "send-im.png" }, |
12163
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
103 #if GTK_CHECK_VERSION(2,6,0) |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
104 { GAIM_STOCK_PLUGIN, NULL, GTK_STOCK_DISCONNECT }, |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
105 #else |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
106 { GAIM_STOCK_PLUGIN, "icons", "stock_disconnect_16.png" }, |
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12116
diff
changeset
|
107 #endif |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12170
diff
changeset
|
108 { GAIM_STOCK_POUNCE, NULL, GTK_STOCK_REDO }, |
10297 | 109 { GAIM_STOCK_OPEN_MAIL, NULL, GTK_STOCK_JUMP_TO }, |
110 { GAIM_STOCK_SEND, "buttons", "send-im.png" }, | |
111 { GAIM_STOCK_SIGN_ON, NULL, GTK_STOCK_EXECUTE }, | |
112 { GAIM_STOCK_SIGN_OFF, NULL, GTK_STOCK_CLOSE }, | |
113 { GAIM_STOCK_SMILEY, "buttons", "insert-smiley-small.png" }, | |
114 { GAIM_STOCK_TEXT_BIGGER, "buttons", "text_bigger.png" }, | |
115 { GAIM_STOCK_TEXT_NORMAL, "buttons", "text_normal.png" }, | |
116 { GAIM_STOCK_TEXT_SMALLER, "buttons", "text_smaller.png" }, | |
117 { GAIM_STOCK_TYPED, "gaim", "typed.png" }, | |
118 { GAIM_STOCK_TYPING, "gaim", "typing.png" }, | |
12024 | 119 { GAIM_STOCK_VOICE_CHAT, "gaim", "phone.png" }, |
10643 | 120 { GAIM_STOCK_STATUS_ONLINE, "gaim", "status-online.png" }, |
121 { GAIM_STOCK_STATUS_OFFLINE, "gaim", "status-offline.png" }, | |
122 { GAIM_STOCK_STATUS_AWAY, "gaim", "status-away.png" }, | |
123 { GAIM_STOCK_STATUS_INVISIBLE,"gaim", "status-invisible.png" }, | |
124 { GAIM_STOCK_STATUS_TYPING0, "gaim", "status-typing0.png" }, | |
125 { GAIM_STOCK_STATUS_TYPING1, "gaim", "status-typing1.png" }, | |
126 { GAIM_STOCK_STATUS_TYPING2, "gaim", "status-typing2.png" }, | |
127 { GAIM_STOCK_STATUS_TYPING3, "gaim", "status-typing3.png" }, | |
128 { GAIM_STOCK_STATUS_CONNECT0, "gaim", "status-connect0.png" }, | |
129 { GAIM_STOCK_STATUS_CONNECT1, "gaim", "status-connect1.png" }, | |
130 { GAIM_STOCK_STATUS_CONNECT2, "gaim", "status-connect2.png" }, | |
131 { GAIM_STOCK_STATUS_CONNECT3, "gaim", "status-connect3.png" }, | |
10297 | 132 { GAIM_STOCK_UPLOAD, NULL, GTK_STOCK_GO_UP }, |
133 { GAIM_STOCK_WARN, NULL, GTK_STOCK_DIALOG_WARNING } | |
134 }; | |
135 | |
10871 | 136 static const GtkStockItem stock_items[] = |
10297 | 137 { |
138 { GAIM_STOCK_ALIAS, N_("_Alias"), 0, 0, NULL }, | |
139 { GAIM_STOCK_CHAT, N_("_Join"), 0, 0, NULL }, | |
140 { GAIM_STOCK_INVITE, N_("_Invite"), 0, 0, NULL }, | |
141 { GAIM_STOCK_MODIFY, N_("_Modify"), 0, 0, NULL }, | |
142 { GAIM_STOCK_OPEN_MAIL, N_("_Open Mail"), 0, 0, NULL }, | |
143 { GAIM_STOCK_PAUSE, N_("_Pause"), 0, 0, NULL }, | |
144 { GAIM_STOCK_WARN, N_("_Warn"), 0, 0, NULL } | |
145 }; | |
146 | |
147 static gchar * | |
148 find_file(const char *dir, const char *base) | |
149 { | |
150 char *filename; | |
151 | |
152 if (base == NULL) | |
153 return NULL; | |
154 | |
155 if (!strcmp(dir, "gaim")) | |
156 filename = g_build_filename(DATADIR, "pixmaps", "gaim", base, NULL); | |
157 else | |
158 { | |
159 filename = g_build_filename(DATADIR, "pixmaps", "gaim", dir, | |
160 base, NULL); | |
161 } | |
162 | |
163 if (!g_file_test(filename, G_FILE_TEST_EXISTS)) | |
164 { | |
165 g_critical("Unable to load stock pixmap %s\n", base); | |
166 | |
167 g_free(filename); | |
168 | |
169 return NULL; | |
170 } | |
171 | |
172 return filename; | |
173 } | |
174 | |
175 static void | |
176 gaim_gtk_stock_versionize(GdkPixbuf **original, GtkWidget *widget) { | |
177 GdkPixmap *pixmap; | |
178 GtkStyle *style; | |
179 PangoContext *context; | |
180 PangoLayout *layout; | |
181 gchar *markup; | |
182 gint width, height; | |
183 gint lwidth = 0, lheight = 0; | |
184 | |
185 style = gtk_widget_get_style(widget); | |
186 | |
187 gdk_pixbuf_render_pixmap_and_mask(*original, &pixmap, NULL, 255); | |
188 width = gdk_pixbuf_get_width(*original); | |
189 height = gdk_pixbuf_get_height(*original); | |
190 g_object_unref(G_OBJECT(*original)); | |
191 | |
192 context = gtk_widget_get_pango_context(widget); | |
193 layout = pango_layout_new(context); | |
194 | |
195 markup = g_strdup_printf("<span foreground=\"#FFFFFF\" size=\"larger\">%s</span>", VERSION); | |
196 pango_layout_set_font_description(layout, style->font_desc); | |
197 pango_layout_set_markup(layout, markup, strlen(markup)); | |
198 g_free(markup); | |
199 | |
200 pango_layout_get_pixel_size(layout, &lwidth, &lheight); | |
201 gdk_draw_layout(GDK_DRAWABLE(pixmap), style->bg_gc[GTK_STATE_NORMAL], | |
202 width - (lwidth + 3), height - (lheight + 1), layout); | |
203 g_object_unref(G_OBJECT(layout)); | |
204 | |
205 *original = gdk_pixbuf_get_from_drawable(NULL, pixmap, NULL, | |
206 0, 0, 0, 0, | |
207 width, height); | |
208 g_object_unref(G_OBJECT(pixmap)); | |
209 } | |
210 | |
211 void | |
212 gaim_gtk_stock_init(void) | |
213 { | |
214 static gboolean stock_initted = FALSE; | |
215 GtkIconFactory *icon_factory; | |
12255
e0b512d67792
[gaim-migrate @ 14557]
Richard Laager <rlaager@wiktel.com>
parents:
12191
diff
changeset
|
216 size_t i; |
10297 | 217 GtkWidget *win; |
218 | |
219 if (stock_initted) | |
220 return; | |
221 | |
222 stock_initted = TRUE; | |
223 | |
224 /* Setup the icon factory. */ | |
225 icon_factory = gtk_icon_factory_new(); | |
226 | |
227 gtk_icon_factory_add_default(icon_factory); | |
228 | |
229 /* Er, yeah, a hack, but it works. :) */ | |
230 win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
231 gtk_widget_realize(win); | |
232 | |
233 for (i = 0; i < G_N_ELEMENTS(stock_icons); i++) | |
234 { | |
235 GdkPixbuf *pixbuf; | |
236 GtkIconSet *iconset; | |
237 gchar *filename; | |
238 | |
239 if (stock_icons[i].dir == NULL) | |
240 { | |
241 /* GTK+ Stock icon */ | |
242 iconset = gtk_style_lookup_icon_set(gtk_widget_get_style(win), | |
243 stock_icons[i].filename); | |
244 } | |
245 else | |
246 { | |
247 filename = find_file(stock_icons[i].dir, stock_icons[i].filename); | |
248 | |
249 if (filename == NULL) | |
250 continue; | |
251 | |
252 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
253 | |
254 g_free(filename); | |
255 | |
256 if (!strcmp(stock_icons[i].name, GAIM_STOCK_LOGO)) | |
257 gaim_gtk_stock_versionize(&pixbuf, win); | |
258 | |
259 iconset = gtk_icon_set_new_from_pixbuf(pixbuf); | |
260 | |
261 g_object_unref(G_OBJECT(pixbuf)); | |
262 } | |
263 | |
264 gtk_icon_factory_add(icon_factory, stock_icons[i].name, iconset); | |
265 | |
266 gtk_icon_set_unref(iconset); | |
267 } | |
268 | |
269 gtk_widget_destroy(win); | |
270 | |
271 /* register custom icon sizes */ | |
272 gtk_icon_size_register(GAIM_ICON_SIZE_LOGO, 330, 90); | |
273 gtk_icon_size_register(GAIM_ICON_SIZE_DIALOG_COOL, 40, 60); | |
10643 | 274 gtk_icon_size_register(GAIM_ICON_SIZE_STATUS, 30, 30); |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12255
diff
changeset
|
275 gtk_icon_size_register(GAIM_ICON_SIZE_STATUS_TWO_LINE, 30, 30); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12255
diff
changeset
|
276 gtk_icon_size_register(GAIM_ICON_SIZE_STATUS_SMALL, 16, 16); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12255
diff
changeset
|
277 gtk_icon_size_register(GAIM_ICON_SIZE_STATUS_SMALL_TWO_LINE, 24, 24); |
10297 | 278 |
279 g_object_unref(G_OBJECT(icon_factory)); | |
280 | |
281 /* Register the stock items. */ | |
282 gtk_stock_add_static(stock_items, G_N_ELEMENTS(stock_items)); | |
283 } |