* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
-#include <config.h>
+#include "config.h"
#include <stdlib.h>
-#include "gtkalias.h"
#include "gtkhandlebox.h"
#include "gtkinvisible.h"
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkwindow.h"
+#include "gtkprivate.h"
#include "gtkintl.h"
+#include "gtkalias.h"
typedef struct _GtkHandleBoxPrivate GtkHandleBoxPrivate;
PROP_SHADOW_TYPE,
PROP_HANDLE_POSITION,
PROP_SNAP_EDGE,
- PROP_SNAP_EDGE_SET
+ PROP_SNAP_EDGE_SET,
+ PROP_CHILD_DETACHED
};
#define DRAG_HANDLE_SIZE 10
* <--------bin_window-------------------->
*/
-static void gtk_handle_box_class_init (GtkHandleBoxClass *klass);
-static void gtk_handle_box_init (GtkHandleBox *handle_box);
-static void gtk_handle_box_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gtk_handle_box_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-static void gtk_handle_box_destroy (GtkObject *object);
-static void gtk_handle_box_map (GtkWidget *widget);
-static void gtk_handle_box_unmap (GtkWidget *widget);
-static void gtk_handle_box_realize (GtkWidget *widget);
-static void gtk_handle_box_unrealize (GtkWidget *widget);
-static void gtk_handle_box_style_set (GtkWidget *widget,
- GtkStyle *previous_style);
-static void gtk_handle_box_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void gtk_handle_box_size_allocate (GtkWidget *widget,
- GtkAllocation *real_allocation);
-static void gtk_handle_box_add (GtkContainer *container,
- GtkWidget *widget);
-static void gtk_handle_box_remove (GtkContainer *container,
- GtkWidget *widget);
-static void gtk_handle_box_draw_ghost (GtkHandleBox *hb);
-static void gtk_handle_box_paint (GtkWidget *widget,
- GdkEventExpose *event,
- GdkRectangle *area);
-static gint gtk_handle_box_expose (GtkWidget *widget,
- GdkEventExpose *event);
-static gint gtk_handle_box_button_changed (GtkWidget *widget,
- GdkEventButton *event);
-static gint gtk_handle_box_motion (GtkWidget *widget,
- GdkEventMotion *event);
-static gint gtk_handle_box_delete_event (GtkWidget *widget,
- GdkEventAny *event);
-static void gtk_handle_box_reattach (GtkHandleBox *hb);
-static void gtk_handle_box_end_drag (GtkHandleBox *hb,
- guint32 time);
-
-
-static GtkBinClass *parent_class;
-static guint handle_box_signals[SIGNAL_LAST] = { 0 };
-
-
-GType
-gtk_handle_box_get_type (void)
-{
- static GType handle_box_type = 0;
-
- if (!handle_box_type)
- {
- static const GTypeInfo handle_box_info =
- {
- sizeof (GtkHandleBoxClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) gtk_handle_box_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkHandleBox),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gtk_handle_box_init,
- };
-
- handle_box_type = g_type_register_static (GTK_TYPE_BIN, "GtkHandleBox",
- &handle_box_info, 0);
- }
-
- return handle_box_type;
-}
+static void gtk_handle_box_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gtk_handle_box_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void gtk_handle_box_map (GtkWidget *widget);
+static void gtk_handle_box_unmap (GtkWidget *widget);
+static void gtk_handle_box_realize (GtkWidget *widget);
+static void gtk_handle_box_unrealize (GtkWidget *widget);
+static void gtk_handle_box_style_set (GtkWidget *widget,
+ GtkStyle *previous_style);
+static void gtk_handle_box_size_request (GtkWidget *widget,
+ GtkRequisition *requisition);
+static void gtk_handle_box_size_allocate (GtkWidget *widget,
+ GtkAllocation *real_allocation);
+static void gtk_handle_box_add (GtkContainer *container,
+ GtkWidget *widget);
+static void gtk_handle_box_remove (GtkContainer *container,
+ GtkWidget *widget);
+static void gtk_handle_box_draw_ghost (GtkHandleBox *hb);
+static void gtk_handle_box_paint (GtkWidget *widget,
+ GdkEventExpose *event,
+ GdkRectangle *area);
+static gboolean gtk_handle_box_expose (GtkWidget *widget,
+ GdkEventExpose *event);
+static gboolean gtk_handle_box_button_press (GtkWidget *widget,
+ GdkEventButton *event);
+static gboolean gtk_handle_box_motion (GtkWidget *widget,
+ GdkEventMotion *event);
+static gboolean gtk_handle_box_delete_event (GtkWidget *widget,
+ GdkEventAny *event);
+static void gtk_handle_box_reattach (GtkHandleBox *hb);
+static void gtk_handle_box_end_drag (GtkHandleBox *hb,
+ guint32 time);
+
+static guint handle_box_signals[SIGNAL_LAST] = { 0 };
+
+G_DEFINE_TYPE (GtkHandleBox, gtk_handle_box, GTK_TYPE_BIN)
static void
gtk_handle_box_class_init (GtkHandleBoxClass *class)
{
GObjectClass *gobject_class;
- GtkObjectClass *object_class;
GtkWidgetClass *widget_class;
GtkContainerClass *container_class;
gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
widget_class = (GtkWidgetClass *) class;
container_class = (GtkContainerClass *) class;
- parent_class = g_type_class_peek_parent (class);
-
gobject_class->set_property = gtk_handle_box_set_property;
gobject_class->get_property = gtk_handle_box_get_property;
g_param_spec_enum ("shadow", NULL,
P_("Deprecated property, use shadow_type instead"),
GTK_TYPE_SHADOW_TYPE,
- GTK_SHADOW_ETCHED_OUT,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_SHADOW_OUT,
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_SHADOW_TYPE,
- g_param_spec_enum ("shadow_type",
+ g_param_spec_enum ("shadow-type",
P_("Shadow type"),
P_("Appearance of the shadow that surrounds the container"),
GTK_TYPE_SHADOW_TYPE,
- GTK_SHADOW_ETCHED_OUT,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_SHADOW_OUT,
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_HANDLE_POSITION,
- g_param_spec_enum ("handle_position",
+ g_param_spec_enum ("handle-position",
P_("Handle position"),
P_("Position of the handle relative to the child widget"),
GTK_TYPE_POSITION_TYPE,
GTK_POS_LEFT,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_SNAP_EDGE,
- g_param_spec_enum ("snap_edge",
+ g_param_spec_enum ("snap-edge",
P_("Snap edge"),
P_("Side of the handlebox that's lined up with the docking point to dock the handlebox"),
GTK_TYPE_POSITION_TYPE,
GTK_POS_TOP,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_SNAP_EDGE_SET,
- g_param_spec_boolean ("snap_edge_set",
+ g_param_spec_boolean ("snap-edge-set",
P_("Snap edge set"),
P_("Whether to use the value from the snap_edge property or a value derived from handle_position"),
FALSE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
- object_class->destroy = gtk_handle_box_destroy;
+ g_object_class_install_property (gobject_class,
+ PROP_CHILD_DETACHED,
+ g_param_spec_boolean ("child-detached",
+ P_("Child Detached"),
+ P_("A boolean value indicating whether the handlebox's child is attached or detached."),
+ FALSE,
+ GTK_PARAM_READABLE));
widget_class->map = gtk_handle_box_map;
widget_class->unmap = gtk_handle_box_unmap;
widget_class->size_request = gtk_handle_box_size_request;
widget_class->size_allocate = gtk_handle_box_size_allocate;
widget_class->expose_event = gtk_handle_box_expose;
- widget_class->button_press_event = gtk_handle_box_button_changed;
+ widget_class->button_press_event = gtk_handle_box_button_press;
widget_class->delete_event = gtk_handle_box_delete_event;
container_class->add = gtk_handle_box_add;
class->child_detached = NULL;
handle_box_signals[SIGNAL_CHILD_ATTACHED] =
- g_signal_new ("child_attached",
+ g_signal_new (I_("child-attached"),
G_OBJECT_CLASS_TYPE (gobject_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GtkHandleBoxClass, child_attached),
G_TYPE_NONE, 1,
GTK_TYPE_WIDGET);
handle_box_signals[SIGNAL_CHILD_DETACHED] =
- g_signal_new ("child_detached",
+ g_signal_new (I_("child-detached"),
G_OBJECT_CLASS_TYPE (gobject_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GtkHandleBoxClass, child_detached),
_gtk_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
GTK_TYPE_WIDGET);
+
+ g_type_class_add_private (gobject_class, sizeof (GtkHandleBoxPrivate));
}
static GtkHandleBoxPrivate *
gtk_handle_box_get_private (GtkHandleBox *hb)
{
- GtkHandleBoxPrivate *private;
- static GQuark private_quark = 0;
-
- if (!private_quark)
- private_quark = g_quark_from_static_string ("gtk-handle-box-private");
-
- private = g_object_get_qdata (G_OBJECT (hb), private_quark);
-
- if (!private)
- {
- private = g_new0 (GtkHandleBoxPrivate, 1);
- g_object_set_qdata_full (G_OBJECT (hb), private_quark,
- private, g_free);
- }
-
- return private;
+ return G_TYPE_INSTANCE_GET_PRIVATE (hb, GTK_TYPE_HANDLE_BOX, GtkHandleBoxPrivate);
}
static void
case PROP_SNAP_EDGE_SET:
g_value_set_boolean (value, handle_box->snap_edge != -1);
break;
+ case PROP_CHILD_DETACHED:
+ g_value_set_boolean (value, handle_box->child_detached);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
return g_object_new (GTK_TYPE_HANDLE_BOX, NULL);
}
-static void
-gtk_handle_box_destroy (GtkObject *object)
-{
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
static void
gtk_handle_box_map (GtkWidget *widget)
{
hb = GTK_HANDLE_BOX (widget);
if (bin->child &&
- GTK_WIDGET_VISIBLE (bin->child) &&
- !GTK_WIDGET_MAPPED (bin->child))
+ gtk_widget_get_visible (bin->child) &&
+ !gtk_widget_get_mapped (bin->child))
gtk_widget_map (bin->child);
if (hb->child_detached && !hb->float_window_mapped)
GDK_LEAVE_NOTIFY_MASK |
GDK_FOCUS_CHANGE_MASK |
GDK_STRUCTURE_MASK);
- attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+ attributes.type_hint = GDK_WINDOW_TYPE_HINT_TOOLBAR;
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_TYPE_HINT;
hb->float_window = gdk_window_new (gtk_widget_get_root_window (widget),
&attributes, attributes_mask);
gdk_window_set_user_data (hb->float_window, widget);
gdk_window_destroy (hb->float_window);
hb->float_window = NULL;
- if (GTK_WIDGET_CLASS (parent_class)->unrealize)
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+ GTK_WIDGET_CLASS (gtk_handle_box_parent_class)->unrealize (widget);
}
static void
GtkHandleBox *hb = GTK_HANDLE_BOX (widget);
if (GTK_WIDGET_REALIZED (widget) &&
- !GTK_WIDGET_NO_WINDOW (widget))
+ gtk_widget_get_has_window (widget))
{
gtk_style_set_background (widget->style, widget->window,
widget->state);
}
/* if our child is not visible, we still request its size, since we
- * won't have any usefull hint for our size otherwise.
+ * won't have any useful hint for our size otherwise.
*/
if (bin->child)
gtk_widget_size_request (bin->child, &child_requisition);
widget->allocation.height);
- if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
+ if (bin->child && gtk_widget_get_visible (bin->child))
{
- GtkWidget *child;
GtkAllocation child_allocation;
guint border_width;
- child = bin->child;
border_width = GTK_CONTAINER (widget)->border_width;
child_allocation.x = border_width;
static void
draw_textured_frame (GtkWidget *widget, GdkWindow *window, GdkRectangle *rect, GtkShadowType shadow,
- GdkRectangle *clip)
+ GdkRectangle *clip, GtkOrientation orientation)
{
gtk_paint_handle (widget->style, window, GTK_STATE_NORMAL, shadow,
clip, widget, "handlebox",
rect->x, rect->y, rect->width, rect->height,
- GTK_ORIENTATION_VERTICAL);
+ orientation);
}
void
if ((GtkShadowType) handle_box->shadow_type != type)
{
handle_box->shadow_type = type;
- g_object_notify (G_OBJECT (handle_box), "shadow_type");
+ g_object_notify (G_OBJECT (handle_box), "shadow-type");
gtk_widget_queue_resize (GTK_WIDGET (handle_box));
}
}
if ((GtkPositionType) handle_box->handle_position != position)
{
handle_box->handle_position = position;
- g_object_notify (G_OBJECT (handle_box), "handle_position");
+ g_object_notify (G_OBJECT (handle_box), "handle-position");
gtk_widget_queue_resize (GTK_WIDGET (handle_box));
}
}
handle_box->snap_edge = edge;
g_object_freeze_notify (G_OBJECT (handle_box));
- g_object_notify (G_OBJECT (handle_box), "snap_edge");
- g_object_notify (G_OBJECT (handle_box), "snap_edge_set");
+ g_object_notify (G_OBJECT (handle_box), "snap-edge");
+ g_object_notify (G_OBJECT (handle_box), "snap-edge-set");
g_object_thaw_notify (G_OBJECT (handle_box));
}
}
return handle_box->snap_edge;
}
+/**
+ * gtk_handle_box_get_child_detached:
+ * @handle_box: a #GtkHandleBox
+ *
+ * Whether the handlebox's child is currently detached.
+ *
+ * Return value: %TRUE if the child is currently detached, otherwise %FALSE
+ *
+ * Since: 2.14
+ **/
+gboolean
+gtk_handle_box_get_child_detached (GtkHandleBox *handle_box)
+{
+ g_return_val_if_fail (GTK_IS_HANDLE_BOX (handle_box), FALSE);
+
+ return handle_box->child_detached;
+}
+
static void
gtk_handle_box_paint (GtkWidget *widget,
-
- GdkEventExpose *event,
+ GdkEventExpose *event,
GdkRectangle *area)
{
GtkBin *bin;
GtkHandleBox *hb;
- guint width;
- guint height;
+ gint width, height;
GdkRectangle rect;
GdkRectangle dest;
gint handle_position;
+ GtkOrientation handle_orientation;
bin = GTK_BIN (widget);
hb = GTK_HANDLE_BOX (widget);
rect.y = 0;
rect.width = DRAG_HANDLE_SIZE;
rect.height = height;
+ handle_orientation = GTK_ORIENTATION_VERTICAL;
break;
case GTK_POS_RIGHT:
rect.x = width - DRAG_HANDLE_SIZE;
rect.y = 0;
rect.width = DRAG_HANDLE_SIZE;
rect.height = height;
+ handle_orientation = GTK_ORIENTATION_VERTICAL;
break;
case GTK_POS_TOP:
rect.x = 0;
rect.y = 0;
rect.width = width;
rect.height = DRAG_HANDLE_SIZE;
+ handle_orientation = GTK_ORIENTATION_HORIZONTAL;
break;
case GTK_POS_BOTTOM:
rect.x = 0;
rect.y = height - DRAG_HANDLE_SIZE;
rect.width = width;
rect.height = DRAG_HANDLE_SIZE;
+ handle_orientation = GTK_ORIENTATION_HORIZONTAL;
+ break;
+ default:
+ g_assert_not_reached ();
break;
}
if (gdk_rectangle_intersect (event ? &event->area : area, &rect, &dest))
draw_textured_frame (widget, hb->bin_window, &rect,
GTK_SHADOW_OUT,
- event ? &event->area : area);
+ event ? &event->area : area,
+ handle_orientation);
- if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
- (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
+ if (bin->child && gtk_widget_get_visible (bin->child))
+ GTK_WIDGET_CLASS (gtk_handle_box_parent_class)->expose_event (widget, event);
}
-static gint
+static gboolean
gtk_handle_box_expose (GtkWidget *widget,
GdkEventExpose *event)
{
GtkHandleBox *hb;
- if (GTK_WIDGET_DRAWABLE (widget))
+ if (gtk_widget_is_drawable (widget))
{
hb = GTK_HANDLE_BOX (widget);
return FALSE;
}
-static gint
-gtk_handle_box_button_changed (GtkWidget *widget,
- GdkEventButton *event)
+static gboolean
+gtk_handle_box_button_press (GtkWidget *widget,
+ GdkEventButton *event)
{
GtkHandleBox *hb;
gboolean event_handled;
gint root_x, root_y;
gint width, height;
+ gtk_invisible_set_screen (GTK_INVISIBLE (invisible),
+ gtk_widget_get_screen (GTK_WIDGET (hb)));
gdk_window_get_deskrelative_origin (hb->bin_window, &desk_x, &desk_y);
gdk_window_get_origin (hb->bin_window, &root_x, &root_y);
gdk_drawable_get_size (hb->bin_window, &width, &height);
return event_handled;
}
-static gint
+static gboolean
gtk_handle_box_motion (GtkWidget *widget,
GdkEventMotion *event)
{
GtkWidget *widget)
{
gtk_widget_set_parent_window (widget, GTK_HANDLE_BOX (container)->bin_window);
- GTK_CONTAINER_CLASS (parent_class)->add (container, widget);
+ GTK_CONTAINER_CLASS (gtk_handle_box_parent_class)->add (container, widget);
}
static void
gtk_handle_box_remove (GtkContainer *container,
GtkWidget *widget)
{
- GTK_CONTAINER_CLASS (parent_class)->remove (container, widget);
+ GTK_CONTAINER_CLASS (gtk_handle_box_parent_class)->remove (container, widget);
gtk_handle_box_reattach (GTK_HANDLE_BOX (container));
}
g_signal_handlers_disconnect_by_func (invisible,
G_CALLBACK (gtk_handle_box_grab_event),
hb);
- }
+}
+
+#define __GTK_HANDLE_BOX_C__
+#include "gtkaliasdef.c"