Bug Summary

File:ctk/ctkcolorsel.c
Warning:line 1298, column 11
Null pointer passed to 1st parameter expecting 'nonnull'

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 ctkcolorsel.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/ctk -resource-dir /usr/lib/llvm-16/lib/clang/16 -D HAVE_CONFIG_H -I . -I .. -D G_LOG_DOMAIN="Ctk" -D G_LOG_USE_STRUCTURED=1 -D CTK_VERSION="3.25.5" -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/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -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/atk-1.0 -I /usr/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/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/gio-unix-2.0 -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 -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 -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/14/../../../../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/ctk -ferror-limit 19 -fvisibility=hidden -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-09-19-172619-43637-1 -x c ctkcolorsel.c
1/* CTK - The GIMP Toolkit
2 * Copyright (C) 2000 Red Hat, Inc.
3 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
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/*
20 * Modified by the CTK+ Team and others 1997-2001. See the AUTHORS
21 * file for a list of people on the CTK+ Team. See the ChangeLog
22 * files for a list of changes. These files are distributed with
23 * CTK+ at ftp://ftp.ctk.org/pub/ctk/.
24 */
25
26#include "config.h"
27
28#include "ctkcolorsel.h"
29
30#include <math.h>
31#include <string.h>
32
33#include "cdk/cdk.h"
34#include "ctkadjustment.h"
35#include "ctkorientable.h"
36#include "ctkhsv.h"
37#include "ctkwindowgroup.h"
38#include "ctkselection.h"
39#include "ctkcolorutils.h"
40#include "ctkdnd.h"
41#include "ctkdragsource.h"
42#include "ctkdragdest.h"
43#include "ctkdrawingarea.h"
44#include "ctkframe.h"
45#include "ctkgrid.h"
46#include "ctklabel.h"
47#include "ctkmarshalers.h"
48#include "ctkimage.h"
49#include "ctkspinbutton.h"
50#include "ctkrange.h"
51#include "ctkscale.h"
52#include "ctkentry.h"
53#include "ctkbutton.h"
54#include "ctkmenuitem.h"
55#include "ctkmain.h"
56#include "ctksettings.h"
57#include "ctkstock.h"
58#include "ctkaccessible.h"
59#include "ctksizerequest.h"
60#include "ctkseparator.h"
61#include "ctkprivate.h"
62#include "ctkintl.h"
63
64
65/**
66 * SECTION:ctkcolorsel
67 * @Short_description: Widget used to select a color
68 * @Title: CtkColorSelection
69 *
70 * The #CtkColorSelection is a widget that is used to select
71 * a color. It consists of a color wheel and number of sliders
72 * and entry boxes for color parameters such as hue, saturation,
73 * value, red, green, blue, and opacity. It is found on the standard
74 * color selection dialog box #CtkColorSelectionDialog.
75 */
76
77
78/* Keep it in sync with ctksettings.c:default_color_palette */
79#define DEFAULT_COLOR_PALETTE"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90" "black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90"
80
81/* Number of elements in the custom palatte */
82#define CTK_CUSTOM_PALETTE_WIDTH10 10
83#define CTK_CUSTOM_PALETTE_HEIGHT2 2
84
85#define CUSTOM_PALETTE_ENTRY_WIDTH20 20
86#define CUSTOM_PALETTE_ENTRY_HEIGHT20 20
87
88/* The cursor for the dropper */
89#define DROPPER_WIDTH17 17
90#define DROPPER_HEIGHT17 17
91#define DROPPER_STRIDE(17 * 4) (DROPPER_WIDTH17 * 4)
92#define DROPPER_X_HOT2 2
93#define DROPPER_Y_HOT16 16
94
95#define SAMPLE_WIDTH64 64
96#define SAMPLE_HEIGHT28 28
97#define CHECK_SIZE16 16
98#define BIG_STEP20 20
99
100/* Conversion between 0->1 double and and guint16. See
101 * scale_round() below for more general conversions
102 */
103#define SCALE(i)(i / 65535.) (i / 65535.)
104#define UNSCALE(d)((guint16)(d * 65535 + 0.5)) ((guint16)(d * 65535 + 0.5))
105#define INTENSITY(r, g, b)((r) * 0.30 + (g) * 0.59 + (b) * 0.11) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11)
106
107enum {
108 COLOR_CHANGED,
109 LAST_SIGNAL
110};
111
112enum {
113 PROP_0,
114 PROP_HAS_PALETTE,
115 PROP_HAS_OPACITY_CONTROL,
116 PROP_CURRENT_COLOR,
117 PROP_CURRENT_ALPHA,
118 PROP_CURRENT_RGBA
119};
120
121enum {
122 COLORSEL_RED = 0,
123 COLORSEL_GREEN = 1,
124 COLORSEL_BLUE = 2,
125 COLORSEL_OPACITY = 3,
126 COLORSEL_HUE,
127 COLORSEL_SATURATION,
128 COLORSEL_VALUE,
129 COLORSEL_NUM_CHANNELS
130};
131
132
133struct _CtkColorSelectionPrivate
134{
135 guint has_opacity : 1;
136 guint has_palette : 1;
137 guint changing : 1;
138 guint default_set : 1;
139 guint default_alpha_set : 1;
140 guint has_grab : 1;
141
142 gdouble color[COLORSEL_NUM_CHANNELS];
143 gdouble old_color[COLORSEL_NUM_CHANNELS];
144
145 CtkWidget *triangle_colorsel;
146 CtkWidget *hue_spinbutton;
147 CtkWidget *sat_spinbutton;
148 CtkWidget *val_spinbutton;
149 CtkWidget *red_spinbutton;
150 CtkWidget *green_spinbutton;
151 CtkWidget *blue_spinbutton;
152 CtkWidget *opacity_slider;
153 CtkWidget *opacity_label;
154 CtkWidget *opacity_entry;
155 CtkWidget *palette_frame;
156 CtkWidget *hex_entry;
157
158 /* The Palette code */
159 CtkWidget *custom_palette [CTK_CUSTOM_PALETTE_WIDTH10][CTK_CUSTOM_PALETTE_HEIGHT2];
160
161 /* The color_sample stuff */
162 CtkWidget *sample_area;
163 CtkWidget *old_sample;
164 CtkWidget *cur_sample;
165 CtkWidget *colorsel;
166
167 /* Window for grabbing on */
168 CtkWidget *dropper_grab_widget;
169 guint32 grab_time;
170 CdkDevice *keyboard_device;
171 CdkDevice *pointer_device;
172
173 /* Connection to settings */
174 gulong settings_connection;
175};
176
177
178static void ctk_color_selection_destroy (CtkWidget *widget);
179static void ctk_color_selection_finalize (GObject *object);
180static void update_color (CtkColorSelection *colorsel);
181static void ctk_color_selection_set_property (GObject *object,
182 guint prop_id,
183 const GValue *value,
184 GParamSpec *pspec);
185static void ctk_color_selection_get_property (GObject *object,
186 guint prop_id,
187 GValue *value,
188 GParamSpec *pspec);
189
190static void ctk_color_selection_realize (CtkWidget *widget);
191static void ctk_color_selection_unrealize (CtkWidget *widget);
192static void ctk_color_selection_show_all (CtkWidget *widget);
193static gboolean ctk_color_selection_grab_broken (CtkWidget *widget,
194 CdkEventGrabBroken *event);
195
196static void ctk_color_selection_set_palette_color (CtkColorSelection *colorsel,
197 gint index,
198 CdkColor *color);
199static void set_focus_line_attributes (CtkWidget *drawing_area,
200 cairo_t *cr,
201 gint *focus_width);
202static void default_noscreen_change_palette_func (const CdkColor *colors,
203 gint n_colors);
204static void default_change_palette_func (CdkScreen *screen,
205 const CdkColor *colors,
206 gint n_colors);
207static void make_control_relations (AtkObject *atk_obj,
208 CtkWidget *widget);
209static void make_all_relations (AtkObject *atk_obj,
210 CtkColorSelectionPrivate *priv);
211
212static void hsv_changed (CtkWidget *hsv,
213 gpointer data);
214static void get_screen_color (CtkWidget *button);
215static void adjustment_changed (CtkAdjustment *adjustment,
216 gpointer data);
217static void opacity_entry_changed (CtkWidget *opacity_entry,
218 gpointer data);
219static void hex_changed (CtkWidget *hex_entry,
220 gpointer data);
221static gboolean hex_focus_out (CtkWidget *hex_entry,
222 CdkEventFocus *event,
223 gpointer data);
224static void color_sample_new (CtkColorSelection *colorsel);
225static void make_label_spinbutton (CtkColorSelection *colorsel,
226 CtkWidget **spinbutton,
227 gchar *text,
228 CtkWidget *table,
229 gint i,
230 gint j,
231 gint channel_type,
232 const gchar *tooltip);
233static void make_palette_frame (CtkColorSelection *colorsel,
234 CtkWidget *table,
235 gint i,
236 gint j);
237static void set_selected_palette (CtkColorSelection *colorsel,
238 int x,
239 int y);
240static void set_focus_line_attributes (CtkWidget *drawing_area,
241 cairo_t *cr,
242 gint *focus_width);
243static gboolean mouse_press (CtkWidget *invisible,
244 CdkEventButton *event,
245 gpointer data);
246static void palette_change_notify_instance (GObject *object,
247 GParamSpec *pspec,
248 gpointer data);
249static void update_palette (CtkColorSelection *colorsel);
250static void shutdown_eyedropper (CtkWidget *widget);
251
252static guint color_selection_signals[LAST_SIGNAL] = { 0 };
253
254static CtkColorSelectionChangePaletteFunc noscreen_change_palette_hook = default_noscreen_change_palette_func;
255static CtkColorSelectionChangePaletteWithScreenFunc change_palette_hook = default_change_palette_func;
256
257static const guchar dropper_bits[] = {
258 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
259 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377"
260 "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
261 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\0\0\0\377"
262 "\0\0\0\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
263 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377"
264 "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\377"
265 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377"
266 "\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\377\0\0"
267 "\0\377\0\0\0\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0"
268 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\0\0\0\377\0\0\0\377\0"
269 "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377"
270 "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
271 "\377\377\377\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
272 "\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
273 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\0\0\0\377\0\0"
274 "\0\377\0\0\0\377\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0"
275 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377"
276 "\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\377\377\377"
277 "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
278 "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377\377"
279 "\0\0\0\377\377\377\377\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0"
280 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377"
281 "\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\377\377"
282 "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
283 "\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0"
284 "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
285 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377"
286 "\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
287 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377"
288 "\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0"
289 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
290 "\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0"
291 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
292 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\0\0"
293 "\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
294 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\377\0\0\0"
295 "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
296 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0"
297 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
298 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
299
300G_DEFINE_TYPE_WITH_PRIVATE (CtkColorSelection, ctk_color_selection, CTK_TYPE_BOX)static void ctk_color_selection_init (CtkColorSelection *self
); static void ctk_color_selection_class_init (CtkColorSelectionClass
*klass); static GType ctk_color_selection_get_type_once (void
); static gpointer ctk_color_selection_parent_class = ((void*
)0); static gint CtkColorSelection_private_offset; static void
ctk_color_selection_class_intern_init (gpointer klass) { ctk_color_selection_parent_class
= g_type_class_peek_parent (klass); if (CtkColorSelection_private_offset
!= 0) g_type_class_adjust_private_offset (klass, &CtkColorSelection_private_offset
); ctk_color_selection_class_init ((CtkColorSelectionClass*) klass
); } __attribute__ ((__unused__)) static inline gpointer ctk_color_selection_get_instance_private
(CtkColorSelection *self) { return (((gpointer) ((guint8*) (
self) + (glong) (CtkColorSelection_private_offset)))); } GType
ctk_color_selection_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_selection_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_selection_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
((ctk_box_get_type ()), g_intern_static_string ("CtkColorSelection"
), sizeof (CtkColorSelectionClass), (GClassInitFunc)(void (*)
(void)) ctk_color_selection_class_intern_init, sizeof (CtkColorSelection
), (GInstanceInitFunc)(void (*)(void)) ctk_color_selection_init
, (GTypeFlags) 0); { {{ CtkColorSelection_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (CtkColorSelectionPrivate)); };} }
return g_define_type_id; }
301
302static void
303ctk_color_selection_class_init (CtkColorSelectionClass *klass)
304{
305 GObjectClass *gobject_class;
306 CtkWidgetClass *widget_class;
307
308 gobject_class = G_OBJECT_CLASS (klass)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((klass)), (((GType) ((20) << (2))))))))
;
309 gobject_class->finalize = ctk_color_selection_finalize;
310 gobject_class->set_property = ctk_color_selection_set_property;
311 gobject_class->get_property = ctk_color_selection_get_property;
312
313 widget_class = CTK_WIDGET_CLASS (klass)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((klass)), ((ctk_widget_get_type ()))))))
;
314 widget_class->destroy = ctk_color_selection_destroy;
315 widget_class->realize = ctk_color_selection_realize;
316 widget_class->unrealize = ctk_color_selection_unrealize;
317 widget_class->show_all = ctk_color_selection_show_all;
318 widget_class->grab_broken_event = ctk_color_selection_grab_broken;
319
320 g_object_class_install_property (gobject_class,
321 PROP_HAS_OPACITY_CONTROL,
322 g_param_spec_boolean ("has-opacity-control",
323 P_("Has Opacity Control")g_dgettext("ctk30" "-properties","Has Opacity Control"),
324 P_("Whether the color selector should allow setting opacity")g_dgettext("ctk30" "-properties","Whether the color selector should allow setting opacity"
)
,
325 FALSE(0),
326 CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
327 g_object_class_install_property (gobject_class,
328 PROP_HAS_PALETTE,
329 g_param_spec_boolean ("has-palette",
330 P_("Has palette")g_dgettext("ctk30" "-properties","Has palette"),
331 P_("Whether a palette should be used")g_dgettext("ctk30" "-properties","Whether a palette should be used"
)
,
332 FALSE(0),
333 CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
334
335 /**
336 * CtkColorSelection:current-color:
337 *
338 * The current CdkColor color.
339 */
340 g_object_class_install_property (gobject_class,
341 PROP_CURRENT_COLOR,
342 g_param_spec_boxed ("current-color",
343 P_("Current Color")g_dgettext("ctk30" "-properties","Current Color"),
344 P_("The current color")g_dgettext("ctk30" "-properties","The current color"),
345 CDK_TYPE_COLOR(cdk_color_get_type ()),
346 CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
347 g_object_class_install_property (gobject_class,
348 PROP_CURRENT_ALPHA,
349 g_param_spec_uint ("current-alpha",
350 P_("Current Alpha")g_dgettext("ctk30" "-properties","Current Alpha"),
351 P_("The current opacity value (0 fully transparent, 65535 fully opaque)")g_dgettext("ctk30" "-properties","The current opacity value (0 fully transparent, 65535 fully opaque)"
)
,
352 0, 65535, 65535,
353 CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
354
355 /**
356 * CtkColorSelection:current-rgba:
357 *
358 * The current RGBA color.
359 *
360 * Since: 3.0
361 */
362 g_object_class_install_property (gobject_class,
363 PROP_CURRENT_RGBA,
364 g_param_spec_boxed ("current-rgba",
365 P_("Current RGBA")g_dgettext("ctk30" "-properties","Current RGBA"),
366 P_("The current RGBA color")g_dgettext("ctk30" "-properties","The current RGBA color"),
367 CDK_TYPE_RGBA(cdk_rgba_get_type ()),
368 CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
369
370 /**
371 * CtkColorSelection::color-changed:
372 * @colorselection: the object which received the signal.
373 *
374 * This signal is emitted when the color changes in the #CtkColorSelection
375 * according to its update policy.
376 */
377 color_selection_signals[COLOR_CHANGED] =
378 g_signal_new (I_("color-changed")g_intern_static_string ("color-changed"),
379 G_OBJECT_CLASS_TYPE (gobject_class)((((GTypeClass*) (gobject_class))->g_type)),
380 G_SIGNAL_RUN_FIRST,
381 G_STRUCT_OFFSET (CtkColorSelectionClass, color_changed)((glong) __builtin_offsetof(CtkColorSelectionClass, color_changed
))
,
382 NULL((void*)0), NULL((void*)0),
383 NULL((void*)0),
384 G_TYPE_NONE((GType) ((1) << (2))), 0);
385}
386
387static void
388ctk_color_selection_init (CtkColorSelection *colorsel)
389{
390 CtkWidget *top_hbox;
391 CtkWidget *top_right_vbox;
392 CtkWidget *table, *label, *hbox, *frame, *vbox, *button;
393 CtkAdjustment *adjust;
394 CtkWidget *picker_image;
395 gint i, j;
396 CtkColorSelectionPrivate *priv;
397 AtkObject *atk_obj;
398 GList *focus_chain = NULL((void*)0);
399
400 ctk_orientable_set_orientation (CTK_ORIENTABLE (colorsel)((((CtkOrientable*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), ((ctk_orientable_get_type ()))))))
,
401 CTK_ORIENTATION_VERTICAL);
402
403 ctk_widget_push_composite_child ();
404
405 priv = colorsel->private_data = ctk_color_selection_get_instance_private (colorsel);
406 priv->changing = FALSE(0);
407 priv->default_set = FALSE(0);
408 priv->default_alpha_set = FALSE(0);
409
410 top_hbox = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 12);
411 ctk_box_pack_start (CTK_BOX (colorsel)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), ((ctk_box_get_type ()))))))
, top_hbox, FALSE(0), FALSE(0), 0);
412
413 vbox = ctk_box_new (CTK_ORIENTATION_VERTICAL, 6);
414 priv->triangle_colorsel = ctk_hsv_new ();
415 g_signal_connect (priv->triangle_colorsel, "changed",g_signal_connect_data ((priv->triangle_colorsel), ("changed"
), (((GCallback) (hsv_changed))), (colorsel), ((void*)0), (GConnectFlags
) 0)
416 G_CALLBACK (hsv_changed), colorsel)g_signal_connect_data ((priv->triangle_colorsel), ("changed"
), (((GCallback) (hsv_changed))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
417 ctk_hsv_set_metrics (CTK_HSV (priv->triangle_colorsel)((((CtkHSV*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->triangle_colorsel)), ((ctk_hsv_get_type ())))))
)
, 174, 15);
418 ctk_box_pack_start (CTK_BOX (top_hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((top_hbox)), ((ctk_box_get_type ()))))))
, vbox, FALSE(0), FALSE(0), 0);
419 ctk_box_pack_start (CTK_BOX (vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((vbox)), ((ctk_box_get_type ()))))))
, priv->triangle_colorsel, FALSE(0), FALSE(0), 0);
420 ctk_widget_set_tooltip_text (priv->triangle_colorsel,
421 _("Select the color you want from the outer ring. "((char *) g_dgettext ("ctk30", "Select the color you want from the outer ring. "
"Select the darkness or lightness of that color " "using the inner triangle."
))
422 "Select the darkness or lightness of that color "((char *) g_dgettext ("ctk30", "Select the color you want from the outer ring. "
"Select the darkness or lightness of that color " "using the inner triangle."
))
423 "using the inner triangle.")((char *) g_dgettext ("ctk30", "Select the color you want from the outer ring. "
"Select the darkness or lightness of that color " "using the inner triangle."
))
);
424
425 hbox = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 6);
426 ctk_box_pack_end (CTK_BOX (vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((vbox)), ((ctk_box_get_type ()))))))
, hbox, FALSE(0), FALSE(0), 0);
427
428 frame = ctk_frame_new (NULL((void*)0));
429 ctk_widget_set_size_request (frame, -1, 30);
430 ctk_frame_set_shadow_type (CTK_FRAME (frame)((((CtkFrame*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((frame)), ((ctk_frame_get_type ()))))))
, CTK_SHADOW_IN);
431 color_sample_new (colorsel);
432 ctk_container_add (CTK_CONTAINER (frame)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((frame)), ((ctk_container_get_type ()))))))
, priv->sample_area);
433 ctk_box_pack_start (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((hbox)), ((ctk_box_get_type ()))))))
, frame, TRUE(!(0)), TRUE(!(0)), 0);
434
435 button = ctk_button_new ();
436
437 ctk_widget_set_events (button, CDK_POINTER_MOTION_MASK | CDK_POINTER_MOTION_HINT_MASK);
438 g_object_set_data (G_OBJECT (button)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), (((GType) ((20) << (2))))))))
, I_("COLORSEL")g_intern_static_string ("COLORSEL"), colorsel);
439 g_signal_connect (button, "clicked",g_signal_connect_data ((button), ("clicked"), (((GCallback) (
get_screen_color))), (((void*)0)), ((void*)0), (GConnectFlags
) 0)
440 G_CALLBACK (get_screen_color), NULL)g_signal_connect_data ((button), ("clicked"), (((GCallback) (
get_screen_color))), (((void*)0)), ((void*)0), (GConnectFlags
) 0)
;
441 picker_image = ctk_image_new_from_stock (CTK_STOCK_COLOR_PICKER((CtkStock)"ctk-color-picker"), CTK_ICON_SIZE_BUTTON);
442 ctk_container_add (CTK_CONTAINER (button)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), ((ctk_container_get_type ()))))))
, picker_image);
443 ctk_widget_show (CTK_WIDGET (picker_image)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((picker_image)), ((ctk_widget_get_type ()))))))
);
444 ctk_box_pack_end (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((hbox)), ((ctk_box_get_type ()))))))
, button, FALSE(0), FALSE(0), 0);
445
446 ctk_widget_set_tooltip_text (button,
447 _("Click the eyedropper, then click a color "((char *) g_dgettext ("ctk30", "Click the eyedropper, then click a color "
"anywhere on your screen to select that color."))
448 "anywhere on your screen to select that color.")((char *) g_dgettext ("ctk30", "Click the eyedropper, then click a color "
"anywhere on your screen to select that color."))
);
449
450 top_right_vbox = ctk_box_new (CTK_ORIENTATION_VERTICAL, 6);
451 ctk_box_pack_start (CTK_BOX (top_hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((top_hbox)), ((ctk_box_get_type ()))))))
, top_right_vbox, FALSE(0), FALSE(0), 0);
452 table = ctk_grid_new ();
453 ctk_box_pack_start (CTK_BOX (top_right_vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((top_right_vbox)), ((ctk_box_get_type ()))))))
, table, FALSE(0), FALSE(0), 0);
454 ctk_grid_set_row_spacing (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, 6);
455 ctk_grid_set_column_spacing (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, 12);
456
457 make_label_spinbutton (colorsel, &priv->hue_spinbutton, _("_Hue:")((char *) g_dgettext ("ctk30", "_Hue:")), table, 0, 0, COLORSEL_HUE,
458 _("Position on the color wheel.")((char *) g_dgettext ("ctk30", "Position on the color wheel."
))
);
459 ctk_spin_button_set_wrap (CTK_SPIN_BUTTON (priv->hue_spinbutton)((((CtkSpinButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->hue_spinbutton)), ((ctk_spin_button_get_type ()
))))))
, TRUE(!(0)));
460 make_label_spinbutton (colorsel, &priv->sat_spinbutton, _("S_aturation:")((char *) g_dgettext ("ctk30", "S_aturation:")), table, 0, 1, COLORSEL_SATURATION,
461 _("Intensity of the color.")((char *) g_dgettext ("ctk30", "Intensity of the color.")));
462 make_label_spinbutton (colorsel, &priv->val_spinbutton, _("_Value:")((char *) g_dgettext ("ctk30", "_Value:")), table, 0, 2, COLORSEL_VALUE,
463 _("Brightness of the color.")((char *) g_dgettext ("ctk30", "Brightness of the color.")));
464 make_label_spinbutton (colorsel, &priv->red_spinbutton, _("_Red:")((char *) g_dgettext ("ctk30", "_Red:")), table, 6, 0, COLORSEL_RED,
465 _("Amount of red light in the color.")((char *) g_dgettext ("ctk30", "Amount of red light in the color."
))
);
466 make_label_spinbutton (colorsel, &priv->green_spinbutton, _("_Green:")((char *) g_dgettext ("ctk30", "_Green:")), table, 6, 1, COLORSEL_GREEN,
467 _("Amount of green light in the color.")((char *) g_dgettext ("ctk30", "Amount of green light in the color."
))
);
468 make_label_spinbutton (colorsel, &priv->blue_spinbutton, _("_Blue:")((char *) g_dgettext ("ctk30", "_Blue:")), table, 6, 2, COLORSEL_BLUE,
469 _("Amount of blue light in the color.")((char *) g_dgettext ("ctk30", "Amount of blue light in the color."
))
);
470 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, ctk_separator_new (CTK_ORIENTATION_HORIZONTAL), 0, 3, 8, 1);
471
472 priv->opacity_label = ctk_label_new_with_mnemonic (_("Op_acity:")((char *) g_dgettext ("ctk30", "Op_acity:")));
473 ctk_widget_set_halign (priv->opacity_label, CTK_ALIGN_START);
474 ctk_widget_set_valign (priv->opacity_label, CTK_ALIGN_CENTER);
475 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, priv->opacity_label, 0, 4, 1, 1);
476 adjust = ctk_adjustment_new (0.0, 0.0, 255.0, 1.0, 1.0, 0.0);
477 g_object_set_data (G_OBJECT (adjust)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((adjust)), (((GType) ((20) << (2))))))))
, I_("COLORSEL")g_intern_static_string ("COLORSEL"), colorsel);
478 priv->opacity_slider = ctk_scale_new (CTK_ORIENTATION_HORIZONTAL, adjust);
479 ctk_widget_set_tooltip_text (priv->opacity_slider,
480 _("Transparency of the color.")((char *) g_dgettext ("ctk30", "Transparency of the color.")));
481 ctk_label_set_mnemonic_widget (CTK_LABEL (priv->opacity_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->opacity_label)), ((ctk_label_get_type ()))))))
,
482 priv->opacity_slider);
483 ctk_scale_set_draw_value (CTK_SCALE (priv->opacity_slider)((((CtkScale*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->opacity_slider)), ((ctk_scale_get_type ()))))))
, FALSE(0));
484 g_signal_connect (adjust, "value-changed",g_signal_connect_data ((adjust), ("value-changed"), (((GCallback
) (adjustment_changed))), (((gpointer) (glong) (COLORSEL_OPACITY
))), ((void*)0), (GConnectFlags) 0)
485 G_CALLBACK (adjustment_changed),g_signal_connect_data ((adjust), ("value-changed"), (((GCallback
) (adjustment_changed))), (((gpointer) (glong) (COLORSEL_OPACITY
))), ((void*)0), (GConnectFlags) 0)
486 GINT_TO_POINTER (COLORSEL_OPACITY))g_signal_connect_data ((adjust), ("value-changed"), (((GCallback
) (adjustment_changed))), (((gpointer) (glong) (COLORSEL_OPACITY
))), ((void*)0), (GConnectFlags) 0)
;
487 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, priv->opacity_slider, 1, 4, 6, 1);
488 priv->opacity_entry = ctk_entry_new ();
489 ctk_widget_set_tooltip_text (priv->opacity_entry,
490 _("Transparency of the color.")((char *) g_dgettext ("ctk30", "Transparency of the color.")));
491 ctk_widget_set_size_request (priv->opacity_entry, 40, -1);
492
493 g_signal_connect (priv->opacity_entry, "activate",g_signal_connect_data ((priv->opacity_entry), ("activate")
, (((GCallback) (opacity_entry_changed))), (colorsel), ((void
*)0), (GConnectFlags) 0)
494 G_CALLBACK (opacity_entry_changed), colorsel)g_signal_connect_data ((priv->opacity_entry), ("activate")
, (((GCallback) (opacity_entry_changed))), (colorsel), ((void
*)0), (GConnectFlags) 0)
;
495 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, priv->opacity_entry, 7, 4, 1, 1);
496
497 label = ctk_label_new_with_mnemonic (_("Color _name:")((char *) g_dgettext ("ctk30", "Color _name:")));
498 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, label, 0, 5, 1, 1);
499 ctk_widget_set_halign (label, CTK_ALIGN_START);
500 ctk_widget_set_valign (label, CTK_ALIGN_CENTER);
501 priv->hex_entry = ctk_entry_new ();
502
503 ctk_label_set_mnemonic_widget (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_label_get_type ()))))))
, priv->hex_entry);
504
505 g_signal_connect (priv->hex_entry, "activate",g_signal_connect_data ((priv->hex_entry), ("activate"), ((
(GCallback) (hex_changed))), (colorsel), ((void*)0), (GConnectFlags
) 0)
506 G_CALLBACK (hex_changed), colorsel)g_signal_connect_data ((priv->hex_entry), ("activate"), ((
(GCallback) (hex_changed))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
507
508 g_signal_connect (priv->hex_entry, "focus-out-event",g_signal_connect_data ((priv->hex_entry), ("focus-out-event"
), (((GCallback) (hex_focus_out))), (colorsel), ((void*)0), (
GConnectFlags) 0)
509 G_CALLBACK (hex_focus_out), colorsel)g_signal_connect_data ((priv->hex_entry), ("focus-out-event"
), (((GCallback) (hex_focus_out))), (colorsel), ((void*)0), (
GConnectFlags) 0)
;
510
511 ctk_widget_set_tooltip_text (priv->hex_entry,
512 _("You can enter an HTML-style hexadecimal color "((char *) g_dgettext ("ctk30", "You can enter an HTML-style hexadecimal color "
"value, or simply a color name such as “orange” " "in this entry."
))
513 "value, or simply a color name such as “orange” "((char *) g_dgettext ("ctk30", "You can enter an HTML-style hexadecimal color "
"value, or simply a color name such as “orange” " "in this entry."
))
514 "in this entry.")((char *) g_dgettext ("ctk30", "You can enter an HTML-style hexadecimal color "
"value, or simply a color name such as “orange” " "in this entry."
))
);
515
516 ctk_entry_set_width_chars (CTK_ENTRY (priv->hex_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->hex_entry)), ((ctk_entry_get_type ()))))))
, 7);
517 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, priv->hex_entry, 1, 5, 4, 1);
518
519 focus_chain = g_list_append (focus_chain, priv->hue_spinbutton);
520 focus_chain = g_list_append (focus_chain, priv->sat_spinbutton);
521 focus_chain = g_list_append (focus_chain, priv->val_spinbutton);
522 focus_chain = g_list_append (focus_chain, priv->red_spinbutton);
523 focus_chain = g_list_append (focus_chain, priv->green_spinbutton);
524 focus_chain = g_list_append (focus_chain, priv->blue_spinbutton);
525 focus_chain = g_list_append (focus_chain, priv->opacity_slider);
526 focus_chain = g_list_append (focus_chain, priv->opacity_entry);
527 focus_chain = g_list_append (focus_chain, priv->hex_entry);
528 ctk_container_set_focus_chain (CTK_CONTAINER (table)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_container_get_type ()))))))
, focus_chain);
529 g_list_free (focus_chain);
530
531 /* Set up the palette */
532 table = ctk_grid_new ();
533 ctk_grid_set_row_spacing (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, 1);
534 ctk_grid_set_column_spacing (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, 1);
535 for (i = 0; i < CTK_CUSTOM_PALETTE_WIDTH10; i++)
536 {
537 for (j = 0; j < CTK_CUSTOM_PALETTE_HEIGHT2; j++)
538 {
539 make_palette_frame (colorsel, table, i, j);
540 }
541 }
542 set_selected_palette (colorsel, 0, 0);
543 priv->palette_frame = ctk_box_new (CTK_ORIENTATION_VERTICAL, 6);
544 label = ctk_label_new_with_mnemonic (_("_Palette:")((char *) g_dgettext ("ctk30", "_Palette:")));
545 ctk_widget_set_halign (label, CTK_ALIGN_START);
546 ctk_widget_set_valign (label, CTK_ALIGN_CENTER);
547 ctk_box_pack_start (CTK_BOX (priv->palette_frame)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->palette_frame)), ((ctk_box_get_type ()))))))
, label, FALSE(0), FALSE(0), 0);
548
549 ctk_label_set_mnemonic_widget (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_label_get_type ()))))))
,
550 priv->custom_palette[0][0]);
551
552 ctk_box_pack_end (CTK_BOX (top_right_vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((top_right_vbox)), ((ctk_box_get_type ()))))))
, priv->palette_frame, FALSE(0), FALSE(0), 0);
553 ctk_box_pack_start (CTK_BOX (priv->palette_frame)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->palette_frame)), ((ctk_box_get_type ()))))))
, table, FALSE(0), FALSE(0), 0);
554
555 ctk_widget_show_all (top_hbox);
556
557 /* hide unused stuff */
558
559 if (priv->has_opacity == FALSE(0))
560 {
561 ctk_widget_hide (priv->opacity_label);
562 ctk_widget_hide (priv->opacity_slider);
563 ctk_widget_hide (priv->opacity_entry);
564 }
565
566 if (priv->has_palette == FALSE(0))
567 {
568 ctk_widget_hide (priv->palette_frame);
569 }
570
571 atk_obj = ctk_widget_get_accessible (priv->triangle_colorsel);
572 if (CTK_IS_ACCESSIBLE (atk_obj)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(atk_obj)); GType __t = ((ctk_accessible_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; }))))
)
573 {
574 atk_object_set_name (atk_obj, _("Color Wheel")((char *) g_dgettext ("ctk30", "Color Wheel")));
575 atk_object_set_role (ctk_widget_get_accessible (CTK_WIDGET (colorsel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), ((ctk_widget_get_type ()))))))
), ATK_ROLE_COLOR_CHOOSER);
576 make_all_relations (atk_obj, priv);
577 }
578
579 ctk_widget_pop_composite_child ();
580}
581
582/* GObject methods */
583static void
584ctk_color_selection_finalize (GObject *object)
585{
586 G_OBJECT_CLASS (ctk_color_selection_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_color_selection_parent_class)), (((GType) ((20) <<
(2))))))))
->finalize (object);
587}
588
589static void
590ctk_color_selection_set_property (GObject *object,
591 guint prop_id,
592 const GValue *value,
593 GParamSpec *pspec)
594{
595 CtkColorSelection *colorsel = CTK_COLOR_SELECTION (object)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((object)), ((ctk_color_selection_get_type (
)))))))
;
596
597 switch (prop_id)
598 {
599 case PROP_HAS_OPACITY_CONTROL:
600 ctk_color_selection_set_has_opacity_control (colorsel,
601 g_value_get_boolean (value));
602 break;
603 case PROP_HAS_PALETTE:
604 ctk_color_selection_set_has_palette (colorsel,
605 g_value_get_boolean (value));
606 break;
607 case PROP_CURRENT_COLOR:
608 {
609 CdkColor *color;
610 CdkRGBA rgba;
611
612 color = g_value_get_boxed (value);
613
614 rgba.red = SCALE (color->red)(color->red / 65535.);
615 rgba.green = SCALE (color->green)(color->green / 65535.);;
616 rgba.blue = SCALE (color->blue)(color->blue / 65535.);
617 rgba.alpha = 1.0;
618
619 ctk_color_selection_set_current_rgba (colorsel, &rgba);
620 }
621 break;
622 case PROP_CURRENT_ALPHA:
623 ctk_color_selection_set_current_alpha (colorsel, g_value_get_uint (value));
624 break;
625 case PROP_CURRENT_RGBA:
626 ctk_color_selection_set_current_rgba (colorsel, g_value_get_boxed (value));
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'"
, "ctkcolorsel.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}
634
635static void
636ctk_color_selection_get_property (GObject *object,
637 guint prop_id,
638 GValue *value,
639 GParamSpec *pspec)
640{
641 CtkColorSelection *colorsel = CTK_COLOR_SELECTION (object)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((object)), ((ctk_color_selection_get_type (
)))))))
;
642
643 switch (prop_id)
644 {
645 case PROP_HAS_OPACITY_CONTROL:
646 g_value_set_boolean (value, ctk_color_selection_get_has_opacity_control (colorsel));
647 break;
648 case PROP_HAS_PALETTE:
649 g_value_set_boolean (value, ctk_color_selection_get_has_palette (colorsel));
650 break;
651 case PROP_CURRENT_COLOR:
652 {
653 CdkColor color;
654 CdkRGBA rgba;
655
656 ctk_color_selection_get_current_rgba (colorsel, &rgba);
657
658 color.red = UNSCALE (rgba.red)((guint16)(rgba.red * 65535 + 0.5));
659 color.green = UNSCALE (rgba.green)((guint16)(rgba.green * 65535 + 0.5));
660 color.blue = UNSCALE (rgba.blue)((guint16)(rgba.blue * 65535 + 0.5));
661
662 g_value_set_boxed (value, &color);
663 }
664 break;
665 case PROP_CURRENT_ALPHA:
666 g_value_set_uint (value, ctk_color_selection_get_current_alpha (colorsel));
667 break;
668 case PROP_CURRENT_RGBA:
669 {
670 CdkRGBA rgba;
671
672 ctk_color_selection_get_current_rgba (colorsel, &rgba);
673 g_value_set_boxed (value, &rgba);
674 }
675 break;
676 default:
677 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'"
, "ctkcolorsel.c", 677, ("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)
;
678 break;
679 }
680}
681
682/* CtkWidget methods */
683
684static void
685ctk_color_selection_destroy (CtkWidget *widget)
686{
687 CtkColorSelection *cselection = CTK_COLOR_SELECTION (widget)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((widget)), ((ctk_color_selection_get_type (
)))))))
;
688 CtkColorSelectionPrivate *priv = cselection->private_data;
689
690 if (priv->dropper_grab_widget)
691 {
692 ctk_widget_destroy (priv->dropper_grab_widget);
693 priv->dropper_grab_widget = NULL((void*)0);
694 }
695
696 CTK_WIDGET_CLASS (ctk_color_selection_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_color_selection_parent_class)), ((ctk_widget_get_type
()))))))
->destroy (widget);
697}
698
699static void
700ctk_color_selection_realize (CtkWidget *widget)
701{
702 CtkColorSelection *colorsel = CTK_COLOR_SELECTION (widget)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((widget)), ((ctk_color_selection_get_type (
)))))))
;
703 CtkColorSelectionPrivate *priv = colorsel->private_data;
704 CtkSettings *settings = ctk_widget_get_settings (widget);
705
706 priv->settings_connection = g_signal_connect (settings,g_signal_connect_data ((settings), ("notify::ctk-color-palette"
), (((GCallback) (palette_change_notify_instance))), (widget)
, ((void*)0), (GConnectFlags) 0)
707 "notify::ctk-color-palette",g_signal_connect_data ((settings), ("notify::ctk-color-palette"
), (((GCallback) (palette_change_notify_instance))), (widget)
, ((void*)0), (GConnectFlags) 0)
708 G_CALLBACK (palette_change_notify_instance),g_signal_connect_data ((settings), ("notify::ctk-color-palette"
), (((GCallback) (palette_change_notify_instance))), (widget)
, ((void*)0), (GConnectFlags) 0)
709 widget)g_signal_connect_data ((settings), ("notify::ctk-color-palette"
), (((GCallback) (palette_change_notify_instance))), (widget)
, ((void*)0), (GConnectFlags) 0)
;
710 update_palette (colorsel);
711
712 CTK_WIDGET_CLASS (ctk_color_selection_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_color_selection_parent_class)), ((ctk_widget_get_type
()))))))
->realize (widget);
713}
714
715static void
716ctk_color_selection_unrealize (CtkWidget *widget)
717{
718 CtkColorSelection *colorsel = CTK_COLOR_SELECTION (widget)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((widget)), ((ctk_color_selection_get_type (
)))))))
;
719 CtkColorSelectionPrivate *priv = colorsel->private_data;
720 CtkSettings *settings = ctk_widget_get_settings (widget);
721
722 g_signal_handler_disconnect (settings, priv->settings_connection);
723
724 CTK_WIDGET_CLASS (ctk_color_selection_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_color_selection_parent_class)), ((ctk_widget_get_type
()))))))
->unrealize (widget);
725}
726
727/* We override show-all since we have internal widgets that
728 * shouldn’t be shown when you call show_all(), like the
729 * palette and opacity sliders.
730 */
731static void
732ctk_color_selection_show_all (CtkWidget *widget)
733{
734 ctk_widget_show (widget);
735}
736
737static gboolean
738ctk_color_selection_grab_broken (CtkWidget *widget,
739 CdkEventGrabBroken *event G_GNUC_UNUSED__attribute__ ((__unused__)))
740{
741 shutdown_eyedropper (widget);
742
743 return TRUE(!(0));
744}
745
746/*
747 *
748 * The Sample Color
749 *
750 */
751
752static void color_sample_draw_sample (CtkColorSelection *colorsel,
753 int which,
754 cairo_t * cr);
755static void color_sample_update_samples (CtkColorSelection *colorsel);
756
757static void
758set_color_internal (CtkColorSelection *colorsel,
759 gdouble *color)
760{
761 CtkColorSelectionPrivate *priv;
762 gint i;
763
764 priv = colorsel->private_data;
765 priv->changing = TRUE(!(0));
766 priv->color[COLORSEL_RED] = color[0];
767 priv->color[COLORSEL_GREEN] = color[1];
768 priv->color[COLORSEL_BLUE] = color[2];
769 priv->color[COLORSEL_OPACITY] = color[3];
770 ctk_rgb_to_hsv (priv->color[COLORSEL_RED],
771 priv->color[COLORSEL_GREEN],
772 priv->color[COLORSEL_BLUE],
773 &priv->color[COLORSEL_HUE],
774 &priv->color[COLORSEL_SATURATION],
775 &priv->color[COLORSEL_VALUE]);
776 if (priv->default_set == FALSE(0))
777 {
778 for (i = 0; i < COLORSEL_NUM_CHANNELS; i++)
779 priv->old_color[i] = priv->color[i];
780 }
781 priv->default_set = TRUE(!(0));
782 priv->default_alpha_set = TRUE(!(0));
783 update_color (colorsel);
784}
785
786static void
787set_color_icon (CdkDragContext *context,
788 gdouble *colors)
789{
790 GdkPixbuf *pixbuf;
791 guint32 pixel;
792
793 pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE(0),
794 8, 48, 32);
795
796 pixel = (((UNSCALE (colors[COLORSEL_RED])((guint16)(colors[COLORSEL_RED] * 65535 + 0.5)) & 0xff00) << 16) |
797 ((UNSCALE (colors[COLORSEL_GREEN])((guint16)(colors[COLORSEL_GREEN] * 65535 + 0.5)) & 0xff00) << 8) |
798 ((UNSCALE (colors[COLORSEL_BLUE])((guint16)(colors[COLORSEL_BLUE] * 65535 + 0.5)) & 0xff00)));
799
800 gdk_pixbuf_fill (pixbuf, pixel);
801
802 ctk_drag_set_icon_pixbuf (context, pixbuf, -2, -2);
803 g_object_unref (pixbuf);
804}
805
806static void
807color_sample_drag_begin (CtkWidget *widget,
808 CdkDragContext *context,
809 gpointer data)
810{
811 CtkColorSelection *colorsel = data;
812 CtkColorSelectionPrivate *priv;
813 gdouble *colsrc;
814
815 priv = colorsel->private_data;
816
817 if (widget == priv->old_sample)
818 colsrc = priv->old_color;
819 else
820 colsrc = priv->color;
821
822 set_color_icon (context, colsrc);
823}
824
825static void
826color_sample_drag_end (CtkWidget *widget,
827 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)),
828 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
829{
830 g_object_set_data (G_OBJECT (widget)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), (((GType) ((20) << (2))))))))
, I_("ctk-color-selection-drag-window")g_intern_static_string ("ctk-color-selection-drag-window"), NULL((void*)0));
831}
832
833static void
834color_sample_drop_handle (CtkWidget *widget,
835 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)),
836 gint x G_GNUC_UNUSED__attribute__ ((__unused__)),
837 gint y G_GNUC_UNUSED__attribute__ ((__unused__)),
838 CtkSelectionData *selection_data,
839 guint info G_GNUC_UNUSED__attribute__ ((__unused__)),
840 guint time G_GNUC_UNUSED__attribute__ ((__unused__)),
841 gpointer data)
842{
843 CtkColorSelection *colorsel = data;
844 CtkColorSelectionPrivate *priv;
845 gint length;
846 guint16 *vals;
847 gdouble color[4];
848 priv = colorsel->private_data;
849
850 /* This is currently a guint16 array of the format:
851 * R
852 * G
853 * B
854 * opacity
855 */
856
857 length = ctk_selection_data_get_length (selection_data);
858
859 if (length < 0)
860 return;
861
862 /* We accept drops with the wrong format, since the KDE color
863 * chooser incorrectly drops application/x-color with format 8.
864 */
865 if (length != 8)
866 {
867 g_warning ("Received invalid color data");
868 return;
869 }
870
871 vals = (guint16 *) ctk_selection_data_get_data (selection_data);
872
873 if (widget == priv->cur_sample)
874 {
875 color[0] = (gdouble)vals[0] / 0xffff;
876 color[1] = (gdouble)vals[1] / 0xffff;
877 color[2] = (gdouble)vals[2] / 0xffff;
878 color[3] = (gdouble)vals[3] / 0xffff;
879
880 set_color_internal (colorsel, color);
881 }
882}
883
884static void
885color_sample_drag_handle (CtkWidget *widget,
886 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)),
887 CtkSelectionData *selection_data,
888 guint info G_GNUC_UNUSED__attribute__ ((__unused__)),
889 guint time G_GNUC_UNUSED__attribute__ ((__unused__)),
890 gpointer data)
891{
892 CtkColorSelection *colorsel = data;
893 CtkColorSelectionPrivate *priv;
894 guint16 vals[4];
895 gdouble *colsrc;
896
897 priv = colorsel->private_data;
898
899 if (widget == priv->old_sample)
900 colsrc = priv->old_color;
901 else
902 colsrc = priv->color;
903
904 vals[0] = colsrc[COLORSEL_RED] * 0xffff;
905 vals[1] = colsrc[COLORSEL_GREEN] * 0xffff;
906 vals[2] = colsrc[COLORSEL_BLUE] * 0xffff;
907 vals[3] = priv->has_opacity ? colsrc[COLORSEL_OPACITY] * 0xffff : 0xffff;
908
909 ctk_selection_data_set (selection_data,
910 cdk_atom_intern_static_string ("application/x-color"),
911 16, (guchar *)vals, 8);
912}
913
914/* which = 0 means draw old sample, which = 1 means draw new */
915static void
916color_sample_draw_sample (CtkColorSelection *colorsel,
917 int which,
918 cairo_t *cr)
919{
920 CtkWidget *da;
921 gint x, y, goff;
922 CtkColorSelectionPrivate *priv;
923 int width, height;
924
925 g_return_if_fail (colorsel != NULL)do { if ((colorsel != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "colorsel != NULL"); return
; } } while (0)
;
926 priv = colorsel->private_data;
927
928 g_return_if_fail (priv->sample_area != NULL)do { if ((priv->sample_area != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "priv->sample_area != NULL"
); return; } } while (0)
;
929 if (!ctk_widget_is_drawable (priv->sample_area))
930 return;
931
932 if (which == 0)
933 {
934 da = priv->old_sample;
935 goff = 0;
936 }
937 else
938 {
939 CtkAllocation old_sample_allocation;
940
941 da = priv->cur_sample;
942 ctk_widget_get_allocation (priv->old_sample, &old_sample_allocation);
943 goff = old_sample_allocation.width % 32;
944 }
945
946 /* Below needs tweaking for non-power-of-two */
947 width = ctk_widget_get_allocated_width (da);
948 height = ctk_widget_get_allocated_height (da);
949
950 if (priv->has_opacity)
951 {
952 /* Draw checks in background */
953
954 cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
955 cairo_rectangle (cr, 0, 0, width, height);
956 cairo_fill (cr);
957
958 cairo_set_source_rgb (cr, 0.75, 0.75, 0.75);
959 for (x = goff & -CHECK_SIZE16; x < goff + width; x += CHECK_SIZE16)
960 for (y = 0; y < height; y += CHECK_SIZE16)
961 if ((x / CHECK_SIZE16 + y / CHECK_SIZE16) % 2 == 0)
962 cairo_rectangle (cr, x - goff, y, CHECK_SIZE16, CHECK_SIZE16);
963 cairo_fill (cr);
964 }
965
966 if (which == 0)
967 {
968 cairo_set_source_rgba (cr,
969 priv->old_color[COLORSEL_RED],
970 priv->old_color[COLORSEL_GREEN],
971 priv->old_color[COLORSEL_BLUE],
972 priv->has_opacity ?
973 priv->old_color[COLORSEL_OPACITY] : 1.0);
974 }
975 else
976 {
977 cairo_set_source_rgba (cr,
978 priv->color[COLORSEL_RED],
979 priv->color[COLORSEL_GREEN],
980 priv->color[COLORSEL_BLUE],
981 priv->has_opacity ?
982 priv->color[COLORSEL_OPACITY] : 1.0);
983 }
984
985 cairo_rectangle (cr, 0, 0, width, height);
986 cairo_fill (cr);
987}
988
989
990static void
991color_sample_update_samples (CtkColorSelection *colorsel)
992{
993 CtkColorSelectionPrivate *priv = colorsel->private_data;
994 ctk_widget_queue_draw (priv->old_sample);
995 ctk_widget_queue_draw (priv->cur_sample);
996}
997
998static gboolean
999color_old_sample_draw (CtkWidget *da G_GNUC_UNUSED__attribute__ ((__unused__)),
1000 cairo_t *cr,
1001 CtkColorSelection *colorsel)
1002{
1003 color_sample_draw_sample (colorsel, 0, cr);
1004 return FALSE(0);
1005}
1006
1007
1008static gboolean
1009color_cur_sample_draw (CtkWidget *da G_GNUC_UNUSED__attribute__ ((__unused__)),
1010 cairo_t *cr,
1011 CtkColorSelection *colorsel)
1012{
1013 color_sample_draw_sample (colorsel, 1, cr);
1014 return FALSE(0);
1015}
1016
1017static void
1018color_sample_setup_dnd (CtkColorSelection *colorsel, CtkWidget *sample)
1019{
1020 static const CtkTargetEntry targets[] = {
1021 { .target = "application/x-color", .flags = 0 }
1022 };
1023 CtkColorSelectionPrivate *priv;
1024 priv = colorsel->private_data;
1025
1026 ctk_drag_source_set (sample,
1027 CDK_BUTTON1_MASK | CDK_BUTTON3_MASK,
1028 targets, 1,
1029 CDK_ACTION_COPY | CDK_ACTION_MOVE);
1030
1031 g_signal_connect (sample, "drag-begin",g_signal_connect_data ((sample), ("drag-begin"), (((GCallback
) (color_sample_drag_begin))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1032 G_CALLBACK (color_sample_drag_begin),g_signal_connect_data ((sample), ("drag-begin"), (((GCallback
) (color_sample_drag_begin))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1033 colorsel)g_signal_connect_data ((sample), ("drag-begin"), (((GCallback
) (color_sample_drag_begin))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1034 if (sample == priv->cur_sample)
1035 {
1036
1037 ctk_drag_dest_set (sample,
1038 CTK_DEST_DEFAULT_HIGHLIGHT |
1039 CTK_DEST_DEFAULT_MOTION |
1040 CTK_DEST_DEFAULT_DROP,
1041 targets, 1,
1042 CDK_ACTION_COPY);
1043
1044 g_signal_connect (sample, "drag-end",g_signal_connect_data ((sample), ("drag-end"), (((GCallback) (
color_sample_drag_end))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1045 G_CALLBACK (color_sample_drag_end),g_signal_connect_data ((sample), ("drag-end"), (((GCallback) (
color_sample_drag_end))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1046 colorsel)g_signal_connect_data ((sample), ("drag-end"), (((GCallback) (
color_sample_drag_end))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1047 }
1048
1049 g_signal_connect (sample, "drag-data-get",g_signal_connect_data ((sample), ("drag-data-get"), (((GCallback
) (color_sample_drag_handle))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1050 G_CALLBACK (color_sample_drag_handle),g_signal_connect_data ((sample), ("drag-data-get"), (((GCallback
) (color_sample_drag_handle))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1051 colorsel)g_signal_connect_data ((sample), ("drag-data-get"), (((GCallback
) (color_sample_drag_handle))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1052 g_signal_connect (sample, "drag-data-received",g_signal_connect_data ((sample), ("drag-data-received"), (((GCallback
) (color_sample_drop_handle))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1053 G_CALLBACK (color_sample_drop_handle),g_signal_connect_data ((sample), ("drag-data-received"), (((GCallback
) (color_sample_drop_handle))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1054 colorsel)g_signal_connect_data ((sample), ("drag-data-received"), (((GCallback
) (color_sample_drop_handle))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1055
1056}
1057
1058static void
1059update_tooltips (CtkColorSelection *colorsel)
1060{
1061 CtkColorSelectionPrivate *priv;
1062
1063 priv = colorsel->private_data;
1064
1065 if (priv->has_palette == TRUE(!(0)))
1066 {
1067 ctk_widget_set_tooltip_text (priv->old_sample,
1068 _("The previously-selected color, for comparison to the color "((char *) g_dgettext ("ctk30", "The previously-selected color, for comparison to the color "
"you’re selecting now. You can drag this color to a palette "
"entry, or select this color as current by dragging it to the "
"other color swatch alongside."))
1069 "you’re selecting now. You can drag this color to a palette "((char *) g_dgettext ("ctk30", "The previously-selected color, for comparison to the color "
"you’re selecting now. You can drag this color to a palette "
"entry, or select this color as current by dragging it to the "
"other color swatch alongside."))
1070 "entry, or select this color as current by dragging it to the "((char *) g_dgettext ("ctk30", "The previously-selected color, for comparison to the color "
"you’re selecting now. You can drag this color to a palette "
"entry, or select this color as current by dragging it to the "
"other color swatch alongside."))
1071 "other color swatch alongside.")((char *) g_dgettext ("ctk30", "The previously-selected color, for comparison to the color "
"you’re selecting now. You can drag this color to a palette "
"entry, or select this color as current by dragging it to the "
"other color swatch alongside."))
);
1072
1073 ctk_widget_set_tooltip_text (priv->cur_sample,
1074 _("The color you’ve chosen. You can drag this color to a palette "((char *) g_dgettext ("ctk30", "The color you’ve chosen. You can drag this color to a palette "
"entry to save it for use in the future."))
1075 "entry to save it for use in the future.")((char *) g_dgettext ("ctk30", "The color you’ve chosen. You can drag this color to a palette "
"entry to save it for use in the future."))
);
1076 }
1077 else
1078 {
1079 ctk_widget_set_tooltip_text (priv->old_sample,
1080 _("The previously-selected color, for comparison to the color "((char *) g_dgettext ("ctk30", "The previously-selected color, for comparison to the color "
"you’re selecting now."))
1081 "you’re selecting now.")((char *) g_dgettext ("ctk30", "The previously-selected color, for comparison to the color "
"you’re selecting now."))
);
1082
1083 ctk_widget_set_tooltip_text (priv->cur_sample,
1084 _("The color you’ve chosen.")((char *) g_dgettext ("ctk30", "The color you’ve chosen.")));
1085 }
1086}
1087
1088static void
1089color_sample_new (CtkColorSelection *colorsel)
1090{
1091 CtkColorSelectionPrivate *priv;
1092
1093 priv = colorsel->private_data;
1094
1095 priv->sample_area = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 0);
1096 priv->old_sample = ctk_drawing_area_new ();
1097 priv->cur_sample = ctk_drawing_area_new ();
1098
1099 ctk_box_pack_start (CTK_BOX (priv->sample_area)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->sample_area)), ((ctk_box_get_type ()))))))
, priv->old_sample,
1100 TRUE(!(0)), TRUE(!(0)), 0);
1101 ctk_box_pack_start (CTK_BOX (priv->sample_area)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->sample_area)), ((ctk_box_get_type ()))))))
, priv->cur_sample,
1102 TRUE(!(0)), TRUE(!(0)), 0);
1103
1104 g_signal_connect (priv->old_sample, "draw",g_signal_connect_data ((priv->old_sample), ("draw"), (((GCallback
) (color_old_sample_draw))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1105 G_CALLBACK (color_old_sample_draw),g_signal_connect_data ((priv->old_sample), ("draw"), (((GCallback
) (color_old_sample_draw))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1106 colorsel)g_signal_connect_data ((priv->old_sample), ("draw"), (((GCallback
) (color_old_sample_draw))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1107 g_signal_connect (priv->cur_sample, "draw",g_signal_connect_data ((priv->cur_sample), ("draw"), (((GCallback
) (color_cur_sample_draw))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1108 G_CALLBACK (color_cur_sample_draw),g_signal_connect_data ((priv->cur_sample), ("draw"), (((GCallback
) (color_cur_sample_draw))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1109 colorsel)g_signal_connect_data ((priv->cur_sample), ("draw"), (((GCallback
) (color_cur_sample_draw))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1110
1111 color_sample_setup_dnd (colorsel, priv->old_sample);
1112 color_sample_setup_dnd (colorsel, priv->cur_sample);
1113
1114 update_tooltips (colorsel);
1115
1116 ctk_widget_show_all (priv->sample_area);
1117}
1118
1119
1120/* The palette area code */
1121
1122static void
1123palette_get_color (CtkWidget *drawing_area, gdouble *color)
1124{
1125 gdouble *color_val;
1126
1127 g_return_if_fail (color != NULL)do { if ((color != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "color != NULL"); return
; } } while (0)
;
1128
1129 color_val = g_object_get_data (G_OBJECT (drawing_area)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drawing_area)), (((GType) ((20) << (2))))))))
, "color_val");
1130 if (color_val == NULL((void*)0))
1131 {
1132 /* Default to white for no good reason */
1133 color[0] = 1.0;
1134 color[1] = 1.0;
1135 color[2] = 1.0;
1136 color[3] = 1.0;
1137 return;
1138 }
1139
1140 color[0] = color_val[0];
1141 color[1] = color_val[1];
1142 color[2] = color_val[2];
1143 color[3] = 1.0;
1144}
1145
1146static gboolean
1147palette_draw (CtkWidget *drawing_area,
1148 cairo_t *cr,
1149 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
1150{
1151 CtkStyleContext *context;
1152 gint focus_width;
1153 CdkRGBA color;
1154
1155 context = ctk_widget_get_style_context (drawing_area);
1156 ctk_style_context_get_background_color (context, 0, &color);
1157 cdk_cairo_set_source_rgba (cr, &color);
1158 cairo_paint (cr);
1159
1160 if (ctk_widget_has_visible_focus (drawing_area))
1161 {
1162 set_focus_line_attributes (drawing_area, cr, &focus_width);
1163
1164 cairo_rectangle (cr,
1165 focus_width / 2., focus_width / 2.,
1166 ctk_widget_get_allocated_width (drawing_area) - focus_width,
1167 ctk_widget_get_allocated_height (drawing_area) - focus_width);
1168 cairo_stroke (cr);
1169 }
1170
1171 return FALSE(0);
1172}
1173
1174static void
1175set_focus_line_attributes (CtkWidget *drawing_area,
1176 cairo_t *cr,
1177 gint *focus_width)
1178{
1179 gdouble color[4];
1180 gint8 *dash_list;
1181
1182 ctk_widget_style_get (drawing_area,
1183 "focus-line-width", focus_width,
1184 "focus-line-pattern", (gchar *)&dash_list,
1185 NULL((void*)0));
1186
1187 palette_get_color (drawing_area, color);
1188
1189 if (INTENSITY (color[0], color[1], color[2])((color[0]) * 0.30 + (color[1]) * 0.59 + (color[2]) * 0.11) > 0.5)
1190 cairo_set_source_rgb (cr, 0., 0., 0.);
1191 else
1192 cairo_set_source_rgb (cr, 1., 1., 1.);
1193
1194 cairo_set_line_width (cr, *focus_width);
1195
1196 if (dash_list[0])
1197 {
1198 gint n_dashes = strlen ((gchar *)dash_list);
1199 gdouble *dashes = g_new (gdouble, n_dashes)((gdouble *) g_malloc_n ((n_dashes), sizeof (gdouble)));
1200 gdouble total_length = 0;
1201 gdouble dash_offset;
1202 gint i;
1203
1204 for (i = 0; i < n_dashes; i++)
1205 {
1206 dashes[i] = dash_list[i];
1207 total_length += dash_list[i];
1208 }
1209
1210 /* The dash offset here aligns the pattern to integer pixels
1211 * by starting the dash at the right side of the left border
1212 * Negative dash offsets in cairo don't work
1213 * (https://bugs.freedesktop.org/show_bug.cgi?id=2729)
1214 */
1215 dash_offset = - *focus_width / 2.;
1216 while (dash_offset < 0)
1217 dash_offset += total_length;
1218
1219 cairo_set_dash (cr, dashes, n_dashes, dash_offset);
1220 g_free (dashes);
1221 }
1222
1223 g_free (dash_list);
1224}
1225
1226static void
1227palette_drag_begin (CtkWidget *widget,
1228 CdkDragContext *context,
1229 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
1230{
1231 gdouble colors[4];
1232
1233 palette_get_color (widget, colors);
1234 set_color_icon (context, colors);
1235}
1236
1237static void
1238palette_drag_handle (CtkWidget *widget,
1239 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)),
1240 CtkSelectionData *selection_data,
1241 guint info G_GNUC_UNUSED__attribute__ ((__unused__)),
1242 guint time G_GNUC_UNUSED__attribute__ ((__unused__)),
1243 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
1244{
1245 guint16 vals[4];
1246 gdouble colsrc[4];
1247
1248 palette_get_color (widget, colsrc);
1249
1250 vals[0] = colsrc[COLORSEL_RED] * 0xffff;
1251 vals[1] = colsrc[COLORSEL_GREEN] * 0xffff;
1252 vals[2] = colsrc[COLORSEL_BLUE] * 0xffff;
1253 vals[3] = 0xffff;
1254
1255 ctk_selection_data_set (selection_data,
1256 cdk_atom_intern_static_string ("application/x-color"),
1257 16, (guchar *)vals, 8);
1258}
1259
1260static void
1261palette_drag_end (CtkWidget *widget,
1262 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)),
1263 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
1264{
1265 g_object_set_data (G_OBJECT (widget)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), (((GType) ((20) << (2))))))))
, I_("ctk-color-selection-drag-window")g_intern_static_string ("ctk-color-selection-drag-window"), NULL((void*)0));
1266}
1267
1268static CdkColor *
1269get_current_colors (CtkColorSelection *colorsel)
1270{
1271 CtkSettings *settings;
1272 CdkColor *colors = NULL((void*)0);
1273 gint n_colors = 0;
1274 gchar *palette;
1275
1276 settings = ctk_widget_get_settings (CTK_WIDGET (colorsel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), ((ctk_widget_get_type ()))))))
);
1277 g_object_get (settings, "ctk-color-palette", &palette, NULL((void*)0));
1278
1279 if (!ctk_color_selection_palette_from_string (palette, &colors, &n_colors))
3
Calling 'ctk_color_selection_palette_from_string'
18
Returning from 'ctk_color_selection_palette_from_string'
19
Taking false branch
1280 {
1281 ctk_color_selection_palette_from_string (DEFAULT_COLOR_PALETTE"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90",
1282 &colors,
1283 &n_colors);
1284 }
1285 else
1286 {
1287 /* If there are less colors provided than the number of slots in the
1288 * color selection, we fill in the rest from the defaults.
1289 */
1290 if (n_colors < (CTK_CUSTOM_PALETTE_WIDTH10 * CTK_CUSTOM_PALETTE_HEIGHT2))
20
Taking true branch
1291 {
1292 CdkColor *tmp_colors = colors;
1293 gint tmp_n_colors = n_colors;
1294
1295 ctk_color_selection_palette_from_string (DEFAULT_COLOR_PALETTE"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90",
21
Calling 'ctk_color_selection_palette_from_string'
28
Returning from 'ctk_color_selection_palette_from_string'
1296 &colors,
1297 &n_colors);
1298 memcpy (colors, tmp_colors, sizeof (CdkColor) * tmp_n_colors);
29
Null pointer passed to 1st parameter expecting 'nonnull'
1299
1300 g_free (tmp_colors);
1301 }
1302 }
1303
1304 /* make sure that we fill every slot */
1305 g_assert (n_colors == CTK_CUSTOM_PALETTE_WIDTH * CTK_CUSTOM_PALETTE_HEIGHT)do { if (n_colors == 10 * 2) ; else g_assertion_message_expr (
"Ctk", "ctkcolorsel.c", 1305, ((const char*) (__func__)), "n_colors == CTK_CUSTOM_PALETTE_WIDTH * CTK_CUSTOM_PALETTE_HEIGHT"
); } while (0)
;
1306 g_free (palette);
1307
1308 return colors;
1309}
1310
1311/* Changes the model color */
1312static void
1313palette_change_color (CtkWidget *drawing_area,
1314 CtkColorSelection *colorsel,
1315 gdouble *color)
1316{
1317 gint x, y;
1318 CtkColorSelectionPrivate *priv;
1319 CdkColor cdk_color;
1320 CdkColor *current_colors;
1321 CdkScreen *screen;
1322
1323 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
1324 g_return_if_fail (CTK_IS_DRAWING_AREA (drawing_area))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((drawing_area)); GType __t = ((ctk_drawing_area_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_DRAWING_AREA (drawing_area)"); return
; } } while (0)
;
1325
1326 priv = colorsel->private_data;
1327
1328 cdk_color.red = UNSCALE (color[0])((guint16)(color[0] * 65535 + 0.5));
1329 cdk_color.green = UNSCALE (color[1])((guint16)(color[1] * 65535 + 0.5));
1330 cdk_color.blue = UNSCALE (color[2])((guint16)(color[2] * 65535 + 0.5));
1331 cdk_color.pixel = 0;
1332
1333 x = 0;
1334 y = 0; /* Quiet GCC */
1335 while (x < CTK_CUSTOM_PALETTE_WIDTH10)
1336 {
1337 y = 0;
1338 while (y < CTK_CUSTOM_PALETTE_HEIGHT2)
1339 {
1340 if (priv->custom_palette[x][y] == drawing_area)
1341 goto out;
1342
1343 ++y;
1344 }
1345
1346 ++x;
1347 }
1348
1349 out:
1350
1351 g_assert (x < CTK_CUSTOM_PALETTE_WIDTH || y < CTK_CUSTOM_PALETTE_HEIGHT)do { if (x < 10 || y < 2) ; else g_assertion_message_expr
("Ctk", "ctkcolorsel.c", 1351, ((const char*) (__func__)), "x < CTK_CUSTOM_PALETTE_WIDTH || y < CTK_CUSTOM_PALETTE_HEIGHT"
); } while (0)
;
1352
1353 current_colors = get_current_colors (colorsel);
1354 current_colors[y * CTK_CUSTOM_PALETTE_WIDTH10 + x] = cdk_color;
1355
1356 screen = ctk_widget_get_screen (CTK_WIDGET (colorsel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), ((ctk_widget_get_type ()))))))
);
1357 if (change_palette_hook != default_change_palette_func)
1358 (* change_palette_hook) (screen, current_colors,
1359 CTK_CUSTOM_PALETTE_WIDTH10 * CTK_CUSTOM_PALETTE_HEIGHT2);
1360 else if (noscreen_change_palette_hook != default_noscreen_change_palette_func)
1361 {
1362 if (screen != cdk_screen_get_default ())
1363 g_warning ("ctk_color_selection_set_change_palette_hook used by "
1364 "widget is not on the default screen.");
1365 (* noscreen_change_palette_hook) (current_colors,
1366 CTK_CUSTOM_PALETTE_WIDTH10 * CTK_CUSTOM_PALETTE_HEIGHT2);
1367 }
1368 else
1369 (* change_palette_hook) (screen, current_colors,
1370 CTK_CUSTOM_PALETTE_WIDTH10 * CTK_CUSTOM_PALETTE_HEIGHT2);
1371
1372 g_free (current_colors);
1373}
1374
1375/* Changes the view color */
1376static void
1377palette_set_color (CtkWidget *drawing_area,
1378 CtkColorSelection *colorsel,
1379 gdouble *color)
1380{
1381 gdouble *new_color = g_new (double, 4)((double *) g_malloc_n ((4), sizeof (double)));
1382 CdkRGBA rgba;
1383
1384 rgba.red = color[0];
1385 rgba.green = color[1];
1386 rgba.blue = color[2];
1387 rgba.alpha = 1;
1388
1389 ctk_widget_override_background_color (drawing_area, CTK_STATE_FLAG_NORMAL, &rgba);
1390
1391 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (drawing_area), "color_set"))((gint) (glong) (g_object_get_data (((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((drawing_area)), (((GType) ((20) <<
(2)))))))), "color_set")))
== 0)
1392 {
1393 static const CtkTargetEntry targets[] = {
1394 { .target = "application/x-color", .flags = 0 }
1395 };
1396 ctk_drag_source_set (drawing_area,
1397 CDK_BUTTON1_MASK | CDK_BUTTON3_MASK,
1398 targets, 1,
1399 CDK_ACTION_COPY | CDK_ACTION_MOVE);
1400
1401 g_signal_connect (drawing_area, "drag-begin",g_signal_connect_data ((drawing_area), ("drag-begin"), (((GCallback
) (palette_drag_begin))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1402 G_CALLBACK (palette_drag_begin),g_signal_connect_data ((drawing_area), ("drag-begin"), (((GCallback
) (palette_drag_begin))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1403 colorsel)g_signal_connect_data ((drawing_area), ("drag-begin"), (((GCallback
) (palette_drag_begin))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1404 g_signal_connect (drawing_area, "drag-data-get",g_signal_connect_data ((drawing_area), ("drag-data-get"), (((
GCallback) (palette_drag_handle))), (colorsel), ((void*)0), (
GConnectFlags) 0)
1405 G_CALLBACK (palette_drag_handle),g_signal_connect_data ((drawing_area), ("drag-data-get"), (((
GCallback) (palette_drag_handle))), (colorsel), ((void*)0), (
GConnectFlags) 0)
1406 colorsel)g_signal_connect_data ((drawing_area), ("drag-data-get"), (((
GCallback) (palette_drag_handle))), (colorsel), ((void*)0), (
GConnectFlags) 0)
;
1407
1408 g_object_set_data (G_OBJECT (drawing_area)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drawing_area)), (((GType) ((20) << (2))))))))
, I_("color_set")g_intern_static_string ("color_set"),
1409 GINT_TO_POINTER (1)((gpointer) (glong) (1)));
1410 }
1411
1412 new_color[0] = color[0];
1413 new_color[1] = color[1];
1414 new_color[2] = color[2];
1415 new_color[3] = 1.0;
1416
1417 g_object_set_data_full (G_OBJECT (drawing_area)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drawing_area)), (((GType) ((20) << (2))))))))
,
1418 I_("color_val")g_intern_static_string ("color_val"), new_color, (GDestroyNotify)g_free);
1419}
1420
1421static void
1422save_color_selected (CtkWidget *menuitem G_GNUC_UNUSED__attribute__ ((__unused__)),
1423 gpointer data)
1424{
1425 CtkColorSelection *colorsel;
1426 CtkWidget *drawing_area;
1427 CtkColorSelectionPrivate *priv;
1428
1429 drawing_area = CTK_WIDGET (data)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((ctk_widget_get_type ()))))))
;
1430
1431 colorsel = CTK_COLOR_SELECTION (g_object_get_data (G_OBJECT (drawing_area),((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((g_object_get_data (((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((drawing_area)), (((GType) ((20) <<
(2)))))))), "ctk-color-sel"))), ((ctk_color_selection_get_type
()))))))
1432 "ctk-color-sel"))((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((g_object_get_data (((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((drawing_area)), (((GType) ((20) <<
(2)))))))), "ctk-color-sel"))), ((ctk_color_selection_get_type
()))))))
;
1433
1434 priv = colorsel->private_data;
1435
1436 palette_change_color (drawing_area, colorsel, priv->color);
1437}
1438
1439static void
1440do_popup (CtkColorSelection *colorsel,
1441 CtkWidget *drawing_area,
1442 const CdkEvent *trigger_event)
1443{
1444 CtkWidget *menu;
1445 CtkWidget *mi;
1446
1447 g_object_set_data (G_OBJECT (drawing_area)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drawing_area)), (((GType) ((20) << (2))))))))
,
1448 I_("ctk-color-sel")g_intern_static_string ("ctk-color-sel"),
1449 colorsel);
1450
1451 menu = ctk_menu_new ();
1452 g_signal_connect (menu, "hide", G_CALLBACK (ctk_widget_destroy), NULL)g_signal_connect_data ((menu), ("hide"), (((GCallback) (ctk_widget_destroy
))), (((void*)0)), ((void*)0), (GConnectFlags) 0)
;
1453
1454 mi = ctk_menu_item_new_with_mnemonic (_("_Save color here")((char *) g_dgettext ("ctk30", "_Save color here")));
1455
1456 g_signal_connect (mi, "activate",g_signal_connect_data ((mi), ("activate"), (((GCallback) (save_color_selected
))), (drawing_area), ((void*)0), (GConnectFlags) 0)
1457 G_CALLBACK (save_color_selected),g_signal_connect_data ((mi), ("activate"), (((GCallback) (save_color_selected
))), (drawing_area), ((void*)0), (GConnectFlags) 0)
1458 drawing_area)g_signal_connect_data ((mi), ("activate"), (((GCallback) (save_color_selected
))), (drawing_area), ((void*)0), (GConnectFlags) 0)
;
1459
1460 ctk_menu_shell_append (CTK_MENU_SHELL (menu)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((menu)), ((ctk_menu_shell_get_type ()))))))
, mi);
1461
1462 ctk_widget_show_all (mi);
1463
1464 if (trigger_event && cdk_event_triggers_context_menu (trigger_event))
1465 ctk_menu_popup_at_pointer (CTK_MENU (menu)((((CtkMenu*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((menu)), ((ctk_menu_get_type ()))))))
, trigger_event);
1466 else
1467 ctk_menu_popup_at_widget (CTK_MENU (menu)((((CtkMenu*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((menu)), ((ctk_menu_get_type ()))))))
,
1468 drawing_area,
1469 CDK_GRAVITY_CENTER,
1470 CDK_GRAVITY_NORTH_WEST,
1471 trigger_event);
1472}
1473
1474
1475static gboolean
1476palette_enter (CtkWidget *drawing_area,
1477 CdkEventCrossing *event G_GNUC_UNUSED__attribute__ ((__unused__)),
1478 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
1479{
1480 g_object_set_data (G_OBJECT (drawing_area)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drawing_area)), (((GType) ((20) << (2))))))))
,
1481 I_("ctk-colorsel-have-pointer")g_intern_static_string ("ctk-colorsel-have-pointer"),
1482 GUINT_TO_POINTER (TRUE)((gpointer) (gulong) ((!(0)))));
1483
1484 return FALSE(0);
1485}
1486
1487static gboolean
1488palette_leave (CtkWidget *drawing_area,
1489 CdkEventCrossing *event G_GNUC_UNUSED__attribute__ ((__unused__)),
1490 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
1491{
1492 g_object_set_data (G_OBJECT (drawing_area)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drawing_area)), (((GType) ((20) << (2))))))))
,
1493 I_("ctk-colorsel-have-pointer")g_intern_static_string ("ctk-colorsel-have-pointer"),
1494 NULL((void*)0));
1495
1496 return FALSE(0);
1497}
1498
1499static gboolean
1500palette_press (CtkWidget *drawing_area,
1501 CdkEventButton *event,
1502 gpointer data)
1503{
1504 CtkColorSelection *colorsel = CTK_COLOR_SELECTION (data)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((data)), ((ctk_color_selection_get_type ())
)))))
;
1505
1506 ctk_widget_grab_focus (drawing_area);
1507
1508 if (cdk_event_triggers_context_menu ((CdkEvent *) event))
1509 {
1510 do_popup (colorsel, drawing_area, (CdkEvent *) event);
1511 return TRUE(!(0));
1512 }
1513
1514 return FALSE(0);
1515}
1516
1517static gboolean
1518palette_release (CtkWidget *drawing_area,
1519 CdkEventButton *event,
1520 gpointer data)
1521{
1522 CtkColorSelection *colorsel = CTK_COLOR_SELECTION (data)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((data)), ((ctk_color_selection_get_type ())
)))))
;
1523
1524 ctk_widget_grab_focus (drawing_area);
1525
1526 if (event->button == CDK_BUTTON_PRIMARY(1) &&
1527 g_object_get_data (G_OBJECT (drawing_area)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drawing_area)), (((GType) ((20) << (2))))))))
,
1528 "ctk-colorsel-have-pointer") != NULL((void*)0))
1529 {
1530 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (drawing_area), "color_set"))((gint) (glong) (g_object_get_data (((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((drawing_area)), (((GType) ((20) <<
(2)))))))), "color_set")))
!= 0)
1531 {
1532 gdouble color[4];
1533 palette_get_color (drawing_area, color);
1534 set_color_internal (colorsel, color);
1535 }
1536 }
1537
1538 return FALSE(0);
1539}
1540
1541static void
1542palette_drop_handle (CtkWidget *widget,
1543 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)),
1544 gint x G_GNUC_UNUSED__attribute__ ((__unused__)),
1545 gint y G_GNUC_UNUSED__attribute__ ((__unused__)),
1546 CtkSelectionData *selection_data,
1547 guint info G_GNUC_UNUSED__attribute__ ((__unused__)),
1548 guint time G_GNUC_UNUSED__attribute__ ((__unused__)),
1549 gpointer data)
1550{
1551 CtkColorSelection *colorsel = CTK_COLOR_SELECTION (data)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((data)), ((ctk_color_selection_get_type ())
)))))
;
1552 gint length;
1553 guint16 *vals;
1554 gdouble color[4];
1555
1556 length = ctk_selection_data_get_length (selection_data);
1557
1558 if (length < 0)
1559 return;
1560
1561 /* We accept drops with the wrong format, since the KDE color
1562 * chooser incorrectly drops application/x-color with format 8.
1563 */
1564 if (length != 8)
1565 {
1566 g_warning ("Received invalid color data");
1567 return;
1568 }
1569
1570 vals = (guint16 *) ctk_selection_data_get_data (selection_data);
1571
1572 color[0] = (gdouble)vals[0] / 0xffff;
1573 color[1] = (gdouble)vals[1] / 0xffff;
1574 color[2] = (gdouble)vals[2] / 0xffff;
1575 color[3] = (gdouble)vals[3] / 0xffff;
1576 palette_change_color (widget, colorsel, color);
1577 set_color_internal (colorsel, color);
1578}
1579
1580static gint
1581palette_activate (CtkWidget *widget,
1582 CdkEventKey *event,
1583 gpointer data)
1584{
1585 /* should have a drawing area subclass with an activate signal */
1586 if ((event->keyval == CDK_KEY_space0x020) ||
1587 (event->keyval == CDK_KEY_Return0xff0d) ||
1588 (event->keyval == CDK_KEY_ISO_Enter0xfe34) ||
1589 (event->keyval == CDK_KEY_KP_Enter0xff8d) ||
1590 (event->keyval == CDK_KEY_KP_Space0xff80))
1591 {
1592 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "color_set"))((gint) (glong) (g_object_get_data (((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((widget)), (((GType) ((20) << (2)))
))))), "color_set")))
!= 0)
1593 {
1594 gdouble color[4];
1595 palette_get_color (widget, color);
1596 set_color_internal (CTK_COLOR_SELECTION (data)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((data)), ((ctk_color_selection_get_type ())
)))))
, color);
1597 }
1598 return TRUE(!(0));
1599 }
1600
1601 return FALSE(0);
1602}
1603
1604static gboolean
1605palette_popup (CtkWidget *widget,
1606 gpointer data)
1607{
1608 do_popup (data, widget, NULL((void*)0));
1609 return TRUE(!(0));
1610}
1611
1612
1613static CtkWidget*
1614palette_new (CtkColorSelection *colorsel)
1615{
1616 CtkWidget *retval;
1617
1618 static const CtkTargetEntry targets[] = {
1619 { .target = "application/x-color", .flags = 0 }
1620 };
1621
1622 retval = ctk_drawing_area_new ();
1623
1624 ctk_widget_set_can_focus (retval, TRUE(!(0)));
1625
1626 g_object_set_data (G_OBJECT (retval)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((retval)), (((GType) ((20) << (2))))))))
, I_("color_set")g_intern_static_string ("color_set"), GINT_TO_POINTER (0)((gpointer) (glong) (0)));
1627 ctk_widget_set_events (retval, CDK_BUTTON_PRESS_MASK
1628 | CDK_BUTTON_RELEASE_MASK
1629 | CDK_ENTER_NOTIFY_MASK
1630 | CDK_LEAVE_NOTIFY_MASK);
1631
1632 g_signal_connect (retval, "draw",g_signal_connect_data ((retval), ("draw"), (((GCallback) (palette_draw
))), (colorsel), ((void*)0), (GConnectFlags) 0)
1633 G_CALLBACK (palette_draw), colorsel)g_signal_connect_data ((retval), ("draw"), (((GCallback) (palette_draw
))), (colorsel), ((void*)0), (GConnectFlags) 0)
;
1634 g_signal_connect (retval, "button-press-event",g_signal_connect_data ((retval), ("button-press-event"), (((GCallback
) (palette_press))), (colorsel), ((void*)0), (GConnectFlags) 0
)
1635 G_CALLBACK (palette_press), colorsel)g_signal_connect_data ((retval), ("button-press-event"), (((GCallback
) (palette_press))), (colorsel), ((void*)0), (GConnectFlags) 0
)
;
1636 g_signal_connect (retval, "button-release-event",g_signal_connect_data ((retval), ("button-release-event"), ((
(GCallback) (palette_release))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1637 G_CALLBACK (palette_release), colorsel)g_signal_connect_data ((retval), ("button-release-event"), ((
(GCallback) (palette_release))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1638 g_signal_connect (retval, "enter-notify-event",g_signal_connect_data ((retval), ("enter-notify-event"), (((GCallback
) (palette_enter))), (colorsel), ((void*)0), (GConnectFlags) 0
)
1639 G_CALLBACK (palette_enter), colorsel)g_signal_connect_data ((retval), ("enter-notify-event"), (((GCallback
) (palette_enter))), (colorsel), ((void*)0), (GConnectFlags) 0
)
;
1640 g_signal_connect (retval, "leave-notify-event",g_signal_connect_data ((retval), ("leave-notify-event"), (((GCallback
) (palette_leave))), (colorsel), ((void*)0), (GConnectFlags) 0
)
1641 G_CALLBACK (palette_leave), colorsel)g_signal_connect_data ((retval), ("leave-notify-event"), (((GCallback
) (palette_leave))), (colorsel), ((void*)0), (GConnectFlags) 0
)
;
1642 g_signal_connect (retval, "key-press-event",g_signal_connect_data ((retval), ("key-press-event"), (((GCallback
) (palette_activate))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1643 G_CALLBACK (palette_activate), colorsel)g_signal_connect_data ((retval), ("key-press-event"), (((GCallback
) (palette_activate))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1644 g_signal_connect (retval, "popup-menu",g_signal_connect_data ((retval), ("popup-menu"), (((GCallback
) (palette_popup))), (colorsel), ((void*)0), (GConnectFlags) 0
)
1645 G_CALLBACK (palette_popup), colorsel)g_signal_connect_data ((retval), ("popup-menu"), (((GCallback
) (palette_popup))), (colorsel), ((void*)0), (GConnectFlags) 0
)
;
1646
1647 ctk_drag_dest_set (retval,
1648 CTK_DEST_DEFAULT_HIGHLIGHT |
1649 CTK_DEST_DEFAULT_MOTION |
1650 CTK_DEST_DEFAULT_DROP,
1651 targets, 1,
1652 CDK_ACTION_COPY);
1653
1654 g_signal_connect (retval, "drag-end",g_signal_connect_data ((retval), ("drag-end"), (((GCallback) (
palette_drag_end))), (((void*)0)), ((void*)0), (GConnectFlags
) 0)
1655 G_CALLBACK (palette_drag_end), NULL)g_signal_connect_data ((retval), ("drag-end"), (((GCallback) (
palette_drag_end))), (((void*)0)), ((void*)0), (GConnectFlags
) 0)
;
1656 g_signal_connect (retval, "drag-data-received",g_signal_connect_data ((retval), ("drag-data-received"), (((GCallback
) (palette_drop_handle))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1657 G_CALLBACK (palette_drop_handle), colorsel)g_signal_connect_data ((retval), ("drag-data-received"), (((GCallback
) (palette_drop_handle))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1658
1659 ctk_widget_set_tooltip_text (retval,
1660 _("Click this palette entry to make it the current color. "((char *) g_dgettext ("ctk30", "Click this palette entry to make it the current color. "
"To change this entry, drag a color swatch here or right-click "
"it and select “Save color here.”"))
1661 "To change this entry, drag a color swatch here or right-click "((char *) g_dgettext ("ctk30", "Click this palette entry to make it the current color. "
"To change this entry, drag a color swatch here or right-click "
"it and select “Save color here.”"))
1662 "it and select “Save color here.”")((char *) g_dgettext ("ctk30", "Click this palette entry to make it the current color. "
"To change this entry, drag a color swatch here or right-click "
"it and select “Save color here.”"))
);
1663 return retval;
1664}
1665
1666
1667/* The actual CtkColorSelection widget */
1668
1669static CdkCursor *
1670make_picker_cursor (CdkScreen *screen)
1671{
1672 CdkCursor *cursor;
1673
1674 cursor = cdk_cursor_new_from_name (cdk_screen_get_display (screen),
1675 "color-picker");
1676
1677 if (!cursor)
1678 {
1679 GdkPixbuf *pixbuf;
1680
1681 pixbuf = gdk_pixbuf_new_from_data (dropper_bits,
1682 GDK_COLORSPACE_RGB, TRUE(!(0)), 8,
1683 DROPPER_WIDTH17, DROPPER_HEIGHT17,
1684 DROPPER_STRIDE(17 * 4),
1685 NULL((void*)0), NULL((void*)0));
1686
1687 cursor = cdk_cursor_new_from_pixbuf (cdk_screen_get_display (screen),
1688 pixbuf,
1689 DROPPER_X_HOT2, DROPPER_Y_HOT16);
1690
1691 g_object_unref (pixbuf);
1692 }
1693
1694 return cursor;
1695}
1696
1697static void
1698grab_color_at_pointer (CdkScreen *screen,
1699 CdkDevice *device,
1700 gint x_root,
1701 gint y_root,
1702 gpointer data)
1703{
1704 GdkPixbuf *pixbuf;
1705 guchar *pixels;
1706 CtkColorSelection *colorsel = data;
1707 CtkColorSelectionPrivate *priv;
1708 CdkColor color;
1709 CdkWindow *root_window = cdk_screen_get_root_window (screen);
1710
1711 priv = colorsel->private_data;
1712
1713 pixbuf = gdk_pixbuf_get_from_window (root_window,
1714 x_root, y_root,
1715 1, 1);
1716 if (!pixbuf)
1717 {
1718 gint x, y;
1719 CdkWindow *window = cdk_device_get_window_at_position (device, &x, &y);
1720 if (!window)
1721 return;
1722 pixbuf = gdk_pixbuf_get_from_window (window,
1723 x, y,
1724 1, 1);
1725 if (!pixbuf)
1726 return;
1727 }
1728 pixels = gdk_pixbuf_get_pixels (pixbuf);
1729 color.red = pixels[0] * 0x101;
1730 color.green = pixels[1] * 0x101;
1731 color.blue = pixels[2] * 0x101;
1732 g_object_unref (pixbuf);
1733
1734 priv->color[COLORSEL_RED] = SCALE (color.red)(color.red / 65535.);
1735 priv->color[COLORSEL_GREEN] = SCALE (color.green)(color.green / 65535.);
1736 priv->color[COLORSEL_BLUE] = SCALE (color.blue)(color.blue / 65535.);
1737
1738 ctk_rgb_to_hsv (priv->color[COLORSEL_RED],
1739 priv->color[COLORSEL_GREEN],
1740 priv->color[COLORSEL_BLUE],
1741 &priv->color[COLORSEL_HUE],
1742 &priv->color[COLORSEL_SATURATION],
1743 &priv->color[COLORSEL_VALUE]);
1744
1745 update_color (colorsel);
1746}
1747
1748static void
1749shutdown_eyedropper (CtkWidget *widget)
1750{
1751 CtkColorSelection *colorsel;
1752 CtkColorSelectionPrivate *priv;
1753
1754 colorsel = CTK_COLOR_SELECTION (widget)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((widget)), ((ctk_color_selection_get_type (
)))))))
;
1755 priv = colorsel->private_data;
1756
1757 if (priv->has_grab)
1758 {
1759 cdk_device_ungrab (priv->keyboard_device, priv->grab_time);
1760 cdk_device_ungrab (priv->pointer_device, priv->grab_time);
1761 ctk_device_grab_remove (priv->dropper_grab_widget, priv->pointer_device);
1762
1763 priv->has_grab = FALSE(0);
1764 priv->keyboard_device = NULL((void*)0);
1765 priv->pointer_device = NULL((void*)0);
1766 }
1767}
1768
1769static void
1770mouse_motion (CtkWidget *invisible G_GNUC_UNUSED__attribute__ ((__unused__)),
1771 CdkEventMotion *event,
1772 gpointer data)
1773{
1774 grab_color_at_pointer (cdk_event_get_screen ((CdkEvent *) event),
1775 cdk_event_get_device ((CdkEvent *) event),
1776 event->x_root, event->y_root, data);
1777}
1778
1779static gboolean
1780mouse_release (CtkWidget *invisible,
1781 CdkEventButton *event,
1782 gpointer data)
1783{
1784 /* CtkColorSelection *colorsel = data; */
1785
1786 if (event->button != CDK_BUTTON_PRIMARY(1))
1787 return FALSE(0);
1788
1789 grab_color_at_pointer (cdk_event_get_screen ((CdkEvent *) event),
1790 cdk_event_get_device ((CdkEvent *) event),
1791 event->x_root, event->y_root, data);
1792
1793 shutdown_eyedropper (CTK_WIDGET (data)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((ctk_widget_get_type ()))))))
);
1794
1795 g_signal_handlers_disconnect_by_func (invisible,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_motion), (data))
1796 mouse_motion,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_motion), (data))
1797 data)g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_motion), (data))
;
1798 g_signal_handlers_disconnect_by_func (invisible,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_release), (data))
1799 mouse_release,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_release), (data))
1800 data)g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_release), (data))
;
1801
1802 return TRUE(!(0));
1803}
1804
1805/* Helper Functions */
1806
1807static gboolean
1808key_press (CtkWidget *invisible,
1809 CdkEventKey *event,
1810 gpointer data)
1811{
1812 CdkScreen *screen = cdk_event_get_screen ((CdkEvent *) event);
1813 CdkDevice *device, *pointer_device;
1814 guint state = event->state & ctk_accelerator_get_default_mod_mask ();
1815 gint x, y;
1816 gint dx, dy;
1817
1818 device = cdk_event_get_device ((CdkEvent * ) event);
1819 pointer_device = cdk_device_get_associated_device (device);
1820 cdk_device_get_position (pointer_device, NULL((void*)0), &x, &y);
1821
1822 dx = 0;
1823 dy = 0;
1824
1825 switch (event->keyval)
1826 {
1827 case CDK_KEY_space0x020:
1828 case CDK_KEY_Return0xff0d:
1829 case CDK_KEY_ISO_Enter0xfe34:
1830 case CDK_KEY_KP_Enter0xff8d:
1831 case CDK_KEY_KP_Space0xff80:
1832 grab_color_at_pointer (screen, pointer_device, x, y, data);
1833 /* fall through */
1834
1835 case CDK_KEY_Escape0xff1b:
1836 shutdown_eyedropper (data);
1837
1838 g_signal_handlers_disconnect_by_func (invisible,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_press), (data))
1839 mouse_press,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_press), (data))
1840 data)g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_press), (data))
;
1841 g_signal_handlers_disconnect_by_func (invisible,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (key_press), (data))
1842 key_press,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (key_press), (data))
1843 data)g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (key_press), (data))
;
1844
1845 return TRUE(!(0));
1846
1847 case CDK_KEY_Up0xff52:
1848 case CDK_KEY_KP_Up0xff97:
1849 dy = state == CDK_MOD1_MASK ? -BIG_STEP20 : -1;
1850 break;
1851
1852 case CDK_KEY_Down0xff54:
1853 case CDK_KEY_KP_Down0xff99:
1854 dy = state == CDK_MOD1_MASK ? BIG_STEP20 : 1;
1855 break;
1856
1857 case CDK_KEY_Left0xff51:
1858 case CDK_KEY_KP_Left0xff96:
1859 dx = state == CDK_MOD1_MASK ? -BIG_STEP20 : -1;
1860 break;
1861
1862 case CDK_KEY_Right0xff53:
1863 case CDK_KEY_KP_Right0xff98:
1864 dx = state == CDK_MOD1_MASK ? BIG_STEP20 : 1;
1865 break;
1866
1867 default:
1868 return FALSE(0);
1869 }
1870
1871 cdk_device_warp (pointer_device, screen, x + dx, y + dy);
1872
1873 return TRUE(!(0));
1874
1875}
1876
1877static gboolean
1878mouse_press (CtkWidget *invisible,
1879 CdkEventButton *event,
1880 gpointer data)
1881{
1882 if (event->type == CDK_BUTTON_PRESS && event->button == CDK_BUTTON_PRIMARY(1))
1883 {
1884 g_signal_connect (invisible, "motion-notify-event",g_signal_connect_data ((invisible), ("motion-notify-event"), (
((GCallback) (mouse_motion))), (data), ((void*)0), (GConnectFlags
) 0)
1885 G_CALLBACK (mouse_motion), data)g_signal_connect_data ((invisible), ("motion-notify-event"), (
((GCallback) (mouse_motion))), (data), ((void*)0), (GConnectFlags
) 0)
;
1886 g_signal_connect (invisible, "button-release-event",g_signal_connect_data ((invisible), ("button-release-event"),
(((GCallback) (mouse_release))), (data), ((void*)0), (GConnectFlags
) 0)
1887 G_CALLBACK (mouse_release), data)g_signal_connect_data ((invisible), ("button-release-event"),
(((GCallback) (mouse_release))), (data), ((void*)0), (GConnectFlags
) 0)
;
1888 g_signal_handlers_disconnect_by_func (invisible,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_press), (data))
1889 mouse_press,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_press), (data))
1890 data)g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (mouse_press), (data))
;
1891 g_signal_handlers_disconnect_by_func (invisible,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (key_press), (data))
1892 key_press,g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (key_press), (data))
1893 data)g_signal_handlers_disconnect_matched ((invisible), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (key_press), (data))
;
1894 return TRUE(!(0));
1895 }
1896
1897 return FALSE(0);
1898}
1899
1900/* when the button is clicked */
1901static void
1902get_screen_color (CtkWidget *button)
1903{
1904 CtkColorSelection *colorsel = g_object_get_data (G_OBJECT (button)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), (((GType) ((20) << (2))))))))
, "COLORSEL");
1905 CtkColorSelectionPrivate *priv = colorsel->private_data;
1906 CdkScreen *screen = ctk_widget_get_screen (CTK_WIDGET (button)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), ((ctk_widget_get_type ()))))))
);
1907 CdkDevice *device, *keyb_device, *pointer_device;
1908 CdkCursor *picker_cursor;
1909 CdkGrabStatus grab_status;
1910 CdkWindow *window;
1911 CtkWidget *grab_widget, *toplevel;
1912
1913 guint32 time = ctk_get_current_event_time ();
1914
1915 device = ctk_get_current_event_device ();
1916
1917 if (cdk_device_get_source (device) == CDK_SOURCE_KEYBOARD)
1918 {
1919 keyb_device = device;
1920 pointer_device = cdk_device_get_associated_device (device);
1921 }
1922 else
1923 {
1924 pointer_device = device;
1925 keyb_device = cdk_device_get_associated_device (device);
1926 }
1927
1928 if (priv->dropper_grab_widget == NULL((void*)0))
1929 {
1930 grab_widget = ctk_window_new (CTK_WINDOW_POPUP);
1931 ctk_window_set_screen (CTK_WINDOW (grab_widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grab_widget)), ((ctk_window_get_type ()))))))
, screen);
1932 ctk_window_resize (CTK_WINDOW (grab_widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grab_widget)), ((ctk_window_get_type ()))))))
, 1, 1);
1933 ctk_window_move (CTK_WINDOW (grab_widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grab_widget)), ((ctk_window_get_type ()))))))
, -100, -100);
1934 ctk_widget_show (grab_widget);
1935
1936 ctk_widget_add_events (grab_widget,
1937 CDK_BUTTON_RELEASE_MASK | CDK_BUTTON_PRESS_MASK | CDK_POINTER_MOTION_MASK);
1938
1939 toplevel = ctk_widget_get_toplevel (CTK_WIDGET (colorsel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), ((ctk_widget_get_type ()))))))
);
1940
1941 if (CTK_IS_WINDOW (toplevel)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(toplevel)); GType __t = ((ctk_window_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; }))))
)
1942 {
1943 if (ctk_window_has_group (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_window_get_type ()))))))
))
1944 ctk_window_group_add_window (ctk_window_get_group (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_window_get_type ()))))))
),
1945 CTK_WINDOW (grab_widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grab_widget)), ((ctk_window_get_type ()))))))
);
1946 }
1947
1948 priv->dropper_grab_widget = grab_widget;
1949 }
1950
1951 window = ctk_widget_get_window (priv->dropper_grab_widget);
1952
1953 if (cdk_device_grab (keyb_device,
1954 window,
1955 CDK_OWNERSHIP_APPLICATION, FALSE(0),
1956 CDK_KEY_PRESS_MASK | CDK_KEY_RELEASE_MASK,
1957 NULL((void*)0), time) != CDK_GRAB_SUCCESS)
1958 return;
1959
1960 picker_cursor = make_picker_cursor (screen);
1961 grab_status = cdk_device_grab (pointer_device,
1962 window,
1963 CDK_OWNERSHIP_APPLICATION,
1964 FALSE(0),
1965 CDK_BUTTON_RELEASE_MASK | CDK_BUTTON_PRESS_MASK | CDK_POINTER_MOTION_MASK,
1966 picker_cursor,
1967 time);
1968 g_object_unref (picker_cursor);
1969
1970 if (grab_status != CDK_GRAB_SUCCESS)
1971 {
1972 cdk_device_ungrab (keyb_device, time);
1973 return;
1974 }
1975
1976 ctk_device_grab_add (priv->dropper_grab_widget,
1977 pointer_device,
1978 TRUE(!(0)));
1979
1980 priv->grab_time = time;
1981 priv->has_grab = TRUE(!(0));
1982 priv->keyboard_device = keyb_device;
1983 priv->pointer_device = pointer_device;
1984
1985 g_signal_connect (priv->dropper_grab_widget, "button-press-event",g_signal_connect_data ((priv->dropper_grab_widget), ("button-press-event"
), (((GCallback) (mouse_press))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1986 G_CALLBACK (mouse_press), colorsel)g_signal_connect_data ((priv->dropper_grab_widget), ("button-press-event"
), (((GCallback) (mouse_press))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1987 g_signal_connect (priv->dropper_grab_widget, "key-press-event",g_signal_connect_data ((priv->dropper_grab_widget), ("key-press-event"
), (((GCallback) (key_press))), (colorsel), ((void*)0), (GConnectFlags
) 0)
1988 G_CALLBACK (key_press), colorsel)g_signal_connect_data ((priv->dropper_grab_widget), ("key-press-event"
), (((GCallback) (key_press))), (colorsel), ((void*)0), (GConnectFlags
) 0)
;
1989}
1990
1991static void
1992hex_changed (CtkWidget *hex_entry G_GNUC_UNUSED__attribute__ ((__unused__)),
1993 gpointer data)
1994{
1995 CtkColorSelection *colorsel;
1996 CtkColorSelectionPrivate *priv;
1997 CdkRGBA color;
1998 gchar *text;
1999
2000 colorsel = CTK_COLOR_SELECTION (data)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((data)), ((ctk_color_selection_get_type ())
)))))
;
2001 priv = colorsel->private_data;
2002
2003 if (priv->changing)
2004 return;
2005
2006 text = ctk_editable_get_chars (CTK_EDITABLE (priv->hex_entry)((((CtkEditable*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->hex_entry)), ((ctk_editable_get_type ()))))))
, 0, -1);
2007 if (cdk_rgba_parse (&color, text))
2008 {
2009 priv->color[COLORSEL_RED] = color.red;
2010 priv->color[COLORSEL_GREEN] = color.green;
2011 priv->color[COLORSEL_BLUE] = color.blue;
2012 ctk_rgb_to_hsv (priv->color[COLORSEL_RED],
2013 priv->color[COLORSEL_GREEN],
2014 priv->color[COLORSEL_BLUE],
2015 &priv->color[COLORSEL_HUE],
2016 &priv->color[COLORSEL_SATURATION],
2017 &priv->color[COLORSEL_VALUE]);
2018 update_color (colorsel);
2019 }
2020 g_free (text);
2021}
2022
2023static gboolean
2024hex_focus_out (CtkWidget *hex_entry,
2025 CdkEventFocus *event G_GNUC_UNUSED__attribute__ ((__unused__)),
2026 gpointer data)
2027{
2028 hex_changed (hex_entry, data);
2029
2030 return FALSE(0);
2031}
2032
2033static void
2034hsv_changed (CtkWidget *hsv,
2035 gpointer data)
2036{
2037 CtkColorSelection *colorsel;
2038 CtkColorSelectionPrivate *priv;
2039
2040 colorsel = CTK_COLOR_SELECTION (data)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((data)), ((ctk_color_selection_get_type ())
)))))
;
2041 priv = colorsel->private_data;
2042
2043 if (priv->changing)
2044 return;
2045
2046 ctk_hsv_get_color (CTK_HSV (hsv)((((CtkHSV*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((hsv)), ((ctk_hsv_get_type ()))))))
,
2047 &priv->color[COLORSEL_HUE],
2048 &priv->color[COLORSEL_SATURATION],
2049 &priv->color[COLORSEL_VALUE]);
2050 ctk_hsv_to_rgb (priv->color[COLORSEL_HUE],
2051 priv->color[COLORSEL_SATURATION],
2052 priv->color[COLORSEL_VALUE],
2053 &priv->color[COLORSEL_RED],
2054 &priv->color[COLORSEL_GREEN],
2055 &priv->color[COLORSEL_BLUE]);
2056 update_color (colorsel);
2057}
2058
2059static void
2060adjustment_changed (CtkAdjustment *adjustment,
2061 gpointer data)
2062{
2063 CtkColorSelection *colorsel;
2064 CtkColorSelectionPrivate *priv;
2065
2066 colorsel = CTK_COLOR_SELECTION (g_object_get_data (G_OBJECT (adjustment), "COLORSEL"))((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((g_object_get_data (((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((adjustment)), (((GType) ((20) << (
2)))))))), "COLORSEL"))), ((ctk_color_selection_get_type ()))
))))
;
2067 priv = colorsel->private_data;
2068
2069 if (priv->changing)
2070 return;
2071
2072 switch (GPOINTER_TO_INT (data)((gint) (glong) (data)))
2073 {
2074 case COLORSEL_SATURATION:
2075 case COLORSEL_VALUE:
2076 priv->color[GPOINTER_TO_INT (data)((gint) (glong) (data))] = ctk_adjustment_get_value (adjustment) / 100;
2077 ctk_hsv_to_rgb (priv->color[COLORSEL_HUE],
2078 priv->color[COLORSEL_SATURATION],
2079 priv->color[COLORSEL_VALUE],
2080 &priv->color[COLORSEL_RED],
2081 &priv->color[COLORSEL_GREEN],
2082 &priv->color[COLORSEL_BLUE]);
2083 break;
2084 case COLORSEL_HUE:
2085 priv->color[GPOINTER_TO_INT (data)((gint) (glong) (data))] = ctk_adjustment_get_value (adjustment) / 360;
2086 ctk_hsv_to_rgb (priv->color[COLORSEL_HUE],
2087 priv->color[COLORSEL_SATURATION],
2088 priv->color[COLORSEL_VALUE],
2089 &priv->color[COLORSEL_RED],
2090 &priv->color[COLORSEL_GREEN],
2091 &priv->color[COLORSEL_BLUE]);
2092 break;
2093 case COLORSEL_RED:
2094 case COLORSEL_GREEN:
2095 case COLORSEL_BLUE:
2096 priv->color[GPOINTER_TO_INT (data)((gint) (glong) (data))] = ctk_adjustment_get_value (adjustment) / 255;
2097
2098 ctk_rgb_to_hsv (priv->color[COLORSEL_RED],
2099 priv->color[COLORSEL_GREEN],
2100 priv->color[COLORSEL_BLUE],
2101 &priv->color[COLORSEL_HUE],
2102 &priv->color[COLORSEL_SATURATION],
2103 &priv->color[COLORSEL_VALUE]);
2104 break;
2105 default:
2106 priv->color[GPOINTER_TO_INT (data)((gint) (glong) (data))] = ctk_adjustment_get_value (adjustment) / 255;
2107 break;
2108 }
2109 update_color (colorsel);
2110}
2111
2112static void
2113opacity_entry_changed (CtkWidget *opacity_entry G_GNUC_UNUSED__attribute__ ((__unused__)),
2114 gpointer data)
2115{
2116 CtkColorSelection *colorsel;
2117 CtkColorSelectionPrivate *priv;
2118 CtkAdjustment *adj;
2119 gchar *text;
2120
2121 colorsel = CTK_COLOR_SELECTION (data)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((data)), ((ctk_color_selection_get_type ())
)))))
;
2122 priv = colorsel->private_data;
2123
2124 if (priv->changing)
2125 return;
2126
2127 text = ctk_editable_get_chars (CTK_EDITABLE (priv->opacity_entry)((((CtkEditable*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->opacity_entry)), ((ctk_editable_get_type ()))))
))
, 0, -1);
2128 adj = ctk_range_get_adjustment (CTK_RANGE (priv->opacity_slider)((((CtkRange*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->opacity_slider)), ((ctk_range_get_type ()))))))
);
2129 ctk_adjustment_set_value (adj, g_strtod (text, NULL((void*)0)));
2130
2131 update_color (colorsel);
2132
2133 g_free (text);
2134}
2135
2136static void
2137make_label_spinbutton (CtkColorSelection *colorsel,
2138 CtkWidget **spinbutton,
2139 gchar *text,
2140 CtkWidget *table,
2141 gint i,
2142 gint j,
2143 gint channel_type,
2144 const gchar *tooltip)
2145{
2146 CtkWidget *label;
2147 CtkAdjustment *adjust;
2148
2149 if (channel_type == COLORSEL_HUE)
2150 {
2151 adjust = ctk_adjustment_new (0.0, 0.0, 360.0, 1.0, 1.0, 0.0);
2152 }
2153 else if (channel_type == COLORSEL_SATURATION ||
2154 channel_type == COLORSEL_VALUE)
2155 {
2156 adjust = ctk_adjustment_new (0.0, 0.0, 100.0, 1.0, 1.0, 0.0);
2157 }
2158 else
2159 {
2160 adjust = ctk_adjustment_new (0.0, 0.0, 255.0, 1.0, 1.0, 0.0);
2161 }
2162 g_object_set_data (G_OBJECT (adjust)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((adjust)), (((GType) ((20) << (2))))))))
, I_("COLORSEL")g_intern_static_string ("COLORSEL"), colorsel);
2163 *spinbutton = ctk_spin_button_new (adjust, 10.0, 0);
2164
2165 ctk_widget_set_tooltip_text (*spinbutton, tooltip);
2166
2167 g_signal_connect (adjust, "value-changed",g_signal_connect_data ((adjust), ("value-changed"), (((GCallback
) (adjustment_changed))), (((gpointer) (glong) (channel_type)
)), ((void*)0), (GConnectFlags) 0)
2168 G_CALLBACK (adjustment_changed),g_signal_connect_data ((adjust), ("value-changed"), (((GCallback
) (adjustment_changed))), (((gpointer) (glong) (channel_type)
)), ((void*)0), (GConnectFlags) 0)
2169 GINT_TO_POINTER (channel_type))g_signal_connect_data ((adjust), ("value-changed"), (((GCallback
) (adjustment_changed))), (((gpointer) (glong) (channel_type)
)), ((void*)0), (GConnectFlags) 0)
;
2170 label = ctk_label_new_with_mnemonic (text);
2171 ctk_label_set_mnemonic_widget (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_label_get_type ()))))))
, *spinbutton);
2172
2173 ctk_widget_set_halign (label, CTK_ALIGN_START);
2174 ctk_widget_set_valign (label, CTK_ALIGN_CENTER);
2175 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, label, i, j, 1, 1);
2176 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, *spinbutton, i+1, j, 1, 1);
2177}
2178
2179static void
2180make_palette_frame (CtkColorSelection *colorsel,
2181 CtkWidget *table,
2182 gint i,
2183 gint j)
2184{
2185 CtkWidget *frame;
2186 CtkColorSelectionPrivate *priv;
2187
2188 priv = colorsel->private_data;
2189 frame = ctk_frame_new (NULL((void*)0));
2190 ctk_frame_set_shadow_type (CTK_FRAME (frame)((((CtkFrame*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((frame)), ((ctk_frame_get_type ()))))))
, CTK_SHADOW_IN);
2191 priv->custom_palette[i][j] = palette_new (colorsel);
2192 ctk_widget_set_size_request (priv->custom_palette[i][j], CUSTOM_PALETTE_ENTRY_WIDTH20, CUSTOM_PALETTE_ENTRY_HEIGHT20);
2193 ctk_container_add (CTK_CONTAINER (frame)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((frame)), ((ctk_container_get_type ()))))))
, priv->custom_palette[i][j]);
2194 ctk_grid_attach (CTK_GRID (table)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((table)), ((ctk_grid_get_type ()))))))
, frame, i, j, 1, 1);
2195}
2196
2197/* Set the palette entry [x][y] to be the currently selected one. */
2198static void
2199set_selected_palette (CtkColorSelection *colorsel, int x, int y)
2200{
2201 CtkColorSelectionPrivate *priv = colorsel->private_data;
2202
2203 ctk_widget_grab_focus (priv->custom_palette[x][y]);
2204}
2205
2206static double
2207scale_round (double val, double factor)
2208{
2209 val = floor (val * factor + 0.5);
2210 val = MAX (val, 0)(((val) > (0)) ? (val) : (0));
2211 val = MIN (val, factor)(((val) < (factor)) ? (val) : (factor));
2212 return val;
2213}
2214
2215static void
2216update_color (CtkColorSelection *colorsel)
2217{
2218 CtkColorSelectionPrivate *priv = colorsel->private_data;
2219 gchar entryval[12];
2220 gchar opacity_text[32];
2221 gchar *ptr;
2222
2223 priv->changing = TRUE(!(0));
2224 color_sample_update_samples (colorsel);
2225
2226 ctk_hsv_set_color (CTK_HSV (priv->triangle_colorsel)((((CtkHSV*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->triangle_colorsel)), ((ctk_hsv_get_type ())))))
)
,
2227 priv->color[COLORSEL_HUE],
2228 priv->color[COLORSEL_SATURATION],
2229 priv->color[COLORSEL_VALUE]);
2230 ctk_adjustment_set_value (ctk_spin_button_get_adjustment
2231 (CTK_SPIN_BUTTON (priv->hue_spinbutton)((((CtkSpinButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->hue_spinbutton)), ((ctk_spin_button_get_type ()
))))))
),
2232 scale_round (priv->color[COLORSEL_HUE], 360));
2233 ctk_adjustment_set_value (ctk_spin_button_get_adjustment
2234 (CTK_SPIN_BUTTON (priv->sat_spinbutton)((((CtkSpinButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->sat_spinbutton)), ((ctk_spin_button_get_type ()
))))))
),
2235 scale_round (priv->color[COLORSEL_SATURATION], 100));
2236 ctk_adjustment_set_value (ctk_spin_button_get_adjustment
2237 (CTK_SPIN_BUTTON (priv->val_spinbutton)((((CtkSpinButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->val_spinbutton)), ((ctk_spin_button_get_type ()
))))))
),
2238 scale_round (priv->color[COLORSEL_VALUE], 100));
2239 ctk_adjustment_set_value (ctk_spin_button_get_adjustment
2240 (CTK_SPIN_BUTTON (priv->red_spinbutton)((((CtkSpinButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->red_spinbutton)), ((ctk_spin_button_get_type ()
))))))
),
2241 scale_round (priv->color[COLORSEL_RED], 255));
2242 ctk_adjustment_set_value (ctk_spin_button_get_adjustment
2243 (CTK_SPIN_BUTTON (priv->green_spinbutton)((((CtkSpinButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->green_spinbutton)), ((ctk_spin_button_get_type (
)))))))
),
2244 scale_round (priv->color[COLORSEL_GREEN], 255));
2245 ctk_adjustment_set_value (ctk_spin_button_get_adjustment
2246 (CTK_SPIN_BUTTON (priv->blue_spinbutton)((((CtkSpinButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->blue_spinbutton)), ((ctk_spin_button_get_type (
)))))))
),
2247 scale_round (priv->color[COLORSEL_BLUE], 255));
2248 ctk_adjustment_set_value (ctk_range_get_adjustment
2249 (CTK_RANGE (priv->opacity_slider)((((CtkRange*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->opacity_slider)), ((ctk_range_get_type ()))))))
),
2250 scale_round (priv->color[COLORSEL_OPACITY], 255));
2251
2252 g_snprintf (opacity_text, 32, "%.0f", scale_round (priv->color[COLORSEL_OPACITY], 255));
2253 ctk_entry_set_text (CTK_ENTRY (priv->opacity_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->opacity_entry)), ((ctk_entry_get_type ()))))))
, opacity_text);
2254
2255 g_snprintf (entryval, 11, "#%2X%2X%2X",
2256 (guint) (scale_round (priv->color[COLORSEL_RED], 255)),
2257 (guint) (scale_round (priv->color[COLORSEL_GREEN], 255)),
2258 (guint) (scale_round (priv->color[COLORSEL_BLUE], 255)));
2259
2260 for (ptr = entryval; *ptr; ptr++)
2261 if (*ptr == ' ')
2262 *ptr = '0';
2263 ctk_entry_set_text (CTK_ENTRY (priv->hex_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->hex_entry)), ((ctk_entry_get_type ()))))))
, entryval);
2264 priv->changing = FALSE(0);
2265
2266 g_object_ref (colorsel)((__typeof__ (colorsel)) (g_object_ref) (colorsel));
2267
2268 g_signal_emit (colorsel, color_selection_signals[COLOR_CHANGED], 0);
2269
2270 g_object_freeze_notify (G_OBJECT (colorsel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), (((GType) ((20) << (2))))))))
);
2271 g_object_notify (G_OBJECT (colorsel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), (((GType) ((20) << (2))))))))
, "current-color");
2272 g_object_notify (G_OBJECT (colorsel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), (((GType) ((20) << (2))))))))
, "current-alpha");
2273 g_object_thaw_notify (G_OBJECT (colorsel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), (((GType) ((20) << (2))))))))
);
2274
2275 g_object_unref (colorsel);
2276}
2277
2278static void
2279update_palette (CtkColorSelection *colorsel)
2280{
2281 CdkColor *current_colors;
2282 gint i, j;
2283
2284 current_colors = get_current_colors (colorsel);
2
Calling 'get_current_colors'
2285
2286 for (i = 0; i < CTK_CUSTOM_PALETTE_HEIGHT2; i++)
2287 {
2288 for (j = 0; j < CTK_CUSTOM_PALETTE_WIDTH10; j++)
2289 {
2290 gint index;
2291
2292 index = i * CTK_CUSTOM_PALETTE_WIDTH10 + j;
2293
2294 ctk_color_selection_set_palette_color (colorsel,
2295 index,
2296 &current_colors[index]);
2297 }
2298 }
2299
2300 g_free (current_colors);
2301}
2302
2303static void
2304palette_change_notify_instance (GObject *object G_GNUC_UNUSED__attribute__ ((__unused__)),
2305 GParamSpec *pspec G_GNUC_UNUSED__attribute__ ((__unused__)),
2306 gpointer data)
2307{
2308 update_palette (CTK_COLOR_SELECTION (data)((((CtkColorSelection*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((data)), ((ctk_color_selection_get_type ())
)))))
)
;
1
Calling 'update_palette'
2309}
2310
2311static void
2312default_noscreen_change_palette_func (const CdkColor *colors,
2313 gint n_colors)
2314{
2315 default_change_palette_func (cdk_screen_get_default (), colors, n_colors);
2316}
2317
2318static void
2319default_change_palette_func (CdkScreen *screen,
2320 const CdkColor *colors,
2321 gint n_colors)
2322{
2323 gchar *str;
2324
2325 str = ctk_color_selection_palette_to_string (colors, n_colors);
2326
2327 ctk_settings_set_string_property (ctk_settings_get_for_screen (screen),
2328 "ctk-color-palette",
2329 str,
2330 "ctk_color_selection_palette_to_string");
2331
2332 g_free (str);
2333}
2334
2335/**
2336 * ctk_color_selection_new:
2337 *
2338 * Creates a new CtkColorSelection.
2339 *
2340 * Returns: a new #CtkColorSelection
2341 */
2342CtkWidget *
2343ctk_color_selection_new (void)
2344{
2345 CtkColorSelection *colorsel;
2346 CtkColorSelectionPrivate *priv;
2347 gdouble color[4];
2348 color[0] = 1.0;
2349 color[1] = 1.0;
2350 color[2] = 1.0;
2351 color[3] = 1.0;
2352
2353 colorsel = g_object_new (CTK_TYPE_COLOR_SELECTION(ctk_color_selection_get_type ()), NULL((void*)0));
2354 priv = colorsel->private_data;
2355 set_color_internal (colorsel, color);
2356 ctk_color_selection_set_has_opacity_control (colorsel, TRUE(!(0)));
2357
2358 /* We want to make sure that default_set is FALSE.
2359 * This way the user can still set it.
2360 */
2361 priv->default_set = FALSE(0);
2362 priv->default_alpha_set = FALSE(0);
2363
2364 return CTK_WIDGET (colorsel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), ((ctk_widget_get_type ()))))))
;
2365}
2366
2367/**
2368 * ctk_color_selection_get_has_opacity_control:
2369 * @colorsel: a #CtkColorSelection
2370 *
2371 * Determines whether the colorsel has an opacity control.
2372 *
2373 * Returns: %TRUE if the @colorsel has an opacity control,
2374 * %FALSE if it does't
2375 */
2376gboolean
2377ctk_color_selection_get_has_opacity_control (CtkColorSelection *colorsel)
2378{
2379 CtkColorSelectionPrivate *priv;
2380
2381 g_return_val_if_fail (CTK_IS_COLOR_SELECTION (colorsel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
((0)); } } while (0)
;
2382
2383 priv = colorsel->private_data;
2384
2385 return priv->has_opacity;
2386}
2387
2388/**
2389 * ctk_color_selection_set_has_opacity_control:
2390 * @colorsel: a #CtkColorSelection
2391 * @has_opacity: %TRUE if @colorsel can set the opacity, %FALSE otherwise
2392 *
2393 * Sets the @colorsel to use or not use opacity.
2394 */
2395void
2396ctk_color_selection_set_has_opacity_control (CtkColorSelection *colorsel,
2397 gboolean has_opacity)
2398{
2399 CtkColorSelectionPrivate *priv;
2400
2401 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2402
2403 priv = colorsel->private_data;
2404 has_opacity = has_opacity != FALSE(0);
2405
2406 if (priv->has_opacity != has_opacity)
2407 {
2408 priv->has_opacity = has_opacity;
2409 if (has_opacity)
2410 {
2411 ctk_widget_show (priv->opacity_slider);
2412 ctk_widget_show (priv->opacity_label);
2413 ctk_widget_show (priv->opacity_entry);
2414 }
2415 else
2416 {
2417 ctk_widget_hide (priv->opacity_slider);
2418 ctk_widget_hide (priv->opacity_label);
2419 ctk_widget_hide (priv->opacity_entry);
2420 }
2421 color_sample_update_samples (colorsel);
2422
2423 g_object_notify (G_OBJECT (colorsel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), (((GType) ((20) << (2))))))))
, "has-opacity-control");
2424 }
2425}
2426
2427/**
2428 * ctk_color_selection_get_has_palette:
2429 * @colorsel: a #CtkColorSelection
2430 *
2431 * Determines whether the color selector has a color palette.
2432 *
2433 * Returns: %TRUE if the selector has a palette, %FALSE if it hasn't
2434 */
2435gboolean
2436ctk_color_selection_get_has_palette (CtkColorSelection *colorsel)
2437{
2438 CtkColorSelectionPrivate *priv;
2439
2440 g_return_val_if_fail (CTK_IS_COLOR_SELECTION (colorsel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
((0)); } } while (0)
;
2441
2442 priv = colorsel->private_data;
2443
2444 return priv->has_palette;
2445}
2446
2447/**
2448 * ctk_color_selection_set_has_palette:
2449 * @colorsel: a #CtkColorSelection
2450 * @has_palette: %TRUE if palette is to be visible, %FALSE otherwise
2451 *
2452 * Shows and hides the palette based upon the value of @has_palette.
2453 */
2454void
2455ctk_color_selection_set_has_palette (CtkColorSelection *colorsel,
2456 gboolean has_palette)
2457{
2458 CtkColorSelectionPrivate *priv;
2459 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2460
2461 priv = colorsel->private_data;
2462 has_palette = has_palette != FALSE(0);
2463
2464 if (priv->has_palette != has_palette)
2465 {
2466 priv->has_palette = has_palette;
2467 if (has_palette)
2468 ctk_widget_show (priv->palette_frame);
2469 else
2470 ctk_widget_hide (priv->palette_frame);
2471
2472 update_tooltips (colorsel);
2473
2474 g_object_notify (G_OBJECT (colorsel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((colorsel)), (((GType) ((20) << (2))))))))
, "has-palette");
2475 }
2476}
2477
2478/**
2479 * ctk_color_selection_set_current_color:
2480 * @colorsel: a #CtkColorSelection
2481 * @color: a #CdkColor to set the current color with
2482 *
2483 * Sets the current color to be @color.
2484 *
2485 * The first time this is called, it will also set
2486 * the original color to be @color too.
2487 */
2488void
2489ctk_color_selection_set_current_color (CtkColorSelection *colorsel,
2490 const CdkColor *color)
2491{
2492 CtkColorSelectionPrivate *priv;
2493 gint i;
2494
2495 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2496 g_return_if_fail (color != NULL)do { if ((color != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "color != NULL"); return
; } } while (0)
;
2497
2498 priv = colorsel->private_data;
2499 priv->changing = TRUE(!(0));
2500 priv->color[COLORSEL_RED] = SCALE (color->red)(color->red / 65535.);
2501 priv->color[COLORSEL_GREEN] = SCALE (color->green)(color->green / 65535.);
2502 priv->color[COLORSEL_BLUE] = SCALE (color->blue)(color->blue / 65535.);
2503 ctk_rgb_to_hsv (priv->color[COLORSEL_RED],
2504 priv->color[COLORSEL_GREEN],
2505 priv->color[COLORSEL_BLUE],
2506 &priv->color[COLORSEL_HUE],
2507 &priv->color[COLORSEL_SATURATION],
2508 &priv->color[COLORSEL_VALUE]);
2509 if (priv->default_set == FALSE(0))
2510 {
2511 for (i = 0; i < COLORSEL_NUM_CHANNELS; i++)
2512 priv->old_color[i] = priv->color[i];
2513 }
2514 priv->default_set = TRUE(!(0));
2515 update_color (colorsel);
2516}
2517
2518/**
2519 * ctk_color_selection_set_current_alpha:
2520 * @colorsel: a #CtkColorSelection
2521 * @alpha: an integer between 0 and 65535
2522 *
2523 * Sets the current opacity to be @alpha.
2524 *
2525 * The first time this is called, it will also set
2526 * the original opacity to be @alpha too.
2527 */
2528void
2529ctk_color_selection_set_current_alpha (CtkColorSelection *colorsel,
2530 guint16 alpha)
2531{
2532 CtkColorSelectionPrivate *priv;
2533 gint i;
2534
2535 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2536
2537 priv = colorsel->private_data;
2538 priv->changing = TRUE(!(0));
2539 priv->color[COLORSEL_OPACITY] = SCALE (alpha)(alpha / 65535.);
2540 if (priv->default_alpha_set == FALSE(0))
2541 {
2542 for (i = 0; i < COLORSEL_NUM_CHANNELS; i++)
2543 priv->old_color[i] = priv->color[i];
2544 }
2545 priv->default_alpha_set = TRUE(!(0));
2546 update_color (colorsel);
2547}
2548
2549/**
2550 * ctk_color_selection_get_current_color:
2551 * @colorsel: a #CtkColorSelection
2552 * @color: (out): a #CdkColor to fill in with the current color
2553 *
2554 * Sets @color to be the current color in the CtkColorSelection widget.
2555 */
2556void
2557ctk_color_selection_get_current_color (CtkColorSelection *colorsel,
2558 CdkColor *color)
2559{
2560 CtkColorSelectionPrivate *priv;
2561
2562 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2563 g_return_if_fail (color != NULL)do { if ((color != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "color != NULL"); return
; } } while (0)
;
2564
2565 priv = colorsel->private_data;
2566 color->red = UNSCALE (priv->color[COLORSEL_RED])((guint16)(priv->color[COLORSEL_RED] * 65535 + 0.5));
2567 color->green = UNSCALE (priv->color[COLORSEL_GREEN])((guint16)(priv->color[COLORSEL_GREEN] * 65535 + 0.5));
2568 color->blue = UNSCALE (priv->color[COLORSEL_BLUE])((guint16)(priv->color[COLORSEL_BLUE] * 65535 + 0.5));
2569}
2570
2571/**
2572 * ctk_color_selection_get_current_alpha:
2573 * @colorsel: a #CtkColorSelection
2574 *
2575 * Returns the current alpha value.
2576 *
2577 * Returns: an integer between 0 and 65535
2578 */
2579guint16
2580ctk_color_selection_get_current_alpha (CtkColorSelection *colorsel)
2581{
2582 CtkColorSelectionPrivate *priv;
2583
2584 g_return_val_if_fail (CTK_IS_COLOR_SELECTION (colorsel), 0)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
(0); } } while (0)
;
2585
2586 priv = colorsel->private_data;
2587 return priv->has_opacity ? UNSCALE (priv->color[COLORSEL_OPACITY])((guint16)(priv->color[COLORSEL_OPACITY] * 65535 + 0.5)) : 65535;
2588}
2589
2590/**
2591 * ctk_color_selection_set_previous_color:
2592 * @colorsel: a #CtkColorSelection
2593 * @color: a #CdkColor to set the previous color with
2594 *
2595 * Sets the “previous” color to be @color.
2596 *
2597 * This function should be called with some hesitations,
2598 * as it might seem confusing to have that color change.
2599 * Calling ctk_color_selection_set_current_color() will also
2600 * set this color the first time it is called.
2601 */
2602void
2603ctk_color_selection_set_previous_color (CtkColorSelection *colorsel,
2604 const CdkColor *color)
2605{
2606 CtkColorSelectionPrivate *priv;
2607
2608 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2609 g_return_if_fail (color != NULL)do { if ((color != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "color != NULL"); return
; } } while (0)
;
2610
2611 priv = colorsel->private_data;
2612 priv->changing = TRUE(!(0));
2613 priv->old_color[COLORSEL_RED] = SCALE (color->red)(color->red / 65535.);
2614 priv->old_color[COLORSEL_GREEN] = SCALE (color->green)(color->green / 65535.);
2615 priv->old_color[COLORSEL_BLUE] = SCALE (color->blue)(color->blue / 65535.);
2616 ctk_rgb_to_hsv (priv->old_color[COLORSEL_RED],
2617 priv->old_color[COLORSEL_GREEN],
2618 priv->old_color[COLORSEL_BLUE],
2619 &priv->old_color[COLORSEL_HUE],
2620 &priv->old_color[COLORSEL_SATURATION],
2621 &priv->old_color[COLORSEL_VALUE]);
2622 color_sample_update_samples (colorsel);
2623 priv->default_set = TRUE(!(0));
2624 priv->changing = FALSE(0);
2625}
2626
2627/**
2628 * ctk_color_selection_set_previous_alpha:
2629 * @colorsel: a #CtkColorSelection
2630 * @alpha: an integer between 0 and 65535
2631 *
2632 * Sets the “previous” alpha to be @alpha.
2633 *
2634 * This function should be called with some hesitations,
2635 * as it might seem confusing to have that alpha change.
2636 */
2637void
2638ctk_color_selection_set_previous_alpha (CtkColorSelection *colorsel,
2639 guint16 alpha)
2640{
2641 CtkColorSelectionPrivate *priv;
2642
2643 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2644
2645 priv = colorsel->private_data;
2646 priv->changing = TRUE(!(0));
2647 priv->old_color[COLORSEL_OPACITY] = SCALE (alpha)(alpha / 65535.);
2648 color_sample_update_samples (colorsel);
2649 priv->default_alpha_set = TRUE(!(0));
2650 priv->changing = FALSE(0);
2651}
2652
2653
2654/**
2655 * ctk_color_selection_get_previous_color:
2656 * @colorsel: a #CtkColorSelection
2657 * @color: (out): a #CdkColor to fill in with the original color value
2658 *
2659 * Fills @color in with the original color value.
2660 */
2661void
2662ctk_color_selection_get_previous_color (CtkColorSelection *colorsel,
2663 CdkColor *color)
2664{
2665 CtkColorSelectionPrivate *priv;
2666
2667 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2668 g_return_if_fail (color != NULL)do { if ((color != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "color != NULL"); return
; } } while (0)
;
2669
2670 priv = colorsel->private_data;
2671 color->red = UNSCALE (priv->old_color[COLORSEL_RED])((guint16)(priv->old_color[COLORSEL_RED] * 65535 + 0.5));
2672 color->green = UNSCALE (priv->old_color[COLORSEL_GREEN])((guint16)(priv->old_color[COLORSEL_GREEN] * 65535 + 0.5));
2673 color->blue = UNSCALE (priv->old_color[COLORSEL_BLUE])((guint16)(priv->old_color[COLORSEL_BLUE] * 65535 + 0.5));
2674}
2675
2676/**
2677 * ctk_color_selection_get_previous_alpha:
2678 * @colorsel: a #CtkColorSelection
2679 *
2680 * Returns the previous alpha value.
2681 *
2682 * Returns: an integer between 0 and 65535
2683 */
2684guint16
2685ctk_color_selection_get_previous_alpha (CtkColorSelection *colorsel)
2686{
2687 CtkColorSelectionPrivate *priv;
2688
2689 g_return_val_if_fail (CTK_IS_COLOR_SELECTION (colorsel), 0)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
(0); } } while (0)
;
2690
2691 priv = colorsel->private_data;
2692 return priv->has_opacity ? UNSCALE (priv->old_color[COLORSEL_OPACITY])((guint16)(priv->old_color[COLORSEL_OPACITY] * 65535 + 0.5
))
: 65535;
2693}
2694
2695/**
2696 * ctk_color_selection_set_current_rgba:
2697 * @colorsel: a #CtkColorSelection
2698 * @rgba: A #CdkRGBA to set the current color with
2699 *
2700 * Sets the current color to be @rgba.
2701 *
2702 * The first time this is called, it will also set
2703 * the original color to be @rgba too.
2704 *
2705 * Since: 3.0
2706 */
2707void
2708ctk_color_selection_set_current_rgba (CtkColorSelection *colorsel,
2709 const CdkRGBA *rgba)
2710{
2711 CtkColorSelectionPrivate *priv;
2712 gint i;
2713
2714 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2715 g_return_if_fail (rgba != NULL)do { if ((rgba != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "rgba != NULL"); return;
} } while (0)
;
2716
2717 priv = colorsel->private_data;
2718 priv->changing = TRUE(!(0));
2719
2720 priv->color[COLORSEL_RED] = CLAMP (rgba->red, 0, 1)(((rgba->red) > (1)) ? (1) : (((rgba->red) < (0))
? (0) : (rgba->red)))
;
2721 priv->color[COLORSEL_GREEN] = CLAMP (rgba->green, 0, 1)(((rgba->green) > (1)) ? (1) : (((rgba->green) < (
0)) ? (0) : (rgba->green)))
;
2722 priv->color[COLORSEL_BLUE] = CLAMP (rgba->blue, 0, 1)(((rgba->blue) > (1)) ? (1) : (((rgba->blue) < (0
)) ? (0) : (rgba->blue)))
;
2723 priv->color[COLORSEL_OPACITY] = CLAMP (rgba->alpha, 0, 1)(((rgba->alpha) > (1)) ? (1) : (((rgba->alpha) < (
0)) ? (0) : (rgba->alpha)))
;
2724
2725 ctk_rgb_to_hsv (priv->color[COLORSEL_RED],
2726 priv->color[COLORSEL_GREEN],
2727 priv->color[COLORSEL_BLUE],
2728 &priv->color[COLORSEL_HUE],
2729 &priv->color[COLORSEL_SATURATION],
2730 &priv->color[COLORSEL_VALUE]);
2731
2732 if (priv->default_set == FALSE(0))
2733 {
2734 for (i = 0; i < COLORSEL_NUM_CHANNELS; i++)
2735 priv->old_color[i] = priv->color[i];
2736 }
2737
2738 priv->default_set = TRUE(!(0));
2739 update_color (colorsel);
2740}
2741
2742/**
2743 * ctk_color_selection_get_current_rgba:
2744 * @colorsel: a #CtkColorSelection
2745 * @rgba: (out): a #CdkRGBA to fill in with the current color
2746 *
2747 * Sets @rgba to be the current color in the CtkColorSelection widget.
2748 *
2749 * Since: 3.0
2750 */
2751void
2752ctk_color_selection_get_current_rgba (CtkColorSelection *colorsel,
2753 CdkRGBA *rgba)
2754{
2755 CtkColorSelectionPrivate *priv;
2756
2757 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2758 g_return_if_fail (rgba != NULL)do { if ((rgba != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "rgba != NULL"); return;
} } while (0)
;
2759
2760 priv = colorsel->private_data;
2761 rgba->red = priv->color[COLORSEL_RED];
2762 rgba->green = priv->color[COLORSEL_GREEN];
2763 rgba->blue = priv->color[COLORSEL_BLUE];
2764 rgba->alpha = (priv->has_opacity) ? priv->color[COLORSEL_OPACITY] : 1;
2765}
2766
2767/**
2768 * ctk_color_selection_set_previous_rgba:
2769 * @colorsel: a #CtkColorSelection
2770 * @rgba: a #CdkRGBA to set the previous color with
2771 *
2772 * Sets the “previous” color to be @rgba.
2773 *
2774 * This function should be called with some hesitations,
2775 * as it might seem confusing to have that color change.
2776 * Calling ctk_color_selection_set_current_rgba() will also
2777 * set this color the first time it is called.
2778 *
2779 * Since: 3.0
2780 */
2781void
2782ctk_color_selection_set_previous_rgba (CtkColorSelection *colorsel,
2783 const CdkRGBA *rgba)
2784{
2785 CtkColorSelectionPrivate *priv;
2786
2787 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2788 g_return_if_fail (rgba != NULL)do { if ((rgba != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "rgba != NULL"); return;
} } while (0)
;
2789
2790 priv = colorsel->private_data;
2791 priv->changing = TRUE(!(0));
2792
2793 priv->old_color[COLORSEL_RED] = CLAMP (rgba->red, 0, 1)(((rgba->red) > (1)) ? (1) : (((rgba->red) < (0))
? (0) : (rgba->red)))
;
2794 priv->old_color[COLORSEL_GREEN] = CLAMP (rgba->green, 0, 1)(((rgba->green) > (1)) ? (1) : (((rgba->green) < (
0)) ? (0) : (rgba->green)))
;
2795 priv->old_color[COLORSEL_BLUE] = CLAMP (rgba->blue, 0, 1)(((rgba->blue) > (1)) ? (1) : (((rgba->blue) < (0
)) ? (0) : (rgba->blue)))
;
2796 priv->old_color[COLORSEL_OPACITY] = CLAMP (rgba->alpha, 0, 1)(((rgba->alpha) > (1)) ? (1) : (((rgba->alpha) < (
0)) ? (0) : (rgba->alpha)))
;
2797
2798 ctk_rgb_to_hsv (priv->old_color[COLORSEL_RED],
2799 priv->old_color[COLORSEL_GREEN],
2800 priv->old_color[COLORSEL_BLUE],
2801 &priv->old_color[COLORSEL_HUE],
2802 &priv->old_color[COLORSEL_SATURATION],
2803 &priv->old_color[COLORSEL_VALUE]);
2804
2805 color_sample_update_samples (colorsel);
2806 priv->default_set = TRUE(!(0));
2807 priv->changing = FALSE(0);
2808}
2809
2810/**
2811 * ctk_color_selection_get_previous_rgba:
2812 * @colorsel: a #CtkColorSelection
2813 * @rgba: (out): a #CdkRGBA to fill in with the original color value
2814 *
2815 * Fills @rgba in with the original color value.
2816 *
2817 * Since: 3.0
2818 */
2819void
2820ctk_color_selection_get_previous_rgba (CtkColorSelection *colorsel,
2821 CdkRGBA *rgba)
2822{
2823 CtkColorSelectionPrivate *priv;
2824
2825 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2826 g_return_if_fail (rgba != NULL)do { if ((rgba != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "rgba != NULL"); return;
} } while (0)
;
2827
2828 priv = colorsel->private_data;
2829 rgba->red = priv->old_color[COLORSEL_RED];
2830 rgba->green = priv->old_color[COLORSEL_GREEN];
2831 rgba->blue = priv->old_color[COLORSEL_BLUE];
2832 rgba->alpha = (priv->has_opacity) ? priv->old_color[COLORSEL_OPACITY] : 1;
2833}
2834
2835/**
2836 * ctk_color_selection_set_palette_color:
2837 * @colorsel: a #CtkColorSelection
2838 * @index: the color index of the palette
2839 * @color: A #CdkColor to set the palette with
2840 *
2841 * Sets the palette located at @index to have @color as its color.
2842 */
2843static void
2844ctk_color_selection_set_palette_color (CtkColorSelection *colorsel,
2845 gint index,
2846 CdkColor *color)
2847{
2848 CtkColorSelectionPrivate *priv;
2849 gint x, y;
2850 gdouble col[3];
2851
2852 g_return_if_fail (CTK_IS_COLOR_SELECTION (colorsel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
; } } while (0)
;
2853 g_return_if_fail (index >= 0 && index < CTK_CUSTOM_PALETTE_WIDTH*CTK_CUSTOM_PALETTE_HEIGHT)do { if ((index >= 0 && index < 10*2)) { } else
{ g_return_if_fail_warning ("Ctk", ((const char*) (__func__)
), "index >= 0 && index < CTK_CUSTOM_PALETTE_WIDTH*CTK_CUSTOM_PALETTE_HEIGHT"
); return; } } while (0)
;
2854
2855 x = index % CTK_CUSTOM_PALETTE_WIDTH10;
2856 y = index / CTK_CUSTOM_PALETTE_WIDTH10;
2857
2858 priv = colorsel->private_data;
2859 col[0] = SCALE (color->red)(color->red / 65535.);
2860 col[1] = SCALE (color->green)(color->green / 65535.);
2861 col[2] = SCALE (color->blue)(color->blue / 65535.);
2862
2863 palette_set_color (priv->custom_palette[x][y], colorsel, col);
2864}
2865
2866/**
2867 * ctk_color_selection_is_adjusting:
2868 * @colorsel: a #CtkColorSelection
2869 *
2870 * Gets the current state of the @colorsel.
2871 *
2872 * Returns: %TRUE if the user is currently dragging
2873 * a color around, and %FALSE if the selection has stopped
2874 */
2875gboolean
2876ctk_color_selection_is_adjusting (CtkColorSelection *colorsel)
2877{
2878 CtkColorSelectionPrivate *priv;
2879
2880 g_return_val_if_fail (CTK_IS_COLOR_SELECTION (colorsel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((colorsel)); GType __t = ((ctk_color_selection_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 ("Ctk", ((const
char*) (__func__)), "CTK_IS_COLOR_SELECTION (colorsel)"); return
((0)); } } while (0)
;
2881
2882 priv = colorsel->private_data;
2883
2884 return (ctk_hsv_is_adjusting (CTK_HSV (priv->triangle_colorsel)((((CtkHSV*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->triangle_colorsel)), ((ctk_hsv_get_type ())))))
)
));
2885}
2886
2887
2888/**
2889 * ctk_color_selection_palette_from_string:
2890 * @str: a string encoding a color palette
2891 * @colors: (out) (array length=n_colors): return location for
2892 * allocated array of #CdkColor
2893 * @n_colors: return location for length of array
2894 *
2895 * Parses a color palette string; the string is a colon-separated
2896 * list of color names readable by cdk_color_parse().
2897 *
2898 * Returns: %TRUE if a palette was successfully parsed
2899 */
2900gboolean
2901ctk_color_selection_palette_from_string (const gchar *str,
2902 CdkColor **colors,
2903 gint *n_colors)
2904{
2905 CdkColor *retval;
2906 gint count;
2907 gchar *p;
2908 gchar *start;
2909 gchar *copy;
2910
2911 count = 0;
2912 retval = NULL((void*)0);
2913 copy = g_strdup (str)g_strdup_inline (str);
2914
2915 start = copy;
2916 p = copy;
2917 while (TRUE(!(0)))
2918 {
2919 if (*p == ':' || *p == '\0')
4
Assuming the condition is false
5
Assuming the condition is false
6
Taking false branch
7
Assuming the condition is false
8
Assuming the condition is true
9
Taking true branch
22
Assuming the condition is true
2920 {
2921 gboolean done = TRUE(!(0));
2922
2923 if (start
9.1
'start' is not equal to 'p'
22.1
'start' is equal to 'p'
== p)
10
Taking false branch
23
Taking true branch
2924 {
2925 goto failed; /* empty entry */
24
Control jumps to line 2964
2926 }
2927
2928 if (*p)
11
Taking false branch
2929 {
2930 *p = '\0';
2931 done = FALSE(0);
2932 }
2933
2934 retval = g_renew (CdkColor, retval, count + 1)((CdkColor *) g_realloc_n (retval, (count + 1), sizeof (CdkColor
)))
;
2935 if (!cdk_color_parse (start, retval + count))
12
Assuming the condition is false
13
Taking false branch
2936 {
2937 goto failed;
2938 }
2939
2940 ++count;
2941
2942 if (done
13.1
'done' is 1
)
14
Taking true branch
2943 break;
2944 else
2945 start = p + 1;
2946 }
2947
2948 ++p;
2949 }
2950
2951 g_free (copy);
2952
2953 if (colors
14.1
'colors' is non-null, which participates in a condition later
)
15
Taking true branch
2954 *colors = retval;
16
The value of 'retval' is assigned to 'colors', which participates in a condition later
2955 else
2956 g_free (retval);
2957
2958 if (n_colors
16.1
'n_colors' is non-null
)
17
Taking true branch
2959 *n_colors = count;
2960
2961 return TRUE(!(0));
2962
2963 failed:
2964 g_free (copy);
2965 g_free (retval);
2966
2967 if (colors
24.1
'colors' is non-null
)
25
Taking true branch
2968 *colors = NULL((void*)0);
26
Null pointer value stored to 'colors'
2969 if (n_colors
26.1
'n_colors' is non-null
)
27
Taking true branch
2970 *n_colors = 0;
2971
2972 return FALSE(0);
2973}
2974
2975/**
2976 * ctk_color_selection_palette_to_string:
2977 * @colors: (array length=n_colors): an array of colors
2978 * @n_colors: length of the array
2979 *
2980 * Encodes a palette as a string, useful for persistent storage.
2981 *
2982 * Returns: allocated string encoding the palette
2983 */
2984gchar*
2985ctk_color_selection_palette_to_string (const CdkColor *colors,
2986 gint n_colors)
2987{
2988 gint i;
2989 gchar **strs = NULL((void*)0);
2990 gchar *retval;
2991
2992 if (n_colors == 0)
2993 return g_strdup ("")g_strdup_inline ("");
2994
2995 strs = g_new0 (gchar*, n_colors + 1)((gchar* *) g_malloc0_n ((n_colors + 1), sizeof (gchar*)));
2996
2997 i = 0;
2998 while (i < n_colors)
2999 {
3000 gchar *ptr;
3001
3002 strs[i] =
3003 g_strdup_printf ("#%2X%2X%2X",
3004 colors[i].red / 256,
3005 colors[i].green / 256,
3006 colors[i].blue / 256);
3007
3008 for (ptr = strs[i]; *ptr; ptr++)
3009 if (*ptr == ' ')
3010 *ptr = '0';
3011
3012 ++i;
3013 }
3014
3015 retval = g_strjoinv (":", strs);
3016
3017 g_strfreev (strs);
3018
3019 return retval;
3020}
3021
3022/**
3023 * ctk_color_selection_set_change_palette_with_screen_hook: (skip)
3024 * @func: a function to call when the custom palette needs saving
3025 *
3026 * Installs a global function to be called whenever the user
3027 * tries to modify the palette in a color selection.
3028 *
3029 * This function should save the new palette contents, and update
3030 * the #CtkSettings:ctk-color-palette CtkSettings property so all
3031 * CtkColorSelection widgets will be modified.
3032 *
3033 * Returns: the previous change palette hook (that was replaced)
3034 *
3035 * Since: 2.2
3036 */
3037CtkColorSelectionChangePaletteWithScreenFunc
3038ctk_color_selection_set_change_palette_with_screen_hook (CtkColorSelectionChangePaletteWithScreenFunc func)
3039{
3040 CtkColorSelectionChangePaletteWithScreenFunc old;
3041
3042 old = change_palette_hook;
3043
3044 change_palette_hook = func;
3045
3046 return old;
3047}
3048
3049static void
3050make_control_relations (AtkObject *atk_obj,
3051 CtkWidget *widget)
3052{
3053 AtkObject *obj;
3054
3055 obj = ctk_widget_get_accessible (widget);
3056 atk_object_add_relationship (atk_obj, ATK_RELATION_CONTROLLED_BY, obj);
3057 atk_object_add_relationship (obj, ATK_RELATION_CONTROLLER_FOR, atk_obj);
3058}
3059
3060static void
3061make_all_relations (AtkObject *atk_obj,
3062 CtkColorSelectionPrivate *priv)
3063{
3064 make_control_relations (atk_obj, priv->hue_spinbutton);
3065 make_control_relations (atk_obj, priv->sat_spinbutton);
3066 make_control_relations (atk_obj, priv->val_spinbutton);
3067 make_control_relations (atk_obj, priv->red_spinbutton);
3068 make_control_relations (atk_obj, priv->green_spinbutton);
3069 make_control_relations (atk_obj, priv->blue_spinbutton);
3070}