Blame gtk/gtkbutton.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Modified by the GTK+ Team and others 1997-2001.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit Service fb6fa5
 * files for a list of changes.  These files are distributed with
Packit Service fb6fa5
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
#include "gtkalignment.h"
Packit Service fb6fa5
#include "gtkbutton.h"
Packit Service fb6fa5
#include "gtklabel.h"
Packit Service fb6fa5
#include "gtkmain.h"
Packit Service fb6fa5
#include "gtkmarshalers.h"
Packit Service fb6fa5
#include "gtkimage.h"
Packit Service fb6fa5
#include "gtkhbox.h"
Packit Service fb6fa5
#include "gtkvbox.h"
Packit Service fb6fa5
#include "gtkstock.h"
Packit Service fb6fa5
#include "gtkiconfactory.h"
Packit Service fb6fa5
#include "gtkactivatable.h"
Packit Service fb6fa5
#include "gtkprivate.h"
Packit Service fb6fa5
#include "gtkintl.h"
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
static const GtkBorder default_default_border = { 1, 1, 1, 1 };
Packit Service fb6fa5
static const GtkBorder default_default_outside_border = { 0, 0, 0, 0 };
Packit Service fb6fa5
static const GtkBorder default_inner_border = { 1, 1, 1, 1 };
Packit Service fb6fa5
Packit Service fb6fa5
/* Time out before giving up on getting a key release when animating
Packit Service fb6fa5
 * the close button.
Packit Service fb6fa5
 */
Packit Service fb6fa5
#define ACTIVATE_TIMEOUT 250
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  PRESSED,
Packit Service fb6fa5
  RELEASED,
Packit Service fb6fa5
  CLICKED,
Packit Service fb6fa5
  ENTER,
Packit Service fb6fa5
  LEAVE,
Packit Service fb6fa5
  ACTIVATE,
Packit Service fb6fa5
  LAST_SIGNAL
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  PROP_0,
Packit Service fb6fa5
  PROP_LABEL,
Packit Service fb6fa5
  PROP_IMAGE,
Packit Service fb6fa5
  PROP_RELIEF,
Packit Service fb6fa5
  PROP_USE_UNDERLINE,
Packit Service fb6fa5
  PROP_USE_STOCK,
Packit Service fb6fa5
  PROP_FOCUS_ON_CLICK,
Packit Service fb6fa5
  PROP_XALIGN,
Packit Service fb6fa5
  PROP_YALIGN,
Packit Service fb6fa5
  PROP_IMAGE_POSITION,
Packit Service fb6fa5
Packit Service fb6fa5
  /* activatable properties */
Packit Service fb6fa5
  PROP_ACTIVATABLE_RELATED_ACTION,
Packit Service fb6fa5
  PROP_ACTIVATABLE_USE_ACTION_APPEARANCE
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
#define GTK_BUTTON_GET_PRIVATE(o)       (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_BUTTON, GtkButtonPrivate))
Packit Service fb6fa5
typedef struct _GtkButtonPrivate GtkButtonPrivate;
Packit Service fb6fa5
Packit Service fb6fa5
struct _GtkButtonPrivate
Packit Service fb6fa5
{
Packit Service fb6fa5
  gfloat          xalign;
Packit Service fb6fa5
  gfloat          yalign;
Packit Service fb6fa5
  GtkWidget      *image;
Packit Service fb6fa5
  guint           align_set             : 1;
Packit Service fb6fa5
  guint           image_is_stock        : 1;
Packit Service fb6fa5
  guint           has_grab              : 1;
Packit Service fb6fa5
  guint           use_action_appearance : 1;
Packit Service fb6fa5
  guint32         grab_time;
Packit Service fb6fa5
  GtkPositionType image_position;
Packit Service fb6fa5
  GtkAction      *action;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static void gtk_button_destroy        (GtkObject          *object);
Packit Service fb6fa5
static void gtk_button_dispose        (GObject            *object);
Packit Service fb6fa5
static void gtk_button_set_property   (GObject            *object,
Packit Service fb6fa5
                                       guint               prop_id,
Packit Service fb6fa5
                                       const GValue       *value,
Packit Service fb6fa5
                                       GParamSpec         *pspec);
Packit Service fb6fa5
static void gtk_button_get_property   (GObject            *object,
Packit Service fb6fa5
                                       guint               prop_id,
Packit Service fb6fa5
                                       GValue             *value,
Packit Service fb6fa5
                                       GParamSpec         *pspec);
Packit Service fb6fa5
static void gtk_button_screen_changed (GtkWidget          *widget,
Packit Service fb6fa5
				       GdkScreen          *previous_screen);
Packit Service fb6fa5
static void gtk_button_realize (GtkWidget * widget);
Packit Service fb6fa5
static void gtk_button_unrealize (GtkWidget * widget);
Packit Service fb6fa5
static void gtk_button_map (GtkWidget * widget);
Packit Service fb6fa5
static void gtk_button_unmap (GtkWidget * widget);
Packit Service fb6fa5
static void gtk_button_style_set (GtkWidget * widget, GtkStyle * prev_style);
Packit Service fb6fa5
static void gtk_button_size_request (GtkWidget * widget,
Packit Service fb6fa5
				     GtkRequisition * requisition);
Packit Service fb6fa5
static void gtk_button_size_allocate (GtkWidget * widget,
Packit Service fb6fa5
				      GtkAllocation * allocation);
Packit Service fb6fa5
static gint gtk_button_expose (GtkWidget * widget, GdkEventExpose * event);
Packit Service fb6fa5
static gint gtk_button_button_press (GtkWidget * widget,
Packit Service fb6fa5
				     GdkEventButton * event);
Packit Service fb6fa5
static gint gtk_button_button_release (GtkWidget * widget,
Packit Service fb6fa5
				       GdkEventButton * event);
Packit Service fb6fa5
static gint gtk_button_grab_broken (GtkWidget * widget,
Packit Service fb6fa5
				    GdkEventGrabBroken * event);
Packit Service fb6fa5
static gint gtk_button_key_release (GtkWidget * widget, GdkEventKey * event);
Packit Service fb6fa5
static gint gtk_button_enter_notify (GtkWidget * widget,
Packit Service fb6fa5
				     GdkEventCrossing * event);
Packit Service fb6fa5
static gint gtk_button_leave_notify (GtkWidget * widget,
Packit Service fb6fa5
				     GdkEventCrossing * event);
Packit Service fb6fa5
static void gtk_real_button_pressed (GtkButton * button);
Packit Service fb6fa5
static void gtk_real_button_released (GtkButton * button);
Packit Service fb6fa5
static void gtk_real_button_clicked (GtkButton * button);
Packit Service fb6fa5
static void gtk_real_button_activate  (GtkButton          *button);
Packit Service fb6fa5
static void gtk_button_update_state   (GtkButton          *button);
Packit Service fb6fa5
static void gtk_button_add            (GtkContainer       *container,
Packit Service fb6fa5
			               GtkWidget          *widget);
Packit Service fb6fa5
static GType gtk_button_child_type    (GtkContainer       *container);
Packit Service fb6fa5
static void gtk_button_finish_activate (GtkButton         *button,
Packit Service fb6fa5
					gboolean           do_it);
Packit Service fb6fa5
Packit Service fb6fa5
static GObject*	gtk_button_constructor (GType                  type,
Packit Service fb6fa5
					guint                  n_construct_properties,
Packit Service fb6fa5
					GObjectConstructParam *construct_params);
Packit Service fb6fa5
static void gtk_button_construct_child (GtkButton             *button);
Packit Service fb6fa5
static void gtk_button_state_changed   (GtkWidget             *widget,
Packit Service fb6fa5
					GtkStateType           previous_state);
Packit Service fb6fa5
static void gtk_button_grab_notify     (GtkWidget             *widget,
Packit Service fb6fa5
					gboolean               was_grabbed);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void gtk_button_activatable_interface_init         (GtkActivatableIface  *iface);
Packit Service fb6fa5
static void gtk_button_update                    (GtkActivatable       *activatable,
Packit Service fb6fa5
				                  GtkAction            *action,
Packit Service fb6fa5
			                          const gchar          *property_name);
Packit Service fb6fa5
static void gtk_button_sync_action_properties    (GtkActivatable       *activatable,
Packit Service fb6fa5
                                                  GtkAction            *action);
Packit Service fb6fa5
static void gtk_button_set_related_action        (GtkButton            *button,
Packit Service fb6fa5
					          GtkAction            *action);
Packit Service fb6fa5
static void gtk_button_set_use_action_appearance (GtkButton            *button,
Packit Service fb6fa5
						  gboolean              use_appearance);
Packit Service fb6fa5
Packit Service fb6fa5
static guint button_signals[LAST_SIGNAL] = { 0 };
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_TYPE_WITH_CODE (GtkButton, gtk_button, GTK_TYPE_BIN,
Packit Service fb6fa5
			 G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTIVATABLE,
Packit Service fb6fa5
						gtk_button_activatable_interface_init))
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_class_init (GtkButtonClass *klass)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GObjectClass *gobject_class;
Packit Service fb6fa5
  GtkObjectClass *object_class;
Packit Service fb6fa5
  GtkWidgetClass *widget_class;
Packit Service fb6fa5
  GtkContainerClass *container_class;
Packit Service fb6fa5
Packit Service fb6fa5
  gobject_class = G_OBJECT_CLASS (klass);
Packit Service fb6fa5
  object_class = (GtkObjectClass*) klass;
Packit Service fb6fa5
  widget_class = (GtkWidgetClass*) klass;
Packit Service fb6fa5
  container_class = (GtkContainerClass*) klass;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gobject_class->constructor  = gtk_button_constructor;
Packit Service fb6fa5
  gobject_class->dispose      = gtk_button_dispose;
Packit Service fb6fa5
  gobject_class->set_property = gtk_button_set_property;
Packit Service fb6fa5
  gobject_class->get_property = gtk_button_get_property;
Packit Service fb6fa5
Packit Service fb6fa5
  object_class->destroy = gtk_button_destroy;
Packit Service fb6fa5
Packit Service fb6fa5
  widget_class->screen_changed = gtk_button_screen_changed;
Packit Service fb6fa5
  widget_class->realize = gtk_button_realize;
Packit Service fb6fa5
  widget_class->unrealize = gtk_button_unrealize;
Packit Service fb6fa5
  widget_class->map = gtk_button_map;
Packit Service fb6fa5
  widget_class->unmap = gtk_button_unmap;
Packit Service fb6fa5
  widget_class->style_set = gtk_button_style_set;
Packit Service fb6fa5
  widget_class->size_request = gtk_button_size_request;
Packit Service fb6fa5
  widget_class->size_allocate = gtk_button_size_allocate;
Packit Service fb6fa5
  widget_class->expose_event = gtk_button_expose;
Packit Service fb6fa5
  widget_class->button_press_event = gtk_button_button_press;
Packit Service fb6fa5
  widget_class->button_release_event = gtk_button_button_release;
Packit Service fb6fa5
  widget_class->grab_broken_event = gtk_button_grab_broken;
Packit Service fb6fa5
  widget_class->key_release_event = gtk_button_key_release;
Packit Service fb6fa5
  widget_class->enter_notify_event = gtk_button_enter_notify;
Packit Service fb6fa5
  widget_class->leave_notify_event = gtk_button_leave_notify;
Packit Service fb6fa5
  widget_class->state_changed = gtk_button_state_changed;
Packit Service fb6fa5
  widget_class->grab_notify = gtk_button_grab_notify;
Packit Service fb6fa5
Packit Service fb6fa5
  container_class->child_type = gtk_button_child_type;
Packit Service fb6fa5
  container_class->add = gtk_button_add;
Packit Service fb6fa5
Packit Service fb6fa5
  klass->pressed = gtk_real_button_pressed;
Packit Service fb6fa5
  klass->released = gtk_real_button_released;
Packit Service fb6fa5
  klass->clicked = NULL;
Packit Service fb6fa5
  klass->enter = gtk_button_update_state;
Packit Service fb6fa5
  klass->leave = gtk_button_update_state;
Packit Service fb6fa5
  klass->activate = gtk_real_button_activate;
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_LABEL,
Packit Service fb6fa5
                                   g_param_spec_string ("label",
Packit Service fb6fa5
                                                        P_("Label"),
Packit Service fb6fa5
                                                        P_("Text of the label widget inside the button, if the button contains a label widget"),
Packit Service fb6fa5
                                                        NULL,
Packit Service fb6fa5
                                                        GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_USE_UNDERLINE,
Packit Service fb6fa5
                                   g_param_spec_boolean ("use-underline",
Packit Service fb6fa5
							 P_("Use underline"),
Packit Service fb6fa5
							 P_("If set, an underline in the text indicates the next character should be used for the mnemonic accelerator key"),
Packit Service fb6fa5
                                                        FALSE,
Packit Service fb6fa5
                                                        GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_USE_STOCK,
Packit Service fb6fa5
                                   g_param_spec_boolean ("use-stock",
Packit Service fb6fa5
							 P_("Use stock"),
Packit Service fb6fa5
							 P_("If set, the label is used to pick a stock item instead of being displayed"),
Packit Service fb6fa5
                                                        FALSE,
Packit Service fb6fa5
                                                        GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_FOCUS_ON_CLICK,
Packit Service fb6fa5
                                   g_param_spec_boolean ("focus-on-click",
Packit Service fb6fa5
							 P_("Focus on click"),
Packit Service fb6fa5
							 P_("Whether the button grabs focus when it is clicked with the mouse"),
Packit Service fb6fa5
							 TRUE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_RELIEF,
Packit Service fb6fa5
                                   g_param_spec_enum ("relief",
Packit Service fb6fa5
                                                      P_("Border relief"),
Packit Service fb6fa5
                                                      P_("The border relief style"),
Packit Service fb6fa5
                                                      GTK_TYPE_RELIEF_STYLE,
Packit Service fb6fa5
                                                      GTK_RELIEF_NORMAL,
Packit Service fb6fa5
                                                      GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton:xalign:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If the child of the button is a #GtkMisc or #GtkAlignment, this property 
Packit Service fb6fa5
   * can be used to control it's horizontal alignment. 0.0 is left aligned, 
Packit Service fb6fa5
   * 1.0 is right aligned.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.4
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_XALIGN,
Packit Service fb6fa5
                                   g_param_spec_float("xalign",
Packit Service fb6fa5
                                                      P_("Horizontal alignment for child"),
Packit Service fb6fa5
                                                      P_("Horizontal position of child in available space. 0.0 is left aligned, 1.0 is right aligned"),
Packit Service fb6fa5
                                                      0.0,
Packit Service fb6fa5
                                                      1.0,
Packit Service fb6fa5
                                                      0.5,
Packit Service fb6fa5
                                                      GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton:yalign:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If the child of the button is a #GtkMisc or #GtkAlignment, this property 
Packit Service fb6fa5
   * can be used to control it's vertical alignment. 0.0 is top aligned, 
Packit Service fb6fa5
   * 1.0 is bottom aligned.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.4
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_YALIGN,
Packit Service fb6fa5
                                   g_param_spec_float("yalign",
Packit Service fb6fa5
                                                      P_("Vertical alignment for child"),
Packit Service fb6fa5
                                                      P_("Vertical position of child in available space. 0.0 is top aligned, 1.0 is bottom aligned"),
Packit Service fb6fa5
                                                      0.0,
Packit Service fb6fa5
                                                      1.0,
Packit Service fb6fa5
                                                      0.5,
Packit Service fb6fa5
                                                      GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton::image:
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * The child widget to appear next to the button text.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.6
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_IMAGE,
Packit Service fb6fa5
                                   g_param_spec_object ("image",
Packit Service fb6fa5
                                                        P_("Image widget"),
Packit Service fb6fa5
                                                        P_("Child widget to appear next to the button text"),
Packit Service fb6fa5
                                                        GTK_TYPE_WIDGET,
Packit Service fb6fa5
                                                        GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton:image-position:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The position of the image relative to the text inside the button.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_IMAGE_POSITION,
Packit Service fb6fa5
                                   g_param_spec_enum ("image-position",
Packit Service fb6fa5
                                            P_("Image position"),
Packit Service fb6fa5
                                                      P_("The position of the image relative to the text"),
Packit Service fb6fa5
                                                      GTK_TYPE_POSITION_TYPE,
Packit Service fb6fa5
                                                      GTK_POS_LEFT,
Packit Service fb6fa5
                                                      GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_class_override_property (gobject_class, PROP_ACTIVATABLE_RELATED_ACTION, "related-action");
Packit Service fb6fa5
  g_object_class_override_property (gobject_class, PROP_ACTIVATABLE_USE_ACTION_APPEARANCE, "use-action-appearance");
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton::pressed:
Packit Service fb6fa5
   * @button: the object that received the signal
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted when the button is pressed.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Deprecated: 2.8: Use the #GtkWidget::button-press-event signal.
Packit Service fb6fa5
   */ 
Packit Service fb6fa5
  button_signals[PRESSED] =
Packit Service fb6fa5
    g_signal_new (I_("pressed"),
Packit Service fb6fa5
		  G_OBJECT_CLASS_TYPE (object_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_FIRST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkButtonClass, pressed),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__VOID,
Packit Service fb6fa5
		  G_TYPE_NONE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton::released:
Packit Service fb6fa5
   * @button: the object that received the signal
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted when the button is released.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Deprecated: 2.8: Use the #GtkWidget::button-release-event signal.
Packit Service fb6fa5
   */ 
Packit Service fb6fa5
  button_signals[RELEASED] =
Packit Service fb6fa5
    g_signal_new (I_("released"),
Packit Service fb6fa5
		  G_OBJECT_CLASS_TYPE (object_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_FIRST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkButtonClass, released),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__VOID,
Packit Service fb6fa5
		  G_TYPE_NONE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton::clicked:
Packit Service fb6fa5
   * @button: the object that received the signal
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted when the button has been activated (pressed and released).
Packit Service fb6fa5
   */ 
Packit Service fb6fa5
  button_signals[CLICKED] =
Packit Service fb6fa5
    g_signal_new (I_("clicked"),
Packit Service fb6fa5
		  G_OBJECT_CLASS_TYPE (object_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkButtonClass, clicked),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__VOID,
Packit Service fb6fa5
		  G_TYPE_NONE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton::enter:
Packit Service fb6fa5
   * @button: the object that received the signal
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted when the pointer enters the button.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Deprecated: 2.8: Use the #GtkWidget::enter-notify-event signal.
Packit Service fb6fa5
   */ 
Packit Service fb6fa5
  button_signals[ENTER] =
Packit Service fb6fa5
    g_signal_new (I_("enter"),
Packit Service fb6fa5
		  G_OBJECT_CLASS_TYPE (object_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_FIRST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkButtonClass, enter),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__VOID,
Packit Service fb6fa5
		  G_TYPE_NONE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton::leave:
Packit Service fb6fa5
   * @button: the object that received the signal
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted when the pointer leaves the button.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Deprecated: 2.8: Use the #GtkWidget::leave-notify-event signal.
Packit Service fb6fa5
   */ 
Packit Service fb6fa5
  button_signals[LEAVE] =
Packit Service fb6fa5
    g_signal_new (I_("leave"),
Packit Service fb6fa5
		  G_OBJECT_CLASS_TYPE (object_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_FIRST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkButtonClass, leave),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__VOID,
Packit Service fb6fa5
		  G_TYPE_NONE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton::activate:
Packit Service fb6fa5
   * @widget: the object which received the signal.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The ::activate signal on GtkButton is an action signal and
Packit Service fb6fa5
   * emitting it causes the button to animate press then release. 
Packit Service fb6fa5
   * Applications should never connect to this signal, but use the
Packit Service fb6fa5
   * #GtkButton::clicked signal.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  button_signals[ACTIVATE] =
Packit Service fb6fa5
    g_signal_new (I_("activate"),
Packit Service fb6fa5
		  G_OBJECT_CLASS_TYPE (object_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkButtonClass, activate),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__VOID,
Packit Service fb6fa5
		  G_TYPE_NONE, 0);
Packit Service fb6fa5
  widget_class->activate_signal = button_signals[ACTIVATE];
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton:default-border:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The "default-border" style property defines the extra space to add
Packit Service fb6fa5
   * around a button that can become the default widget of its window.
Packit Service fb6fa5
   * For more information about default widgets, see gtk_widget_grab_default().
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_boxed ("default-border",
Packit Service fb6fa5
							       P_("Default Spacing"),
Packit Service fb6fa5
							       P_("Extra space to add for GTK_CAN_DEFAULT buttons"),
Packit Service fb6fa5
							       GTK_TYPE_BORDER,
Packit Service fb6fa5
							       GTK_PARAM_READABLE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton:default-outside-border:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The "default-outside-border" style property defines the extra outside
Packit Service fb6fa5
   * space to add around a button that can become the default widget of its
Packit Service fb6fa5
   * window. Extra outside space is always drawn outside the button border.
Packit Service fb6fa5
   * For more information about default widgets, see gtk_widget_grab_default().
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_boxed ("default-outside-border",
Packit Service fb6fa5
							       P_("Default Outside Spacing"),
Packit Service fb6fa5
							       P_("Extra space to add for GTK_CAN_DEFAULT buttons that is always drawn outside the border"),
Packit Service fb6fa5
							       GTK_TYPE_BORDER,
Packit Service fb6fa5
							       GTK_PARAM_READABLE));
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_int ("child-displacement-x",
Packit Service fb6fa5
							     P_("Child X Displacement"),
Packit Service fb6fa5
							     P_("How far in the x direction to move the child when the button is depressed"),
Packit Service fb6fa5
							     G_MININT,
Packit Service fb6fa5
							     G_MAXINT,
Packit Service fb6fa5
							     0,
Packit Service fb6fa5
							     GTK_PARAM_READABLE));
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_int ("child-displacement-y",
Packit Service fb6fa5
							     P_("Child Y Displacement"),
Packit Service fb6fa5
							     P_("How far in the y direction to move the child when the button is depressed"),
Packit Service fb6fa5
							     G_MININT,
Packit Service fb6fa5
							     G_MAXINT,
Packit Service fb6fa5
							     0,
Packit Service fb6fa5
							     GTK_PARAM_READABLE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton:displace-focus:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Whether the child_displacement_x/child_displacement_y properties 
Packit Service fb6fa5
   * should also affect the focus rectangle.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.6
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_boolean ("displace-focus",
Packit Service fb6fa5
								 P_("Displace focus"),
Packit Service fb6fa5
								 P_("Whether the child_displacement_x/_y properties should also affect the focus rectangle"),
Packit Service fb6fa5
								 FALSE,
Packit Service fb6fa5
								 GTK_PARAM_READABLE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton:inner-border:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Sets the border between the button edges and child.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_boxed ("inner-border",
Packit Service fb6fa5
                                                               P_("Inner Border"),
Packit Service fb6fa5
                                                               P_("Border between button edges and child."),
Packit Service fb6fa5
                                                               GTK_TYPE_BORDER,
Packit Service fb6fa5
                                                               GTK_PARAM_READABLE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkButton::image-spacing:
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Spacing in pixels between the image and label.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_int ("image-spacing",
Packit Service fb6fa5
							     P_("Image spacing"),
Packit Service fb6fa5
							     P_("Spacing in pixels between the image and label"),
Packit Service fb6fa5
							     0,
Packit Service fb6fa5
							     G_MAXINT,
Packit Service fb6fa5
							     2,
Packit Service fb6fa5
							     GTK_PARAM_READABLE));
Packit Service fb6fa5
Packit Service fb6fa5
  g_type_class_add_private (gobject_class, sizeof (GtkButtonPrivate));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_init (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_set_can_focus (GTK_WIDGET (button), TRUE);
Packit Service fb6fa5
  gtk_widget_set_receives_default (GTK_WIDGET (button), TRUE);
Packit Service fb6fa5
  gtk_widget_set_has_window (GTK_WIDGET (button), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  button->label_text = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  button->constructed = FALSE;
Packit Service fb6fa5
  button->in_button = FALSE;
Packit Service fb6fa5
  button->button_down = FALSE;
Packit Service fb6fa5
  button->relief = GTK_RELIEF_NORMAL;
Packit Service fb6fa5
  button->use_stock = FALSE;
Packit Service fb6fa5
  button->use_underline = FALSE;
Packit Service fb6fa5
  button->depressed = FALSE;
Packit Service fb6fa5
  button->depress_on_activate = TRUE;
Packit Service fb6fa5
  button->focus_on_click = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  priv->xalign = 0.5;
Packit Service fb6fa5
  priv->yalign = 0.5;
Packit Service fb6fa5
  priv->align_set = 0;
Packit Service fb6fa5
  priv->image_is_stock = TRUE;
Packit Service fb6fa5
  priv->image_position = GTK_POS_LEFT;
Packit Service fb6fa5
  priv->use_action_appearance = TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_destroy (GtkObject *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (object);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (button->label_text)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_free (button->label_text);
Packit Service fb6fa5
      button->label_text = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_OBJECT_CLASS (gtk_button_parent_class)->destroy (object);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GObject*
Packit Service fb6fa5
gtk_button_constructor (GType                  type,
Packit Service fb6fa5
			guint                  n_construct_properties,
Packit Service fb6fa5
			GObjectConstructParam *construct_params)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GObject *object;
Packit Service fb6fa5
  GtkButton *button;
Packit Service fb6fa5
Packit Service fb6fa5
  object = G_OBJECT_CLASS (gtk_button_parent_class)->constructor (type,
Packit Service fb6fa5
                                                                  n_construct_properties,
Packit Service fb6fa5
                                                                  construct_params);
Packit Service fb6fa5
Packit Service fb6fa5
  button = GTK_BUTTON (object);
Packit Service fb6fa5
  button->constructed = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->label_text != NULL)
Packit Service fb6fa5
    gtk_button_construct_child (button);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return object;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static GType
Packit Service fb6fa5
gtk_button_child_type  (GtkContainer     *container)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!GTK_BIN (container)->child)
Packit Service fb6fa5
    return GTK_TYPE_WIDGET;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return G_TYPE_NONE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
maybe_set_alignment (GtkButton *button,
Packit Service fb6fa5
		     GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (GTK_IS_MISC (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkMisc *misc = GTK_MISC (widget);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (priv->align_set)
Packit Service fb6fa5
	gtk_misc_set_alignment (misc, priv->xalign, priv->yalign);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (GTK_IS_ALIGNMENT (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkAlignment *alignment = GTK_ALIGNMENT (widget);
Packit Service fb6fa5
Packit Service fb6fa5
      if (priv->align_set)
Packit Service fb6fa5
	gtk_alignment_set (alignment, priv->xalign, priv->yalign, 
Packit Service fb6fa5
			   alignment->xscale, alignment->yscale);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_add (GtkContainer *container,
Packit Service fb6fa5
		GtkWidget    *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  maybe_set_alignment (GTK_BUTTON (container), widget);
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_CONTAINER_CLASS (gtk_button_parent_class)->add (container, widget);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void 
Packit Service fb6fa5
gtk_button_dispose (GObject *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (object);
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->action)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_activatable_do_set_related_action (GTK_ACTIVATABLE (button), NULL);
Packit Service fb6fa5
      priv->action = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  G_OBJECT_CLASS (gtk_button_parent_class)->dispose (object);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_set_property (GObject         *object,
Packit Service fb6fa5
                         guint            prop_id,
Packit Service fb6fa5
                         const GValue    *value,
Packit Service fb6fa5
                         GParamSpec      *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (object);
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_LABEL:
Packit Service fb6fa5
      gtk_button_set_label (button, g_value_get_string (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_IMAGE:
Packit Service fb6fa5
      gtk_button_set_image (button, (GtkWidget *) g_value_get_object (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_RELIEF:
Packit Service fb6fa5
      gtk_button_set_relief (button, g_value_get_enum (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_USE_UNDERLINE:
Packit Service fb6fa5
      gtk_button_set_use_underline (button, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_USE_STOCK:
Packit Service fb6fa5
      gtk_button_set_use_stock (button, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_FOCUS_ON_CLICK:
Packit Service fb6fa5
      gtk_button_set_focus_on_click (button, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_XALIGN:
Packit Service fb6fa5
      gtk_button_set_alignment (button, g_value_get_float (value), priv->yalign);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_YALIGN:
Packit Service fb6fa5
      gtk_button_set_alignment (button, priv->xalign, g_value_get_float (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_IMAGE_POSITION:
Packit Service fb6fa5
      gtk_button_set_image_position (button, g_value_get_enum (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_ACTIVATABLE_RELATED_ACTION:
Packit Service fb6fa5
      gtk_button_set_related_action (button, g_value_get_object (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_ACTIVATABLE_USE_ACTION_APPEARANCE:
Packit Service fb6fa5
      gtk_button_set_use_action_appearance (button, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_get_property (GObject         *object,
Packit Service fb6fa5
                         guint            prop_id,
Packit Service fb6fa5
                         GValue          *value,
Packit Service fb6fa5
                         GParamSpec      *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (object);
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_LABEL:
Packit Service fb6fa5
      g_value_set_string (value, button->label_text);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_IMAGE:
Packit Service fb6fa5
      g_value_set_object (value, (GObject *)priv->image);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_RELIEF:
Packit Service fb6fa5
      g_value_set_enum (value, gtk_button_get_relief (button));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_USE_UNDERLINE:
Packit Service fb6fa5
      g_value_set_boolean (value, button->use_underline);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_USE_STOCK:
Packit Service fb6fa5
      g_value_set_boolean (value, button->use_stock);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_FOCUS_ON_CLICK:
Packit Service fb6fa5
      g_value_set_boolean (value, button->focus_on_click);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_XALIGN:
Packit Service fb6fa5
      g_value_set_float (value, priv->xalign);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_YALIGN:
Packit Service fb6fa5
      g_value_set_float (value, priv->yalign);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_IMAGE_POSITION:
Packit Service fb6fa5
      g_value_set_enum (value, priv->image_position);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_ACTIVATABLE_RELATED_ACTION:
Packit Service fb6fa5
      g_value_set_object (value, priv->action);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_ACTIVATABLE_USE_ACTION_APPEARANCE:
Packit Service fb6fa5
      g_value_set_boolean (value, priv->use_action_appearance);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void 
Packit Service fb6fa5
gtk_button_activatable_interface_init (GtkActivatableIface  *iface)
Packit Service fb6fa5
{
Packit Service fb6fa5
  iface->update = gtk_button_update;
Packit Service fb6fa5
  iface->sync_action_properties = gtk_button_sync_action_properties;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
activatable_update_stock_id (GtkButton *button,
Packit Service fb6fa5
			     GtkAction *action)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!gtk_button_get_use_stock (button))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_button_set_label (button, gtk_action_get_stock_id (action));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
activatable_update_short_label (GtkButton *button,
Packit Service fb6fa5
				GtkAction *action)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *image;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_button_get_use_stock (button))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  image = gtk_button_get_image (button);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Dont touch custom child... */
Packit Service fb6fa5
  if (GTK_IS_IMAGE (image) ||
Packit Service fb6fa5
      GTK_BIN (button)->child == NULL || 
Packit Service fb6fa5
      GTK_IS_LABEL (GTK_BIN (button)->child))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_button_set_label (button, gtk_action_get_short_label (action));
Packit Service fb6fa5
      gtk_button_set_use_underline (button, TRUE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
activatable_update_icon_name (GtkButton *button,
Packit Service fb6fa5
			      GtkAction *action)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *image;
Packit Service fb6fa5
	      
Packit Service fb6fa5
  if (gtk_button_get_use_stock (button))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  image = gtk_button_get_image (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (GTK_IS_IMAGE (image) &&
Packit Service fb6fa5
      (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
Packit Service fb6fa5
       gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
Packit Service fb6fa5
    gtk_image_set_from_icon_name (GTK_IMAGE (image),
Packit Service fb6fa5
				  gtk_action_get_icon_name (action), GTK_ICON_SIZE_MENU);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
activatable_update_gicon (GtkButton *button,
Packit Service fb6fa5
			  GtkAction *action)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *image = gtk_button_get_image (button);
Packit Service fb6fa5
  GIcon *icon = gtk_action_get_gicon (action);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (GTK_IS_IMAGE (image) &&
Packit Service fb6fa5
      (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
Packit Service fb6fa5
       gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_GICON))
Packit Service fb6fa5
    gtk_image_set_from_gicon (GTK_IMAGE (image), icon, GTK_ICON_SIZE_BUTTON);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void 
Packit Service fb6fa5
gtk_button_update (GtkActivatable *activatable,
Packit Service fb6fa5
		   GtkAction      *action,
Packit Service fb6fa5
	           const gchar    *property_name)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (activatable);
Packit Service fb6fa5
Packit Service fb6fa5
  if (strcmp (property_name, "visible") == 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (gtk_action_is_visible (action))
Packit Service fb6fa5
	gtk_widget_show (GTK_WIDGET (activatable));
Packit Service fb6fa5
      else
Packit Service fb6fa5
	gtk_widget_hide (GTK_WIDGET (activatable));
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (strcmp (property_name, "sensitive") == 0)
Packit Service fb6fa5
    gtk_widget_set_sensitive (GTK_WIDGET (activatable), gtk_action_is_sensitive (action));
Packit Service fb6fa5
Packit Service fb6fa5
  if (!priv->use_action_appearance)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (strcmp (property_name, "stock-id") == 0)
Packit Service fb6fa5
    activatable_update_stock_id (GTK_BUTTON (activatable), action);
Packit Service fb6fa5
  else if (strcmp (property_name, "gicon") == 0)
Packit Service fb6fa5
    activatable_update_gicon (GTK_BUTTON (activatable), action);
Packit Service fb6fa5
  else if (strcmp (property_name, "short-label") == 0)
Packit Service fb6fa5
    activatable_update_short_label (GTK_BUTTON (activatable), action);
Packit Service fb6fa5
  else if (strcmp (property_name, "icon-name") == 0)
Packit Service fb6fa5
    activatable_update_icon_name (GTK_BUTTON (activatable), action);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_sync_action_properties (GtkActivatable *activatable,
Packit Service fb6fa5
			           GtkAction      *action)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (activatable);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!action)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_action_is_visible (action))
Packit Service fb6fa5
    gtk_widget_show (GTK_WIDGET (activatable));
Packit Service fb6fa5
  else
Packit Service fb6fa5
    gtk_widget_hide (GTK_WIDGET (activatable));
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_widget_set_sensitive (GTK_WIDGET (activatable), gtk_action_is_sensitive (action));
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (priv->use_action_appearance)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      activatable_update_stock_id (GTK_BUTTON (activatable), action);
Packit Service fb6fa5
      activatable_update_short_label (GTK_BUTTON (activatable), action);
Packit Service fb6fa5
      activatable_update_gicon (GTK_BUTTON (activatable), action);
Packit Service fb6fa5
      activatable_update_icon_name (GTK_BUTTON (activatable), action);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_set_related_action (GtkButton *button,
Packit Service fb6fa5
			       GtkAction *action)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->action == action)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  /* This should be a default handler, but for compatibility reasons
Packit Service fb6fa5
   * we need to support derived classes that don't chain up their
Packit Service fb6fa5
   * clicked handler.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_signal_handlers_disconnect_by_func (button, gtk_real_button_clicked, NULL);
Packit Service fb6fa5
  if (action)
Packit Service fb6fa5
    g_signal_connect_after (button, "clicked",
Packit Service fb6fa5
                            G_CALLBACK (gtk_real_button_clicked), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_activatable_do_set_related_action (GTK_ACTIVATABLE (button), action);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->action = action;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_set_use_action_appearance (GtkButton *button,
Packit Service fb6fa5
				      gboolean   use_appearance)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->use_action_appearance != use_appearance)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->use_action_appearance = use_appearance;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_activatable_sync_action_properties (GTK_ACTIVATABLE (button), priv->action);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_button_new (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_object_new (GTK_TYPE_BUTTON, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
show_image (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean show;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (button->label_text)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkSettings *settings;
Packit Service fb6fa5
Packit Service fb6fa5
      settings = gtk_widget_get_settings (GTK_WIDGET (button));        
Packit Service fb6fa5
      g_object_get (settings, "gtk-button-images", &show, NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    show = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  return show;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_construct_child (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
  GtkStockItem item;
Packit Service fb6fa5
  GtkWidget *label;
Packit Service fb6fa5
  GtkWidget *box;
Packit Service fb6fa5
  GtkWidget *align;
Packit Service fb6fa5
  GtkWidget *image = NULL;
Packit Service fb6fa5
  gchar *label_text = NULL;
Packit Service fb6fa5
  gint image_spacing;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!button->constructed)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!button->label_text && !priv->image)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_style_get (GTK_WIDGET (button),
Packit Service fb6fa5
			"image-spacing", &image_spacing,
Packit Service fb6fa5
			NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->image && !priv->image_is_stock)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      image = g_object_ref (priv->image);
Packit Service fb6fa5
      if (image->parent)
Packit Service fb6fa5
	gtk_container_remove (GTK_CONTAINER (image->parent), image);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  priv->image = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (GTK_BIN (button)->child)
Packit Service fb6fa5
    gtk_container_remove (GTK_CONTAINER (button),
Packit Service fb6fa5
			  GTK_BIN (button)->child);
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->use_stock &&
Packit Service fb6fa5
      button->label_text &&
Packit Service fb6fa5
      gtk_stock_lookup (button->label_text, &item))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!image)
Packit Service fb6fa5
	image = g_object_ref (gtk_image_new_from_stock (button->label_text, GTK_ICON_SIZE_BUTTON));
Packit Service fb6fa5
Packit Service fb6fa5
      label_text = item.label;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    label_text = button->label_text;
Packit Service fb6fa5
Packit Service fb6fa5
  if (image)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->image = image;
Packit Service fb6fa5
      g_object_set (priv->image,
Packit Service fb6fa5
		    "visible", show_image (button),
Packit Service fb6fa5
		    "no-show-all", TRUE,
Packit Service fb6fa5
		    NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      if (priv->image_position == GTK_POS_LEFT ||
Packit Service fb6fa5
	  priv->image_position == GTK_POS_RIGHT)
Packit Service fb6fa5
	box = gtk_hbox_new (FALSE, image_spacing);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	box = gtk_vbox_new (FALSE, image_spacing);
Packit Service fb6fa5
Packit Service fb6fa5
      if (priv->align_set)
Packit Service fb6fa5
	align = gtk_alignment_new (priv->xalign, priv->yalign, 0.0, 0.0);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
Packit Service fb6fa5
Packit Service fb6fa5
      if (priv->image_position == GTK_POS_LEFT ||
Packit Service fb6fa5
	  priv->image_position == GTK_POS_TOP)
Packit Service fb6fa5
	gtk_box_pack_start (GTK_BOX (box), priv->image, FALSE, FALSE, 0);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	gtk_box_pack_end (GTK_BOX (box), priv->image, FALSE, FALSE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
      if (label_text)
Packit Service fb6fa5
	{
Packit Service fb6fa5
          if (button->use_underline || button->use_stock)
Packit Service fb6fa5
            {
Packit Service fb6fa5
	      label = gtk_label_new_with_mnemonic (label_text);
Packit Service fb6fa5
	      gtk_label_set_mnemonic_widget (GTK_LABEL (label),
Packit Service fb6fa5
                                             GTK_WIDGET (button));
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            label = gtk_label_new (label_text);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (priv->image_position == GTK_POS_RIGHT ||
Packit Service fb6fa5
	      priv->image_position == GTK_POS_BOTTOM)
Packit Service fb6fa5
	    gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    gtk_box_pack_end (GTK_BOX (box), label, FALSE, FALSE, 0);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_container_add (GTK_CONTAINER (button), align);
Packit Service fb6fa5
      gtk_container_add (GTK_CONTAINER (align), box);
Packit Service fb6fa5
      gtk_widget_show_all (align);
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_unref (image);
Packit Service fb6fa5
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->use_underline || button->use_stock)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      label = gtk_label_new_with_mnemonic (button->label_text);
Packit Service fb6fa5
      gtk_label_set_mnemonic_widget (GTK_LABEL (label), GTK_WIDGET (button));
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    label = gtk_label_new (button->label_text);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->align_set)
Packit Service fb6fa5
    gtk_misc_set_alignment (GTK_MISC (label), priv->xalign, priv->yalign);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_show (label);
Packit Service fb6fa5
  gtk_container_add (GTK_CONTAINER (button), label);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_button_new_with_label (const gchar *label)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_object_new (GTK_TYPE_BUTTON, "label", label, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_new_from_stock:
Packit Service fb6fa5
 * @stock_id: the name of the stock item 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Creates a new #GtkButton containing the image and text from a stock item.
Packit Service fb6fa5
 * Some stock ids have preprocessor macros like #GTK_STOCK_OK and
Packit Service fb6fa5
 * #GTK_STOCK_APPLY.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If @stock_id is unknown, then it will be treated as a mnemonic
Packit Service fb6fa5
 * label (as for gtk_button_new_with_mnemonic()).
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: a new #GtkButton
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_button_new_from_stock (const gchar *stock_id)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_object_new (GTK_TYPE_BUTTON,
Packit Service fb6fa5
                       "label", stock_id,
Packit Service fb6fa5
                       "use-stock", TRUE,
Packit Service fb6fa5
                       "use-underline", TRUE,
Packit Service fb6fa5
                       NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_new_with_mnemonic:
Packit Service fb6fa5
 * @label: The text of the button, with an underscore in front of the
Packit Service fb6fa5
 *         mnemonic character
Packit Service fb6fa5
 * @returns: a new #GtkButton
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Creates a new #GtkButton containing a label.
Packit Service fb6fa5
 * If characters in @label are preceded by an underscore, they are underlined.
Packit Service fb6fa5
 * If you need a literal underscore character in a label, use '__' (two 
Packit Service fb6fa5
 * underscores). The first underlined character represents a keyboard 
Packit Service fb6fa5
 * accelerator called a mnemonic.
Packit Service fb6fa5
 * Pressing Alt and that key activates the button.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_button_new_with_mnemonic (const gchar *label)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_object_new (GTK_TYPE_BUTTON, "label", label, "use-underline", TRUE,  NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_pressed (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_signal_emit (button, button_signals[PRESSED], 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_released (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (button, button_signals[RELEASED], 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_clicked (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (button, button_signals[CLICKED], 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_enter (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (button, button_signals[ENTER], 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_leave (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (button, button_signals[LEAVE], 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_set_relief (GtkButton *button,
Packit Service fb6fa5
		       GtkReliefStyle newrelief)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  if (newrelief != button->relief) 
Packit Service fb6fa5
    {
Packit Service fb6fa5
       button->relief = newrelief;
Packit Service fb6fa5
       g_object_notify (G_OBJECT (button), "relief");
Packit Service fb6fa5
       gtk_widget_queue_draw (GTK_WIDGET (button));
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GtkReliefStyle
Packit Service fb6fa5
gtk_button_get_relief (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON (button), GTK_RELIEF_NORMAL);
Packit Service fb6fa5
Packit Service fb6fa5
  return button->relief;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_realize (GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button;
Packit Service fb6fa5
  GdkWindowAttr attributes;
Packit Service fb6fa5
  gint attributes_mask;
Packit Service fb6fa5
  gint border_width;
Packit Service fb6fa5
Packit Service fb6fa5
  button = GTK_BUTTON (widget);
Packit Service fb6fa5
  gtk_widget_set_realized (widget, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  border_width = GTK_CONTAINER (widget)->border_width;
Packit Service fb6fa5
Packit Service fb6fa5
  attributes.window_type = GDK_WINDOW_CHILD;
Packit Service fb6fa5
  attributes.x = widget->allocation.x + border_width;
Packit Service fb6fa5
  attributes.y = widget->allocation.y + border_width;
Packit Service fb6fa5
  attributes.width = widget->allocation.width - border_width * 2;
Packit Service fb6fa5
  attributes.height = widget->allocation.height - border_width * 2;
Packit Service fb6fa5
  attributes.wclass = GDK_INPUT_ONLY;
Packit Service fb6fa5
  attributes.event_mask = gtk_widget_get_events (widget);
Packit Service fb6fa5
  attributes.event_mask |= (GDK_BUTTON_PRESS_MASK |
Packit Service fb6fa5
			    GDK_BUTTON_RELEASE_MASK |
Packit Service fb6fa5
			    GDK_ENTER_NOTIFY_MASK |
Packit Service fb6fa5
			    GDK_LEAVE_NOTIFY_MASK);
Packit Service fb6fa5
Packit Service fb6fa5
  attributes_mask = GDK_WA_X | GDK_WA_Y;
Packit Service fb6fa5
Packit Service fb6fa5
  widget->window = gtk_widget_get_parent_window (widget);
Packit Service fb6fa5
  g_object_ref (widget->window);
Packit Service fb6fa5
  
Packit Service fb6fa5
  button->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
Packit Service fb6fa5
					 &attributes, attributes_mask);
Packit Service fb6fa5
  gdk_window_set_user_data (button->event_window, button);
Packit Service fb6fa5
Packit Service fb6fa5
  widget->style = gtk_style_attach (widget->style, widget->window);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_unrealize (GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->activate_timeout)
Packit Service fb6fa5
    gtk_button_finish_activate (button, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->event_window)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gdk_window_set_user_data (button->event_window, NULL);
Packit Service fb6fa5
      gdk_window_destroy (button->event_window);
Packit Service fb6fa5
      button->event_window = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  GTK_WIDGET_CLASS (gtk_button_parent_class)->unrealize (widget);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_map (GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
  
Packit Service fb6fa5
  GTK_WIDGET_CLASS (gtk_button_parent_class)->map (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->event_window)
Packit Service fb6fa5
    gdk_window_show (button->event_window);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_unmap (GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
    
Packit Service fb6fa5
  if (button->event_window)
Packit Service fb6fa5
    gdk_window_hide (button->event_window);
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_WIDGET_CLASS (gtk_button_parent_class)->unmap (widget);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_update_image_spacing (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
  GtkWidget *child; 
Packit Service fb6fa5
  gint spacing;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Keep in sync with gtk_button_construct_child,
Packit Service fb6fa5
   * we only want to update the spacing if the box 
Packit Service fb6fa5
   * was constructed there.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (!button->constructed || !priv->image)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  child = GTK_BIN (button)->child;
Packit Service fb6fa5
  if (GTK_IS_ALIGNMENT (child))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      child = GTK_BIN (child)->child;
Packit Service fb6fa5
      if (GTK_IS_BOX (child))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_widget_style_get (GTK_WIDGET (button),
Packit Service fb6fa5
                                "image-spacing", &spacing,
Packit Service fb6fa5
                                NULL);
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_box_set_spacing (GTK_BOX (child), spacing);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }   
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_style_set (GtkWidget *widget,
Packit Service fb6fa5
		      GtkStyle  *prev_style)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_button_update_image_spacing (GTK_BUTTON (widget));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_get_props (GtkButton *button,
Packit Service fb6fa5
		      GtkBorder *default_border,
Packit Service fb6fa5
		      GtkBorder *default_outside_border,
Packit Service fb6fa5
                      GtkBorder *inner_border,
Packit Service fb6fa5
		      gboolean  *interior_focus)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *widget =  GTK_WIDGET (button);
Packit Service fb6fa5
  GtkBorder *tmp_border;
Packit Service fb6fa5
Packit Service fb6fa5
  if (default_border)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_widget_style_get (widget, "default-border", &tmp_border, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      if (tmp_border)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  *default_border = *tmp_border;
Packit Service fb6fa5
	  gtk_border_free (tmp_border);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	*default_border = default_default_border;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (default_outside_border)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_widget_style_get (widget, "default-outside-border", &tmp_border, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      if (tmp_border)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  *default_outside_border = *tmp_border;
Packit Service fb6fa5
	  gtk_border_free (tmp_border);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	*default_outside_border = default_default_outside_border;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (inner_border)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_widget_style_get (widget, "inner-border", &tmp_border, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      if (tmp_border)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  *inner_border = *tmp_border;
Packit Service fb6fa5
	  gtk_border_free (tmp_border);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	*inner_border = default_inner_border;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (interior_focus)
Packit Service fb6fa5
    gtk_widget_style_get (widget, "interior-focus", interior_focus, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
	
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_size_request (GtkWidget      *widget,
Packit Service fb6fa5
			 GtkRequisition *requisition)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
  GtkBorder default_border;
Packit Service fb6fa5
  GtkBorder inner_border;
Packit Service fb6fa5
  gint focus_width;
Packit Service fb6fa5
  gint focus_pad;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_button_get_props (button, &default_border, NULL, &inner_border, NULL);
Packit Service fb6fa5
  gtk_widget_style_get (GTK_WIDGET (widget),
Packit Service fb6fa5
			"focus-line-width", &focus_width,
Packit Service fb6fa5
			"focus-padding", &focus_pad,
Packit Service fb6fa5
			NULL);
Packit Service fb6fa5
 
Packit Service fb6fa5
  requisition->width = ((GTK_CONTAINER (widget)->border_width +
Packit Service fb6fa5
                         GTK_WIDGET (widget)->style->xthickness) * 2 +
Packit Service fb6fa5
                        inner_border.left + inner_border.right);
Packit Service fb6fa5
  requisition->height = ((GTK_CONTAINER (widget)->border_width +
Packit Service fb6fa5
                          GTK_WIDGET (widget)->style->ythickness) * 2 +
Packit Service fb6fa5
                         inner_border.top + inner_border.bottom);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_widget_get_can_default (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      requisition->width += default_border.left + default_border.right;
Packit Service fb6fa5
      requisition->height += default_border.top + default_border.bottom;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (GTK_BIN (button)->child && gtk_widget_get_visible (GTK_BIN (button)->child))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkRequisition child_requisition;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_widget_size_request (GTK_BIN (button)->child, &child_requisition);
Packit Service fb6fa5
Packit Service fb6fa5
      requisition->width += child_requisition.width;
Packit Service fb6fa5
      requisition->height += child_requisition.height;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  requisition->width += 2 * (focus_width + focus_pad);
Packit Service fb6fa5
  requisition->height += 2 * (focus_width + focus_pad);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_size_allocate (GtkWidget     *widget,
Packit Service fb6fa5
			  GtkAllocation *allocation)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
  GtkAllocation child_allocation;
Packit Service fb6fa5
Packit Service fb6fa5
  gint border_width = GTK_CONTAINER (widget)->border_width;
Packit Service fb6fa5
  gint xthickness = GTK_WIDGET (widget)->style->xthickness;
Packit Service fb6fa5
  gint ythickness = GTK_WIDGET (widget)->style->ythickness;
Packit Service fb6fa5
  GtkBorder default_border;
Packit Service fb6fa5
  GtkBorder inner_border;
Packit Service fb6fa5
  gint focus_width;
Packit Service fb6fa5
  gint focus_pad;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_button_get_props (button, &default_border, NULL, &inner_border, NULL);
Packit Service fb6fa5
  gtk_widget_style_get (GTK_WIDGET (widget),
Packit Service fb6fa5
			"focus-line-width", &focus_width,
Packit Service fb6fa5
			"focus-padding", &focus_pad,
Packit Service fb6fa5
			NULL);
Packit Service fb6fa5
 
Packit Service fb6fa5
			    
Packit Service fb6fa5
  widget->allocation = *allocation;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_widget_get_realized (widget))
Packit Service fb6fa5
    gdk_window_move_resize (button->event_window,
Packit Service fb6fa5
			    widget->allocation.x + border_width,
Packit Service fb6fa5
			    widget->allocation.y + border_width,
Packit Service fb6fa5
			    widget->allocation.width - border_width * 2,
Packit Service fb6fa5
			    widget->allocation.height - border_width * 2);
Packit Service fb6fa5
Packit Service fb6fa5
  if (GTK_BIN (button)->child && gtk_widget_get_visible (GTK_BIN (button)->child))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      child_allocation.x = widget->allocation.x + border_width + inner_border.left + xthickness;
Packit Service fb6fa5
      child_allocation.y = widget->allocation.y + border_width + inner_border.top + ythickness;
Packit Service fb6fa5
      
Packit Service fb6fa5
      child_allocation.width = MAX (1, widget->allocation.width -
Packit Service fb6fa5
                                    xthickness * 2 -
Packit Service fb6fa5
                                    inner_border.left -
Packit Service fb6fa5
                                    inner_border.right -
Packit Service fb6fa5
				    border_width * 2);
Packit Service fb6fa5
      child_allocation.height = MAX (1, widget->allocation.height -
Packit Service fb6fa5
                                     ythickness * 2 -
Packit Service fb6fa5
                                     inner_border.top -
Packit Service fb6fa5
                                     inner_border.bottom -
Packit Service fb6fa5
				     border_width * 2);
Packit Service fb6fa5
Packit Service fb6fa5
      if (gtk_widget_get_can_default (GTK_WIDGET (button)))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  child_allocation.x += default_border.left;
Packit Service fb6fa5
	  child_allocation.y += default_border.top;
Packit Service fb6fa5
	  child_allocation.width =  MAX (1, child_allocation.width - default_border.left - default_border.right);
Packit Service fb6fa5
	  child_allocation.height = MAX (1, child_allocation.height - default_border.top - default_border.bottom);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (gtk_widget_get_can_focus (GTK_WIDGET (button)))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  child_allocation.x += focus_width + focus_pad;
Packit Service fb6fa5
	  child_allocation.y += focus_width + focus_pad;
Packit Service fb6fa5
	  child_allocation.width =  MAX (1, child_allocation.width - (focus_width + focus_pad) * 2);
Packit Service fb6fa5
	  child_allocation.height = MAX (1, child_allocation.height - (focus_width + focus_pad) * 2);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (button->depressed)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gint child_displacement_x;
Packit Service fb6fa5
	  gint child_displacement_y;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  gtk_widget_style_get (widget,
Packit Service fb6fa5
				"child-displacement-x", &child_displacement_x, 
Packit Service fb6fa5
				"child-displacement-y", &child_displacement_y,
Packit Service fb6fa5
				NULL);
Packit Service fb6fa5
	  child_allocation.x += child_displacement_x;
Packit Service fb6fa5
	  child_allocation.y += child_displacement_y;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_widget_size_allocate (GTK_BIN (button)->child, &child_allocation);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_button_paint (GtkButton          *button,
Packit Service fb6fa5
		   const GdkRectangle *area,
Packit Service fb6fa5
		   GtkStateType        state_type,
Packit Service fb6fa5
		   GtkShadowType       shadow_type,
Packit Service fb6fa5
		   const gchar        *main_detail,
Packit Service fb6fa5
		   const gchar        *default_detail)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *widget;
Packit Service fb6fa5
  gint width, height;
Packit Service fb6fa5
  gint x, y;
Packit Service fb6fa5
  gint border_width;
Packit Service fb6fa5
  GtkBorder default_border;
Packit Service fb6fa5
  GtkBorder default_outside_border;
Packit Service fb6fa5
  gboolean interior_focus;
Packit Service fb6fa5
  gint focus_width;
Packit Service fb6fa5
  gint focus_pad;
Packit Service fb6fa5
Packit Service fb6fa5
  widget = GTK_WIDGET (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_widget_is_drawable (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      border_width = GTK_CONTAINER (widget)->border_width;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_button_get_props (button, &default_border, &default_outside_border, NULL, &interior_focus);
Packit Service fb6fa5
      gtk_widget_style_get (widget,
Packit Service fb6fa5
			    "focus-line-width", &focus_width,
Packit Service fb6fa5
			    "focus-padding", &focus_pad,
Packit Service fb6fa5
			    NULL); 
Packit Service fb6fa5
	
Packit Service fb6fa5
      x = widget->allocation.x + border_width;
Packit Service fb6fa5
      y = widget->allocation.y + border_width;
Packit Service fb6fa5
      width = widget->allocation.width - border_width * 2;
Packit Service fb6fa5
      height = widget->allocation.height - border_width * 2;
Packit Service fb6fa5
Packit Service fb6fa5
      if (gtk_widget_has_default (widget) &&
Packit Service fb6fa5
	  GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gtk_paint_box (widget->style, widget->window,
Packit Service fb6fa5
			 GTK_STATE_NORMAL, GTK_SHADOW_IN,
Packit Service fb6fa5
			 area, widget, "buttondefault",
Packit Service fb6fa5
			 x, y, width, height);
Packit Service fb6fa5
Packit Service fb6fa5
	  x += default_border.left;
Packit Service fb6fa5
	  y += default_border.top;
Packit Service fb6fa5
	  width -= default_border.left + default_border.right;
Packit Service fb6fa5
	  height -= default_border.top + default_border.bottom;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else if (gtk_widget_get_can_default (widget))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  x += default_outside_border.left;
Packit Service fb6fa5
	  y += default_outside_border.top;
Packit Service fb6fa5
	  width -= default_outside_border.left + default_outside_border.right;
Packit Service fb6fa5
	  height -= default_outside_border.top + default_outside_border.bottom;
Packit Service fb6fa5
	}
Packit Service fb6fa5
       
Packit Service fb6fa5
      if (!interior_focus && gtk_widget_has_focus (widget))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  x += focus_width + focus_pad;
Packit Service fb6fa5
	  y += focus_width + focus_pad;
Packit Service fb6fa5
	  width -= 2 * (focus_width + focus_pad);
Packit Service fb6fa5
	  height -= 2 * (focus_width + focus_pad);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (button->relief != GTK_RELIEF_NONE || button->depressed ||
Packit Service fb6fa5
	  gtk_widget_get_state(widget) == GTK_STATE_PRELIGHT)
Packit Service fb6fa5
	gtk_paint_box (widget->style, widget->window,
Packit Service fb6fa5
		       state_type,
Packit Service fb6fa5
		       shadow_type, area, widget, "button",
Packit Service fb6fa5
		       x, y, width, height);
Packit Service fb6fa5
       
Packit Service fb6fa5
      if (gtk_widget_has_focus (widget))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gint child_displacement_x;
Packit Service fb6fa5
	  gint child_displacement_y;
Packit Service fb6fa5
	  gboolean displace_focus;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  gtk_widget_style_get (widget,
Packit Service fb6fa5
				"child-displacement-y", &child_displacement_y,
Packit Service fb6fa5
				"child-displacement-x", &child_displacement_x,
Packit Service fb6fa5
				"displace-focus", &displace_focus,
Packit Service fb6fa5
				NULL);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (interior_focus)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      x += widget->style->xthickness + focus_pad;
Packit Service fb6fa5
	      y += widget->style->ythickness + focus_pad;
Packit Service fb6fa5
	      width -= 2 * (widget->style->xthickness + focus_pad);
Packit Service fb6fa5
	      height -=  2 * (widget->style->ythickness + focus_pad);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      x -= focus_width + focus_pad;
Packit Service fb6fa5
	      y -= focus_width + focus_pad;
Packit Service fb6fa5
	      width += 2 * (focus_width + focus_pad);
Packit Service fb6fa5
	      height += 2 * (focus_width + focus_pad);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  if (button->depressed && displace_focus)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      x += child_displacement_x;
Packit Service fb6fa5
	      y += child_displacement_y;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  gtk_paint_focus (widget->style, widget->window, gtk_widget_get_state (widget),
Packit Service fb6fa5
			   area, widget, "button",
Packit Service fb6fa5
			   x, y, width, height);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_button_expose (GtkWidget      *widget,
Packit Service fb6fa5
		   GdkEventExpose *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (gtk_widget_is_drawable (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
      
Packit Service fb6fa5
      _gtk_button_paint (button, &event->area,
Packit Service fb6fa5
			 gtk_widget_get_state (widget),
Packit Service fb6fa5
			 button->depressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
Packit Service fb6fa5
			 "button", "buttondefault");
Packit Service fb6fa5
Packit Service fb6fa5
      GTK_WIDGET_CLASS (gtk_button_parent_class)->expose_event (widget, event);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_button_button_press (GtkWidget      *widget,
Packit Service fb6fa5
			 GdkEventButton *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button;
Packit Service fb6fa5
Packit Service fb6fa5
  if (event->type == GDK_BUTTON_PRESS)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button = GTK_BUTTON (widget);
Packit Service fb6fa5
Packit Service fb6fa5
      if (button->focus_on_click && !gtk_widget_has_focus (widget))
Packit Service fb6fa5
	gtk_widget_grab_focus (widget);
Packit Service fb6fa5
Packit Service fb6fa5
      if (event->button == 1)
Packit Service fb6fa5
	gtk_button_pressed (button);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_button_button_release (GtkWidget      *widget,
Packit Service fb6fa5
			   GdkEventButton *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button;
Packit Service fb6fa5
Packit Service fb6fa5
  if (event->button == 1)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button = GTK_BUTTON (widget);
Packit Service fb6fa5
      gtk_button_released (button);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_button_grab_broken (GtkWidget          *widget,
Packit Service fb6fa5
			GdkEventGrabBroken *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
  gboolean save_in;
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Simulate a button release without the pointer in the button */
Packit Service fb6fa5
  if (button->button_down)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      save_in = button->in_button;
Packit Service fb6fa5
      button->in_button = FALSE;
Packit Service fb6fa5
      gtk_button_released (button);
Packit Service fb6fa5
      if (save_in != button->in_button)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  button->in_button = save_in;
Packit Service fb6fa5
	  gtk_button_update_state (button);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_button_key_release (GtkWidget   *widget,
Packit Service fb6fa5
			GdkEventKey *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->activate_timeout)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_button_finish_activate (button, TRUE);
Packit Service fb6fa5
      return TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (GTK_WIDGET_CLASS (gtk_button_parent_class)->key_release_event)
Packit Service fb6fa5
    return GTK_WIDGET_CLASS (gtk_button_parent_class)->key_release_event (widget, event);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_button_enter_notify (GtkWidget        *widget,
Packit Service fb6fa5
			 GdkEventCrossing *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button;
Packit Service fb6fa5
  GtkWidget *event_widget;
Packit Service fb6fa5
Packit Service fb6fa5
  button = GTK_BUTTON (widget);
Packit Service fb6fa5
  event_widget = gtk_get_event_widget ((GdkEvent*) event);
Packit Service fb6fa5
Packit Service fb6fa5
  if ((event_widget == widget) &&
Packit Service fb6fa5
      (event->detail != GDK_NOTIFY_INFERIOR))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->in_button = TRUE;
Packit Service fb6fa5
      gtk_button_enter (button);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_button_leave_notify (GtkWidget        *widget,
Packit Service fb6fa5
			 GdkEventCrossing *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button;
Packit Service fb6fa5
  GtkWidget *event_widget;
Packit Service fb6fa5
Packit Service fb6fa5
  button = GTK_BUTTON (widget);
Packit Service fb6fa5
  event_widget = gtk_get_event_widget ((GdkEvent*) event);
Packit Service fb6fa5
Packit Service fb6fa5
  if ((event_widget == widget) &&
Packit Service fb6fa5
      (event->detail != GDK_NOTIFY_INFERIOR) &&
Packit Service fb6fa5
      (gtk_widget_get_sensitive (event_widget)))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->in_button = FALSE;
Packit Service fb6fa5
      gtk_button_leave (button);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_real_button_pressed (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (button->activate_timeout)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  
Packit Service fb6fa5
  button->button_down = TRUE;
Packit Service fb6fa5
  gtk_button_update_state (button);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_real_button_released (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (button->button_down)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->button_down = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
      if (button->activate_timeout)
Packit Service fb6fa5
	return;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (button->in_button)
Packit Service fb6fa5
	gtk_button_clicked (button);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_button_update_state (button);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void 
Packit Service fb6fa5
gtk_real_button_clicked (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->action)
Packit Service fb6fa5
    gtk_action_activate (priv->action);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
button_activate_timeout (gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_button_finish_activate (data, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_real_button_activate (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *widget = GTK_WIDGET (button);
Packit Service fb6fa5
  GtkButtonPrivate *priv;
Packit Service fb6fa5
  guint32 time;
Packit Service fb6fa5
Packit Service fb6fa5
  priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_widget_get_realized (widget) && !button->activate_timeout)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      time = gtk_get_current_event_time ();
Packit Service fb6fa5
      if (gdk_keyboard_grab (button->event_window, TRUE, time) == 
Packit Service fb6fa5
	  GDK_GRAB_SUCCESS)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  priv->has_grab = TRUE;
Packit Service fb6fa5
	  priv->grab_time = time;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_grab_add (widget);
Packit Service fb6fa5
      
Packit Service fb6fa5
      button->activate_timeout = gdk_threads_add_timeout (ACTIVATE_TIMEOUT,
Packit Service fb6fa5
						button_activate_timeout,
Packit Service fb6fa5
						button);
Packit Service fb6fa5
      button->button_down = TRUE;
Packit Service fb6fa5
      gtk_button_update_state (button);
Packit Service fb6fa5
      gtk_widget_queue_draw (GTK_WIDGET (button));
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_finish_activate (GtkButton *button,
Packit Service fb6fa5
			    gboolean   do_it)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *widget = GTK_WIDGET (button);
Packit Service fb6fa5
  GtkButtonPrivate *priv;
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  g_source_remove (button->activate_timeout);
Packit Service fb6fa5
  button->activate_timeout = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->has_grab)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gdk_display_keyboard_ungrab (gtk_widget_get_display (widget),
Packit Service fb6fa5
				   priv->grab_time);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  gtk_grab_remove (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  button->button_down = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_button_update_state (button);
Packit Service fb6fa5
  gtk_widget_queue_draw (GTK_WIDGET (button));
Packit Service fb6fa5
Packit Service fb6fa5
  if (do_it)
Packit Service fb6fa5
    gtk_button_clicked (button);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_set_label:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @label: a string
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the text of the label of the button to @str. This text is
Packit Service fb6fa5
 * also used to select the stock item if gtk_button_set_use_stock()
Packit Service fb6fa5
 * is used.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This will also clear any previously set labels.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_set_label (GtkButton   *button,
Packit Service fb6fa5
		      const gchar *label)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gchar *new_label;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  new_label = g_strdup (label);
Packit Service fb6fa5
  g_free (button->label_text);
Packit Service fb6fa5
  button->label_text = new_label;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_button_construct_child (button);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_notify (G_OBJECT (button), "label");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_get_label:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Fetches the text from the label of the button, as set by
Packit Service fb6fa5
 * gtk_button_set_label(). If the label text has not 
Packit Service fb6fa5
 * been set the return value will be %NULL. This will be the 
Packit Service fb6fa5
 * case if you create an empty button with gtk_button_new() to 
Packit Service fb6fa5
 * use as a container.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: The text of the label widget. This string is owned
Packit Service fb6fa5
 * by the widget and must not be modified or freed.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
const gchar *
Packit Service fb6fa5
gtk_button_get_label (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON (button), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return button->label_text;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_set_use_underline:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @use_underline: %TRUE if underlines in the text indicate mnemonics
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If true, an underline in the text of the button label indicates
Packit Service fb6fa5
 * the next character should be used for the mnemonic accelerator key.
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_set_use_underline (GtkButton *button,
Packit Service fb6fa5
			      gboolean   use_underline)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  use_underline = use_underline != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (use_underline != button->use_underline)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->use_underline = use_underline;
Packit Service fb6fa5
  
Packit Service fb6fa5
      gtk_button_construct_child (button);
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_object_notify (G_OBJECT (button), "use-underline");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_get_use_underline:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns whether an embedded underline in the button label indicates a
Packit Service fb6fa5
 * mnemonic. See gtk_button_set_use_underline ().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: %TRUE if an embedded underline in the button label
Packit Service fb6fa5
 *               indicates the mnemonic accelerator keys.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_button_get_use_underline (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON (button), FALSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return button->use_underline;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_set_use_stock:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @use_stock: %TRUE if the button should use a stock item
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If %TRUE, the label set on the button is used as a
Packit Service fb6fa5
 * stock id to select the stock item for the button.
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_set_use_stock (GtkButton *button,
Packit Service fb6fa5
			  gboolean   use_stock)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
Packit Service fb6fa5
  use_stock = use_stock != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (use_stock != button->use_stock)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->use_stock = use_stock;
Packit Service fb6fa5
  
Packit Service fb6fa5
      gtk_button_construct_child (button);
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_object_notify (G_OBJECT (button), "use-stock");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_get_use_stock:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns whether the button label is a stock item.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: %TRUE if the button label is used to
Packit Service fb6fa5
 *               select a stock item instead of being
Packit Service fb6fa5
 *               used directly as the label text.
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_button_get_use_stock (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON (button), FALSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return button->use_stock;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_set_focus_on_click:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @focus_on_click: whether the button grabs focus when clicked with the mouse
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sets whether the button will grab focus when it is clicked with the mouse.
Packit Service fb6fa5
 * Making mouse clicks not grab focus is useful in places like toolbars where
Packit Service fb6fa5
 * you don't want the keyboard focus removed from the main area of the
Packit Service fb6fa5
 * application.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.4
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_set_focus_on_click (GtkButton *button,
Packit Service fb6fa5
			       gboolean   focus_on_click)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
  
Packit Service fb6fa5
  focus_on_click = focus_on_click != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->focus_on_click != focus_on_click)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->focus_on_click = focus_on_click;
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_object_notify (G_OBJECT (button), "focus-on-click");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_get_focus_on_click:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns whether the button grabs focus when it is clicked with the mouse.
Packit Service fb6fa5
 * See gtk_button_set_focus_on_click().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: %TRUE if the button grabs focus when it is clicked with
Packit Service fb6fa5
 *               the mouse.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.4
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_button_get_focus_on_click (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON (button), FALSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return button->focus_on_click;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_set_alignment:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @xalign: the horizontal position of the child, 0.0 is left aligned, 
Packit Service fb6fa5
 *   1.0 is right aligned
Packit Service fb6fa5
 * @yalign: the vertical position of the child, 0.0 is top aligned, 
Packit Service fb6fa5
 *   1.0 is bottom aligned
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the alignment of the child. This property has no effect unless 
Packit Service fb6fa5
 * the child is a #GtkMisc or a #GtkAligment.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.4
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_set_alignment (GtkButton *button,
Packit Service fb6fa5
			  gfloat     xalign,
Packit Service fb6fa5
			  gfloat     yalign)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->xalign = xalign;
Packit Service fb6fa5
  priv->yalign = yalign;
Packit Service fb6fa5
  priv->align_set = 1;
Packit Service fb6fa5
Packit Service fb6fa5
  maybe_set_alignment (button, GTK_BIN (button)->child);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_freeze_notify (G_OBJECT (button));
Packit Service fb6fa5
  g_object_notify (G_OBJECT (button), "xalign");
Packit Service fb6fa5
  g_object_notify (G_OBJECT (button), "yalign");
Packit Service fb6fa5
  g_object_thaw_notify (G_OBJECT (button));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_get_alignment:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @xalign: (out): return location for horizontal alignment
Packit Service fb6fa5
 * @yalign: (out): return location for vertical alignment
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the alignment of the child in the button.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.4
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_get_alignment (GtkButton *button,
Packit Service fb6fa5
			  gfloat    *xalign,
Packit Service fb6fa5
			  gfloat    *yalign)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
 
Packit Service fb6fa5
  if (xalign) 
Packit Service fb6fa5
    *xalign = priv->xalign;
Packit Service fb6fa5
Packit Service fb6fa5
  if (yalign)
Packit Service fb6fa5
    *yalign = priv->yalign;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gtk_button_set_depressed:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @depressed: %TRUE if the button should be drawn with a recessed shadow.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sets whether the button is currently drawn as down or not. This is 
Packit Service fb6fa5
 * purely a visual setting, and is meant only for use by derived widgets
Packit Service fb6fa5
 * such as #GtkToggleButton.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_button_set_depressed (GtkButton *button,
Packit Service fb6fa5
			   gboolean   depressed)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *widget = GTK_WIDGET (button);
Packit Service fb6fa5
Packit Service fb6fa5
  depressed = depressed != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (depressed != button->depressed)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->depressed = depressed;
Packit Service fb6fa5
      gtk_widget_queue_resize (widget);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_update_state (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean depressed, touchscreen;
Packit Service fb6fa5
  GtkStateType new_state;
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_get (gtk_widget_get_settings (GTK_WIDGET (button)),
Packit Service fb6fa5
                "gtk-touchscreen-mode", &touchscreen,
Packit Service fb6fa5
                NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (button->activate_timeout)
Packit Service fb6fa5
    depressed = button->depress_on_activate;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    depressed = button->in_button && button->button_down;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!touchscreen && button->in_button && (!button->button_down || !depressed))
Packit Service fb6fa5
    new_state = GTK_STATE_PRELIGHT;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    new_state = depressed ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL;
Packit Service fb6fa5
Packit Service fb6fa5
  _gtk_button_set_depressed (button, depressed); 
Packit Service fb6fa5
  gtk_widget_set_state (GTK_WIDGET (button), new_state);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void 
Packit Service fb6fa5
show_image_change_notify (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->image) 
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (show_image (button))
Packit Service fb6fa5
	gtk_widget_show (priv->image);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	gtk_widget_hide (priv->image);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
traverse_container (GtkWidget *widget,
Packit Service fb6fa5
		    gpointer   data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (GTK_IS_BUTTON (widget))
Packit Service fb6fa5
    show_image_change_notify (GTK_BUTTON (widget));
Packit Service fb6fa5
  else if (GTK_IS_CONTAINER (widget))
Packit Service fb6fa5
    gtk_container_forall (GTK_CONTAINER (widget), traverse_container, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_setting_changed (GtkSettings *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *list, *l;
Packit Service fb6fa5
Packit Service fb6fa5
  list = gtk_window_list_toplevels ();
Packit Service fb6fa5
Packit Service fb6fa5
  for (l = list; l; l = l->next)
Packit Service fb6fa5
    gtk_container_forall (GTK_CONTAINER (l->data), 
Packit Service fb6fa5
			  traverse_container, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_list_free (list);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_screen_changed (GtkWidget *widget,
Packit Service fb6fa5
			   GdkScreen *previous_screen)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button;
Packit Service fb6fa5
  GtkSettings *settings;
Packit Service fb6fa5
  guint show_image_connection;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_widget_has_screen (widget))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  button = GTK_BUTTON (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  /* If the button is being pressed while the screen changes the
Packit Service fb6fa5
    release might never occur, so we reset the state. */
Packit Service fb6fa5
  if (button->button_down)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->button_down = FALSE;
Packit Service fb6fa5
      gtk_button_update_state (button);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  settings = gtk_widget_get_settings (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  show_image_connection = 
Packit Service fb6fa5
    GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (settings), 
Packit Service fb6fa5
					 "gtk-button-connection"));
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (show_image_connection)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  show_image_connection =
Packit Service fb6fa5
    g_signal_connect (settings, "notify::gtk-button-images",
Packit Service fb6fa5
		      G_CALLBACK (gtk_button_setting_changed), NULL);
Packit Service fb6fa5
  g_object_set_data (G_OBJECT (settings), 
Packit Service fb6fa5
		     I_("gtk-button-connection"),
Packit Service fb6fa5
		     GUINT_TO_POINTER (show_image_connection));
Packit Service fb6fa5
Packit Service fb6fa5
  show_image_change_notify (button);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_state_changed (GtkWidget    *widget,
Packit Service fb6fa5
                          GtkStateType  previous_state)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_widget_is_sensitive (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      button->in_button = FALSE;
Packit Service fb6fa5
      gtk_real_button_released (button);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_grab_notify (GtkWidget *widget,
Packit Service fb6fa5
			gboolean   was_grabbed)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButton *button = GTK_BUTTON (widget);
Packit Service fb6fa5
  gboolean save_in;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!was_grabbed)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      save_in = button->in_button;
Packit Service fb6fa5
      button->in_button = FALSE; 
Packit Service fb6fa5
      gtk_real_button_released (button);
Packit Service fb6fa5
      if (save_in != button->in_button)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          button->in_button = save_in;
Packit Service fb6fa5
          gtk_button_update_state (button);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_set_image:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @image: a widget to set as the image for the button
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Set the image of @button to the given widget. Note that
Packit Service fb6fa5
 * it depends on the #GtkSettings:gtk-button-images setting whether the
Packit Service fb6fa5
 * image will be displayed or not, you don't have to call
Packit Service fb6fa5
 * gtk_widget_show() on @image yourself.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.6
Packit Service fb6fa5
 */ 
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_set_image (GtkButton *button,
Packit Service fb6fa5
		      GtkWidget *image)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
  g_return_if_fail (image == NULL || GTK_IS_WIDGET (image));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->image && priv->image->parent)
Packit Service fb6fa5
    gtk_container_remove (GTK_CONTAINER (priv->image->parent), priv->image);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->image = image;
Packit Service fb6fa5
  priv->image_is_stock = (image == NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_button_construct_child (button);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_notify (G_OBJECT (button), "image");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_get_image:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the widget that is currenty set as the image of @button.
Packit Service fb6fa5
 * This may have been explicitly set by gtk_button_set_image()
Packit Service fb6fa5
 * or constructed by gtk_button_new_from_stock().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): a #GtkWidget or %NULL in case there is no image
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.6
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_button_get_image (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON (button), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return priv->image;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_set_image_position:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 * @position: the position
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the position of the image relative to the text 
Packit Service fb6fa5
 * inside the button.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */ 
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_set_image_position (GtkButton       *button,
Packit Service fb6fa5
			       GtkPositionType  position)
Packit Service fb6fa5
{
Packit Service fb6fa5
Packit Service fb6fa5
  GtkButtonPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit Service fb6fa5
  g_return_if_fail (position >= GTK_POS_LEFT && position <= GTK_POS_BOTTOM);
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->image_position != position)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->image_position = position;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_button_construct_child (button);
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_notify (G_OBJECT (button), "image-position");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_get_image_position:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the position of the image relative to the text 
Packit Service fb6fa5
 * inside the button.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: the position
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkPositionType
Packit Service fb6fa5
gtk_button_get_image_position (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON (button), GTK_POS_LEFT);
Packit Service fb6fa5
Packit Service fb6fa5
  priv = GTK_BUTTON_GET_PRIVATE (button);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return priv->image_position;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_get_event_window:
Packit Service fb6fa5
 * @button: a #GtkButton
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns the button's event window if it is realized, %NULL otherwise.
Packit Service fb6fa5
 * This function should be rarely needed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): @button's event window.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.22
Packit Service fb6fa5
 */
Packit Service fb6fa5
GdkWindow*
Packit Service fb6fa5
gtk_button_get_event_window (GtkButton *button)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON (button), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return button->event_window;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GTK_BUTTON_C__
Packit Service fb6fa5
#include "gtkaliasdef.c"