Add an interface list icon. Some of the new capture icons were 1 pixel
[metze/wireshark/wip.git] / ui / gtk / stock_icons.c
1 /* stock_icons.c
2  * Wireshark specific stock icons
3  * Copyright 2003-2008, Ulf Lamping <ulf.lamping@web.de>
4  *
5  * $Id$
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1998 Gerald Combs
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24  */
25
26 #include "config.h"
27
28 #include <gtk/gtk.h>
29
30 #include "ui/gtk/stock_icons.h"
31 #include "ui/gtk/toolbar_icons.h"
32 #include "ui/gtk/wsicon.h"
33
34 #include "ui/utf8_entities.h"
35
36 /* these icons are derived from the original stock icons */
37 #include "../../image/toolbar/capture_filter_24.xpm"
38 #include "../../image/toolbar/capture_details_24.xpm"
39 #include "../../image/toolbar/display_filter_24.xpm"
40 #include "../../image/toolbar/colorize_24.xpm"
41 #include "../../image/toolbar/autoscroll_24.xpm"
42 #include "../../image/toolbar/resize_columns_24.xpm"
43 #include "../../image/toolbar/time_24.xpm"
44 #include "../../image/toolbar/internet_24.xpm"
45 #include "../../image/toolbar/web_support_24.xpm"
46 #include "../../image/toolbar/conversations_16.xpm"
47 #include "../../image/toolbar/endpoints_16.xpm"
48 #include "../../image/toolbar/expert_info_16.xpm"
49 #include "../../image/toolbar/flow_graph_16.xpm"
50 #include "../../image/toolbar/graphs_16.xpm"
51 #include "../../image/toolbar/telephony_16.xpm"
52 #include "../../image/toolbar/decode_as_16.xpm"
53 #include "../../image/toolbar/checkbox_16.xpm"
54 #include "../../image/toolbar/file_set_list_16.xpm"
55 #include "../../image/toolbar/file_set_next_16.xpm"
56 #include "../../image/toolbar/file_set_previous_16.xpm"
57 #include "../../image/toolbar/icon_color_1.xpm"
58 #include "../../image/toolbar/icon_color_2.xpm"
59 #include "../../image/toolbar/icon_color_3.xpm"
60 #include "../../image/toolbar/icon_color_4.xpm"
61 #include "../../image/toolbar/icon_color_5.xpm"
62 #include "../../image/toolbar/icon_color_6.xpm"
63 #include "../../image/toolbar/icon_color_7.xpm"
64 #include "../../image/toolbar/icon_color_8.xpm"
65 #include "../../image/toolbar/icon_color_9.xpm"
66 #include "../../image/toolbar/icon_color_0.xpm"
67 #include "../../image/toolbar/decode_24.xpm"
68 #include "../../image/toolbar/audio_player_24.xpm"
69 #include "../../image/toolbar/voip_flow_24.xpm"
70 #include "../../image/toolbar/telephone_16.xpm"
71 #include "../../image/toolbar/analyze_24.xpm"
72
73 #define NO_MOD (GdkModifierType)0
74
75 typedef struct stock_pixmap_tag{
76     const char *    name;
77     const char **   xpm_data;
78 } stock_pixmap_t;
79
80 typedef struct stock_pixbuf_tag{
81     const char    * name;
82     const guint8 * pb_data16; /* Optional */
83     const guint8 * pb_data24; /* Mandatory */
84 } stock_pixbuf_t;
85
86 /* generate application specific stock items */
87 void stock_icons_init(void) {
88     GtkIconFactory * factory;
89     gint32 i;
90     GdkPixbuf * pixbuf;
91     GtkIconSet *icon_set;
92
93
94     /* register non-standard pixmaps with the gtk-stock engine */
95     static const GtkStockItem stock_items[] = {
96         { (char *)WIRESHARK_STOCK_CAPTURE_INTERFACES,    (char *)"_Interfaces",    NO_MOD, 0, NULL },
97         { (char *)WIRESHARK_STOCK_CAPTURE_OPTIONS,       (char *)"_Options",       NO_MOD, 0, NULL },
98         { (char *)WIRESHARK_STOCK_CAPTURE_START,         (char *)"_Start",         NO_MOD, 0, NULL },
99         { (char *)WIRESHARK_STOCK_CAPTURE_STOP,          (char *)"S_top",          NO_MOD, 0, NULL },
100         { (char *)WIRESHARK_STOCK_CAPTURE_RESTART,       (char *)"_Restart",       NO_MOD, 0, NULL },
101         { (char *)WIRESHARK_STOCK_CAPTURE_FILTER,        (char *)"_Capture Filter",   NO_MOD, 0, NULL },
102         { (char *)WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY,  (char *)"_Capture Filter:",  NO_MOD, 0, NULL },
103         { (char *)WIRESHARK_STOCK_CAPTURE_DETAILS,       (char *)"_Details",       NO_MOD, 0, NULL },
104 #ifdef HAVE_GEOIP
105         { (char *)WIRESHARK_STOCK_MAP,                   (char *)"Map",                   NO_MOD, 0, NULL },
106 #endif
107         { (char *)WIRESHARK_STOCK_GRAPH_A_B,             (char *)"Graph A" UTF8_RIGHTWARDS_ARROW "B", NO_MOD, 0, NULL },
108         { (char *)WIRESHARK_STOCK_GRAPH_B_A,             (char *)"Graph B" UTF8_RIGHTWARDS_ARROW "A", NO_MOD, 0, NULL },
109         { (char *)WIRESHARK_STOCK_FOLLOW_STREAM,         (char *)"Follow Stream",         NO_MOD, 0, NULL },
110         { (char *)WIRESHARK_STOCK_DISPLAY_FILTER,        (char *)"Display _Filter",       NO_MOD, 0, NULL },
111         { (char *)WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY,  (char *)"F_ilter:",  NO_MOD, 0, NULL },
112         { (char *)WIRESHARK_STOCK_BROWSE,                (char *)"_Browse...",                NO_MOD, 0, NULL },
113         { (char *)WIRESHARK_STOCK_CREATE_STAT,           (char *)"Create _Stat",           NO_MOD, 0, NULL },
114         { (char *)WIRESHARK_STOCK_EXPORT,                (char *)"_Export...",                NO_MOD, 0, NULL },
115         { (char *)WIRESHARK_STOCK_IMPORT,                (char *)"_Import...",                NO_MOD, 0, NULL },
116         { (char *)WIRESHARK_STOCK_EDIT,                  (char *)"_Edit...",                  NO_MOD, 0, NULL },
117         { (char *)WIRESHARK_STOCK_ADD_EXPRESSION,        (char *)"E_xpression..." ,        NO_MOD, 0, NULL }, /* plus sign coming from icon */
118         { (char *)WIRESHARK_STOCK_CLEAR_EXPRESSION,      (char *)"Clea_r" ,                   NO_MOD, 0, NULL },
119         { (char *)WIRESHARK_STOCK_APPLY_EXPRESSION,      (char *)"App_ly" ,                   NO_MOD, 0, NULL },
120         { (char *)WIRESHARK_STOCK_SAVE_ALL,              (char *)"Save A_ll",             NO_MOD, 0, NULL },
121         { (char *)WIRESHARK_STOCK_DONT_SAVE,             (char *)"Continue _without Saving",             NO_MOD, 0, NULL },
122         { (char *)WIRESHARK_STOCK_QUIT_DONT_SAVE,        (char *)"Quit _without Saving",             NO_MOD, 0, NULL },
123         { (char *)WIRESHARK_STOCK_STOP_DONT_SAVE,        (char *)"Stop and Continue _without Saving",             NO_MOD, 0, NULL },
124         { (char *)WIRESHARK_STOCK_STOP_QUIT_DONT_SAVE,   (char *)"Stop and Quit _without Saving",             NO_MOD, 0, NULL },
125         { (char *)WIRESHARK_STOCK_STOP_SAVE,             (char *)"Stop and Save",             NO_MOD, 0, NULL },
126         { (char *)WIRESHARK_STOCK_ABOUT,                 (char *)"_About",                 NO_MOD, 0, NULL },
127         { (char *)WIRESHARK_STOCK_COLORIZE,              (char *)"_Colorize",              NO_MOD, 0, NULL },
128         { (char *)WIRESHARK_STOCK_AUTOSCROLL,            (char *)"_Auto Scroll",            NO_MOD, 0, NULL },
129         { (char *)WIRESHARK_STOCK_RESIZE_COLUMNS,        (char *)"Resize Columns",        NO_MOD, 0, NULL },
130         { (char *)WIRESHARK_STOCK_TIME,                  (char *)"Time",                  NO_MOD, 0, NULL },
131         { (char *)WIRESHARK_STOCK_INTERNET,              (char *)"Internet",              NO_MOD, 0, NULL },
132         { (char *)WIRESHARK_STOCK_WEB_SUPPORT,           (char *)"Web Support",           NO_MOD, 0, NULL },
133         { (char *)WIRESHARK_STOCK_WIKI,                  (char *)"Wiki",                  NO_MOD, 0, NULL },
134         { (char *)WIRESHARK_STOCK_CONVERSATIONS,         (char *)"Conversations",         NO_MOD, 0, NULL },
135         { (char *)WIRESHARK_STOCK_ENDPOINTS,             (char *)"Endpoints",             NO_MOD, 0, NULL },
136         { (char *)WIRESHARK_STOCK_EXPERT_INFO,           (char *)"Expert Info",           NO_MOD, 0, NULL },
137         { (char *)WIRESHARK_STOCK_GRAPHS,                (char *)"Graphs",                NO_MOD, 0, NULL },
138         { (char *)WIRESHARK_STOCK_FLOW_GRAPH,            (char *)"Flow Graph",            NO_MOD, 0, NULL },
139         { (char *)WIRESHARK_STOCK_TELEPHONY,             (char *)"Telephony",             NO_MOD, 0, NULL },
140         { (char *)WIRESHARK_STOCK_DECODE_AS,             (char *)"Decode As",             NO_MOD, 0, NULL },
141         { (char *)WIRESHARK_STOCK_CHECKBOX,              (char *)"Checkbox",              NO_MOD, 0, NULL },
142         { (char *)WIRESHARK_STOCK_FILE_SET_LIST,         (char *)"List Files",         NO_MOD, 0, NULL },
143         { (char *)WIRESHARK_STOCK_FILE_SET_NEXT,         (char *)"Next File",         NO_MOD, 0, NULL },
144         { (char *)WIRESHARK_STOCK_FILE_SET_PREVIOUS,     (char *)"Previous File",     NO_MOD, 0, NULL },
145         { (char *)WIRESHARK_STOCK_FILTER_OUT_STREAM,     (char *)"Filter Out This Stream",     NO_MOD, 0, NULL },
146         { (char *)WIRESHARK_STOCK_ENABLE,                (char *)"Enable",                NO_MOD, 0, NULL },
147         { (char *)WIRESHARK_STOCK_DISABLE,               (char *)"Disable",               NO_MOD, 0, NULL },
148         { (char *)WIRESHARK_STOCK_COLOR1,                (char *)"Color 1",                NO_MOD, 0, NULL },
149         { (char *)WIRESHARK_STOCK_COLOR2,                (char *)"Color 2",                NO_MOD, 0, NULL },
150         { (char *)WIRESHARK_STOCK_COLOR3,                (char *)"Color 3",                NO_MOD, 0, NULL },
151         { (char *)WIRESHARK_STOCK_COLOR4,                (char *)"Color 4",                NO_MOD, 0, NULL },
152         { (char *)WIRESHARK_STOCK_COLOR5,                (char *)"Color 5",                NO_MOD, 0, NULL },
153         { (char *)WIRESHARK_STOCK_COLOR6,                (char *)"Color 6",                NO_MOD, 0, NULL },
154         { (char *)WIRESHARK_STOCK_COLOR7,                (char *)"Color 7",                NO_MOD, 0, NULL },
155         { (char *)WIRESHARK_STOCK_COLOR8,                (char *)"Color 8",                NO_MOD, 0, NULL },
156         { (char *)WIRESHARK_STOCK_COLOR9,                (char *)"Color 9",                NO_MOD, 0, NULL },
157         { (char *)WIRESHARK_STOCK_COLOR0,                (char *)"Color 10",               NO_MOD, 0, NULL },
158         { (char *)WIRESHARK_STOCK_DECODE,                (char *)"Decode",                 NO_MOD, 0, NULL },
159         { (char *)WIRESHARK_STOCK_AUDIO_PLAYER,          (char *)"Player",                 NO_MOD, 0, NULL },
160         { (char *)WIRESHARK_STOCK_VOIP_FLOW,             (char *)"Flow",                   NO_MOD, 0, NULL },
161         { (char *)WIRESHARK_STOCK_TELEPHONE,             (char *)"Telephone",              NO_MOD, 0, NULL },
162         { (char *)WIRESHARK_STOCK_PREPARE_FILTER,        (char *)"Prepare Filter",         NO_MOD, 0, NULL },
163         { (char *)WIRESHARK_STOCK_ANALYZE,               (char *)"Analyze",                NO_MOD, 0, NULL },
164         { (char *)WIRESHARK_STOCK_SAVE,                  (char *)"Save",                   NO_MOD, 0, NULL }
165     };
166
167     static const stock_pixbuf_t pixbufs[] = {
168         { WIRESHARK_STOCK_ABOUT,              wsicon_16_pb_data, wsicon_24_pb_data },
169         { WIRESHARK_STOCK_CAPTURE_INTERFACES, capture_interfaces_16_pb_data, capture_interfaces_24_pb_data },
170         { WIRESHARK_STOCK_CAPTURE_OPTIONS,    capture_options_16_pb_data, capture_options_24_pb_data },
171         { WIRESHARK_STOCK_CAPTURE_RESTART,    capture_restart_16_pb_data, capture_restart_24_pb_data },
172         { WIRESHARK_STOCK_CAPTURE_START,      capture_start_16_pb_data, capture_start_24_pb_data },
173         { WIRESHARK_STOCK_CAPTURE_STOP,       capture_stop_16_pb_data, capture_stop_24_pb_data },
174         { WIRESHARK_STOCK_SAVE,               toolbar_wireshark_file_16_pb_data, toolbar_wireshark_file_24_pb_data},
175         { WIRESHARK_STOCK_WIKI,               gnome_emblem_web_16_pb_data, gnome_emblem_web_24_pb_data },
176         { NULL, NULL, NULL }
177     };
178
179     /* New images should be PNGs + pixbufs above. Please don't add to this list. */
180     static const stock_pixmap_t pixmaps[] = {
181         { WIRESHARK_STOCK_CAPTURE_FILTER,        capture_filter_24_xpm },
182         { WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY,  capture_filter_24_xpm },
183         { WIRESHARK_STOCK_CAPTURE_DETAILS,       capture_details_24_xpm },
184 #ifdef HAVE_GEOIP
185         { WIRESHARK_STOCK_MAP,                   internet_24_xpm},
186 #endif
187         { WIRESHARK_STOCK_DISPLAY_FILTER,        display_filter_24_xpm },
188         { WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY,  display_filter_24_xpm },
189         { WIRESHARK_STOCK_COLORIZE,              colorize_24_xpm },
190         { WIRESHARK_STOCK_AUTOSCROLL,            autoscroll_24_xpm },
191         { WIRESHARK_STOCK_RESIZE_COLUMNS,        resize_columns_24_xpm},
192         { WIRESHARK_STOCK_TIME,                  time_24_xpm},
193         { WIRESHARK_STOCK_INTERNET,              internet_24_xpm},
194         { WIRESHARK_STOCK_WEB_SUPPORT,           web_support_24_xpm},
195         { WIRESHARK_STOCK_CONVERSATIONS,         conversations_16_xpm},
196         { WIRESHARK_STOCK_ENDPOINTS,             endpoints_16_xpm},
197         { WIRESHARK_STOCK_EXPERT_INFO,           expert_info_16_xpm},
198         { WIRESHARK_STOCK_GRAPHS,                graphs_16_xpm},
199         { WIRESHARK_STOCK_FLOW_GRAPH,            flow_graph_16_xpm},
200         { WIRESHARK_STOCK_TELEPHONY,             telephony_16_xpm},
201         { WIRESHARK_STOCK_DECODE_AS,             decode_as_16_xpm},
202         { WIRESHARK_STOCK_CHECKBOX,              checkbox_16_xpm},
203         { WIRESHARK_STOCK_FILE_SET_LIST,         file_set_list_16_xpm},
204         { WIRESHARK_STOCK_FILE_SET_NEXT,         file_set_next_16_xpm},
205         { WIRESHARK_STOCK_FILE_SET_PREVIOUS,     file_set_previous_16_xpm},
206         { WIRESHARK_STOCK_FILTER_OUT_STREAM,     display_filter_24_xpm},
207         { WIRESHARK_STOCK_ENABLE,                checkbox_16_xpm},
208         { WIRESHARK_STOCK_COLOR1,                icon_color_1_xpm},
209         { WIRESHARK_STOCK_COLOR2,                icon_color_2_xpm},
210         { WIRESHARK_STOCK_COLOR3,                icon_color_3_xpm},
211         { WIRESHARK_STOCK_COLOR4,                icon_color_4_xpm},
212         { WIRESHARK_STOCK_COLOR5,                icon_color_5_xpm},
213         { WIRESHARK_STOCK_COLOR6,                icon_color_6_xpm},
214         { WIRESHARK_STOCK_COLOR7,                icon_color_7_xpm},
215         { WIRESHARK_STOCK_COLOR8,                icon_color_8_xpm},
216         { WIRESHARK_STOCK_COLOR9,                icon_color_9_xpm},
217         { WIRESHARK_STOCK_COLOR0,                icon_color_0_xpm},
218         { WIRESHARK_STOCK_DECODE,                decode_24_xpm},
219         { WIRESHARK_STOCK_AUDIO_PLAYER,          audio_player_24_xpm},
220         { WIRESHARK_STOCK_VOIP_FLOW,             voip_flow_24_xpm},
221         { WIRESHARK_STOCK_TELEPHONE,             telephone_16_xpm},
222         { WIRESHARK_STOCK_PREPARE_FILTER,        display_filter_24_xpm},
223         { WIRESHARK_STOCK_ANALYZE,               analyze_24_xpm},
224         { NULL, NULL }
225     };
226
227     /* Register our stock items */
228     gtk_stock_add (stock_items, G_N_ELEMENTS (stock_items));
229
230     /* Add our custom icon factory to the list of defaults */
231     factory = gtk_icon_factory_new();
232     gtk_icon_factory_add_default(factory);
233
234     /* Add pixmaps our icon factory */
235     /* Please use pixbufs (below) for new icons */
236     for (i = 0; pixmaps[i].name != NULL; i++) {
237         /* The default icon */
238         pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) (pixmaps[i].xpm_data));
239         g_assert(pixbuf);
240         icon_set = gtk_icon_set_new_from_pixbuf (pixbuf);
241
242         /* XXX - add different sized icons here (some 16*16 icons look a bit blurred) */
243         /*gtk_icon_set_add_source(icon_set, const GtkIconSource *source);*/
244
245         gtk_icon_factory_add (factory, pixmaps[i].name, icon_set);
246         gtk_icon_set_unref (icon_set);
247         g_object_unref (G_OBJECT (pixbuf));
248     }
249
250     /* Add pixbufs our icon factory */
251     for (i = 0; pixbufs[i].name != NULL; i++) {
252         /* Default image */
253         icon_set = gtk_icon_set_new_from_pixbuf(gdk_pixbuf_new_from_inline(-1, pixbufs[i].pb_data24, FALSE, NULL));
254
255         if (pixbufs[i].pb_data16) {
256             GtkIconSource *source16 = gtk_icon_source_new();
257             gtk_icon_source_set_pixbuf(source16, gdk_pixbuf_new_from_inline(-1, pixbufs[i].pb_data16, FALSE, NULL));
258             gtk_icon_source_set_size_wildcarded(source16, FALSE);
259             gtk_icon_source_set_size(source16, GTK_ICON_SIZE_MENU);
260             gtk_icon_set_add_source(icon_set, source16);
261
262             /* Twice? Really? Seriously? */
263             source16 = gtk_icon_source_new();
264             gtk_icon_source_set_pixbuf(source16, gdk_pixbuf_new_from_inline(-1, pixbufs[i].pb_data16, FALSE, NULL));
265             gtk_icon_source_set_size_wildcarded(source16, FALSE);
266             gtk_icon_source_set_size(source16, GTK_ICON_SIZE_SMALL_TOOLBAR);
267             gtk_icon_set_add_source(icon_set, source16);
268         }
269
270         gtk_icon_factory_add (factory, pixbufs[i].name, icon_set);
271         gtk_icon_set_unref (icon_set);
272     }
273
274     /* use default stock icons for Wireshark specifics where the icon metapher makes sense */
275     /* PLEASE DON'T REUSE STOCK ICONS IF THEY ARE USUALLY USED FOR SOME DIFFERENT MEANING!!!) */
276     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_OPEN);
277     gtk_icon_factory_add(factory, WIRESHARK_STOCK_BROWSE, icon_set);
278     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_OK);
279     gtk_icon_factory_add(factory, WIRESHARK_STOCK_CREATE_STAT, icon_set);
280     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_SAVE);
281     gtk_icon_factory_add(factory, WIRESHARK_STOCK_EXPORT, icon_set);    /* XXX: needs a better icon */
282     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_OPEN);
283     gtk_icon_factory_add(factory, WIRESHARK_STOCK_IMPORT, icon_set);    /* XXX: needs a better icon */
284     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_PROPERTIES);
285     gtk_icon_factory_add(factory, WIRESHARK_STOCK_EDIT, icon_set);
286     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_ADD);
287     gtk_icon_factory_add(factory, WIRESHARK_STOCK_ADD_EXPRESSION, icon_set);
288     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_CLEAR);
289     gtk_icon_factory_add(factory, WIRESHARK_STOCK_CLEAR_EXPRESSION, icon_set);
290     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_APPLY);
291     gtk_icon_factory_add(factory, WIRESHARK_STOCK_APPLY_EXPRESSION, icon_set);
292     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_CLEAR);
293     gtk_icon_factory_add(factory, WIRESHARK_STOCK_DONT_SAVE, icon_set);
294     gtk_icon_factory_add(factory, WIRESHARK_STOCK_QUIT_DONT_SAVE, icon_set);
295     gtk_icon_factory_add(factory, WIRESHARK_STOCK_STOP_DONT_SAVE, icon_set);
296     gtk_icon_factory_add(factory, WIRESHARK_STOCK_STOP_QUIT_DONT_SAVE, icon_set);
297     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_SAVE);
298     gtk_icon_factory_add(factory, WIRESHARK_STOCK_STOP_SAVE, icon_set);
299     gtk_icon_factory_add(factory, WIRESHARK_STOCK_SAVE_ALL, icon_set);  /* XXX: needs a better icon */
300     icon_set = gtk_icon_factory_lookup_default(GTK_STOCK_CLOSE);
301     gtk_icon_factory_add(factory, WIRESHARK_STOCK_DISABLE, icon_set);
302
303     /* Drop our reference to the factory, GTK will hold a reference.*/
304     g_object_unref (G_OBJECT (factory));
305 }
306
307 /*
308  * Editor modelines
309  *
310  * Local Variables:
311  * c-basic-offset: 4
312  * tab-width: 8
313  * indent-tabs-mode: nil
314  * End:
315  *
316  * ex: set shiftwidth=4 tabstop=8 expandtab:
317  * :indentSize=4:tabSize=8:noTabs=true:
318  */