gtkalignment.c 19.9 KB
Newer Older
Elliot Lee's avatar
Elliot Lee committed
1 2 3 4
/* GTK - The GIMP Toolkit
 * 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
15 16 17
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
Elliot Lee's avatar
Elliot Lee committed
18
 */
19 20

/*
21
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22 23 24 25 26
 * 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/. 
 */

Elliot Lee's avatar
Elliot Lee committed
27
#include "gtkalignment.h"
28
#include "gtkintl.h"
Elliot Lee's avatar
Elliot Lee committed
29

Tim Janik's avatar
Tim Janik committed
30
enum {
31 32 33 34 35 36
  PROP_0,

  PROP_XALIGN,
  PROP_YALIGN,
  PROP_XSCALE,
  PROP_YSCALE,
37 38 39 40 41

  PROP_PADDING_TOP,
  PROP_PADDING_BOTTOM,
  PROP_PADDING_LEFT,
  PROP_PADDING_RIGHT,
42 43
  
  PROP_LAST
Tim Janik's avatar
Tim Janik committed
44 45
};

Matthias Clasen's avatar
Matthias Clasen committed
46 47
#define GTK_ALIGNMENT_GET_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_ALIGNMENT, GtkAlignmentPrivate))

48 49 50 51 52 53 54
struct _GtkAlignmentPrivate
{
  guint padding_top;
  guint padding_bottom;
  guint padding_left;
  guint padding_right;
};
Tim Janik's avatar
Tim Janik committed
55

Elliot Lee's avatar
Elliot Lee committed
56 57 58 59 60 61
static void gtk_alignment_class_init    (GtkAlignmentClass *klass);
static void gtk_alignment_init          (GtkAlignment      *alignment);
static void gtk_alignment_size_request  (GtkWidget         *widget,
					 GtkRequisition    *requisition);
static void gtk_alignment_size_allocate (GtkWidget         *widget,
					 GtkAllocation     *allocation);
62 63 64
static void gtk_alignment_set_property (GObject         *object,
                                        guint            prop_id,
                                        const GValue    *value,
Tim Janik's avatar
Tim Janik committed
65
                                        GParamSpec      *pspec);
66 67 68
static void gtk_alignment_get_property (GObject         *object,
                                        guint            prop_id,
                                        GValue          *value,
Tim Janik's avatar
Tim Janik committed
69
                                        GParamSpec      *pspec);
Tim Janik's avatar
Tim Janik committed
70

Manish Singh's avatar
Manish Singh committed
71
GType
72
gtk_alignment_get_type (void)
Elliot Lee's avatar
Elliot Lee committed
73
{
Manish Singh's avatar
Manish Singh committed
74
  static GType alignment_type = 0;
Elliot Lee's avatar
Elliot Lee committed
75 76 77

  if (!alignment_type)
    {
Manish Singh's avatar
Manish Singh committed
78
      static const GTypeInfo alignment_info =
Elliot Lee's avatar
Elliot Lee committed
79 80
      {
	sizeof (GtkAlignmentClass),
Manish Singh's avatar
Manish Singh committed
81 82 83 84 85 86 87 88
	NULL,		/* base_init */
	NULL,		/* base_finalize */
	(GClassInitFunc) gtk_alignment_class_init,
	NULL,		/* class_finalize */
	NULL,		/* class_data */
	sizeof (GtkAlignment),
	0,		/* n_preallocs */
	(GInstanceInitFunc) gtk_alignment_init,
Elliot Lee's avatar
Elliot Lee committed
89 90
      };

Manish Singh's avatar
Manish Singh committed
91 92
      alignment_type = g_type_register_static (GTK_TYPE_BIN, "GtkAlignment",
					       &alignment_info, 0);
Elliot Lee's avatar
Elliot Lee committed
93 94 95 96 97 98 99 100
    }

  return alignment_type;
}

static void
gtk_alignment_class_init (GtkAlignmentClass *class)
{
Havoc Pennington's avatar
Havoc Pennington committed
101
  GObjectClass *gobject_class;
Elliot Lee's avatar
Elliot Lee committed
102 103
  GtkWidgetClass *widget_class;

Havoc Pennington's avatar
Havoc Pennington committed
104
  gobject_class = (GObjectClass*) class;
Elliot Lee's avatar
Elliot Lee committed
105
  widget_class = (GtkWidgetClass*) class;
Havoc Pennington's avatar
Havoc Pennington committed
106 107 108
  
  gobject_class->set_property = gtk_alignment_set_property;
  gobject_class->get_property = gtk_alignment_get_property;
Tim Janik's avatar
Tim Janik committed
109

Elliot Lee's avatar
Elliot Lee committed
110 111
  widget_class->size_request = gtk_alignment_size_request;
  widget_class->size_allocate = gtk_alignment_size_allocate;
112

Havoc Pennington's avatar
Havoc Pennington committed
113 114 115 116
  g_object_class_install_property (gobject_class,
                                   PROP_XALIGN,
                                   g_param_spec_float("xalign",
                                                      _("Horizontal alignment"),
Owen Taylor's avatar
Owen Taylor committed
117
                                                      _("Horizontal position of child in available space. 0.0 is left aligned, 1.0 is right aligned"),
Havoc Pennington's avatar
Havoc Pennington committed
118 119 120 121 122 123 124 125 126
                                                      0.0,
                                                      1.0,
                                                      0.5,
                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
   
  g_object_class_install_property (gobject_class,
                                   PROP_YALIGN,
                                   g_param_spec_float("yalign",
                                                      _("Vertical alignment"),
Owen Taylor's avatar
Owen Taylor committed
127
                                                      _("Vertical position of child in available space. 0.0 is top aligned, 1.0 is bottom aligned"),
Havoc Pennington's avatar
Havoc Pennington committed
128 129 130 131 132 133 134 135
                                                      0.0,
                                                      1.0,
						      0.5,
                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
  g_object_class_install_property (gobject_class,
                                   PROP_XSCALE,
                                   g_param_spec_float("xscale",
                                                      _("Horizontal scale"),
Owen Taylor's avatar
Owen Taylor committed
136
                                                      _("If available horizontal space is bigger than needed for the child, how much of it to use for the child. 0.0 means none, 1.0 means all"),
Havoc Pennington's avatar
Havoc Pennington committed
137 138
                                                      0.0,
                                                      1.0,
139
                                                      1.0,
Havoc Pennington's avatar
Havoc Pennington committed
140 141 142 143 144
                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
  g_object_class_install_property (gobject_class,
                                   PROP_YSCALE,
                                   g_param_spec_float("yscale",
                                                      _("Vertical scale"),
Owen Taylor's avatar
Owen Taylor committed
145
                                                      _("If available vertical space is bigger than needed for the child, how much of it to use for the child. 0.0 means none, 1.0 means all"),
Havoc Pennington's avatar
Havoc Pennington committed
146 147
                                                      0.0,
                                                      1.0,
148
                                                      1.0,
Havoc Pennington's avatar
Havoc Pennington committed
149
                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
150 151


152 153 154 155 156 157 158
/**
 * GtkAlignment:top-padding:
 *
 * The padding to insert at the top of the widget.
 *
 * Since: 2.4
 */
159 160 161 162 163 164 165 166 167 168
  g_object_class_install_property (gobject_class,
                                   PROP_PADDING_TOP,
                                   g_param_spec_uint("top_padding",
                                                      _("Top Padding"),
                                                      _("The padding to insert at the top of the widget."),
                                                      0,
                                                      G_MAXINT,
                                                      0,
                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));

169 170 171 172 173 174 175
/**
 * GtkAlignment:top-padding:
 *
 * The padding to insert at the bottom of the widget.
 *
 * Since: 2.4
 */
176 177 178 179 180 181 182 183 184 185
  g_object_class_install_property (gobject_class,
                                   PROP_PADDING_BOTTOM,
                                   g_param_spec_uint("bottom_padding",
                                                      _("Bottom Padding"),
                                                      _("The padding to insert at the bottom of the widget."),
                                                      0,
                                                      G_MAXINT,
                                                      0,
                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));

186 187 188 189 190 191 192
/**
 * GtkAlignment:top-padding:
 *
 * The padding to insert at the left of the widget.
 *
 * Since: 2.4
 */
193 194 195 196 197 198 199 200 201 202
  g_object_class_install_property (gobject_class,
                                   PROP_PADDING_LEFT,
                                   g_param_spec_uint("left_padding",
                                                      _("Left Padding"),
                                                      _("The padding to insert at the left of the widget."),
                                                      0,
                                                      G_MAXINT,
                                                      0,
                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));

203 204 205 206 207 208 209
/**
 * GtkAlignment:top-padding:
 *
 * The padding to insert at the right of the widget.
 *
 * Since: 2.4
 */
210 211 212 213 214 215 216 217 218 219 220
  g_object_class_install_property (gobject_class,
                                   PROP_PADDING_RIGHT,
                                   g_param_spec_uint("right_padding",
                                                      _("Right Padding"),
                                                      _("The padding to insert at the right of the widget."),
                                                      0,
                                                      G_MAXINT,
                                                      0,
                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));

  g_type_class_add_private (gobject_class, sizeof (GtkAlignmentPrivate));  
Elliot Lee's avatar
Elliot Lee committed
221 222 223 224 225
}

static void
gtk_alignment_init (GtkAlignment *alignment)
{
226 227
  GtkAlignmentPrivate *priv;
  
228
  GTK_WIDGET_SET_FLAGS (alignment, GTK_NO_WINDOW);
229
  gtk_widget_set_redraw_on_allocate (GTK_WIDGET (alignment), FALSE);
Elliot Lee's avatar
Elliot Lee committed
230 231 232

  alignment->xalign = 0.5;
  alignment->yalign = 0.5;
233 234
  alignment->xscale = 1.0;
  alignment->yscale = 1.0;
235 236 237 238 239 240 241

  /* Initialize padding with default values: */
  priv = GTK_ALIGNMENT_GET_PRIVATE (alignment);
  priv->padding_top = 0;
  priv->padding_bottom = 0;
  priv->padding_left = 0;
  priv->padding_right = 0;
Elliot Lee's avatar
Elliot Lee committed
242 243 244 245 246 247 248 249 250 251
}

GtkWidget*
gtk_alignment_new (gfloat xalign,
		   gfloat yalign,
		   gfloat xscale,
		   gfloat yscale)
{
  GtkAlignment *alignment;

Manish Singh's avatar
Manish Singh committed
252
  alignment = g_object_new (GTK_TYPE_ALIGNMENT, NULL);
Elliot Lee's avatar
Elliot Lee committed
253 254 255 256 257 258 259 260 261

  alignment->xalign = CLAMP (xalign, 0.0, 1.0);
  alignment->yalign = CLAMP (yalign, 0.0, 1.0);
  alignment->xscale = CLAMP (xscale, 0.0, 1.0);
  alignment->yscale = CLAMP (yscale, 0.0, 1.0);

  return GTK_WIDGET (alignment);
}

Tim Janik's avatar
Tim Janik committed
262 263 264 265 266
static void
gtk_alignment_set_property (GObject         *object,
			    guint            prop_id,
			    const GValue    *value,
			    GParamSpec      *pspec)
Tim Janik's avatar
Tim Janik committed
267 268
{
  GtkAlignment *alignment;
269
  GtkAlignmentPrivate *priv;
Tim Janik's avatar
Tim Janik committed
270
  
Tim Janik's avatar
Tim Janik committed
271
  alignment = GTK_ALIGNMENT (object);
272
  priv = GTK_ALIGNMENT_GET_PRIVATE (alignment);
Tim Janik's avatar
Tim Janik committed
273
  
274
  switch (prop_id)
Tim Janik's avatar
Tim Janik committed
275
    {
276
    case PROP_XALIGN:
Tim Janik's avatar
Tim Janik committed
277
      gtk_alignment_set (alignment,
278
			 g_value_get_float (value),
Tim Janik's avatar
Tim Janik committed
279 280 281 282
			 alignment->yalign,
			 alignment->xscale,
			 alignment->yscale);
      break;
283
    case PROP_YALIGN:
Tim Janik's avatar
Tim Janik committed
284 285
      gtk_alignment_set (alignment,
			 alignment->xalign,
286
			 g_value_get_float (value),
Tim Janik's avatar
Tim Janik committed
287 288 289
			 alignment->xscale,
			 alignment->yscale);
      break;
290
    case PROP_XSCALE:
Tim Janik's avatar
Tim Janik committed
291 292 293
      gtk_alignment_set (alignment,
			 alignment->xalign,
			 alignment->yalign,
294
			 g_value_get_float (value),
Tim Janik's avatar
Tim Janik committed
295 296
			 alignment->yscale);
      break;
297
    case PROP_YSCALE:
Tim Janik's avatar
Tim Janik committed
298 299 300 301
      gtk_alignment_set (alignment,
			 alignment->xalign,
			 alignment->yalign,
			 alignment->xscale,
302
			 g_value_get_float (value));
Tim Janik's avatar
Tim Janik committed
303
      break;
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
      
    /* Padding: */
    case PROP_PADDING_TOP:
      gtk_alignment_set_padding (alignment,
			 g_value_get_uint (value),
			 priv->padding_bottom,
			 priv->padding_left,
			 priv->padding_right);
      break;
    case PROP_PADDING_BOTTOM:
      gtk_alignment_set_padding (alignment,
			 priv->padding_top,
			 g_value_get_uint (value),
			 priv->padding_left,
			 priv->padding_right);
      break;
    case PROP_PADDING_LEFT:
      gtk_alignment_set_padding (alignment,
			 priv->padding_top,
			 priv->padding_bottom,
			 g_value_get_uint (value),
			 priv->padding_right);
      break;
    case PROP_PADDING_RIGHT:
      gtk_alignment_set_padding (alignment,
			 priv->padding_top,
			 priv->padding_bottom,
			 priv->padding_left,
			 g_value_get_uint (value));
      break;
    
Tim Janik's avatar
Tim Janik committed
335
    default:
336
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Tim Janik's avatar
Tim Janik committed
337 338 339 340
      break;
    }
}

Tim Janik's avatar
Tim Janik committed
341 342 343 344 345
static void
gtk_alignment_get_property (GObject         *object,
			    guint            prop_id,
			    GValue          *value,
			    GParamSpec      *pspec)
Tim Janik's avatar
Tim Janik committed
346 347
{
  GtkAlignment *alignment;
348 349
  GtkAlignmentPrivate *priv;

Tim Janik's avatar
Tim Janik committed
350
  alignment = GTK_ALIGNMENT (object);
351
  priv = GTK_ALIGNMENT_GET_PRIVATE (alignment);
352 353
   
  switch (prop_id)
Tim Janik's avatar
Tim Janik committed
354
    {
355 356
    case PROP_XALIGN:
      g_value_set_float(value, alignment->xalign);
Tim Janik's avatar
Tim Janik committed
357
      break;
358 359
    case PROP_YALIGN:
      g_value_set_float(value, alignment->yalign);
Tim Janik's avatar
Tim Janik committed
360
      break;
361 362
    case PROP_XSCALE:
      g_value_set_float(value, alignment->xscale);
Tim Janik's avatar
Tim Janik committed
363
      break;
364 365
    case PROP_YSCALE:
      g_value_set_float(value, alignment->yscale);
Tim Janik's avatar
Tim Janik committed
366
      break;
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381

    /* Padding: */
    case PROP_PADDING_TOP:
      g_value_set_uint (value, priv->padding_top);
      break;
    case PROP_PADDING_BOTTOM:
      g_value_set_uint (value, priv->padding_bottom);
      break;
    case PROP_PADDING_LEFT:
      g_value_set_uint (value, priv->padding_left);
      break;
    case PROP_PADDING_RIGHT:
      g_value_set_uint (value, priv->padding_right);
      break;
      
Tim Janik's avatar
Tim Janik committed
382
    default:
383
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Tim Janik's avatar
Tim Janik committed
384 385 386 387
      break;
    }
}

Elliot Lee's avatar
Elliot Lee committed
388 389 390 391 392 393 394 395 396 397 398 399 400 401
void
gtk_alignment_set (GtkAlignment *alignment,
		   gfloat        xalign,
		   gfloat        yalign,
		   gfloat        xscale,
		   gfloat        yscale)
{
  g_return_if_fail (GTK_IS_ALIGNMENT (alignment));

  xalign = CLAMP (xalign, 0.0, 1.0);
  yalign = CLAMP (yalign, 0.0, 1.0);
  xscale = CLAMP (xscale, 0.0, 1.0);
  yscale = CLAMP (yscale, 0.0, 1.0);

Hans Breuer's avatar
Hans Breuer committed
402 403 404 405
  if (   (alignment->xalign != xalign)
      || (alignment->yalign != yalign)
      || (alignment->xscale != xscale)
      || (alignment->yscale != yscale))
406
    {
Hans Breuer's avatar
Hans Breuer committed
407 408 409 410
      g_object_freeze_notify (G_OBJECT (alignment));
      if (alignment->xalign != xalign)
        {
           alignment->xalign = xalign;
411
           g_object_notify (G_OBJECT (alignment), "xalign");
Hans Breuer's avatar
Hans Breuer committed
412 413 414 415
        }
      if (alignment->yalign != yalign)
        {
           alignment->yalign = yalign;
416
           g_object_notify (G_OBJECT (alignment), "yalign");
Hans Breuer's avatar
Hans Breuer committed
417 418 419 420
        }
      if (alignment->xscale != xscale)
        {
           alignment->xscale = xscale;
421
           g_object_notify (G_OBJECT (alignment), "xscale");
Hans Breuer's avatar
Hans Breuer committed
422 423 424 425
        }
      if (alignment->yscale != yscale)
        {
           alignment->yscale = yscale;
426
           g_object_notify (G_OBJECT (alignment), "yscale");
Hans Breuer's avatar
Hans Breuer committed
427 428
        }
      g_object_thaw_notify (G_OBJECT (alignment));
Elliot Lee's avatar
Elliot Lee committed
429

Hans Breuer's avatar
Hans Breuer committed
430 431
      if (GTK_BIN (alignment)->child)
        gtk_widget_queue_resize (GTK_BIN (alignment)->child);
Elliot Lee's avatar
Elliot Lee committed
432 433 434 435 436 437 438 439 440 441 442
      gtk_widget_queue_draw (GTK_WIDGET (alignment));
    }
}


static void
gtk_alignment_size_request (GtkWidget      *widget,
			    GtkRequisition *requisition)
{
  GtkAlignment *alignment;
  GtkBin *bin;
443
  GtkAlignmentPrivate *priv;
Elliot Lee's avatar
Elliot Lee committed
444 445 446

  alignment = GTK_ALIGNMENT (widget);
  bin = GTK_BIN (widget);
447
  priv = GTK_ALIGNMENT_GET_PRIVATE (widget);
Elliot Lee's avatar
Elliot Lee committed
448 449 450 451 452 453

  requisition->width = GTK_CONTAINER (widget)->border_width * 2;
  requisition->height = GTK_CONTAINER (widget)->border_width * 2;

  if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
    {
454 455 456
      GtkRequisition child_requisition;
      
      gtk_widget_size_request (bin->child, &child_requisition);
Elliot Lee's avatar
Elliot Lee committed
457

458 459
      requisition->width += child_requisition.width;
      requisition->height += child_requisition.height;
460 461 462 463

      /* Request extra space for the padding: */
      requisition->width += (priv->padding_left + priv->padding_right);
      requisition->height += (priv->padding_top + priv->padding_bottom);
Elliot Lee's avatar
Elliot Lee committed
464 465 466 467 468 469 470 471 472 473
    }
}

static void
gtk_alignment_size_allocate (GtkWidget     *widget,
			     GtkAllocation *allocation)
{
  GtkAlignment *alignment;
  GtkBin *bin;
  GtkAllocation child_allocation;
474
  GtkRequisition child_requisition;
Elliot Lee's avatar
Elliot Lee committed
475
  gint width, height;
476 477 478 479 480 481 482
  gint border_width;
  gint padding_horizontal, padding_vertical;
  GtkAlignmentPrivate *priv;
  

  padding_horizontal = 0;
  padding_vertical = 0;
Elliot Lee's avatar
Elliot Lee committed
483 484 485 486

  widget->allocation = *allocation;
  alignment = GTK_ALIGNMENT (widget);
  bin = GTK_BIN (widget);
Tim Janik's avatar
Tim Janik committed
487
  
Elliot Lee's avatar
Elliot Lee committed
488 489
  if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
    {
490
      gtk_widget_get_child_requisition (bin->child, &child_requisition);
491 492 493 494 495 496 497 498 499 500

      border_width = GTK_CONTAINER (alignment)->border_width;

      priv = GTK_ALIGNMENT_GET_PRIVATE (widget);
      padding_horizontal = priv->padding_left + priv->padding_right;
      padding_vertical = priv->padding_top + priv->padding_bottom;

      width = allocation->width - padding_horizontal - 2 * border_width;
      height = allocation->height - padding_vertical - 2 * border_width;
    
501 502
      if (width > child_requisition.width)
	child_allocation.width = (child_requisition.width *
Elliot Lee's avatar
Elliot Lee committed
503 504 505 506
				  (1.0 - alignment->xscale) +
				  width * alignment->xscale);
      else
	child_allocation.width = width;
Tim Janik's avatar
Tim Janik committed
507
      
508 509
      if (height > child_requisition.height)
	child_allocation.height = (child_requisition.height *
Tim Janik's avatar
Tim Janik committed
510 511
				   (1.0 - alignment->yscale) +
				   height * alignment->yscale);
Elliot Lee's avatar
Elliot Lee committed
512 513 514
      else
	child_allocation.height = height;

515 516
      child_allocation.x = alignment->xalign * (width - child_allocation.width) + allocation->x + border_width + priv->padding_left;
      child_allocation.y = alignment->yalign * (height - child_allocation.height) + allocation->y + border_width + priv->padding_top;
Elliot Lee's avatar
Elliot Lee committed
517 518 519 520

      gtk_widget_size_allocate (bin->child, &child_allocation);
    }
}
521 522 523

/**
 * gtk_alignment_set_padding:
524
 * @alignment: a #GtkAlignment
525 526 527 528 529 530 531 532 533
 * @padding_top: the padding at the top of the widget
 * @padding_bottom: the padding at the bottom of the widget
 * @padding_left: the padding at the left of the widget
 * @padding_right: the padding at the right of the widget.
 *
 * Sets the padding on the different sides of the widget.
 * The padding adds blank space to the sides of the widget. For instance,
 * this can be used to indent the child widget towards the right by adding
 * padding on the left.
534 535
 *
 * Since: 2.4
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
 */
void
gtk_alignment_set_padding (GtkAlignment    *alignment,
			   guint            padding_top,
			   guint            padding_bottom,
			   guint            padding_left,
			   guint            padding_right)
{
  GtkAlignmentPrivate *priv;
  
  g_return_if_fail (GTK_IS_ALIGNMENT (alignment));

  priv = GTK_ALIGNMENT_GET_PRIVATE (alignment);

  g_object_freeze_notify (G_OBJECT (alignment));

  if (priv->padding_top != padding_top)
    {
      priv->padding_top = padding_top;
      g_object_notify (G_OBJECT (alignment), "top_padding");
    }
  if (priv->padding_bottom != padding_bottom)
    {
      priv->padding_bottom = padding_bottom;
      g_object_notify (G_OBJECT (alignment), "bottom_padding");
    }
  if (priv->padding_left != padding_left)
    {
      priv->padding_left = padding_left;
      g_object_notify (G_OBJECT (alignment), "left_padding");
    }
  if (priv->padding_right != padding_right)
    {
      priv->padding_right = padding_right;
      g_object_notify (G_OBJECT (alignment), "right_padding");
    }

  g_object_thaw_notify (G_OBJECT (alignment));
  
  /* Make sure that the widget and children are redrawn with the new setting: */
  if (GTK_BIN (alignment)->child)
    gtk_widget_queue_resize (GTK_BIN (alignment)->child);

  gtk_widget_queue_draw (GTK_WIDGET (alignment));
}

/**
 * gtk_alignment_get_padding:
584
 * @alignment: a #GtkAlignment
585 586 587 588 589 590 591
 * @padding_top: location to store the padding for the top of the widget, or %NULL
 * @padding_bottom: location to store the padding for the bottom of the widget, or %NULL
 * @padding_left: location to store the padding for the left of the widget, or %NULL
 * @padding_right: location to store the padding for the right of the widget, or %NULL
 *
 * Gets the padding on the different sides of the widget.
 * See gtk_alignment_set_padding ().
592 593
 *
 * Since: 2.4
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
 */
void
gtk_alignment_get_padding (GtkAlignment    *alignment,
			   guint           *padding_top,
			   guint           *padding_bottom,
			   guint           *padding_left,
			   guint           *padding_right)
{
  GtkAlignmentPrivate *priv;
 
  g_return_if_fail (GTK_IS_ALIGNMENT (alignment));

  priv = GTK_ALIGNMENT_GET_PRIVATE (alignment);
  if(padding_top)
    *padding_top = priv->padding_top;
  if(padding_bottom)
    *padding_bottom = priv->padding_bottom;
  if(padding_left)
    *padding_left = priv->padding_left;
  if(padding_right)
    *padding_right = priv->padding_right;
}