gtkcheckbutton.c 20.2 KB
Newer Older
Cody Russell's avatar
Cody Russell committed
1
/* GTK - The GIMP Toolkit
Elliot Lee's avatar
Elliot Lee committed
2 3 4
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * This library is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
Elliot Lee's avatar
Elliot Lee committed
6 7 8 9 10 11
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
 * Lesser General Public License for more details.
Elliot Lee's avatar
Elliot Lee committed
13
 *
14
 * You should have received a copy of the GNU Lesser General Public
Javier Jardon's avatar
Javier Jardon committed
15
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
Elliot Lee's avatar
Elliot Lee committed
16
 */
17 18

/*
19
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
20 21 22 23 24
 * file for a list of people on the GTK+ Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
 */

25
#include "config.h"
26

Elliot Lee's avatar
Elliot Lee committed
27
#include "gtkcheckbutton.h"
28

29
#include "gtkbuttonprivate.h"
Elliot Lee's avatar
Elliot Lee committed
30
#include "gtklabel.h"
31

32
#include "gtkintl.h"
33
#include "gtkprivate.h"
34
#include "gtkrender.h"
35
#include "gtkwidgetprivate.h"
36
#include "gtkbuiltiniconprivate.h"
37
#include "gtkcssnodeprivate.h"
38
#include "gtkboxgadgetprivate.h"
39 40
#include "gtkcontainerprivate.h"
#include "gtkstylecontextprivate.h"
41
#include "gtkcssnumbervalueprivate.h"
42
#include "gtkradiobutton.h"
Elliot Lee's avatar
Elliot Lee committed
43 44


45 46 47 48 49 50 51 52 53 54 55 56
/**
 * SECTION:gtkcheckbutton
 * @Short_description: Create widgets with a discrete toggle button
 * @Title: GtkCheckButton
 * @See_also: #GtkCheckMenuItem, #GtkButton, #GtkToggleButton, #GtkRadioButton
 *
 * A #GtkCheckButton places a discrete #GtkToggleButton next to a widget,
 * (usually a #GtkLabel). See the section on #GtkToggleButton widgets for
 * more information about toggle/check buttons.
 *
 * The important signal ( #GtkToggleButton::toggled ) is also inherited from
 * #GtkToggleButton.
57 58 59
 *
 * # CSS nodes
 *
60 61
 * |[<!-- language="plain" -->
 * checkbutton
62 63
 * ├── check
 * ╰── <child>
64 65
 * ]|
 *
66 67 68
 * A GtkCheckButton with indicator (see gtk_toggle_button_set_mode()) has a
 * main CSS node with name checkbutton and a subnode with name check.
 *
69 70
 * |[<!-- language="plain" -->
 * button.check
71 72
 * ├── check
 * ╰── <child>
73 74
 * ]|
 *
75 76 77
 * A GtkCheckButton without indicator changes the name of its main node
 * to button and adds a .check style class to it. The subnode is invisible
 * in this case.
78 79 80
 */


81
#define INDICATOR_SIZE     16
Elliot Lee's avatar
Elliot Lee committed
82 83 84
#define INDICATOR_SPACING  2


85 86 87 88 89 90 91 92 93 94 95 96 97 98
static void gtk_check_button_get_preferred_width                         (GtkWidget          *widget,
                                                                          gint               *minimum,
                                                                          gint               *natural);
static void gtk_check_button_get_preferred_width_for_height              (GtkWidget          *widget,
                                                                          gint                height,
                                                                          gint               *minimum,
                                                                          gint               *natural);
static void gtk_check_button_get_preferred_height                        (GtkWidget          *widget,
                                                                          gint               *minimum,
                                                                          gint               *natural);
static void gtk_check_button_get_preferred_height_for_width              (GtkWidget          *widget,
                                                                          gint                width,
                                                                          gint               *minimum,
                                                                          gint               *natural);
99 100 101 102 103 104
static void gtk_check_button_get_preferred_height_and_baseline_for_width (GtkWidget          *widget,
									  gint                width,
									  gint               *minimum,
									  gint               *natural,
									  gint               *minimum_baseline,
									  gint               *natural_baseline);
Elliot Lee's avatar
Elliot Lee committed
105 106
static void gtk_check_button_size_allocate       (GtkWidget           *widget,
						  GtkAllocation       *allocation);
107 108
static gboolean gtk_check_button_draw            (GtkWidget           *widget,
						  cairo_t             *cr);
109

110
typedef struct {
111 112
  GtkCssGadget *gadget;
  GtkCssGadget *indicator_gadget;
113 114 115
} GtkCheckButtonPrivate;

G_DEFINE_TYPE_WITH_PRIVATE (GtkCheckButton, gtk_check_button, GTK_TYPE_TOGGLE_BUTTON)
Elliot Lee's avatar
Elliot Lee committed
116

117
static void
118
gtk_check_button_update_node_state (GtkWidget *widget)
119
{
120
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
121 122
  GtkCssImageBuiltinType image_type;
  GtkStateFlags state;
123

124 125
  state = gtk_widget_get_state_flags (widget);

126 127 128
  /* XXX: This is somewhat awkward here, but there's no better
   * way to update the icon
   */
129
  if (state & GTK_STATE_FLAG_CHECKED)
130
    image_type = GTK_IS_RADIO_BUTTON (widget) ? GTK_CSS_IMAGE_BUILTIN_OPTION : GTK_CSS_IMAGE_BUILTIN_CHECK;
131 132 133
  else if (state & GTK_STATE_FLAG_INCONSISTENT)
    image_type = GTK_IS_RADIO_BUTTON (widget) ? GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT : GTK_CSS_IMAGE_BUILTIN_CHECK_INCONSISTENT;
  else
134
    image_type = GTK_CSS_IMAGE_BUILTIN_NONE;
135
  gtk_builtin_icon_set_image (GTK_BUILTIN_ICON (priv->indicator_gadget), image_type);
136 137

  gtk_css_gadget_set_state (priv->indicator_gadget, state);
138 139
}

140

141 142 143 144 145
static void
gtk_check_button_state_flags_changed (GtkWidget     *widget,
				      GtkStateFlags  previous_state_flags)
{
  gtk_check_button_update_node_state (widget);
146 147 148 149

  GTK_WIDGET_CLASS (gtk_check_button_parent_class)->state_flags_changed (widget, previous_state_flags);
}

150 151 152 153 154 155
static void
gtk_check_button_direction_changed (GtkWidget        *widget,
                                    GtkTextDirection  previous_direction)
{
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));

156
  gtk_box_gadget_reverse_children (GTK_BOX_GADGET (priv->gadget));
157 158
  gtk_box_gadget_set_allocate_reverse (GTK_BOX_GADGET (priv->gadget),
                                       gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
159 160
  gtk_box_gadget_set_align_reverse (GTK_BOX_GADGET (priv->gadget),
                                    gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175

  GTK_WIDGET_CLASS (gtk_check_button_parent_class)->direction_changed (widget, previous_direction);
}

static void
gtk_check_button_finalize (GObject *object)
{
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (object));

  g_clear_object (&priv->gadget);
  g_clear_object (&priv->indicator_gadget);

  G_OBJECT_CLASS (gtk_check_button_parent_class)->finalize (object);
}

176 177 178 179 180
static void
gtk_check_button_add (GtkContainer *container,
                      GtkWidget    *widget)
{
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (container));
181
  int pos;
182 183 184

  GTK_CONTAINER_CLASS (gtk_check_button_parent_class)->add (container, widget);

185 186
  pos = gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL ? 0 : 1;
  gtk_box_gadget_insert_widget (GTK_BOX_GADGET (priv->gadget), pos, widget);
187
  gtk_box_gadget_set_gadget_expand (GTK_BOX_GADGET (priv->gadget), G_OBJECT (widget), TRUE);
188 189 190 191 192 193 194 195 196 197 198 199 200
}

static void
gtk_check_button_remove (GtkContainer *container,
                         GtkWidget    *widget)
{
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (container));

  gtk_box_gadget_remove_widget (GTK_BOX_GADGET (priv->gadget), widget);

  GTK_CONTAINER_CLASS (gtk_check_button_parent_class)->remove (container, widget);
}

Elliot Lee's avatar
Elliot Lee committed
201 202 203
static void
gtk_check_button_class_init (GtkCheckButtonClass *class)
{
204 205
  GObjectClass *object_class = G_OBJECT_CLASS (class);
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
206
  GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
207

208
  object_class->finalize = gtk_check_button_finalize;
209 210

  widget_class->get_preferred_width = gtk_check_button_get_preferred_width;
211
  widget_class->get_preferred_width_for_height = gtk_check_button_get_preferred_width_for_height;
212
  widget_class->get_preferred_height = gtk_check_button_get_preferred_height;
213
  widget_class->get_preferred_height_for_width = gtk_check_button_get_preferred_height_for_width;
214
  widget_class->get_preferred_height_and_baseline_for_width = gtk_check_button_get_preferred_height_and_baseline_for_width;
Elliot Lee's avatar
Elliot Lee committed
215
  widget_class->size_allocate = gtk_check_button_size_allocate;
216
  widget_class->draw = gtk_check_button_draw;
217
  widget_class->state_flags_changed = gtk_check_button_state_flags_changed;
218
  widget_class->direction_changed = gtk_check_button_direction_changed;
219

220 221 222
  container_class->add = gtk_check_button_add;
  container_class->remove = gtk_check_button_remove;

223 224 225 226 227 228 229
  /**
   * GtkCheckButton:indicator-size:
   *
   * The size of the indicator.
   *
   * Deprecated: 3.20: Use CSS min-width and min-height on the indicator node.
   */
230
  gtk_widget_class_install_style_property (widget_class,
231
					   g_param_spec_int ("indicator-size",
232 233
							     P_("Indicator Size"),
							     P_("Size of check or radio indicator"),
234 235 236
							     0,
							     G_MAXINT,
							     INDICATOR_SIZE,
237
							     GTK_PARAM_READABLE|G_PARAM_DEPRECATED));
238 239 240 241 242 243 244 245 246

  /**
   * GtkCheckButton:indicator-spacing:
   *
   * The spacing around the indicator.
   *
   * Deprecated: 3.20: Use CSS margins of the indicator node,
   *    the value of this style property is ignored.
   */
247
  gtk_widget_class_install_style_property (widget_class,
248
					   g_param_spec_int ("indicator-spacing",
249 250
							     P_("Indicator Spacing"),
							     P_("Spacing around check or radio indicator"),
251 252 253
							     0,
							     G_MAXINT,
							     INDICATOR_SPACING,
254
							     GTK_PARAM_READABLE|G_PARAM_DEPRECATED));
255 256 257

  gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_CHECK_BOX);
  gtk_widget_class_set_css_name (widget_class, "checkbutton");
Elliot Lee's avatar
Elliot Lee committed
258 259
}

260 261 262 263 264 265
static void
draw_indicator_changed (GObject    *object,
                        GParamSpec *pspec,
                        gpointer    user_data)
{
  GtkButton *button = GTK_BUTTON (object);
266 267
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (button));
  GtkCssNode *widget_node;
268
  GtkCssNode *indicator_node;
269 270

  widget_node = gtk_widget_get_css_node (GTK_WIDGET (button));
271
  indicator_node = gtk_css_gadget_get_node (priv->indicator_gadget);
272

273
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
274
  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (button)))
275 276
    {
      gtk_button_set_alignment (button, 0.0, 0.5);
277
      gtk_css_node_set_visible (indicator_node, TRUE);
278 279 280 281 282 283 284 285 286 287
      if (GTK_IS_RADIO_BUTTON (button))
        {
          gtk_css_node_remove_class (widget_node, g_quark_from_static_string ("radio"));
          gtk_css_node_set_name (widget_node, I_("radiobutton"));
        }
      else if (GTK_IS_CHECK_BUTTON (button))
        {
          gtk_css_node_remove_class (widget_node, g_quark_from_static_string ("check"));
          gtk_css_node_set_name (widget_node, I_("checkbutton"));
        }
288
    }
289
  else
290 291
    {
      gtk_button_set_alignment (button, 0.5, 0.5);
292
      gtk_css_node_set_visible (indicator_node, FALSE);
293 294 295 296 297 298 299 300 301 302
      if (GTK_IS_RADIO_BUTTON (button))
        {
          gtk_css_node_add_class (widget_node, g_quark_from_static_string ("radio"));
          gtk_css_node_set_name (widget_node, I_("button"));
        }
      else if (GTK_IS_CHECK_BUTTON (button))
        {
          gtk_css_node_add_class (widget_node, g_quark_from_static_string ("check"));
          gtk_css_node_set_name (widget_node, I_("button"));
        }
303
    }
304
G_GNUC_END_IGNORE_DEPRECATIONS
305 306
}

Elliot Lee's avatar
Elliot Lee committed
307 308 309
static void
gtk_check_button_init (GtkCheckButton *check_button)
{
310 311 312
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button);
  GtkCssNode *widget_node;

313
  gtk_widget_set_receives_default (GTK_WIDGET (check_button), FALSE);
314
  g_signal_connect (check_button, "notify::draw-indicator", G_CALLBACK (draw_indicator_changed), NULL);
315
  gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (check_button), TRUE);
316 317 318 319

  gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET (check_button)), "toggle");

  widget_node = gtk_widget_get_css_node (GTK_WIDGET (check_button));
320 321
  priv->gadget = gtk_box_gadget_new_for_node (widget_node, GTK_WIDGET (check_button));
  gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->gadget), GTK_ORIENTATION_HORIZONTAL);
322
  gtk_box_gadget_set_draw_focus (GTK_BOX_GADGET (priv->gadget), TRUE);
323 324 325 326 327
  priv->indicator_gadget = gtk_builtin_icon_new ("check",
                                                 GTK_WIDGET (check_button),
                                                 priv->gadget,
                                                 NULL);
  gtk_builtin_icon_set_default_size_property (GTK_BUILTIN_ICON (priv->indicator_gadget), "indicator-size");
328
  gtk_box_gadget_insert_gadget (GTK_BOX_GADGET (priv->gadget), 0, priv->indicator_gadget, FALSE, GTK_ALIGN_BASELINE);
329 330

  gtk_check_button_update_node_state (GTK_WIDGET (check_button));
Elliot Lee's avatar
Elliot Lee committed
331 332
}

333 334 335 336 337 338 339
/**
 * gtk_check_button_new:
 *
 * Creates a new #GtkCheckButton.
 *
 * Returns: a #GtkWidget.
 */
Elliot Lee's avatar
Elliot Lee committed
340
GtkWidget*
341
gtk_check_button_new (void)
Elliot Lee's avatar
Elliot Lee committed
342
{
Manish Singh's avatar
Manish Singh committed
343
  return g_object_new (GTK_TYPE_CHECK_BUTTON, NULL);
Elliot Lee's avatar
Elliot Lee committed
344 345 346
}


347 348 349 350 351 352 353 354
/**
 * gtk_check_button_new_with_label:
 * @label: the text for the check button.
 *
 * Creates a new #GtkCheckButton with a #GtkLabel to the right of it.
 *
 * Returns: a #GtkWidget.
 */
Elliot Lee's avatar
Elliot Lee committed
355 356 357
GtkWidget*
gtk_check_button_new_with_label (const gchar *label)
{
358
  return g_object_new (GTK_TYPE_CHECK_BUTTON, "label", label, NULL);
Elliot Lee's avatar
Elliot Lee committed
359 360
}

361 362 363
/**
 * gtk_check_button_new_with_mnemonic:
 * @label: The text of the button, with an underscore in front of the
364
 *   mnemonic character
365
 *
366 367 368
 * Creates a new #GtkCheckButton containing a label. The label
 * will be created using gtk_label_new_with_mnemonic(), so underscores
 * in @label indicate the mnemonic for the check button.
Matthias Clasen's avatar
Matthias Clasen committed
369 370 371
 *
 * Returns: a new #GtkCheckButton
 */
372 373 374
GtkWidget*
gtk_check_button_new_with_mnemonic (const gchar *label)
{
375 376 377 378
  return g_object_new (GTK_TYPE_CHECK_BUTTON, 
                       "label", label, 
                       "use-underline", TRUE, 
                       NULL);
379 380
}

381 382 383 384 385 386 387 388 389 390 391
static void
gtk_check_button_get_preferred_width_for_height (GtkWidget *widget,
                                                 gint       height,
                                                 gint      *minimum,
                                                 gint      *natural)
{
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
  GtkCssGadget *gadget;

  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
    gadget = priv->gadget;
392
  else
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
    gadget = GTK_BUTTON (widget)->priv->gadget;

  gtk_css_gadget_get_preferred_size (gadget,
                                     GTK_ORIENTATION_HORIZONTAL,
                                     height,
                                     minimum, natural,
                                     NULL, NULL);
}

static void
gtk_check_button_get_preferred_width (GtkWidget *widget,
                                      gint      *minimum,
                                      gint      *natural)
{
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
  GtkCssGadget *gadget;

  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
    gadget = priv->gadget;
  else
    gadget = GTK_BUTTON (widget)->priv->gadget;

  gtk_css_gadget_get_preferred_size (gadget,
                                     GTK_ORIENTATION_HORIZONTAL,
                                     -1,
                                     minimum, natural,
                                     NULL, NULL);
}

static void
gtk_check_button_get_preferred_height_and_baseline_for_width (GtkWidget *widget,
							      gint       width,
							      gint      *minimum,
							      gint      *natural,
							      gint      *minimum_baseline,
							      gint      *natural_baseline)
{
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
  GtkCssGadget *gadget;

  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
    gadget = priv->gadget;
  else
    gadget = GTK_BUTTON (widget)->priv->gadget;

  gtk_css_gadget_get_preferred_size (gadget,
                                     GTK_ORIENTATION_VERTICAL,
                                     width,
                                     minimum, natural,
                                     minimum_baseline, natural_baseline);
443 444
}

445 446 447 448 449 450
static void
gtk_check_button_get_preferred_height_for_width (GtkWidget *widget,
                                                 gint       width,
                                                 gint      *minimum,
                                                 gint      *natural)
{
451 452 453 454 455 456 457 458 459 460 461 462 463
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
  GtkCssGadget *gadget;

  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
    gadget = priv->gadget;
  else
    gadget = GTK_BUTTON (widget)->priv->gadget;

  gtk_css_gadget_get_preferred_size (gadget,
                                     GTK_ORIENTATION_VERTICAL,
                                     width,
                                     minimum, natural,
                                     NULL, NULL);
464 465
}

466 467 468 469 470
static void
gtk_check_button_get_preferred_height (GtkWidget *widget,
                                       gint      *minimum,
                                       gint      *natural)
{
471 472 473 474 475 476 477 478 479 480 481 482 483
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
  GtkCssGadget *gadget;

  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
    gadget = priv->gadget;
  else
    gadget = GTK_BUTTON (widget)->priv->gadget;

  gtk_css_gadget_get_preferred_size (gadget,
                                     GTK_ORIENTATION_VERTICAL,
                                     -1,
                                     minimum, natural,
                                     NULL, NULL);
Elliot Lee's avatar
Elliot Lee committed
484 485 486 487 488 489
}

static void
gtk_check_button_size_allocate (GtkWidget     *widget,
				GtkAllocation *allocation)
{
490
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
491
  GtkButton *button = GTK_BUTTON (widget);
492 493
  GtkCssGadget *gadget;
  GdkRectangle clip;
494 495
  PangoContext *pango_context;
  PangoFontMetrics *metrics;
496 497 498 499

  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
    gadget = priv->gadget;
  else
500
    gadget = button->priv->gadget;
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518

  gtk_widget_set_allocation (widget, allocation);
  gtk_css_gadget_allocate (gadget,
                           allocation,
                           gtk_widget_get_allocated_baseline (widget),
                           &clip);

  gtk_widget_set_clip (widget, &clip);

  pango_context = gtk_widget_get_pango_context (widget);
  metrics = pango_context_get_metrics (pango_context,
                                       pango_context_get_font_description (pango_context),
                                       pango_context_get_language (pango_context));
  button->priv->baseline_align =
      (double)pango_font_metrics_get_ascent (metrics) /
      (pango_font_metrics_get_ascent (metrics) + pango_font_metrics_get_descent (metrics));
  pango_font_metrics_unref (metrics);

519 520 521 522 523 524 525 526 527 528
  if (gtk_widget_get_realized (widget))
    {
      GtkAllocation border_allocation;
      gtk_css_gadget_get_border_allocation (gadget, &border_allocation, NULL);
      gdk_window_move_resize (GTK_BUTTON (widget)->priv->event_window,
                              border_allocation.x,
                              border_allocation.y,
                              border_allocation.width,
                              border_allocation.height);
    }
Elliot Lee's avatar
Elliot Lee committed
529 530 531
}

static gint
532 533
gtk_check_button_draw (GtkWidget *widget,
                       cairo_t   *cr)
Elliot Lee's avatar
Elliot Lee committed
534
{
535 536
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
  GtkCssGadget *gadget;
537

538 539 540 541
  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
    gadget = priv->gadget;
  else
    gadget = GTK_BUTTON (widget)->priv->gadget;
Javier Jardon's avatar
Javier Jardon committed
542

543
  gtk_css_gadget_draw (gadget, cr);
544

Elliot Lee's avatar
Elliot Lee committed
545 546 547
  return FALSE;
}

548 549 550 551 552
GtkCssNode *
gtk_check_button_get_indicator_node (GtkCheckButton *check_button)
{
  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button);

553
  return gtk_css_gadget_get_node (priv->indicator_gadget);
554
}