Bug Summary

File:ctk/ctkcolorchooserwidget.c
Warning:line 569, column 9
This statement is never executed

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 ctkcolorchooserwidget.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 -fdebug-compilation-dir=/rootdir/ctk -fcoverage-compilation-dir=/rootdir/ctk -resource-dir /usr/lib/llvm-21/lib/clang/21 -D HAVE_CONFIG_H -I . -I .. -D G_LOG_DOMAIN="Ctk" -D G_LOG_USE_STRUCTURED=1 -D CTK_VERSION="3.25.7" -D CTK_BINARY_VERSION="3.0.0" -D CTK_COMPILATION -D CTK_PRINT_BACKEND_ENABLE_UNSUPPORTED -D CTK_LIBDIR="/usr/lib" -D CTK_LOCALEDIR="/usr/share/locale" -D CTK_DATADIR="/usr/share" -D CTK_DATA_PREFIX="/usr" -D CTK_SYSCONFDIR="/usr/etc" -D CTK_HOST="x86_64-pc-linux-gnu" -D CTK_PRINT_BACKENDS="file,cups" -D X11_DATA_PREFIX="/usr" -D ISO_CODES_PREFIX="" -I .. -I ../ctk -I .. -I ../cdk -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -D G_ENABLE_DEBUG -D G_ENABLE_CONSISTENCY_CHECKS -D GLIB_MIN_REQUIRED_VERSION=GLIB_VERSION_2_66 -D GLIB_MAX_ALLOWED_VERSION=GLIB_VERSION_2_66 -I /usr/include/pango-1.0 -I /usr/include/cairo -I /usr/local/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/atk-1.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/fribidi -I /usr/include/pixman-1 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/gio-unix-2.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/pango-1.0 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -D PIC -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/15/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fvisibility=hidden -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -analyzer-checker deadcode.DeadStores -analyzer-checker security.ArrayBound -analyzer-checker unix.cstring.NotNullTerminated -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -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/2026-05-20-085847-45482-1 -x c ctkcolorchooserwidget.c
1/* CTK - The GIMP Toolkit
2 *
3 * Copyright (C) 2012 Red Hat, Inc.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include "config.h"
20
21#include "ctkcolorchooserprivate.h"
22#include "ctkcolorchooserwidget.h"
23#include "ctkcoloreditorprivate.h"
24#include "ctkcolorswatchprivate.h"
25#include "ctkbox.h"
26#include "ctkgrid.h"
27#include "ctklabel.h"
28#include "ctkorientable.h"
29#include "ctkprivate.h"
30#include "ctkintl.h"
31#include "ctksizegroup.h"
32
33#include <math.h>
34
35/**
36 * SECTION:ctkcolorchooserwidget
37 * @Short_description: A widget for choosing colors
38 * @Title: CtkColorChooserWidget
39 * @See_also: #CtkColorChooserDialog
40 *
41 * The #CtkColorChooserWidget widget lets the user select a
42 * color. By default, the chooser presents a predefined palette
43 * of colors, plus a small number of settable custom colors.
44 * It is also possible to select a different color with the
45 * single-color editor. To enter the single-color editing mode,
46 * use the context menu of any color of the palette, or use the
47 * '+' button to add a new custom color.
48 *
49 * The chooser automatically remembers the last selection, as well
50 * as custom colors.
51 *
52 * To change the initially selected color, use ctk_color_chooser_set_rgba().
53 * To get the selected color use ctk_color_chooser_get_rgba().
54 *
55 * The #CtkColorChooserWidget is used in the #CtkColorChooserDialog
56 * to provide a dialog for selecting colors.
57 *
58 * # CSS names
59 *
60 * CtkColorChooserWidget has a single CSS node with name colorchooser.
61 *
62 * Since: 3.4
63 */
64
65struct _CtkColorChooserWidgetPrivate
66{
67 CtkWidget *palette;
68 CtkWidget *editor;
69 CtkSizeGroup *size_group;
70
71 CtkWidget *custom_label;
72 CtkWidget *custom;
73
74 CtkWidget *button;
75 CtkColorSwatch *current;
76
77 gboolean use_alpha;
78 gboolean has_default_palette;
79
80 GSettings *settings;
81};
82
83enum
84{
85 PROP_ZERO,
86 PROP_RGBA,
87 PROP_USE_ALPHA,
88 PROP_SHOW_EDITOR
89};
90
91static void ctk_color_chooser_widget_iface_init (CtkColorChooserInterface *iface);
92
93G_DEFINE_TYPE_WITH_CODE (CtkColorChooserWidget, ctk_color_chooser_widget, CTK_TYPE_BOX,static void ctk_color_chooser_widget_init (CtkColorChooserWidget
*self); static void ctk_color_chooser_widget_class_init (CtkColorChooserWidgetClass
*klass); static GType ctk_color_chooser_widget_get_type_once
(void); static gpointer ctk_color_chooser_widget_parent_class
= ((void*)0); static gint CtkColorChooserWidget_private_offset
; static void ctk_color_chooser_widget_class_intern_init (gpointer
klass) { ctk_color_chooser_widget_parent_class = g_type_class_peek_parent
(klass); if (CtkColorChooserWidget_private_offset != 0) g_type_class_adjust_private_offset
(klass, &CtkColorChooserWidget_private_offset); ctk_color_chooser_widget_class_init
((CtkColorChooserWidgetClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer ctk_color_chooser_widget_get_instance_private
(CtkColorChooserWidget *self) { return (((gpointer) ((guint8
*) (self) + (glong) (CtkColorChooserWidget_private_offset))))
; } GType ctk_color_chooser_widget_get_type (void) { static GType
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_pointer (
&static_g_define_type_id)); })) ) { GType g_define_type_id
= ctk_color_chooser_widget_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_pointer ((&static_g_define_type_id), (
gpointer) (guintptr) (g_define_type_id)); })) ; } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType ctk_color_chooser_widget_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
((ctk_box_get_type ()), g_intern_static_string ("CtkColorChooserWidget"
), sizeof (CtkColorChooserWidgetClass), (GClassInitFunc)(void
(*)(void)) ctk_color_chooser_widget_class_intern_init, sizeof
(CtkColorChooserWidget), (GInstanceInitFunc)(void (*)(void))
ctk_color_chooser_widget_init, (GTypeFlags) 0); { {{ CtkColorChooserWidget_private_offset
= g_type_add_instance_private (g_define_type_id, sizeof (CtkColorChooserWidgetPrivate
)); } { const GInterfaceInfo g_implement_interface_info = { (
GInterfaceInitFunc)(void (*)(void)) ctk_color_chooser_widget_iface_init
, ((void*)0), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (ctk_color_chooser_get_type ()), &g_implement_interface_info
); };} } return g_define_type_id; }
94 G_ADD_PRIVATE (CtkColorChooserWidget)static void ctk_color_chooser_widget_init (CtkColorChooserWidget
*self); static void ctk_color_chooser_widget_class_init (CtkColorChooserWidgetClass
*klass); static GType ctk_color_chooser_widget_get_type_once
(void); static gpointer ctk_color_chooser_widget_parent_class
= ((void*)0); static gint CtkColorChooserWidget_private_offset
; static void ctk_color_chooser_widget_class_intern_init (gpointer
klass) { ctk_color_chooser_widget_parent_class = g_type_class_peek_parent
(klass); if (CtkColorChooserWidget_private_offset != 0) g_type_class_adjust_private_offset
(klass, &CtkColorChooserWidget_private_offset); ctk_color_chooser_widget_class_init
((CtkColorChooserWidgetClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer ctk_color_chooser_widget_get_instance_private
(CtkColorChooserWidget *self) { return (((gpointer) ((guint8
*) (self) + (glong) (CtkColorChooserWidget_private_offset))))
; } GType ctk_color_chooser_widget_get_type (void) { static GType
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_pointer (
&static_g_define_type_id)); })) ) { GType g_define_type_id
= ctk_color_chooser_widget_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_pointer ((&static_g_define_type_id), (
gpointer) (guintptr) (g_define_type_id)); })) ; } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType ctk_color_chooser_widget_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
((ctk_box_get_type ()), g_intern_static_string ("CtkColorChooserWidget"
), sizeof (CtkColorChooserWidgetClass), (GClassInitFunc)(void
(*)(void)) ctk_color_chooser_widget_class_intern_init, sizeof
(CtkColorChooserWidget), (GInstanceInitFunc)(void (*)(void))
ctk_color_chooser_widget_init, (GTypeFlags) 0); { {{ CtkColorChooserWidget_private_offset
= g_type_add_instance_private (g_define_type_id, sizeof (CtkColorChooserWidgetPrivate
)); } { const GInterfaceInfo g_implement_interface_info = { (
GInterfaceInitFunc)(void (*)(void)) ctk_color_chooser_widget_iface_init
, ((void*)0), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (ctk_color_chooser_get_type ()), &g_implement_interface_info
); };} } return g_define_type_id; }
95 G_IMPLEMENT_INTERFACE (CTK_TYPE_COLOR_CHOOSER,static void ctk_color_chooser_widget_init (CtkColorChooserWidget
*self); static void ctk_color_chooser_widget_class_init (CtkColorChooserWidgetClass
*klass); static GType ctk_color_chooser_widget_get_type_once
(void); static gpointer ctk_color_chooser_widget_parent_class
= ((void*)0); static gint CtkColorChooserWidget_private_offset
; static void ctk_color_chooser_widget_class_intern_init (gpointer
klass) { ctk_color_chooser_widget_parent_class = g_type_class_peek_parent
(klass); if (CtkColorChooserWidget_private_offset != 0) g_type_class_adjust_private_offset
(klass, &CtkColorChooserWidget_private_offset); ctk_color_chooser_widget_class_init
((CtkColorChooserWidgetClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer ctk_color_chooser_widget_get_instance_private
(CtkColorChooserWidget *self) { return (((gpointer) ((guint8
*) (self) + (glong) (CtkColorChooserWidget_private_offset))))
; } GType ctk_color_chooser_widget_get_type (void) { static GType
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_pointer (
&static_g_define_type_id)); })) ) { GType g_define_type_id
= ctk_color_chooser_widget_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_pointer ((&static_g_define_type_id), (
gpointer) (guintptr) (g_define_type_id)); })) ; } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType ctk_color_chooser_widget_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
((ctk_box_get_type ()), g_intern_static_string ("CtkColorChooserWidget"
), sizeof (CtkColorChooserWidgetClass), (GClassInitFunc)(void
(*)(void)) ctk_color_chooser_widget_class_intern_init, sizeof
(CtkColorChooserWidget), (GInstanceInitFunc)(void (*)(void))
ctk_color_chooser_widget_init, (GTypeFlags) 0); { {{ CtkColorChooserWidget_private_offset
= g_type_add_instance_private (g_define_type_id, sizeof (CtkColorChooserWidgetPrivate
)); } { const GInterfaceInfo g_implement_interface_info = { (
GInterfaceInitFunc)(void (*)(void)) ctk_color_chooser_widget_iface_init
, ((void*)0), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (ctk_color_chooser_get_type ()), &g_implement_interface_info
); };} } return g_define_type_id; }
96 ctk_color_chooser_widget_iface_init))static void ctk_color_chooser_widget_init (CtkColorChooserWidget
*self); static void ctk_color_chooser_widget_class_init (CtkColorChooserWidgetClass
*klass); static GType ctk_color_chooser_widget_get_type_once
(void); static gpointer ctk_color_chooser_widget_parent_class
= ((void*)0); static gint CtkColorChooserWidget_private_offset
; static void ctk_color_chooser_widget_class_intern_init (gpointer
klass) { ctk_color_chooser_widget_parent_class = g_type_class_peek_parent
(klass); if (CtkColorChooserWidget_private_offset != 0) g_type_class_adjust_private_offset
(klass, &CtkColorChooserWidget_private_offset); ctk_color_chooser_widget_class_init
((CtkColorChooserWidgetClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer ctk_color_chooser_widget_get_instance_private
(CtkColorChooserWidget *self) { return (((gpointer) ((guint8
*) (self) + (glong) (CtkColorChooserWidget_private_offset))))
; } GType ctk_color_chooser_widget_get_type (void) { static GType
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_pointer (
&static_g_define_type_id)); })) ) { GType g_define_type_id
= ctk_color_chooser_widget_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_pointer ((&static_g_define_type_id), (
gpointer) (guintptr) (g_define_type_id)); })) ; } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType ctk_color_chooser_widget_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
((ctk_box_get_type ()), g_intern_static_string ("CtkColorChooserWidget"
), sizeof (CtkColorChooserWidgetClass), (GClassInitFunc)(void
(*)(void)) ctk_color_chooser_widget_class_intern_init, sizeof
(CtkColorChooserWidget), (GInstanceInitFunc)(void (*)(void))
ctk_color_chooser_widget_init, (GTypeFlags) 0); { {{ CtkColorChooserWidget_private_offset
= g_type_add_instance_private (g_define_type_id, sizeof (CtkColorChooserWidgetPrivate
)); } { const GInterfaceInfo g_implement_interface_info = { (
GInterfaceInitFunc)(void (*)(void)) ctk_color_chooser_widget_iface_init
, ((void*)0), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (ctk_color_chooser_get_type ()), &g_implement_interface_info
); };} } return g_define_type_id; }
97
98static void
99select_swatch (CtkColorChooserWidget *cc,
100 CtkColorSwatch *swatch)
101{
102 CdkRGBA color;
103
104 if (cc->priv->current == swatch)
105 return;
106
107 if (cc->priv->current != NULL((void*)0))
108 ctk_widget_unset_state_flags (CTK_WIDGET (cc->priv->current)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->current)), ((ctk_widget_get_type ())))))
)
, CTK_STATE_FLAG_SELECTED);
109
110 ctk_widget_set_state_flags (CTK_WIDGET (swatch)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((swatch)), ((ctk_widget_get_type ()))))))
, CTK_STATE_FLAG_SELECTED, FALSE(0));
111 cc->priv->current = swatch;
112
113 ctk_color_swatch_get_rgba (swatch, &color);
114
115 g_settings_set (cc->priv->settings, "selected-color", "(bdddd)",
116 TRUE(!(0)), color.red, color.green, color.blue, color.alpha);
117
118 if (ctk_widget_get_visible (CTK_WIDGET (cc->priv->editor)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->editor)), ((ctk_widget_get_type ()))))))
))
119 ctk_color_chooser_set_rgba (CTK_COLOR_CHOOSER (cc->priv->editor)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->editor)), ((ctk_color_chooser_get_type (
)))))))
, &color);
120 else
121 g_object_notify (G_OBJECT (cc)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), (((GType) ((20) << (2))))))))
, "rgba");
122}
123
124static void
125swatch_activate (CtkColorSwatch *swatch,
126 CtkColorChooserWidget *cc)
127{
128 CdkRGBA color;
129
130 ctk_color_swatch_get_rgba (swatch, &color);
131 _ctk_color_chooser_color_activated (CTK_COLOR_CHOOSER (cc)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_color_chooser_get_type ()))))))
, &color);
132}
133
134static void
135swatch_customize (CtkColorSwatch *swatch,
136 CtkColorChooserWidget *cc)
137{
138 CdkRGBA color;
139
140 ctk_color_swatch_get_rgba (swatch, &color);
141 ctk_color_chooser_set_rgba (CTK_COLOR_CHOOSER (cc->priv->editor)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->editor)), ((ctk_color_chooser_get_type (
)))))))
, &color);
142
143 ctk_widget_hide (cc->priv->palette);
144 ctk_widget_show (cc->priv->editor);
145 g_object_notify (G_OBJECT (cc)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), (((GType) ((20) << (2))))))))
, "show-editor");
146}
147
148static void
149swatch_selected (CtkColorSwatch *swatch,
150 CtkStateFlags previous,
151 CtkColorChooserWidget *cc)
152{
153 CtkStateFlags flags;
154
155 flags = ctk_widget_get_state_flags (CTK_WIDGET (swatch)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((swatch)), ((ctk_widget_get_type ()))))))
);
156 if ((flags & CTK_STATE_FLAG_SELECTED) != (previous & CTK_STATE_FLAG_SELECTED) &&
157 (flags & CTK_STATE_FLAG_SELECTED) != 0)
158 select_swatch (cc, swatch);
159}
160
161static void
162connect_swatch_signals (CtkWidget *p,
163 gpointer data)
164{
165 g_signal_connect (p, "activate", G_CALLBACK (swatch_activate), data)g_signal_connect_data ((p), ("activate"), (((GCallback) (swatch_activate
))), (data), ((void*)0), (GConnectFlags) 0)
;
166 g_signal_connect (p, "customize", G_CALLBACK (swatch_customize), data)g_signal_connect_data ((p), ("customize"), (((GCallback) (swatch_customize
))), (data), ((void*)0), (GConnectFlags) 0)
;
167 g_signal_connect (p, "state-flags-changed", G_CALLBACK (swatch_selected), data)g_signal_connect_data ((p), ("state-flags-changed"), (((GCallback
) (swatch_selected))), (data), ((void*)0), (GConnectFlags) 0)
;
168}
169
170static void
171button_activate (CtkColorSwatch *swatch G_GNUC_UNUSED__attribute__ ((__unused__)),
172 CtkColorChooserWidget *cc)
173{
174 /* somewhat random, makes the hairline nicely visible */
175 CdkRGBA color = { 0.75, 0.25, 0.25, 1.0 };
176
177 ctk_color_chooser_set_rgba (CTK_COLOR_CHOOSER (cc->priv->editor)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->editor)), ((ctk_color_chooser_get_type (
)))))))
, &color);
178
179 ctk_widget_hide (cc->priv->palette);
180 ctk_widget_show (cc->priv->editor);
181 g_object_notify (G_OBJECT (cc)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), (((GType) ((20) << (2))))))))
, "show-editor");
182}
183
184static void
185connect_button_signals (CtkWidget *p,
186 gpointer data)
187{
188 g_signal_connect (p, "activate", G_CALLBACK (button_activate), data)g_signal_connect_data ((p), ("activate"), (((GCallback) (button_activate
))), (data), ((void*)0), (GConnectFlags) 0)
;
189}
190
191static void
192save_custom_colors (CtkColorChooserWidget *cc)
193{
194 GVariantBuilder builder;
195 GVariant *variant;
196 CdkRGBA color;
197 GList *children, *l;
198 CtkWidget *child;
199
200 g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(dddd)")(g_variant_type_checked_ (("a(dddd)"))));
201
202 children = ctk_container_get_children (CTK_CONTAINER (cc->priv->custom)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->custom)), ((ctk_container_get_type ())))
)))
);
203 for (l = g_list_nth (children, 1); l != NULL((void*)0); l = l->next)
204 {
205 child = l->data;
206 if (ctk_color_swatch_get_rgba (CTK_COLOR_SWATCH (child)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((child)), ((ctk_color_swatch_get_type ()))))))
, &color))
207 g_variant_builder_add (&builder, "(dddd)",
208 color.red, color.green, color.blue, color.alpha);
209 }
210
211 variant = g_variant_builder_end (&builder);
212 g_settings_set_value (cc->priv->settings, "custom-colors", variant);
213
214 g_list_free (children);
215}
216
217static void
218connect_custom_signals (CtkWidget *p,
219 gpointer data)
220{
221 connect_swatch_signals (p, data);
222 g_signal_connect_swapped (p, "notify::rgba",g_signal_connect_data ((p), ("notify::rgba"), (((GCallback) (
save_custom_colors))), (data), ((void*)0), G_CONNECT_SWAPPED)
223 G_CALLBACK (save_custom_colors), data)g_signal_connect_data ((p), ("notify::rgba"), (((GCallback) (
save_custom_colors))), (data), ((void*)0), G_CONNECT_SWAPPED)
;
224}
225
226static void
227ctk_color_chooser_widget_set_use_alpha (CtkColorChooserWidget *cc,
228 gboolean use_alpha)
229{
230 GList *children, *l;
231 GList *palettes, *p;
232 CtkWidget *swatch;
233 CtkWidget *grid;
234
235 if (cc->priv->use_alpha == use_alpha)
236 return;
237
238 cc->priv->use_alpha = use_alpha;
239 ctk_color_chooser_set_use_alpha (CTK_COLOR_CHOOSER (cc->priv->editor)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->editor)), ((ctk_color_chooser_get_type (
)))))))
, use_alpha);
240
241 palettes = ctk_container_get_children (CTK_CONTAINER (cc->priv->palette)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->palette)), ((ctk_container_get_type ()))
))))
);
242 for (p = palettes; p; p = p->next)
243 {
244 grid = p->data;
245
246 if (!CTK_IS_CONTAINER (grid)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(grid)); GType __t = ((ctk_container_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; }))))
)
247 continue;
248
249 children = ctk_container_get_children (CTK_CONTAINER (grid)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_container_get_type ()))))))
);
250 for (l = children; l; l = l->next)
251 {
252 swatch = l->data;
253 ctk_color_swatch_set_use_alpha (CTK_COLOR_SWATCH (swatch)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((swatch)), ((ctk_color_swatch_get_type ()))))))
, use_alpha);
254 }
255 g_list_free (children);
256 }
257 g_list_free (palettes);
258
259 ctk_widget_queue_draw (CTK_WIDGET (cc)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_widget_get_type ()))))))
);
260 g_object_notify (G_OBJECT (cc)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), (((GType) ((20) << (2))))))))
, "use-alpha");
261}
262
263static void
264ctk_color_chooser_widget_set_show_editor (CtkColorChooserWidget *cc,
265 gboolean show_editor)
266{
267 if (show_editor)
268 {
269 CdkRGBA color = { 0.75, 0.25, 0.25, 1.0 };
270
271 if (cc->priv->current)
272 ctk_color_swatch_get_rgba (cc->priv->current, &color);
273 ctk_color_chooser_set_rgba (CTK_COLOR_CHOOSER (cc->priv->editor)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->editor)), ((ctk_color_chooser_get_type (
)))))))
, &color);
274 }
275
276 ctk_widget_set_visible (cc->priv->editor, show_editor);
277 ctk_widget_set_visible (cc->priv->palette, !show_editor);
278}
279
280static void
281update_from_editor (CtkColorEditor *editor,
282 GParamSpec *pspec G_GNUC_UNUSED__attribute__ ((__unused__)),
283 CtkColorChooserWidget *widget)
284{
285 if (ctk_widget_get_visible (CTK_WIDGET (editor)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((editor)), ((ctk_widget_get_type ()))))))
))
286 g_object_notify (G_OBJECT (widget)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), (((GType) ((20) << (2))))))))
, "rgba");
287}
288
289/* UI construction {{{1 */
290
291static guint
292scale_round (gdouble value, gdouble scale)
293{
294 value = floor (value * scale + 0.5);
295 value = MAX (value, 0)(((value) > (0)) ? (value) : (0));
296 value = MIN (value, scale)(((value) < (scale)) ? (value) : (scale));
297 return (guint)value;
298}
299
300static gchar *
301accessible_color_name (CdkRGBA *color)
302{
303 if (color->alpha < 1.0)
304 return g_strdup_printf (_("Red %d%%, Green %d%%, Blue %d%%, Alpha %d%%")((char *) g_dgettext ("ctk30", "Red %d%%, Green %d%%, Blue %d%%, Alpha %d%%"
))
,
305 scale_round (color->red, 100),
306 scale_round (color->green, 100),
307 scale_round (color->blue, 100),
308 scale_round (color->alpha, 100));
309 else
310 return g_strdup_printf (_("Red %d%%, Green %d%%, Blue %d%%")((char *) g_dgettext ("ctk30", "Red %d%%, Green %d%%, Blue %d%%"
))
,
311 scale_round (color->red, 100),
312 scale_round (color->green, 100),
313 scale_round (color->blue, 100));
314}
315
316static void
317remove_palette (CtkColorChooserWidget *cc)
318{
319 GList *children, *l;
320 CtkWidget *widget;
321
322 if (cc->priv->current != NULL((void*)0) &&
323 ctk_widget_get_parent (CTK_WIDGET (cc->priv->current)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->current)), ((ctk_widget_get_type ())))))
)
) != cc->priv->custom)
324 cc->priv->current = NULL((void*)0);
325
326 children = ctk_container_get_children (CTK_CONTAINER (cc->priv->palette)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->palette)), ((ctk_container_get_type ()))
))))
);
327 for (l = children; l; l = l->next)
328 {
329 widget = l->data;
330 if (widget == cc->priv->custom_label || widget == cc->priv->custom)
331 continue;
332 ctk_container_remove (CTK_CONTAINER (cc->priv->palette)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->palette)), ((ctk_container_get_type ()))
))))
, widget);
333 }
334 g_list_free (children);
335}
336
337static void
338add_palette (CtkColorChooserWidget *cc,
339 CtkOrientation orientation,
340 gint colors_per_line,
341 gint n_colors,
342 CdkRGBA *colors,
343 const gchar **names)
344{
345 CtkWidget *grid;
346 CtkWidget *p;
347 AtkObject *atk_obj;
348 gint line, pos;
349 gint i;
350 gint left, right;
351
352 if (colors == NULL((void*)0))
353 {
354 remove_palette (cc);
355 return;
356 }
357
358 grid = ctk_grid_new ();
359 ctk_widget_set_margin_bottom (grid, 12);
360 ctk_grid_set_row_spacing (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, 2);
361 ctk_grid_set_column_spacing (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, 4);
362 ctk_container_add (CTK_CONTAINER (cc->priv->palette)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->palette)), ((ctk_container_get_type ()))
))))
, grid);
363
364 left = 0;
365 right = colors_per_line - 1;
366 if (ctk_widget_get_direction (CTK_WIDGET (cc)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_widget_get_type ()))))))
) == CTK_TEXT_DIR_RTL)
367 {
368 i = left;
369 left = right;
370 right = i;
371 }
372
373 for (i = 0; i < n_colors; i++)
374 {
375 p = ctk_color_swatch_new ();
376 atk_obj = ctk_widget_get_accessible (p);
377 if (names)
378 {
379 atk_object_set_name (atk_obj,
380 g_dpgettext2 (GETTEXT_PACKAGE"ctk30", "Color name", names[i]));
381 }
382 else
383 {
384 gchar *text, *name;
385
386 name = accessible_color_name (&colors[i]);
387 text = g_strdup_printf (_("Color: %s")((char *) g_dgettext ("ctk30", "Color: %s")), name);
388 atk_object_set_name (atk_obj, text);
389 g_free (text);
390 g_free (name);
391 }
392 ctk_color_swatch_set_rgba (CTK_COLOR_SWATCH (p)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((p)), ((ctk_color_swatch_get_type ()))))))
, &colors[i]);
393 connect_swatch_signals (p, cc);
394
395 line = i / colors_per_line;
396 pos = i % colors_per_line;
397
398 if (orientation == CTK_ORIENTATION_HORIZONTAL)
399 {
400 if (pos == left)
401 ctk_style_context_add_class (ctk_widget_get_style_context (p), CTK_STYLE_CLASS_LEFT"left");
402 else if (pos == right)
403 ctk_style_context_add_class (ctk_widget_get_style_context (p), CTK_STYLE_CLASS_RIGHT"right");
404
405 ctk_grid_attach (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, p, pos, line, 1, 1);
406 }
407 else
408 {
409 if (pos == 0)
410 ctk_style_context_add_class (ctk_widget_get_style_context (p), CTK_STYLE_CLASS_TOP"top");
411 else if (pos == colors_per_line - 1)
412 ctk_style_context_add_class (ctk_widget_get_style_context (p), CTK_STYLE_CLASS_BOTTOM"bottom");
413
414 ctk_grid_attach (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, p, line, pos, 1, 1);
415 }
416 }
417
418 ctk_widget_show_all (grid);
419}
420
421static void
422remove_default_palette (CtkColorChooserWidget *cc)
423{
424 if (!cc->priv->has_default_palette)
425 return;
426
427 remove_palette (cc);
428 cc->priv->has_default_palette = FALSE(0);
429}
430
431static void
432add_default_palette (CtkColorChooserWidget *cc)
433{
434 const gchar *default_colors[9][5] = {
435 { "#99c1f1", "#62a0ea", "#3584e4", "#1c71d8", "#1a5fb4" }, /* Blue */
436 { "#8ff0a4", "#57e389", "#33d17a", "#2ec27e", "#26a269" }, /* Green */
437 { "#f9f06b", "#f8e45c", "#f6d32d", "#f5c211", "#e5a50a" }, /* Yellow */
438 { "#ffbe6f", "#ffa348", "#ff7800", "#e66100", "#c64600" }, /* Orange */
439 { "#f66151", "#ed333b", "#e01b24", "#c01c28", "#a51d2d" }, /* Red */
440 { "#dc8add", "#c061cb", "#9141ac", "#813d9c", "#613583" }, /* Purple */
441 { "#cdab8f", "#b5835a", "#986a44", "#865e3c", "#63452c" }, /* Brown */
442 { "#ffffff", "#f6f5f4", "#deddda", "#c0bfbc", "#9a9996" }, /* Light */
443 { "#77767b", "#5e5c64", "#3d3846", "#241f31", "#000000" } /* Dark */
444 };
445 const gchar *color_names[] = {
446 NC_("Color name", "Very Light Blue")("Very Light Blue"),
447 NC_("Color name", "Light Blue")("Light Blue"),
448 NC_("Color name", "Blue")("Blue"),
449 NC_("Color name", "Dark Blue")("Dark Blue"),
450 NC_("Color name", "Very Dark Blue")("Very Dark Blue"),
451 NC_("Color name", "Very Light Green")("Very Light Green"),
452 NC_("Color name", "Light Green")("Light Green"),
453 NC_("Color name", "Green")("Green"),
454 NC_("Color name", "Dark Green")("Dark Green"),
455 NC_("Color name", "Very Dark Green")("Very Dark Green"),
456 NC_("Color name", "Very Light Yellow")("Very Light Yellow"),
457 NC_("Color name", "Light Yellow")("Light Yellow"),
458 NC_("Color name", "Yellow")("Yellow"),
459 NC_("Color name", "Dark Yellow")("Dark Yellow"),
460 NC_("Color name", "Very Dark Yellow")("Very Dark Yellow"),
461 NC_("Color name", "Very Light Orange")("Very Light Orange"),
462 NC_("Color name", "Light Orange")("Light Orange"),
463 NC_("Color name", "Orange")("Orange"),
464 NC_("Color name", "Dark Orange")("Dark Orange"),
465 NC_("Color name", "Very Dark Orange")("Very Dark Orange"),
466 NC_("Color name", "Very Light Red")("Very Light Red"),
467 NC_("Color name", "Light Red")("Light Red"),
468 NC_("Color name", "Red")("Red"),
469 NC_("Color name", "Dark Red")("Dark Red"),
470 NC_("Color name", "Very Dark Red")("Very Dark Red"),
471 NC_("Color name", "Very Light Purple")("Very Light Purple"),
472 NC_("Color name", "Light Purple")("Light Purple"),
473 NC_("Color name", "Purple")("Purple"),
474 NC_("Color name", "Dark Purple")("Dark Purple"),
475 NC_("Color name", "Very Dark Purple")("Very Dark Purple"),
476 NC_("Color name", "Very Light Brown")("Very Light Brown"),
477 NC_("Color name", "Light Brown")("Light Brown"),
478 NC_("Color name", "Brown")("Brown"),
479 NC_("Color name", "Dark Brown")("Dark Brown"),
480 NC_("Color name", "Very Dark Brown")("Very Dark Brown"),
481 NC_("Color name", "White")("White"),
482 NC_("Color name", "Light Gray 1")("Light Gray 1"),
483 NC_("Color name", "Light Gray 2")("Light Gray 2"),
484 NC_("Color name", "Light Gray 3")("Light Gray 3"),
485 NC_("Color name", "Light Gray 4")("Light Gray 4"),
486 NC_("Color name", "Dark Gray 1")("Dark Gray 1"),
487 NC_("Color name", "Dark Gray 2")("Dark Gray 2"),
488 NC_("Color name", "Dark Gray 3")("Dark Gray 3"),
489 NC_("Color name", "Dark Gray 4")("Dark Gray 4"),
490 NC_("Color name", "Black")("Black"),
491 };
492 CdkRGBA colors[9*5];
493 gint i, j;
494
495 for (i = 0; i < 9; i++)
496 for (j = 0; j < 5; j++)
497 cdk_rgba_parse (&colors[i*5 + j], default_colors[i][j]);
498
499 add_palette (cc, CTK_ORIENTATION_VERTICAL, 5, 9*5, colors, color_names);
500
501 cc->priv->has_default_palette = TRUE(!(0));
502}
503
504static void
505ctk_color_chooser_widget_init (CtkColorChooserWidget *cc)
506{
507 CtkWidget *box;
508 CtkWidget *p;
509 CtkWidget *button;
510 CtkWidget *label;
511 gint i;
512 CdkRGBA color;
513 GVariant *variant;
514 GVariantIter iter;
515 gboolean selected;
516 AtkObject *atk_obj;
517 gchar *text, *name;
518
519 cc->priv = ctk_color_chooser_widget_get_instance_private (cc);
520
521 cc->priv->use_alpha = TRUE(!(0));
522
523 ctk_orientable_set_orientation (CTK_ORIENTABLE (cc)((((CtkOrientable*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_orientable_get_type ()))))))
, CTK_ORIENTATION_VERTICAL);
524 cc->priv->palette = ctk_box_new (CTK_ORIENTATION_VERTICAL, 0);
525 ctk_container_add (CTK_CONTAINER (cc)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_container_get_type ()))))))
, cc->priv->palette);
526
527 add_default_palette (cc);
528
529 cc->priv->custom = box = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 4);
530 g_object_set (box, "margin-top", 12, NULL((void*)0));
531 ctk_box_pack_end (CTK_BOX (cc->priv->palette)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->palette)), ((ctk_box_get_type ()))))))
, box, FALSE(0), TRUE(!(0)), 0);
532
533 /* translators: label for the custom section in the color chooser */
534 cc->priv->custom_label = label = ctk_label_new (_("Custom")((char *) g_dgettext ("ctk30", "Custom")));
535 ctk_widget_set_halign (label, CTK_ALIGN_START);
536 ctk_box_pack_end (CTK_BOX (cc->priv->palette)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->palette)), ((ctk_box_get_type ()))))))
, label, FALSE(0), TRUE(!(0)), 0);
537
538 cc->priv->button = button = ctk_color_swatch_new ();
539 ctk_widget_set_name (button, "add-color-button");
540 atk_obj = ctk_widget_get_accessible (button);
541 atk_object_set_name (atk_obj, _("Custom color")((char *) g_dgettext ("ctk30", "Custom color")));
542 atk_object_set_description (atk_obj, _("Create a custom color")((char *) g_dgettext ("ctk30", "Create a custom color")));
543 connect_button_signals (button, cc);
544 ctk_color_swatch_set_icon (CTK_COLOR_SWATCH (button)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), ((ctk_color_swatch_get_type ()))))))
, "list-add-symbolic");
545 ctk_color_swatch_set_selectable (CTK_COLOR_SWATCH (button)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), ((ctk_color_swatch_get_type ()))))))
, FALSE(0));
546 ctk_container_add (CTK_CONTAINER (box)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((box)), ((ctk_container_get_type ()))))))
, button);
547
548 cc->priv->settings = g_settings_new ("org.ctk.Settings.ColorChooser");
549 variant = g_settings_get_value (cc->priv->settings, "custom-colors");
550 g_variant_iter_init (&iter, variant);
551 i = 0;
552 p = NULL((void*)0);
553 while (g_variant_iter_loop (&iter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha))
554 {
555 i++;
556 p = ctk_color_swatch_new ();
557 ctk_color_swatch_set_rgba (CTK_COLOR_SWATCH (p)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((p)), ((ctk_color_swatch_get_type ()))))))
, &color);
558 ctk_color_swatch_set_can_drop (CTK_COLOR_SWATCH (p)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((p)), ((ctk_color_swatch_get_type ()))))))
, TRUE(!(0)));
559 atk_obj = ctk_widget_get_accessible (p);
560 name = accessible_color_name (&color);
561 text = g_strdup_printf (_("Custom color %d: %s")((char *) g_dgettext ("ctk30", "Custom color %d: %s")), i, name);
562 atk_object_set_name (atk_obj, text);
563 g_free (text);
564 g_free (name);
565 connect_custom_signals (p, cc);
566 ctk_container_add (CTK_CONTAINER (box)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((box)), ((ctk_container_get_type ()))))))
, p);
567
568 if (i == 9)
569 break;
This statement is never executed
570 }
571 g_variant_unref (variant);
572
573 cc->priv->editor = ctk_color_editor_new ();
574 ctk_widget_set_halign (cc->priv->editor, CTK_ALIGN_CENTER);
575 ctk_widget_set_hexpand (cc->priv->editor, TRUE(!(0)));
576 g_signal_connect (cc->priv->editor, "notify::rgba",g_signal_connect_data ((cc->priv->editor), ("notify::rgba"
), (((GCallback) (update_from_editor))), (cc), ((void*)0), (GConnectFlags
) 0)
577 G_CALLBACK (update_from_editor), cc)g_signal_connect_data ((cc->priv->editor), ("notify::rgba"
), (((GCallback) (update_from_editor))), (cc), ((void*)0), (GConnectFlags
) 0)
;
578
579 box = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 0);
580 ctk_container_add (CTK_CONTAINER (cc)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_container_get_type ()))))))
, box);
581 ctk_container_add (CTK_CONTAINER (box)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((box)), ((ctk_container_get_type ()))))))
, cc->priv->editor);
582
583 g_settings_get (cc->priv->settings, "selected-color", "(bdddd)",
584 &selected,
585 &color.red, &color.green, &color.blue, &color.alpha);
586 if (selected)
587 ctk_color_chooser_set_rgba (CTK_COLOR_CHOOSER (cc)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_color_chooser_get_type ()))))))
, &color);
588
589 ctk_widget_show_all (CTK_WIDGET (cc)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_widget_get_type ()))))))
);
590 ctk_widget_hide (CTK_WIDGET (cc->priv->editor)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->editor)), ((ctk_widget_get_type ()))))))
);
591 ctk_widget_hide (CTK_WIDGET (cc)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_widget_get_type ()))))))
);
592
593 ctk_widget_set_no_show_all (cc->priv->palette, TRUE(!(0)));
594 ctk_widget_set_no_show_all (cc->priv->editor, TRUE(!(0)));
595
596 cc->priv->size_group = ctk_size_group_new (CTK_SIZE_GROUP_HORIZONTAL);
597 ctk_size_group_add_widget (cc->priv->size_group, cc->priv->palette);
598 ctk_size_group_add_widget (cc->priv->size_group, box);
599}
600
601/* GObject implementation {{{1 */
602
603static void
604ctk_color_chooser_widget_get_property (GObject *object,
605 guint prop_id,
606 GValue *value,
607 GParamSpec *pspec)
608{
609 CtkColorChooserWidget *cw = CTK_COLOR_CHOOSER_WIDGET (object)((((CtkColorChooserWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((object)), ((ctk_color_chooser_widget_get_type
()))))))
;
610 CtkColorChooser *cc = CTK_COLOR_CHOOSER (object)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((ctk_color_chooser_get_type ()))))))
;
611
612 switch (prop_id)
613 {
614 case PROP_RGBA:
615 {
616 CdkRGBA color;
617
618 ctk_color_chooser_get_rgba (cc, &color);
619 g_value_set_boxed (value, &color);
620 }
621 break;
622 case PROP_USE_ALPHA:
623 g_value_set_boolean (value, cw->priv->use_alpha);
624 break;
625 case PROP_SHOW_EDITOR:
626 g_value_set_boolean (value, ctk_widget_get_visible (cw->priv->editor));
627 break;
628 default:
629 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec
*_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id
= ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'"
, "ctkcolorchooserwidget.c", 629, ("property"), _glib__property_id
, _glib__pspec->name, g_type_name ((((((GTypeClass*) (((GTypeInstance
*) (_glib__pspec))->g_class))->g_type)))), (g_type_name
((((((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class
))->g_type)))))); } while (0)
;
630 break;
631 }
632}
633
634static void
635ctk_color_chooser_widget_set_property (GObject *object,
636 guint prop_id,
637 const GValue *value,
638 GParamSpec *pspec)
639{
640 CtkColorChooserWidget *cc = CTK_COLOR_CHOOSER_WIDGET (object)((((CtkColorChooserWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((object)), ((ctk_color_chooser_widget_get_type
()))))))
;
641
642 switch (prop_id)
643 {
644 case PROP_RGBA:
645 ctk_color_chooser_set_rgba (CTK_COLOR_CHOOSER (cc)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc)), ((ctk_color_chooser_get_type ()))))))
,
646 g_value_get_boxed (value));
647 break;
648 case PROP_USE_ALPHA:
649 ctk_color_chooser_widget_set_use_alpha (cc,
650 g_value_get_boolean (value));
651 break;
652 case PROP_SHOW_EDITOR:
653 ctk_color_chooser_widget_set_show_editor (cc,
654 g_value_get_boolean (value));
655 break;
656 default:
657 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec
*_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id
= ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'"
, "ctkcolorchooserwidget.c", 657, ("property"), _glib__property_id
, _glib__pspec->name, g_type_name ((((((GTypeClass*) (((GTypeInstance
*) (_glib__pspec))->g_class))->g_type)))), (g_type_name
((((((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class
))->g_type)))))); } while (0)
;
658 break;
659 }
660}
661
662static void
663ctk_color_chooser_widget_finalize (GObject *object)
664{
665 CtkColorChooserWidget *cc = CTK_COLOR_CHOOSER_WIDGET (object)((((CtkColorChooserWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((object)), ((ctk_color_chooser_widget_get_type
()))))))
;
666
667 g_object_unref (cc->priv->size_group);
668 g_object_unref (cc->priv->settings);
669
670 G_OBJECT_CLASS (ctk_color_chooser_widget_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_color_chooser_widget_parent_class)), (((GType) ((20)
<< (2))))))))
->finalize (object);
671}
672
673static void
674ctk_color_chooser_widget_class_init (CtkColorChooserWidgetClass *class)
675{
676 GObjectClass *object_class = G_OBJECT_CLASS (class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((class)), (((GType) ((20) << (2))))))))
;
677
678 object_class->get_property = ctk_color_chooser_widget_get_property;
679 object_class->set_property = ctk_color_chooser_widget_set_property;
680 object_class->finalize = ctk_color_chooser_widget_finalize;
681
682 g_object_class_override_property (object_class, PROP_RGBA, "rgba");
683 g_object_class_override_property (object_class, PROP_USE_ALPHA, "use-alpha");
684
685 /**
686 * CtkColorChooserWidget:show-editor:
687 *
688 * The ::show-editor property is %TRUE when the color chooser
689 * is showing the single-color editor. It can be set to switch
690 * the color chooser into single-color editing mode.
691 *
692 * Since: 3.4
693 */
694 g_object_class_install_property (object_class, PROP_SHOW_EDITOR,
695 g_param_spec_boolean ("show-editor", P_("Show editor")g_dgettext("ctk30" "-properties","Show editor"), P_("Show editor")g_dgettext("ctk30" "-properties","Show editor"),
696 FALSE(0), CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
697
698 ctk_widget_class_set_css_name (CTK_WIDGET_CLASS (class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((class)), ((ctk_widget_get_type ()))))))
, "colorchooser");
699}
700
701/* CtkColorChooser implementation {{{1 */
702
703static void
704ctk_color_chooser_widget_get_rgba (CtkColorChooser *chooser,
705 CdkRGBA *color)
706{
707 CtkColorChooserWidget *cc = CTK_COLOR_CHOOSER_WIDGET (chooser)((((CtkColorChooserWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((chooser)), ((ctk_color_chooser_widget_get_type
()))))))
;
708
709 if (ctk_widget_get_visible (cc->priv->editor))
710 ctk_color_chooser_get_rgba (CTK_COLOR_CHOOSER (cc->priv->editor)((((CtkColorChooser*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->editor)), ((ctk_color_chooser_get_type (
)))))))
, color);
711 else if (cc->priv->current)
712 ctk_color_swatch_get_rgba (cc->priv->current, color);
713 else
714 {
715 color->red = 1.0;
716 color->green = 1.0;
717 color->blue = 1.0;
718 color->alpha = 1.0;
719 }
720
721 if (!cc->priv->use_alpha)
722 color->alpha = 1.0;
723}
724
725static void
726add_custom_color (CtkColorChooserWidget *cc,
727 const CdkRGBA *color)
728{
729 CtkWidget *last;
730 CtkWidget *p;
731 GList *children;
732
733 children = ctk_container_get_children (CTK_CONTAINER (cc->priv->custom)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->custom)), ((ctk_container_get_type ())))
)))
);
734 if (g_list_length (children) >= 9)
735 {
736 last = g_list_last (children)->data;
737 if (last == CTK_WIDGET (cc->priv->current)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->current)), ((ctk_widget_get_type ())))))
)
)
738 cc->priv->current = NULL((void*)0);
739
740 ctk_widget_destroy (last);
741 }
742
743 g_list_free (children);
744
745 p = ctk_color_swatch_new ();
746 ctk_color_swatch_set_rgba (CTK_COLOR_SWATCH (p)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((p)), ((ctk_color_swatch_get_type ()))))))
, color);
747 ctk_color_swatch_set_can_drop (CTK_COLOR_SWATCH (p)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((p)), ((ctk_color_swatch_get_type ()))))))
, TRUE(!(0)));
748 connect_custom_signals (p, cc);
749
750 ctk_container_add (CTK_CONTAINER (cc->priv->custom)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->custom)), ((ctk_container_get_type ())))
)))
, p);
751 ctk_box_reorder_child (CTK_BOX (cc->priv->custom)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->custom)), ((ctk_box_get_type ()))))))
, p, 1);
752 ctk_widget_show (p);
753
754 select_swatch (cc, CTK_COLOR_SWATCH (p)((((CtkColorSwatch*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((p)), ((ctk_color_swatch_get_type ()))))))
);
755 save_custom_colors (cc);
756}
757
758static void
759ctk_color_chooser_widget_set_rgba (CtkColorChooser *chooser,
760 const CdkRGBA *color)
761{
762 CtkColorChooserWidget *cc = CTK_COLOR_CHOOSER_WIDGET (chooser)((((CtkColorChooserWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((chooser)), ((ctk_color_chooser_widget_get_type
()))))))
;
763 GList *children, *l;
764 GList *palettes, *p;
765 CtkColorSwatch *swatch;
766 CtkWidget *w;
767 CdkRGBA c;
768
769 palettes = ctk_container_get_children (CTK_CONTAINER (cc->priv->palette)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cc->priv->palette)), ((ctk_container_get_type ()))
))))
);
770 for (p = palettes; p; p = p->next)
771 {
772 w = p->data;
773 if (!CTK_IS_GRID (w)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(w)); GType __t = ((ctk_grid_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; }))))
&& !CTK_IS_BOX (w)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(w)); GType __t = ((ctk_box_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; }))))
)
774 continue;
775
776 children = ctk_container_get_children (CTK_CONTAINER (w)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((w)), ((ctk_container_get_type ()))))))
);
777 for (l = children; l; l = l->next)
778 {
779 swatch = l->data;
780 ctk_color_swatch_get_rgba (swatch, &c);
781 if (!cc->priv->use_alpha)
782 c.alpha = color->alpha;
783 if (cdk_rgba_equal (color, &c))
784 {
785 select_swatch (cc, swatch);
786 g_list_free (children);
787 g_list_free (palettes);
788 return;
789 }
790 }
791 g_list_free (children);
792 }
793 g_list_free (palettes);
794
795 add_custom_color (cc, color);
796}
797
798static void
799ctk_color_chooser_widget_add_palette (CtkColorChooser *chooser,
800 CtkOrientation orientation,
801 gint colors_per_line,
802 gint n_colors,
803 CdkRGBA *colors)
804{
805 CtkColorChooserWidget *cc = CTK_COLOR_CHOOSER_WIDGET (chooser)((((CtkColorChooserWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((chooser)), ((ctk_color_chooser_widget_get_type
()))))))
;
806
807 remove_default_palette (cc);
808 add_palette (cc, orientation, colors_per_line, n_colors, colors, NULL((void*)0));
809}
810
811static void
812ctk_color_chooser_widget_iface_init (CtkColorChooserInterface *iface)
813{
814 iface->get_rgba = ctk_color_chooser_widget_get_rgba;
815 iface->set_rgba = ctk_color_chooser_widget_set_rgba;
816 iface->add_palette = ctk_color_chooser_widget_add_palette;
817}
818
819/* Public API {{{1 */
820
821/**
822 * ctk_color_chooser_widget_new:
823 *
824 * Creates a new #CtkColorChooserWidget.
825 *
826 * Returns: a new #CtkColorChooserWidget
827 *
828 * Since: 3.4
829 */
830CtkWidget *
831ctk_color_chooser_widget_new (void)
832{
833 return g_object_new (CTK_TYPE_COLOR_CHOOSER_WIDGET(ctk_color_chooser_widget_get_type ()), NULL((void*)0));
834}
835
836/* vim:set foldmethod=marker: */