Bug Summary

File:cut-n-paste/toolbar-editor/egg-toolbar-editor.c
Warning:line 619, column 3
Value stored to 'y' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name egg-toolbar-editor.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/cut-n-paste/toolbar-editor -resource-dir /usr/lib/llvm-16/lib/clang/16 -D HAVE_CONFIG_H -I . -I ../.. -I /usr/include/libxml2 -I /usr/include/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -D CURSOR_DIR="/usr/share/lector" -D PIC -internal-isystem /usr/lib/llvm-16/lib/clang/16/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdebug-compilation-dir=/rootdir/cut-n-paste/toolbar-editor -ferror-limit 19 -fgnuc-version=4.2.1 -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-17-123254-54188-1 -x c egg-toolbar-editor.c
1/*
2 * Copyright (C) 2003 Marco Pesenti Gritti
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 *
18 * $Id$
19 */
20
21#include "config.h"
22
23#include "egg-toolbar-editor.h"
24#include "egg-editable-toolbar.h"
25
26#include <string.h>
27#include <libxml/tree.h>
28#include <ctk/ctk.h>
29#include <glib/gi18n.h>
30
31static const CtkTargetEntry dest_drag_types[] = {
32 {EGG_TOOLBAR_ITEM_TYPE"application/x-toolbar-item", CTK_TARGET_SAME_APP, 0},
33};
34
35static const CtkTargetEntry source_drag_types[] = {
36 {EGG_TOOLBAR_ITEM_TYPE"application/x-toolbar-item", CTK_TARGET_SAME_APP, 0},
37};
38
39
40static void egg_toolbar_editor_finalize (GObject *object);
41static void update_editor_sheet (EggToolbarEditor *editor);
42
43enum
44{
45 PROP_0,
46 PROP_UI_MANAGER,
47 PROP_TOOLBARS_MODEL
48};
49
50enum
51{
52 SIGNAL_HANDLER_ITEM_ADDED,
53 SIGNAL_HANDLER_ITEM_REMOVED,
54 SIGNAL_HANDLER_TOOLBAR_REMOVED,
55 SIGNAL_HANDLER_LIST_SIZE /* Array size */
56};
57
58struct EggToolbarEditorPrivate
59{
60 CtkUIManager *manager;
61 EggToolbarsModel *model;
62
63 CtkWidget *grid;
64 CtkWidget *scrolled_window;
65 GList *actions_list;
66 GList *factory_list;
67
68 /* These handlers need to be sanely disconnected when switching models */
69 gulong sig_handlers[SIGNAL_HANDLER_LIST_SIZE];
70};
71
72G_DEFINE_TYPE_WITH_PRIVATE (EggToolbarEditor, egg_toolbar_editor, CTK_TYPE_BOX)static void egg_toolbar_editor_init (EggToolbarEditor *self);
static void egg_toolbar_editor_class_init (EggToolbarEditorClass
*klass); static GType egg_toolbar_editor_get_type_once (void
); static gpointer egg_toolbar_editor_parent_class = ((void*)
0); static gint EggToolbarEditor_private_offset; static void egg_toolbar_editor_class_intern_init
(gpointer klass) { egg_toolbar_editor_parent_class = g_type_class_peek_parent
(klass); if (EggToolbarEditor_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EggToolbarEditor_private_offset); egg_toolbar_editor_class_init
((EggToolbarEditorClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer egg_toolbar_editor_get_instance_private
(EggToolbarEditor *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EggToolbarEditor_private_offset)))); } GType egg_toolbar_editor_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = egg_toolbar_editor_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType egg_toolbar_editor_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
((ctk_box_get_type ()), g_intern_static_string ("EggToolbarEditor"
), sizeof (EggToolbarEditorClass), (GClassInitFunc)(void (*)(
void)) egg_toolbar_editor_class_intern_init, sizeof (EggToolbarEditor
), (GInstanceInitFunc)(void (*)(void)) egg_toolbar_editor_init
, (GTypeFlags) 0); { {{ EggToolbarEditor_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EggToolbarEditorPrivate)); };} } return
g_define_type_id; }
;
73
74static gint
75compare_items (gconstpointer a,
76 gconstpointer b)
77{
78 const CtkWidget *item1 = a;
79 const CtkWidget *item2 = b;
80
81 char *key1 = g_object_get_data (G_OBJECT (item1)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((item1)), (((GType) ((20) << (2))))))))
,
82 "egg-collate-key");
83 char *key2 = g_object_get_data (G_OBJECT (item2)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((item2)), (((GType) ((20) << (2))))))))
,
84 "egg-collate-key");
85
86 return strcmp (key1, key2);
87}
88
89static CtkAction *
90find_action (EggToolbarEditor *t,
91 const char *name)
92{
93 GList *l;
94 CtkAction *action = NULL((void*)0);
95
96 l = ctk_ui_manager_get_action_groups (t->priv->manager);
97
98 g_return_val_if_fail (EGG_IS_TOOLBAR_EDITOR (t), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((t)); GType __t = ((egg_toolbar_editor_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning (((gchar*) 0), ((const char*
) (__func__)), "EGG_IS_TOOLBAR_EDITOR (t)"); return (((void*)
0)); } } while (0)
;
99 g_return_val_if_fail (name != NULL, NULL)do { if ((name != ((void*)0))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "name != NULL"); return
(((void*)0)); } } while (0)
;
100
101 for (; l != NULL((void*)0); l = l->next)
102 {
103 CtkAction *tmp;
104
105 tmp = ctk_action_group_get_action (CTK_ACTION_GROUP (l->data)((((CtkActionGroup*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((l->data)), ((ctk_action_group_get_type ()))))))
, name);
106 if (tmp)
107 action = tmp;
108 }
109
110 return action;
111}
112
113static void
114egg_toolbar_editor_set_ui_manager (EggToolbarEditor *t,
115 CtkUIManager *manager)
116{
117 g_return_if_fail (CTK_IS_UI_MANAGER (manager))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((manager)); GType __t = ((ctk_ui_manager_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning (((gchar*) 0), ((const char*
) (__func__)), "CTK_IS_UI_MANAGER (manager)"); return; } } while
(0)
;
118
119 t->priv->manager = g_object_ref (manager)((__typeof__ (manager)) (g_object_ref) (manager));
120}
121
122static void
123item_added_or_removed_cb (EggToolbarsModel *model,
124 int tpos,
125 int ipos,
126 EggToolbarEditor *editor)
127{
128 update_editor_sheet (editor);
129}
130
131static void
132toolbar_removed_cb (EggToolbarsModel *model,
133 int position,
134 EggToolbarEditor *editor)
135{
136 update_editor_sheet (editor);
137}
138
139static void
140egg_toolbar_editor_disconnect_model (EggToolbarEditor *t)
141{
142 EggToolbarEditorPrivate *priv = t->priv;
143 EggToolbarsModel *model = priv->model;
144 gulong handler;
145 int i;
146
147 for (i = 0; i < SIGNAL_HANDLER_LIST_SIZE; i++)
148 {
149 handler = priv->sig_handlers[i];
150
151 if (handler != 0)
152 {
153 if (g_signal_handler_is_connected (model, handler))
154 {
155 g_signal_handler_disconnect (model, handler);
156 }
157
158 priv->sig_handlers[i] = 0;
159 }
160 }
161}
162
163void
164egg_toolbar_editor_set_model (EggToolbarEditor *t,
165 EggToolbarsModel *model)
166{
167 EggToolbarEditorPrivate *priv;
168
169 g_return_if_fail (EGG_IS_TOOLBAR_EDITOR (t))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((t)); GType __t = ((egg_toolbar_editor_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning (((gchar*) 0), ((const char*
) (__func__)), "EGG_IS_TOOLBAR_EDITOR (t)"); return; } } while
(0)
;
170 g_return_if_fail (model != NULL)do { if ((model != ((void*)0))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "model != NULL");
return; } } while (0)
;
171
172 priv = t->priv;
173
174 if (priv->model)
175 {
176 if (G_UNLIKELY (priv->model == model)(priv->model == model)) return;
177
178 egg_toolbar_editor_disconnect_model (t);
179 g_object_unref (priv->model);
180 }
181
182 priv->model = g_object_ref (model)((__typeof__ (model)) (g_object_ref) (model));
183
184 update_editor_sheet (t);
185
186 priv->sig_handlers[SIGNAL_HANDLER_ITEM_ADDED] =
187 g_signal_connect_object (model, "item_added",
188 G_CALLBACK (item_added_or_removed_cb)((GCallback) (item_added_or_removed_cb)), t, 0);
189 priv->sig_handlers[SIGNAL_HANDLER_ITEM_REMOVED] =
190 g_signal_connect_object (model, "item_removed",
191 G_CALLBACK (item_added_or_removed_cb)((GCallback) (item_added_or_removed_cb)), t, 0);
192 priv->sig_handlers[SIGNAL_HANDLER_TOOLBAR_REMOVED] =
193 g_signal_connect_object (model, "toolbar_removed",
194 G_CALLBACK (toolbar_removed_cb)((GCallback) (toolbar_removed_cb)), t, 0);
195}
196
197static void
198egg_toolbar_editor_set_property (GObject *object,
199 guint prop_id,
200 const GValue *value,
201 GParamSpec *pspec)
202{
203 EggToolbarEditor *t = EGG_TOOLBAR_EDITOR (object)((((EggToolbarEditor*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((object)), ((egg_toolbar_editor_get_type ())
)))))
;
204
205 switch (prop_id)
206 {
207 case PROP_UI_MANAGER:
208 egg_toolbar_editor_set_ui_manager (t, g_value_get_object (value));
209 break;
210 case PROP_TOOLBARS_MODEL:
211 egg_toolbar_editor_set_model (t, g_value_get_object (value));
212 break;
213 }
214}
215
216static void
217egg_toolbar_editor_get_property (GObject *object,
218 guint prop_id,
219 GValue *value,
220 GParamSpec *pspec)
221{
222 EggToolbarEditor *t = EGG_TOOLBAR_EDITOR (object)((((EggToolbarEditor*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((object)), ((egg_toolbar_editor_get_type ())
)))))
;
223
224 switch (prop_id)
225 {
226 case PROP_UI_MANAGER:
227 g_value_set_object (value, t->priv->manager);
228 break;
229 case PROP_TOOLBARS_MODEL:
230 g_value_set_object (value, t->priv->model);
231 break;
232 }
233}
234
235static void
236egg_toolbar_editor_class_init (EggToolbarEditorClass *klass)
237{
238 GObjectClass *object_class = G_OBJECT_CLASS (klass)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((klass)), (((GType) ((20) << (2))))))))
;
239
240 object_class->finalize = egg_toolbar_editor_finalize;
241 object_class->set_property = egg_toolbar_editor_set_property;
242 object_class->get_property = egg_toolbar_editor_get_property;
243
244 g_object_class_install_property (object_class,
245 PROP_UI_MANAGER,
246 g_param_spec_object ("ui-manager",
247 "UI-Manager",
248 "UI Manager",
249 CTK_TYPE_UI_MANAGER(ctk_ui_manager_get_type ()),
250 G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
251 G_PARAM_CONSTRUCT_ONLY));
252 g_object_class_install_property (object_class,
253 PROP_TOOLBARS_MODEL,
254 g_param_spec_object ("model",
255 "Model",
256 "Toolbars Model",
257 EGG_TYPE_TOOLBARS_MODEL(egg_toolbars_model_get_type ()),
258 G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
259 G_PARAM_CONSTRUCT));
260
261 CtkWidgetClass *widget_class = CTK_WIDGET_CLASS (klass)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((klass)), ((ctk_widget_get_type ()))))))
;
262 ctk_widget_class_set_css_name (widget_class, "EggToolbarEditor");
263}
264
265static void
266egg_toolbar_editor_finalize (GObject *object)
267{
268 EggToolbarEditor *editor = EGG_TOOLBAR_EDITOR (object)((((EggToolbarEditor*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((object)), ((egg_toolbar_editor_get_type ())
)))))
;
269
270 if (editor->priv->manager)
271 {
272 g_object_unref (editor->priv->manager);
273 }
274
275 if (editor->priv->model)
276 {
277 egg_toolbar_editor_disconnect_model (editor);
278 g_object_unref (editor->priv->model);
279 }
280
281 g_list_free (editor->priv->actions_list);
282 g_list_free (editor->priv->factory_list);
283
284 G_OBJECT_CLASS (egg_toolbar_editor_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((egg_toolbar_editor_parent_class)), (((GType) ((20) <<
(2))))))))
->finalize (object);
285}
286
287CtkWidget *
288egg_toolbar_editor_new (CtkUIManager *manager,
289 EggToolbarsModel *model)
290{
291 return CTK_WIDGET (g_object_new (EGG_TYPE_TOOLBAR_EDITOR,((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((g_object_new ((egg_toolbar_editor_get_type ()), "ui-manager"
, manager, "model", model, ((void*)0)))), ((ctk_widget_get_type
()))))))
292 "ui-manager", manager,((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((g_object_new ((egg_toolbar_editor_get_type ()), "ui-manager"
, manager, "model", model, ((void*)0)))), ((ctk_widget_get_type
()))))))
293 "model", model,((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((g_object_new ((egg_toolbar_editor_get_type ()), "ui-manager"
, manager, "model", model, ((void*)0)))), ((ctk_widget_get_type
()))))))
294 NULL))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((g_object_new ((egg_toolbar_editor_get_type ()), "ui-manager"
, manager, "model", model, ((void*)0)))), ((ctk_widget_get_type
()))))))
;
295}
296
297static void
298drag_begin_cb (CtkWidget *widget,
299 CdkDragContext *context)
300{
301 ctk_widget_hide (widget);
302}
303
304static void
305drag_end_cb (CtkWidget *widget,
306 CdkDragContext *context)
307{
308 ctk_widget_show (widget);
309}
310
311static void
312drag_data_get_cb (CtkWidget *widget,
313 CdkDragContext *context,
314 CtkSelectionData *selection_data,
315 guint info,
316 guint32 time,
317 EggToolbarEditor *editor)
318{
319 const char *target;
320
321 target = g_object_get_data (G_OBJECT (widget)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), (((GType) ((20) << (2))))))))
, "egg-item-name");
322 g_return_if_fail (target != NULL)do { if ((target != ((void*)0))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "target != NULL")
; return; } } while (0)
;
323
324 ctk_selection_data_set (selection_data,
325 ctk_selection_data_get_target (selection_data), 8,
326 (const guchar *) target, strlen (target));
327}
328
329static gchar *
330elide_underscores (const gchar *original)
331{
332 gchar *q, *result;
333 const gchar *p;
334 gboolean last_underscore;
335
336 q = result = g_malloc (strlen (original) + 1);
337 last_underscore = FALSE(0);
338
339 for (p = original; *p; p++)
340 {
341 if (!last_underscore && *p == '_')
342 last_underscore = TRUE(!(0));
343 else
344 {
345 last_underscore = FALSE(0);
346 *q++ = *p;
347 }
348 }
349
350 *q = '\0';
351
352 return result;
353}
354
355static void
356set_drag_cursor (CtkWidget *widget)
357{
358 CdkCursor *cursor;
359 CdkScreen *screen;
360
361 screen = ctk_widget_get_screen (widget);
362
363 cursor = cdk_cursor_new_for_display (cdk_screen_get_display (screen),
364 CDK_HAND2);
365 cdk_window_set_cursor (ctk_widget_get_window (widget), cursor);
366 g_object_unref (cursor);
367}
368
369static void
370event_box_realize_cb (CtkWidget *widget, CtkImage *icon)
371{
372 CtkImageType type;
373
374 set_drag_cursor (widget);
375
376 type = ctk_image_get_storage_type (icon);
377 if (type == CTK_IMAGE_STOCK)
378 {
379 gchar *stock_id;
380 GdkPixbuf *pixbuf;
381
382 ctk_image_get_stock (icon, &stock_id, NULL((void*)0));
383 pixbuf = ctk_widget_render_icon_pixbuf (widget, stock_id,
384 CTK_ICON_SIZE_LARGE_TOOLBAR);
385 ctk_drag_source_set_icon_pixbuf (widget, pixbuf);
386 g_object_unref (pixbuf);
387 }
388 else if (type == CTK_IMAGE_ICON_NAME)
389 {
390 const gchar *icon_name;
391 CdkScreen *screen;
392 CtkIconTheme *icon_theme;
393 gint width, height;
394 GdkPixbuf *pixbuf;
395
396 ctk_image_get_icon_name (icon, &icon_name, NULL((void*)0));
397 screen = ctk_widget_get_screen (widget);
398 icon_theme = ctk_icon_theme_get_for_screen (screen);
399
400 if (!ctk_icon_size_lookup (CTK_ICON_SIZE_LARGE_TOOLBAR,
401 &width, &height))
402 {
403 width = height = 24;
404 }
405
406 pixbuf = ctk_icon_theme_load_icon (icon_theme, icon_name,
407 MIN (width, height)(((width) < (height)) ? (width) : (height)), 0, NULL((void*)0));
408 if (G_UNLIKELY (!pixbuf)(!pixbuf))
409 return;
410
411 ctk_drag_source_set_icon_pixbuf (widget, pixbuf);
412 g_object_unref (pixbuf);
413
414 }
415 else if (type == CTK_IMAGE_PIXBUF)
416 {
417 GdkPixbuf *pixbuf = ctk_image_get_pixbuf (icon);
418 ctk_drag_source_set_icon_pixbuf (widget, pixbuf);
419 }
420}
421
422static CtkWidget *
423editor_create_item (EggToolbarEditor *editor,
424 CtkImage *icon,
425 const char *label_text,
426 CdkDragAction action)
427{
428 CtkWidget *event_box;
429 CtkWidget *vbox;
430 CtkWidget *label;
431 gchar *label_no_mnemonic = NULL((void*)0);
432
433 event_box = ctk_event_box_new ();
434 ctk_event_box_set_visible_window (CTK_EVENT_BOX (event_box)((((CtkEventBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((event_box)), ((ctk_event_box_get_type ()))))))
, FALSE(0));
435 ctk_widget_show (event_box);
436 ctk_drag_source_set (event_box,
437 CDK_BUTTON1_MASK,
438 source_drag_types, G_N_ELEMENTS (source_drag_types)(sizeof (source_drag_types) / sizeof ((source_drag_types)[0])
)
, action);
439 g_signal_connect (event_box, "drag_data_get",g_signal_connect_data ((event_box), ("drag_data_get"), (((GCallback
) (drag_data_get_cb))), (editor), ((void*)0), (GConnectFlags)
0)
440 G_CALLBACK (drag_data_get_cb), editor)g_signal_connect_data ((event_box), ("drag_data_get"), (((GCallback
) (drag_data_get_cb))), (editor), ((void*)0), (GConnectFlags)
0)
;
441 g_signal_connect_after (event_box, "realize",g_signal_connect_data ((event_box), ("realize"), (((GCallback
) (event_box_realize_cb))), (icon), ((void*)0), G_CONNECT_AFTER
)
442 G_CALLBACK (event_box_realize_cb), icon)g_signal_connect_data ((event_box), ("realize"), (((GCallback
) (event_box_realize_cb))), (icon), ((void*)0), G_CONNECT_AFTER
)
;
443
444 if (action == CDK_ACTION_MOVE)
445 {
446 g_signal_connect (event_box, "drag_begin",g_signal_connect_data ((event_box), ("drag_begin"), (((GCallback
) (drag_begin_cb))), (((void*)0)), ((void*)0), (GConnectFlags
) 0)
447 G_CALLBACK (drag_begin_cb), NULL)g_signal_connect_data ((event_box), ("drag_begin"), (((GCallback
) (drag_begin_cb))), (((void*)0)), ((void*)0), (GConnectFlags
) 0)
;
448 g_signal_connect (event_box, "drag_end",g_signal_connect_data ((event_box), ("drag_end"), (((GCallback
) (drag_end_cb))), (((void*)0)), ((void*)0), (GConnectFlags) 0
)
449 G_CALLBACK (drag_end_cb), NULL)g_signal_connect_data ((event_box), ("drag_end"), (((GCallback
) (drag_end_cb))), (((void*)0)), ((void*)0), (GConnectFlags) 0
)
;
450 }
451
452 vbox = ctk_box_new (CTK_ORIENTATION_VERTICAL, 0);
453 ctk_widget_show (vbox);
454 ctk_container_add (CTK_CONTAINER (event_box)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((event_box)), ((ctk_container_get_type ()))))))
, vbox);
455
456 ctk_widget_show (CTK_WIDGET (icon)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((icon)), ((ctk_widget_get_type ()))))))
);
457 ctk_box_pack_start (CTK_BOX (vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((vbox)), ((ctk_box_get_type ()))))))
, CTK_WIDGET (icon)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((icon)), ((ctk_widget_get_type ()))))))
, FALSE(0), TRUE(!(0)), 0);
458 label_no_mnemonic = elide_underscores (label_text);
459 label = ctk_label_new (label_no_mnemonic);
460 g_free (label_no_mnemonic);
461 ctk_widget_show (label);
462 ctk_box_pack_start (CTK_BOX (vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((vbox)), ((ctk_box_get_type ()))))))
, label, FALSE(0), TRUE(!(0)), 0);
463
464 return event_box;
465}
466
467static CtkWidget *
468editor_create_item_from_name (EggToolbarEditor *editor,
469 const char * name,
470 CdkDragAction drag_action)
471{
472 CtkWidget *item;
473 const char *item_name;
474 char *short_label;
475 const char *collate_key;
476
477 if (strcmp (name, "_separator") == 0)
478 {
479 CtkWidget *icon;
480
481 icon = _egg_editable_toolbar_new_separator_image ();
482 short_label = _("Separator")gettext ("Separator");
483 item_name = g_strdup (name)g_strdup_inline (name);
484 collate_key = g_utf8_collate_key (short_label, -1);
485 item = editor_create_item (editor, CTK_IMAGE (icon)((((CtkImage*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((icon)), ((ctk_image_get_type ()))))))
,
486 short_label, drag_action);
487 }
488 else
489 {
490 CtkAction *action;
491 CtkWidget *icon;
492 char *stock_id, *icon_name = NULL((void*)0);
493
494 action = find_action (editor, name);
495 g_return_val_if_fail (action != NULL, NULL)do { if ((action != ((void*)0))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "action != NULL")
; return (((void*)0)); } } while (0)
;
496
497 g_object_get (action,
498 "icon-name", &icon_name,
499 "stock-id", &stock_id,
500 "short-label", &short_label,
501 NULL((void*)0));
502
503 /* This is a workaround to catch named icons. */
504 if (icon_name)
505 icon = ctk_image_new_from_icon_name (icon_name,
506 CTK_ICON_SIZE_LARGE_TOOLBAR);
507 else
508 icon = ctk_image_new_from_icon_name (stock_id ? stock_id : "ctk-dnd",
509 CTK_ICON_SIZE_LARGE_TOOLBAR);
510
511 item_name = g_strdup (name)g_strdup_inline (name);
512 collate_key = g_utf8_collate_key (short_label, -1);
513 item = editor_create_item (editor, CTK_IMAGE (icon)((((CtkImage*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((icon)), ((ctk_image_get_type ()))))))
,
514 short_label, drag_action);
515
516 g_free (short_label);
517 g_free (stock_id);
518 g_free (icon_name);
519 }
520
521 g_object_set_data_full (G_OBJECT (item)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((item)), (((GType) ((20) << (2))))))))
, "egg-collate-key",
522 (gpointer) collate_key, g_free);
523 g_object_set_data_full (G_OBJECT (item)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((item)), (((GType) ((20) << (2))))))))
, "egg-item-name",
524 (gpointer) item_name, g_free);
525
526 return item;
527}
528
529static gint
530append_grid (CtkGrid *grid, GList *items, gint y, gint width)
531{
532 if (items != NULL((void*)0))
533 {
534 gint x = 0;
535 CtkWidget *item;
536
537 if (y > 0)
538 {
539 item = ctk_separator_new (CTK_ORIENTATION_HORIZONTAL);
540 ctk_widget_set_hexpand (item, TRUE(!(0)));
541 ctk_widget_set_vexpand (item, FALSE(0));
542 ctk_widget_show (item);
543
544 ctk_grid_attach (grid, item, 0, y, width, 1);
545 y++;
546 }
547
548 for (; items != NULL((void*)0); items = items->next)
549 {
550 item = items->data;
551 ctk_widget_set_hexpand (item, FALSE(0));
552 ctk_widget_set_vexpand (item, FALSE(0));
553 ctk_widget_show (item);
554
555 if (x >= width)
556 {
557 x = 0;
558 y++;
559 }
560 ctk_grid_attach (grid, item, x, y, 1, 1);
561 x++;
562 }
563
564 y++;
565 }
566 return y;
567}
568
569static void
570update_editor_sheet (EggToolbarEditor *editor)
571{
572 gint y;
573 GPtrArray *items;
574 GList *to_move = NULL((void*)0), *to_copy = NULL((void*)0);
575 CtkWidget *grid;
576 CtkWidget *viewport;
577
578 g_return_if_fail (EGG_IS_TOOLBAR_EDITOR (editor))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((editor)); GType __t = ((egg_toolbar_editor_get_type ()))
; gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class
&& __inst->g_class->g_type == __t) __r = (!(0)
); else __r = g_type_check_instance_is_a (__inst, __t); __r; }
)))))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const
char*) (__func__)), "EGG_IS_TOOLBAR_EDITOR (editor)"); return
; } } while (0)
;
579
580 /* Create new grid. */
581 grid = ctk_grid_new ();
582 editor->priv->grid = grid;
583 ctk_container_set_border_width (CTK_CONTAINER (grid)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_container_get_type ()))))))
, 12);
584 ctk_grid_set_row_spacing (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, 24);
585 ctk_widget_show (grid);
586 ctk_drag_dest_set (grid, CTK_DEST_DEFAULT_ALL,
587 dest_drag_types, G_N_ELEMENTS (dest_drag_types)(sizeof (dest_drag_types) / sizeof ((dest_drag_types)[0])),
588 CDK_ACTION_MOVE | CDK_ACTION_COPY);
589
590 /* Build two lists of items (one for copying, one for moving). */
591 items = egg_toolbars_model_get_name_avail (editor->priv->model);
592 while (items->len > 0)
593 {
594 CtkWidget *item;
595 const char *name;
596 gint flags;
597
598 name = g_ptr_array_index (items, 0)((items)->pdata)[0];
599 g_ptr_array_remove_index_fast (items, 0);
600
601 flags = egg_toolbars_model_get_name_flags (editor->priv->model, name);
602 if ((flags & EGG_TB_MODEL_NAME_INFINITE) == 0)
603 {
604 item = editor_create_item_from_name (editor, name, CDK_ACTION_MOVE);
605 if (item != NULL((void*)0))
606 to_move = g_list_insert_sorted (to_move, item, compare_items);
607 }
608 else
609 {
610 item = editor_create_item_from_name (editor, name, CDK_ACTION_COPY);
611 if (item != NULL((void*)0))
612 to_copy = g_list_insert_sorted (to_copy, item, compare_items);
613 }
614 }
615
616 /* Add them to the sheet. */
617 y = 0;
618 y = append_grid (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, to_move, y, 4);
619 y = append_grid (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, to_copy, y, 4)
;
Value stored to 'y' is never read
620
621 g_list_free (to_move);
622 g_list_free (to_copy);
623 g_ptr_array_free (items, TRUE(!(0)));
624
625 /* Delete old grid. */
626 viewport = ctk_bin_get_child (CTK_BIN (editor->priv->scrolled_window)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((editor->priv->scrolled_window)), ((ctk_bin_get_type
()))))))
);
627 if (viewport)
628 {
629 ctk_container_remove (CTK_CONTAINER (viewport)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((viewport)), ((ctk_container_get_type ()))))))
,
630 ctk_bin_get_child (CTK_BIN (viewport)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((viewport)), ((ctk_bin_get_type ()))))))
));
631 }
632
633 /* Add grid to window. */
634 ctk_scrolled_window_add_with_viewport
635 (CTK_SCROLLED_WINDOW (editor->priv->scrolled_window)((((CtkScrolledWindow*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((editor->priv->scrolled_window)), ((ctk_scrolled_window_get_type
()))))))
, grid);
636}
637
638static void
639setup_editor (EggToolbarEditor *editor)
640{
641 CtkWidget *scrolled_window;
642
643 ctk_container_set_border_width (CTK_CONTAINER (editor)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((editor)), ((ctk_container_get_type ()))))))
, 12);
644 scrolled_window = ctk_scrolled_window_new (NULL((void*)0), NULL((void*)0));
645 editor->priv->scrolled_window = scrolled_window;
646 ctk_widget_show (scrolled_window);
647 ctk_scrolled_window_set_policy (CTK_SCROLLED_WINDOW (scrolled_window)((((CtkScrolledWindow*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((scrolled_window)), ((ctk_scrolled_window_get_type
()))))))
,
648 CTK_POLICY_NEVER, CTK_POLICY_AUTOMATIC);
649 ctk_box_pack_start (CTK_BOX (editor)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((editor)), ((ctk_box_get_type ()))))))
, scrolled_window, TRUE(!(0)), TRUE(!(0)), 0);
650}
651
652static void
653egg_toolbar_editor_init (EggToolbarEditor *t)
654{
655 ctk_orientable_set_orientation (CTK_ORIENTABLE (t)((((CtkOrientable*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((t)), ((ctk_orientable_get_type ()))))))
, CTK_ORIENTATION_VERTICAL);
656
657 t->priv = egg_toolbar_editor_get_instance_private (t);
658
659 t->priv->manager = NULL((void*)0);
660 t->priv->actions_list = NULL((void*)0);
661
662 setup_editor (t);
663}
664