]> Pileus Git - ~andy/gtk/blob - gtk/gtkgamma.c
Intern some more strings.
[~andy/gtk] / gtk / gtkgamma.c
1 /* GTK - The GIMP Toolkit
2  * Copyright (C) 1997 David Mosberger
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GTK+ Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 #include <config.h>
28 #include <string.h>
29 #include <stdlib.h>
30 #include <stdio.h>
31
32 #include "gtkgamma.h"
33 #include "gtkcurve.h"
34 #include "gtkdialog.h"
35 #include "gtkdrawingarea.h"
36 #include "gtkentry.h"
37 #include "gtkhbox.h"
38 #include "gtkimage.h"
39 #include "gtklabel.h"
40 #include "gtkmain.h"
41 #include "gtkradiobutton.h"
42 #include "gtkstock.h"
43 #include "gtktable.h"
44 #include "gtkvbox.h"
45 #include "gtkwindow.h"
46 #include "gtkintl.h"
47 #include "gtkalias.h"
48
49 static GtkVBoxClass *parent_class = NULL;
50
51
52 /* forward declarations: */
53 static void gtk_gamma_curve_class_init (GtkGammaCurveClass *class);
54 static void gtk_gamma_curve_init (GtkGammaCurve *curve);
55 static void gtk_gamma_curve_destroy (GtkObject *object);
56
57 static void curve_type_changed_callback (GtkWidget *w, gpointer data);
58 static void button_realize_callback     (GtkWidget *w);
59 static void button_toggled_callback     (GtkWidget *w, gpointer data);
60 static void button_clicked_callback     (GtkWidget *w, gpointer data);
61
62 enum
63   {
64     LINEAR = 0,
65     SPLINE,
66     FREE,
67     GAMMA,
68     RESET,
69     NUM_XPMS
70   };
71
72 static const char *const xpm[][27] =
73   {
74     /* spline: */
75     {
76       /* width height ncolors chars_per_pixel */
77       "16 16 4 1",
78       /* colors */
79       ". c None",
80       "B c #000000",
81       "+ c #BC2D2D",
82       "r c #FF0000",
83       /* pixels */
84       "..............BB",
85       ".........rrrrrrB",
86       ".......rr.......",
87       ".....B+.........",
88       "....BBB.........",
89       "....+B..........",
90       "....r...........",
91       "...r............",
92       "...r............",
93       "..r.............",
94       "..r.............",
95       ".r..............",
96       ".r..............",
97       ".r..............",
98       "B+..............",
99       "BB.............."
100     },
101     /* linear: */
102     {
103       /* width height ncolors chars_per_pixel */
104       "16 16 5 1",
105       /* colors */
106       ". c None", /* transparent */
107       "B c #000000",
108       "' c #7F7F7F",
109       "+ c #824141",
110       "r c #FF0000",
111       /* pixels */
112       "..............BB",
113       "..............+B",
114       "..............r.",
115       ".............r..",
116       ".............r..",
117       "....'B'.....r...",
118       "....BBB.....r...",
119       "....+B+....r....",
120       "....r.r....r....",
121       "...r...r..r.....",
122       "...r...r..r.....",
123       "..r.....rB+.....",
124       "..r.....BBB.....",
125       ".r......'B'.....",
126       "B+..............",
127       "BB.............."
128     },
129     /* free: */
130     {
131       /* width height ncolors chars_per_pixel */
132       "16 16 2 1",
133       /* colors */
134       ". c None",
135       "r c #FF0000",
136       /* pixels */
137       "................",
138       "................",
139       "......r.........",
140       "......r.........",
141       ".......r........",
142       ".......r........",
143       ".......r........",
144       "........r.......",
145       "........r.......",
146       "........r.......",
147       ".....r...r.rrrrr",
148       "....r....r......",
149       "...r.....r......",
150       "..r.......r.....",
151       ".r........r.....",
152       "r..............."
153     },
154     /* gamma: */
155     {
156       /* width height ncolors chars_per_pixel */
157       "16 16 10 1",
158       /* colors */
159       ". c None",
160       "B c #000000",
161       "& c #171717",
162       "# c #2F2F2F",
163       "X c #464646",
164       "= c #5E5E5E",
165       "/ c #757575",
166       "+ c #8C8C8C",
167       "- c #A4A4A4",
168       "` c #BBBBBB",
169       /* pixels */
170       "................",
171       "................",
172       "................",
173       "....B=..+B+.....",
174       "....X&`./&-.....",
175       "...../+.XX......",
176       "......B.B+......",
177       "......X.X.......",
178       "......X&+.......",
179       "......-B........",
180       "....../=........",
181       "......#B........",
182       "......BB........",
183       "......B#........",
184       "................",
185       "................"
186     },
187     /* reset: */
188     {
189       /* width height ncolors chars_per_pixel */
190       "16 16 4 1",
191       /* colors */
192       ". c None",
193       "B c #000000",
194       "+ c #824141",
195       "r c #FF0000",
196       /* pixels */
197       "..............BB",
198       "..............+B",
199       ".............r..",
200       "............r...",
201       "...........r....",
202       "..........r.....",
203       ".........r......",
204       "........r.......",
205       ".......r........",
206       "......r.........",
207       ".....r..........",
208       "....r...........",
209       "...r............",
210       "..r.............",
211       "B+..............",
212       "BB.............."
213     }
214   };
215
216 GType
217 gtk_gamma_curve_get_type (void)
218 {
219   static GType gamma_curve_type = 0;
220   
221   if (!gamma_curve_type)
222     {
223       static const GTypeInfo gamma_curve_info =
224       {
225         sizeof (GtkGammaCurveClass),
226         NULL,           /* base_init */
227         NULL,           /* base_finalize */
228         (GClassInitFunc) gtk_gamma_curve_class_init,
229         NULL,           /* class_finalize */
230         NULL,           /* class_data */
231         sizeof (GtkGammaCurve),
232         0,              /* n_preallocs */
233         (GInstanceInitFunc) gtk_gamma_curve_init,
234       };
235       
236       gamma_curve_type = g_type_register_static (GTK_TYPE_VBOX, I_("GtkGammaCurve"),
237                                                  &gamma_curve_info, 0);
238     }
239   return gamma_curve_type;
240 }
241
242 static void
243 gtk_gamma_curve_class_init (GtkGammaCurveClass *class)
244 {
245   GtkObjectClass *object_class;
246
247   parent_class = g_type_class_peek_parent (class);
248
249   object_class = (GtkObjectClass *) class;
250   object_class->destroy = gtk_gamma_curve_destroy;
251 }
252
253 static void
254 gtk_gamma_curve_init (GtkGammaCurve *curve)
255 {
256   GtkWidget *vbox;
257   int i;
258
259   curve->gamma = 1.0;
260
261   curve->table = gtk_table_new (1, 2, FALSE);
262   gtk_table_set_col_spacings (GTK_TABLE (curve->table), 3);
263   gtk_container_add (GTK_CONTAINER (curve), curve->table);
264
265   curve->curve = gtk_curve_new ();
266   g_signal_connect (curve->curve, "curve_type_changed",
267                     G_CALLBACK (curve_type_changed_callback), curve);
268   gtk_table_attach_defaults (GTK_TABLE (curve->table), curve->curve, 0, 1, 0, 1);
269
270   vbox = gtk_vbox_new (/* homogeneous */ FALSE, /* spacing */ 3);
271   gtk_table_attach (GTK_TABLE (curve->table), vbox, 1, 2, 0, 1, 0, 0, 0, 0);
272
273   /* toggle buttons: */
274   for (i = 0; i < 3; ++i)
275     {
276       curve->button[i] = gtk_toggle_button_new ();
277       g_object_set_data (G_OBJECT (curve->button[i]), I_("_GtkGammaCurveIndex"),
278                          GINT_TO_POINTER (i));
279       gtk_container_add (GTK_CONTAINER (vbox), curve->button[i]);
280       g_signal_connect (curve->button[i], "realize",
281                         G_CALLBACK (button_realize_callback), NULL);
282       g_signal_connect (curve->button[i], "toggled",
283                         G_CALLBACK (button_toggled_callback), curve);
284       gtk_widget_show (curve->button[i]);
285     }
286
287   /* push buttons: */
288   for (i = 3; i < 5; ++i)
289     {
290       curve->button[i] = gtk_button_new ();
291       g_object_set_data (G_OBJECT (curve->button[i]), I_("_GtkGammaCurveIndex"),
292                          GINT_TO_POINTER (i));
293       gtk_container_add (GTK_CONTAINER (vbox), curve->button[i]);
294       g_signal_connect (curve->button[i], "realize",
295                         G_CALLBACK (button_realize_callback), NULL);
296       g_signal_connect (curve->button[i], "clicked",
297                         G_CALLBACK (button_clicked_callback), curve);
298       gtk_widget_show (curve->button[i]);
299     }
300
301   gtk_widget_show (vbox);
302   gtk_widget_show (curve->table);
303   gtk_widget_show (curve->curve);
304 }
305
306 static void
307 button_realize_callback (GtkWidget *w)
308 {
309   GtkWidget *pixmap;
310   GdkBitmap *mask;
311   GdkPixmap *pm;
312   int i;
313
314   i = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex"));
315   pm = gdk_pixmap_create_from_xpm_d (w->window, &mask,
316                                      &w->style->bg[GTK_STATE_NORMAL], (gchar **)xpm[i]);
317
318   pixmap = gtk_image_new_from_pixmap (pm, mask);
319   gtk_container_add (GTK_CONTAINER (w), pixmap);
320   gtk_widget_show (pixmap);
321
322   g_object_unref (pm);
323   g_object_unref (mask);
324 }
325
326 static void
327 button_toggled_callback (GtkWidget *w, gpointer data)
328 {
329   GtkGammaCurve *c = data;
330   GtkCurveType type;
331   int active, i;
332
333   if (!GTK_TOGGLE_BUTTON (w)->active)
334     return;
335
336   active = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex"));
337
338   for (i = 0; i < 3; ++i)
339     if ((i != active) && GTK_TOGGLE_BUTTON (c->button[i])->active)
340       break;
341
342   if (i < 3)
343     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c->button[i]), FALSE);
344
345   switch (active)
346     {
347     case 0:  type = GTK_CURVE_TYPE_SPLINE; break;
348     case 1:  type = GTK_CURVE_TYPE_LINEAR; break;
349     default: type = GTK_CURVE_TYPE_FREE; break;
350     }
351   gtk_curve_set_curve_type (GTK_CURVE (c->curve), type);
352 }
353
354 static void
355 gamma_cancel_callback (GtkWidget *w, gpointer data)
356 {
357   GtkGammaCurve *c = data;
358
359   gtk_widget_destroy (c->gamma_dialog);
360 }
361
362 static void
363 gamma_ok_callback (GtkWidget *w, gpointer data)
364 {
365   GtkGammaCurve *c = data;
366   const gchar *start;
367   gchar *end;
368   gfloat v;
369
370   start = gtk_entry_get_text (GTK_ENTRY (c->gamma_text));
371   if (start)
372     {
373       v = g_strtod (start, &end);
374       if (end > start && v > 0.0)
375         c->gamma = v;
376     }
377   gtk_curve_set_gamma (GTK_CURVE (c->curve), c->gamma);
378   gamma_cancel_callback (w, data);
379 }
380
381 static void
382 button_clicked_callback (GtkWidget *w, gpointer data)
383 {
384   GtkGammaCurve *c = data;
385   int active;
386
387   active = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex"));
388   if (active == 3)
389     {
390       /* set gamma */
391       if (c->gamma_dialog)
392         return;
393       else
394         {
395           GtkWidget *vbox, *hbox, *label, *button;
396           gchar buf[64];
397           
398           c->gamma_dialog = gtk_dialog_new ();
399           gtk_window_set_screen (GTK_WINDOW (c->gamma_dialog),
400                                  gtk_widget_get_screen (w));
401           gtk_window_set_title (GTK_WINDOW (c->gamma_dialog), _("Gamma"));
402           g_object_add_weak_pointer (G_OBJECT (c->gamma_dialog),
403                                      (gpointer *)&c->gamma_dialog);
404           
405           vbox = GTK_DIALOG (c->gamma_dialog)->vbox;
406           
407           hbox = gtk_hbox_new (/* homogeneous */ FALSE, 0);
408           gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2);
409           gtk_widget_show (hbox);
410           
411           label = gtk_label_new_with_mnemonic (_("_Gamma value"));
412           gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
413           gtk_widget_show (label);
414           
415           sprintf (buf, "%g", c->gamma);
416           c->gamma_text = gtk_entry_new ();
417           gtk_label_set_mnemonic_widget (GTK_LABEL (label), c->gamma_text);
418           gtk_entry_set_text (GTK_ENTRY (c->gamma_text), buf);
419           gtk_box_pack_start (GTK_BOX (hbox), c->gamma_text, TRUE, TRUE, 2);
420           gtk_widget_show (c->gamma_text);
421           
422           /* fill in action area: */
423           hbox = GTK_DIALOG (c->gamma_dialog)->action_area;
424
425           button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
426           g_signal_connect (button, "clicked",
427                             G_CALLBACK (gamma_cancel_callback), c);
428           gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
429           gtk_widget_show (button);
430           
431           button = gtk_button_new_from_stock (GTK_STOCK_OK);
432           GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
433           g_signal_connect (button, "clicked",
434                             G_CALLBACK (gamma_ok_callback), c);
435           gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
436           gtk_widget_grab_default (button);
437           gtk_widget_show (button);
438           
439           gtk_widget_show (c->gamma_dialog);
440         }
441     }
442   else
443     {
444       /* reset */
445       gtk_curve_reset (GTK_CURVE (c->curve));
446     }
447 }
448
449 static void
450 curve_type_changed_callback (GtkWidget *w, gpointer data)
451 {
452   GtkGammaCurve *c = data;
453   GtkCurveType new_type;
454   int active;
455
456   new_type = GTK_CURVE (w)->curve_type;
457   switch (new_type)
458     {
459     case GTK_CURVE_TYPE_SPLINE: active = 0; break;
460     case GTK_CURVE_TYPE_LINEAR: active = 1; break;
461     default:                    active = 2; break;
462     }
463   if (!GTK_TOGGLE_BUTTON (c->button[active])->active)
464     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c->button[active]), TRUE);
465 }
466
467 GtkWidget*
468 gtk_gamma_curve_new (void)
469 {
470   return g_object_new (GTK_TYPE_GAMMA_CURVE, NULL);
471 }
472
473 static void
474 gtk_gamma_curve_destroy (GtkObject *object)
475 {
476   GtkGammaCurve *c;
477
478   g_return_if_fail (GTK_IS_GAMMA_CURVE (object));
479
480   c = GTK_GAMMA_CURVE (object);
481
482   if (c->gamma_dialog)
483     gtk_widget_destroy (c->gamma_dialog);
484
485   if (GTK_OBJECT_CLASS (parent_class)->destroy)
486     (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
487 }
488
489 #define __GTK_GAMMA_CURVE_C__
490 #include "gtkaliasdef.c"