]> Pileus Git - ~andy/gtk/blob - gtk/gtkcellrenderer.c
gtk/gtkbutton.h gtk/gtkcellrenderer.h gtk/gtkimcontext.h gtk/gtkstyle.h
[~andy/gtk] / gtk / gtkcellrenderer.c
1 /* gtkcellrenderer.c
2  * Copyright (C) 2000  Red Hat, Inc. Jonathan Blandford
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library 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  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library 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 #include <config.h>
21 #include "gtkcellrenderer.h"
22 #include "gtkintl.h"
23 #include "gtkmarshalers.h"
24 #include "gtkprivate.h"
25 #include "gtktreeprivate.h"
26 #include "gtkalias.h"
27
28 static void gtk_cell_renderer_get_property  (GObject              *object,
29                                              guint                 param_id,
30                                              GValue               *value,
31                                              GParamSpec           *pspec);
32 static void gtk_cell_renderer_set_property  (GObject              *object,
33                                              guint                 param_id,
34                                              const GValue         *value,
35                                              GParamSpec           *pspec);
36 static void set_cell_bg_color               (GtkCellRenderer      *cell,
37                                              GdkColor             *color);
38
39
40 #define GTK_CELL_RENDERER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_CELL_RENDERER, GtkCellRendererPrivate))
41
42 typedef struct _GtkCellRendererPrivate GtkCellRendererPrivate;
43 struct _GtkCellRendererPrivate
44 {
45   GdkColor cell_background;
46 };
47
48
49 enum {
50   PROP_ZERO,
51   PROP_MODE,
52   PROP_VISIBLE,
53   PROP_SENSITIVE,
54   PROP_XALIGN,
55   PROP_YALIGN,
56   PROP_XPAD,
57   PROP_YPAD,
58   PROP_WIDTH,
59   PROP_HEIGHT,
60   PROP_IS_EXPANDER,
61   PROP_IS_EXPANDED,
62   PROP_CELL_BACKGROUND,
63   PROP_CELL_BACKGROUND_GDK,
64   PROP_CELL_BACKGROUND_SET
65 };
66
67 /* Signal IDs */
68 enum {
69   EDITING_CANCELED,
70   EDITING_STARTED,
71   LAST_SIGNAL
72 };
73
74 static guint cell_renderer_signals[LAST_SIGNAL] = { 0 };
75
76 G_DEFINE_ABSTRACT_TYPE (GtkCellRenderer, gtk_cell_renderer, GTK_TYPE_OBJECT)
77
78 static void
79 gtk_cell_renderer_init (GtkCellRenderer *cell)
80 {
81   cell->mode = GTK_CELL_RENDERER_MODE_INERT;
82   cell->visible = TRUE;
83   cell->width = -1;
84   cell->height = -1;
85   cell->xalign = 0.5;
86   cell->yalign = 0.5;
87   cell->xpad = 0;
88   cell->ypad = 0;
89   cell->sensitive = TRUE;
90   cell->is_expander = FALSE;
91   cell->is_expanded = FALSE;
92   cell->editing = FALSE;
93 }
94
95 static void
96 gtk_cell_renderer_class_init (GtkCellRendererClass *class)
97 {
98   GObjectClass *object_class = G_OBJECT_CLASS (class);
99
100   object_class->get_property = gtk_cell_renderer_get_property;
101   object_class->set_property = gtk_cell_renderer_set_property;
102
103   class->render = NULL;
104   class->get_size = NULL;
105
106   /**
107    * GtkCellRenderer::editing-canceled:
108    * @renderer: the object which received the signal
109    *
110    * This signal gets emitted when the user cancels the process of editing a
111    * cell.  For example, an editable cell renderer could be written to cancel
112    * editing when the user presses Escape. 
113    *
114    * See also: gtk_cell_renderer_stop_editing().
115    *
116    * Since: 2.4
117    */
118   cell_renderer_signals[EDITING_CANCELED] =
119     g_signal_new (I_("editing-canceled"),
120                   G_OBJECT_CLASS_TYPE (object_class),
121                   G_SIGNAL_RUN_FIRST,
122                   G_STRUCT_OFFSET (GtkCellRendererClass, editing_canceled),
123                   NULL, NULL,
124                   _gtk_marshal_VOID__VOID,
125                   G_TYPE_NONE, 0);
126
127   /**
128    * GtkCellRenderer::editing-started:
129    * @renderer: the object which received the signal
130    * @editable: the #GtkCellEditable
131    * @path: the path identifying the edited cell
132    *
133    * This signal gets emitted when a cell starts to be edited.
134    * The indended use of this signal is to do special setup
135    * on @editable, e.g. adding a #GtkEntryCompletion or setting
136    * up additional columns in a #GtkComboBox.
137    *
138    * Note that GTK+ doesn't guarantee that cell renderers will
139    * continue to use the same kind of widget for editing in future
140    * releases, therefore you should check the type of @editable
141    * before doing any specific setup, as in the following example:
142    * |[
143    * static void
144    * text_editing_started (GtkCellRenderer *cell,
145    *                       GtkCellEditable *editable,
146    *                       const gchar     *path,
147    *                       gpointer         data)
148    * {
149    *   if (GTK_IS_ENTRY (editable)) 
150    *     {
151    *       GtkEntry *entry = GTK_ENTRY (editable);
152    *       
153    *       /&ast; ... create a GtkEntryCompletion &ast;/
154    *       
155    *       gtk_entry_set_completion (entry, completion);
156    *     }
157    * }
158    * ]|
159    *
160    * Since: 2.6
161    */
162   cell_renderer_signals[EDITING_STARTED] =
163     g_signal_new (I_("editing-started"),
164                   G_OBJECT_CLASS_TYPE (object_class),
165                   G_SIGNAL_RUN_FIRST,
166                   G_STRUCT_OFFSET (GtkCellRendererClass, editing_started),
167                   NULL, NULL,
168                   _gtk_marshal_VOID__OBJECT_STRING,
169                   G_TYPE_NONE, 2,
170                   GTK_TYPE_CELL_EDITABLE,
171                   G_TYPE_STRING);
172
173   g_object_class_install_property (object_class,
174                                    PROP_MODE,
175                                    g_param_spec_enum ("mode",
176                                                       P_("mode"),
177                                                       P_("Editable mode of the CellRenderer"),
178                                                       GTK_TYPE_CELL_RENDERER_MODE,
179                                                       GTK_CELL_RENDERER_MODE_INERT,
180                                                       GTK_PARAM_READWRITE));
181
182   g_object_class_install_property (object_class,
183                                    PROP_VISIBLE,
184                                    g_param_spec_boolean ("visible",
185                                                          P_("visible"),
186                                                          P_("Display the cell"),
187                                                          TRUE,
188                                                          GTK_PARAM_READWRITE));
189   g_object_class_install_property (object_class,
190                                    PROP_SENSITIVE,
191                                    g_param_spec_boolean ("sensitive",
192                                                          P_("Sensitive"),
193                                                          P_("Display the cell sensitive"),
194                                                          TRUE,
195                                                          GTK_PARAM_READWRITE));
196
197   g_object_class_install_property (object_class,
198                                    PROP_XALIGN,
199                                    g_param_spec_float ("xalign",
200                                                        P_("xalign"),
201                                                        P_("The x-align"),
202                                                        0.0,
203                                                        1.0,
204                                                        0.5,
205                                                        GTK_PARAM_READWRITE));
206
207   g_object_class_install_property (object_class,
208                                    PROP_YALIGN,
209                                    g_param_spec_float ("yalign",
210                                                        P_("yalign"),
211                                                        P_("The y-align"),
212                                                        0.0,
213                                                        1.0,
214                                                        0.5,
215                                                        GTK_PARAM_READWRITE));
216
217   g_object_class_install_property (object_class,
218                                    PROP_XPAD,
219                                    g_param_spec_uint ("xpad",
220                                                       P_("xpad"),
221                                                       P_("The xpad"),
222                                                       0,
223                                                       G_MAXUINT,
224                                                       0,
225                                                       GTK_PARAM_READWRITE));
226
227   g_object_class_install_property (object_class,
228                                    PROP_YPAD,
229                                    g_param_spec_uint ("ypad",
230                                                       P_("ypad"),
231                                                       P_("The ypad"),
232                                                       0,
233                                                       G_MAXUINT,
234                                                       0,
235                                                       GTK_PARAM_READWRITE));
236
237   g_object_class_install_property (object_class,
238                                    PROP_WIDTH,
239                                    g_param_spec_int ("width",
240                                                      P_("width"),
241                                                      P_("The fixed width"),
242                                                      -1,
243                                                      G_MAXINT,
244                                                      -1,
245                                                      GTK_PARAM_READWRITE));
246
247   g_object_class_install_property (object_class,
248                                    PROP_HEIGHT,
249                                    g_param_spec_int ("height",
250                                                      P_("height"),
251                                                      P_("The fixed height"),
252                                                      -1,
253                                                      G_MAXINT,
254                                                      -1,
255                                                      GTK_PARAM_READWRITE));
256
257   g_object_class_install_property (object_class,
258                                    PROP_IS_EXPANDER,
259                                    g_param_spec_boolean ("is-expander",
260                                                          P_("Is Expander"),
261                                                          P_("Row has children"),
262                                                          FALSE,
263                                                          GTK_PARAM_READWRITE));
264
265
266   g_object_class_install_property (object_class,
267                                    PROP_IS_EXPANDED,
268                                    g_param_spec_boolean ("is-expanded",
269                                                          P_("Is Expanded"),
270                                                          P_("Row is an expander row, and is expanded"),
271                                                          FALSE,
272                                                          GTK_PARAM_READWRITE));
273
274   g_object_class_install_property (object_class,
275                                    PROP_CELL_BACKGROUND,
276                                    g_param_spec_string ("cell-background",
277                                                         P_("Cell background color name"),
278                                                         P_("Cell background color as a string"),
279                                                         NULL,
280                                                         GTK_PARAM_WRITABLE));
281
282   g_object_class_install_property (object_class,
283                                    PROP_CELL_BACKGROUND_GDK,
284                                    g_param_spec_boxed ("cell-background-gdk",
285                                                        P_("Cell background color"),
286                                                        P_("Cell background color as a GdkColor"),
287                                                        GDK_TYPE_COLOR,
288                                                        GTK_PARAM_READWRITE));
289
290
291 #define ADD_SET_PROP(propname, propval, nick, blurb) g_object_class_install_property (object_class, propval, g_param_spec_boolean (propname, nick, blurb, FALSE, GTK_PARAM_READWRITE))
292
293   ADD_SET_PROP ("cell-background-set", PROP_CELL_BACKGROUND_SET,
294                 P_("Cell background set"),
295                 P_("Whether this tag affects the cell background color"));
296
297   g_type_class_add_private (object_class, sizeof (GtkCellRendererPrivate));
298 }
299
300 static void
301 gtk_cell_renderer_get_property (GObject     *object,
302                                 guint        param_id,
303                                 GValue      *value,
304                                 GParamSpec  *pspec)
305 {
306   GtkCellRenderer *cell = GTK_CELL_RENDERER (object);
307   GtkCellRendererPrivate *priv = GTK_CELL_RENDERER_GET_PRIVATE (object);
308
309   switch (param_id)
310     {
311     case PROP_MODE:
312       g_value_set_enum (value, cell->mode);
313       break;
314     case PROP_VISIBLE:
315       g_value_set_boolean (value, cell->visible);
316       break;
317     case PROP_SENSITIVE:
318       g_value_set_boolean (value, cell->sensitive);
319       break;
320     case PROP_XALIGN:
321       g_value_set_float (value, cell->xalign);
322       break;
323     case PROP_YALIGN:
324       g_value_set_float (value, cell->yalign);
325       break;
326     case PROP_XPAD:
327       g_value_set_uint (value, cell->xpad);
328       break;
329     case PROP_YPAD:
330       g_value_set_uint (value, cell->ypad);
331       break;
332     case PROP_WIDTH:
333       g_value_set_int (value, cell->width);
334       break;
335     case PROP_HEIGHT:
336       g_value_set_int (value, cell->height);
337       break;
338     case PROP_IS_EXPANDER:
339       g_value_set_boolean (value, cell->is_expander);
340       break;
341     case PROP_IS_EXPANDED:
342       g_value_set_boolean (value, cell->is_expanded);
343       break;
344     case PROP_CELL_BACKGROUND_GDK:
345       {
346         GdkColor color;
347
348         color.red = priv->cell_background.red;
349         color.green = priv->cell_background.green;
350         color.blue = priv->cell_background.blue;
351
352         g_value_set_boxed (value, &color);
353       }
354       break;
355     case PROP_CELL_BACKGROUND_SET:
356       g_value_set_boolean (value, cell->cell_background_set);
357       break;
358     case PROP_CELL_BACKGROUND:
359     default:
360       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
361       break;
362     }
363
364 }
365
366 static void
367 gtk_cell_renderer_set_property (GObject      *object,
368                                 guint         param_id,
369                                 const GValue *value,
370                                 GParamSpec   *pspec)
371 {
372   GtkCellRenderer *cell = GTK_CELL_RENDERER (object);
373
374   switch (param_id)
375     {
376     case PROP_MODE:
377       cell->mode = g_value_get_enum (value);
378       break;
379     case PROP_VISIBLE:
380       cell->visible = g_value_get_boolean (value);
381       break;
382     case PROP_SENSITIVE:
383       cell->sensitive = g_value_get_boolean (value);
384       break;
385     case PROP_XALIGN:
386       cell->xalign = g_value_get_float (value);
387       break;
388     case PROP_YALIGN:
389       cell->yalign = g_value_get_float (value);
390       break;
391     case PROP_XPAD:
392       cell->xpad = g_value_get_uint (value);
393       break;
394     case PROP_YPAD:
395       cell->ypad = g_value_get_uint (value);
396       break;
397     case PROP_WIDTH:
398       cell->width = g_value_get_int (value);
399       break;
400     case PROP_HEIGHT:
401       cell->height = g_value_get_int (value);
402       break;
403     case PROP_IS_EXPANDER:
404       cell->is_expander = g_value_get_boolean (value);
405       break;
406     case PROP_IS_EXPANDED:
407       cell->is_expanded = g_value_get_boolean (value);
408       break;
409     case PROP_CELL_BACKGROUND:
410       {
411         GdkColor color;
412
413         if (!g_value_get_string (value))
414           set_cell_bg_color (cell, NULL);
415         else if (gdk_color_parse (g_value_get_string (value), &color))
416           set_cell_bg_color (cell, &color);
417         else
418           g_warning ("Don't know color `%s'", g_value_get_string (value));
419
420         g_object_notify (object, "cell-background-gdk");
421       }
422       break;
423     case PROP_CELL_BACKGROUND_GDK:
424       set_cell_bg_color (cell, g_value_get_boxed (value));
425       break;
426     case PROP_CELL_BACKGROUND_SET:
427       cell->cell_background_set = g_value_get_boolean (value);
428       break;
429     default:
430       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
431       break;
432     }
433 }
434
435 static void
436 set_cell_bg_color (GtkCellRenderer *cell,
437                    GdkColor        *color)
438 {
439   GtkCellRendererPrivate *priv = GTK_CELL_RENDERER_GET_PRIVATE (cell);
440
441   if (color)
442     {
443       if (!cell->cell_background_set)
444         {
445           cell->cell_background_set = TRUE;
446           g_object_notify (G_OBJECT (cell), "cell-background-set");
447         }
448
449       priv->cell_background.red = color->red;
450       priv->cell_background.green = color->green;
451       priv->cell_background.blue = color->blue;
452     }
453   else
454     {
455       if (cell->cell_background_set)
456         {
457           cell->cell_background_set = FALSE;
458           g_object_notify (G_OBJECT (cell), "cell-background-set");
459         }
460     }
461 }
462
463 /**
464  * gtk_cell_renderer_get_size:
465  * @cell: a #GtkCellRenderer
466  * @widget: the widget the renderer is rendering to
467  * @cell_area: The area a cell will be allocated, or %NULL
468  * @x_offset: location to return x offset of cell relative to @cell_area, or %NULL
469  * @y_offset: location to return y offset of cell relative to @cell_area, or %NULL
470  * @width: location to return width needed to render a cell, or %NULL
471  * @height: location to return height needed to render a cell, or %NULL
472  *
473  * Obtains the width and height needed to render the cell. Used by view 
474  * widgets to determine the appropriate size for the cell_area passed to
475  * gtk_cell_renderer_render().  If @cell_area is not %NULL, fills in the
476  * x and y offsets (if set) of the cell relative to this location. 
477  *
478  * Please note that the values set in @width and @height, as well as those 
479  * in @x_offset and @y_offset are inclusive of the xpad and ypad properties.
480  **/
481 void
482 gtk_cell_renderer_get_size (GtkCellRenderer    *cell,
483                             GtkWidget          *widget,
484                             const GdkRectangle *cell_area,
485                             gint               *x_offset,
486                             gint               *y_offset,
487                             gint               *width,
488                             gint               *height)
489 {
490   gint *real_width = width;
491   gint *real_height = height;
492
493   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
494   g_return_if_fail (GTK_CELL_RENDERER_GET_CLASS (cell)->get_size != NULL);
495
496   if (width && cell->width != -1)
497     {
498       real_width = NULL;
499       *width = cell->width;
500     }
501   if (height && cell->height != -1)
502     {
503       real_height = NULL;
504       *height = cell->height;
505     }
506
507   GTK_CELL_RENDERER_GET_CLASS (cell)->get_size (cell,
508                                                 widget,
509                                                 (GdkRectangle *) cell_area,
510                                                 x_offset,
511                                                 y_offset,
512                                                 real_width,
513                                                 real_height);
514 }
515
516 /**
517  * gtk_cell_renderer_render:
518  * @cell: a #GtkCellRenderer
519  * @window: a #GdkDrawable to draw to
520  * @widget: the widget owning @window
521  * @background_area: entire cell area (including tree expanders and maybe 
522  *    padding on the sides)
523  * @cell_area: area normally rendered by a cell renderer
524  * @expose_area: area that actually needs updating
525  * @flags: flags that affect rendering
526  *
527  * Invokes the virtual render function of the #GtkCellRenderer. The three
528  * passed-in rectangles are areas of @window. Most renderers will draw within
529  * @cell_area; the xalign, yalign, xpad, and ypad fields of the #GtkCellRenderer
530  * should be honored with respect to @cell_area. @background_area includes the
531  * blank space around the cell, and also the area containing the tree expander;
532  * so the @background_area rectangles for all cells tile to cover the entire
533  * @window.  @expose_area is a clip rectangle.
534  **/
535 void
536 gtk_cell_renderer_render (GtkCellRenderer      *cell,
537                           GdkWindow            *window,
538                           GtkWidget            *widget,
539                           const GdkRectangle   *background_area,
540                           const GdkRectangle   *cell_area,
541                           const GdkRectangle   *expose_area,
542                           GtkCellRendererState  flags)
543 {
544   gboolean selected = FALSE;
545   GtkCellRendererPrivate *priv = GTK_CELL_RENDERER_GET_PRIVATE (cell);
546
547   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
548   g_return_if_fail (GTK_CELL_RENDERER_GET_CLASS (cell)->render != NULL);
549
550   selected = (flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED;
551
552   if (cell->cell_background_set && !selected)
553     {
554       cairo_t *cr = gdk_cairo_create (window);
555
556       gdk_cairo_rectangle (cr, background_area);
557       gdk_cairo_set_source_color (cr, &priv->cell_background);
558       cairo_fill (cr);
559       
560       cairo_destroy (cr);
561     }
562
563   GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell,
564                                               window,
565                                               widget,
566                                               (GdkRectangle *) background_area,
567                                               (GdkRectangle *) cell_area,
568                                               (GdkRectangle *) expose_area,
569                                               flags);
570 }
571
572 /**
573  * gtk_cell_renderer_activate:
574  * @cell: a #GtkCellRenderer
575  * @event: a #GdkEvent
576  * @widget: widget that received the event
577  * @path: widget-dependent string representation of the event location; 
578  *    e.g. for #GtkTreeView, a string representation of #GtkTreePath
579  * @background_area: background area as passed to gtk_cell_renderer_render()
580  * @cell_area: cell area as passed to gtk_cell_renderer_render()
581  * @flags: render flags
582  *
583  * Passes an activate event to the cell renderer for possible processing.  
584  * Some cell renderers may use events; for example, #GtkCellRendererToggle 
585  * toggles when it gets a mouse click.
586  *
587  * Return value: %TRUE if the event was consumed/handled
588  **/
589 gboolean
590 gtk_cell_renderer_activate (GtkCellRenderer      *cell,
591                             GdkEvent             *event,
592                             GtkWidget            *widget,
593                             const gchar          *path,
594                             const GdkRectangle   *background_area,
595                             const GdkRectangle   *cell_area,
596                             GtkCellRendererState  flags)
597 {
598   g_return_val_if_fail (GTK_IS_CELL_RENDERER (cell), FALSE);
599
600   if (cell->mode != GTK_CELL_RENDERER_MODE_ACTIVATABLE)
601     return FALSE;
602
603   if (GTK_CELL_RENDERER_GET_CLASS (cell)->activate == NULL)
604     return FALSE;
605
606   return GTK_CELL_RENDERER_GET_CLASS (cell)->activate (cell,
607                                                        event,
608                                                        widget,
609                                                        path,
610                                                        (GdkRectangle *) background_area,
611                                                        (GdkRectangle *) cell_area,
612                                                        flags);
613 }
614
615 /**
616  * gtk_cell_renderer_start_editing:
617  * @cell: a #GtkCellRenderer
618  * @event: a #GdkEvent
619  * @widget: widget that received the event
620  * @path: widget-dependent string representation of the event location; 
621  *    e.g. for #GtkTreeView, a string representation of #GtkTreePath
622  * @background_area: background area as passed to gtk_cell_renderer_render()
623  * @cell_area: cell area as passed to gtk_cell_renderer_render()
624  * @flags: render flags
625  * 
626  * Passes an activate event to the cell renderer for possible processing.
627  * 
628  * Return value: A new #GtkCellEditable, or %NULL
629  **/
630 GtkCellEditable *
631 gtk_cell_renderer_start_editing (GtkCellRenderer      *cell,
632                                  GdkEvent             *event,
633                                  GtkWidget            *widget,
634                                  const gchar          *path,
635                                  const GdkRectangle   *background_area,
636                                  const GdkRectangle   *cell_area,
637                                  GtkCellRendererState  flags)
638
639 {
640   GtkCellEditable *editable;
641
642   g_return_val_if_fail (GTK_IS_CELL_RENDERER (cell), NULL);
643
644   if (cell->mode != GTK_CELL_RENDERER_MODE_EDITABLE)
645     return NULL;
646
647   if (GTK_CELL_RENDERER_GET_CLASS (cell)->start_editing == NULL)
648     return NULL;
649
650   editable = GTK_CELL_RENDERER_GET_CLASS (cell)->start_editing (cell,
651                                                                 event,
652                                                                 widget,
653                                                                 path,
654                                                                 (GdkRectangle *) background_area,
655                                                                 (GdkRectangle *) cell_area,
656                                                                 flags);
657
658   g_signal_emit (cell, 
659                  cell_renderer_signals[EDITING_STARTED], 0,
660                  editable, path);
661
662   cell->editing = TRUE;
663
664   return editable;
665 }
666
667 /**
668  * gtk_cell_renderer_set_fixed_size:
669  * @cell: A #GtkCellRenderer
670  * @width: the width of the cell renderer, or -1
671  * @height: the height of the cell renderer, or -1
672  * 
673  * Sets the renderer size to be explicit, independent of the properties set.
674  **/
675 void
676 gtk_cell_renderer_set_fixed_size (GtkCellRenderer *cell,
677                                   gint             width,
678                                   gint             height)
679 {
680   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
681   g_return_if_fail (width >= -1 && height >= -1);
682
683   if ((width != cell->width) || (height != cell->height))
684     {
685       g_object_freeze_notify (G_OBJECT (cell));
686
687       if (width != cell->width)
688         {
689           cell->width = width;
690           g_object_notify (G_OBJECT (cell), "width");
691         }
692
693       if (height != cell->height)
694         {
695           cell->height = height;
696           g_object_notify (G_OBJECT (cell), "height");
697         }
698
699       g_object_thaw_notify (G_OBJECT (cell));
700     }
701 }
702
703 /**
704  * gtk_cell_renderer_get_fixed_size:
705  * @cell: A #GtkCellRenderer
706  * @width: location to fill in with the fixed width of the widget, or %NULL
707  * @height: location to fill in with the fixed height of the widget, or %NULL
708  * 
709  * Fills in @width and @height with the appropriate size of @cell.
710  **/
711 void
712 gtk_cell_renderer_get_fixed_size (GtkCellRenderer *cell,
713                                   gint            *width,
714                                   gint            *height)
715 {
716   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
717
718   if (width)
719     (* width) = cell->width;
720   if (height)
721     (* height) = cell->height;
722 }
723
724 /**
725  * gtk_cell_renderer_editing_canceled:
726  * @cell: A #GtkCellRenderer
727  * 
728  * Causes the cell renderer to emit the #GtkCellRenderer::editing-canceled 
729  * signal.  
730  *
731  * This function is for use only by implementations of cell renderers that 
732  * need to notify the client program that an editing process was canceled 
733  * and the changes were not committed.
734  *
735  * Since: 2.4
736  * Deprecated: 2.6: Use gtk_cell_renderer_stop_editing() instead
737  **/
738 void
739 gtk_cell_renderer_editing_canceled (GtkCellRenderer *cell)
740 {
741   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
742
743   gtk_cell_renderer_stop_editing (cell, TRUE);
744 }
745
746 /**
747  * gtk_cell_renderer_stop_editing:
748  * @cell: A #GtkCellRenderer
749  * @canceled: %TRUE if the editing has been canceled
750  * 
751  * Informs the cell renderer that the editing is stopped.
752  * If @canceled is %TRUE, the cell renderer will emit the 
753  * #GtkCellRenderer::editing-canceled signal. 
754  *
755  * This function should be called by cell renderer implementations 
756  * in response to the #GtkCellEditable::editing-done signal of 
757  * #GtkCellEditable.
758  *
759  * Since: 2.6
760  **/
761 void
762 gtk_cell_renderer_stop_editing (GtkCellRenderer *cell,
763                                 gboolean         canceled)
764 {
765   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
766
767   if (cell->editing)
768     {
769       cell->editing = FALSE;
770       if (canceled)
771         g_signal_emit (cell, cell_renderer_signals[EDITING_CANCELED], 0);
772     }
773 }
774
775 #define __GTK_CELL_RENDERER_C__
776 #include "gtkaliasdef.c"