- GTK_OBJECT_CLASS (gtk_statusbar_parent_class)->destroy (object);
-}
-
-static void
-gtk_statusbar_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (object);
-
- switch (prop_id)
- {
- case PROP_HAS_RESIZE_GRIP:
- gtk_statusbar_set_has_resize_grip (statusbar, g_value_get_boolean (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gtk_statusbar_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (object);
- GtkStatusbarPriv *priv = statusbar->priv;
-
- switch (prop_id)
- {
- case PROP_HAS_RESIZE_GRIP:
- g_value_set_boolean (value, priv->has_resize_grip);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static GdkWindowEdge
-get_grip_edge (GtkStatusbar *statusbar)
-{
- GtkWidget *widget = GTK_WIDGET (statusbar);
-
- if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
- return GDK_WINDOW_EDGE_SOUTH_EAST;
- else
- return GDK_WINDOW_EDGE_SOUTH_WEST;
-}
-
-static void
-get_grip_rect (GtkStatusbar *statusbar,
- GdkRectangle *rect)
-{
- GtkWidget *widget;
- gint w, h;
-
- widget = GTK_WIDGET (statusbar);
-
- /* These are in effect the max/default size of the grip. */
- w = 18;
- h = 18;
-
- if (w > widget->allocation.width)
- w = widget->allocation.width;
-
- if (h > widget->allocation.height - widget->style->ythickness)
- h = widget->allocation.height - widget->style->ythickness;
-
- rect->width = w;
- rect->height = h;
- rect->y = widget->allocation.y + widget->allocation.height - h;
-
- if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
- rect->x = widget->allocation.x + widget->allocation.width - w;
- else
- rect->x = widget->allocation.x + widget->style->xthickness;
-}
-
-static void
-set_grip_cursor (GtkStatusbar *statusbar)
-{
- GtkStatusbarPriv *priv = statusbar->priv;
-
- if (priv->has_resize_grip && priv->grip_window != NULL)
- {
- GtkWidget *widget = GTK_WIDGET (statusbar);
- GdkDisplay *display = gtk_widget_get_display (widget);
- GdkCursorType cursor_type;
- GdkCursor *cursor;
-
- if (gtk_widget_is_sensitive (widget))
- {
- if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
- cursor_type = GDK_BOTTOM_RIGHT_CORNER;
- else
- cursor_type = GDK_BOTTOM_LEFT_CORNER;
-
- cursor = gdk_cursor_new_for_display (display, cursor_type);
- gdk_window_set_cursor (priv->grip_window, cursor);
- gdk_cursor_unref (cursor);
- }
- else
- gdk_window_set_cursor (priv->grip_window, NULL);
- }
-}
-
-static void
-gtk_statusbar_create_window (GtkStatusbar *statusbar)
-{
- GtkWidget *widget;
- GtkStatusbarPriv *priv = statusbar->priv;
- GdkWindowAttr attributes;
- gint attributes_mask;
- GdkRectangle rect;
-
- widget = GTK_WIDGET (statusbar);
-
- g_return_if_fail (gtk_widget_get_realized (widget));
- g_return_if_fail (priv->has_resize_grip);
-
- get_grip_rect (statusbar, &rect);
-
- attributes.x = rect.x;
- attributes.y = rect.y;
- attributes.width = rect.width;
- attributes.height = rect.height;
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.wclass = GDK_INPUT_ONLY;
- attributes.event_mask = gtk_widget_get_events (widget) |
- GDK_BUTTON_PRESS_MASK;
-
- attributes_mask = GDK_WA_X | GDK_WA_Y;
-
- priv->grip_window = gdk_window_new (widget->window,
- &attributes, attributes_mask);
-
- gdk_window_set_user_data (priv->grip_window, widget);
-
- gdk_window_raise (priv->grip_window);
-
- set_grip_cursor (statusbar);
-}
-
-static void
-gtk_statusbar_direction_changed (GtkWidget *widget,
- GtkTextDirection prev_dir)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
-
- set_grip_cursor (statusbar);
-}
-
-static void
-gtk_statusbar_state_changed (GtkWidget *widget,
- GtkStateType previous_state)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
-
- set_grip_cursor (statusbar);
-}
-
-static void
-gtk_statusbar_destroy_window (GtkStatusbar *statusbar)
-{
- GtkStatusbarPriv *priv = statusbar->priv;
-
- gdk_window_set_user_data (priv->grip_window, NULL);
- gdk_window_destroy (priv->grip_window);
- priv->grip_window = NULL;
-}
-
-static void
-gtk_statusbar_realize (GtkWidget *widget)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
- GtkStatusbarPriv *priv = statusbar->priv;
-
- GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->realize (widget);
-
- if (priv->has_resize_grip)
- gtk_statusbar_create_window (statusbar);
-}
-
-static void
-gtk_statusbar_unrealize (GtkWidget *widget)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
- GtkStatusbarPriv *priv = statusbar->priv;
-
- if (priv->grip_window)
- gtk_statusbar_destroy_window (statusbar);
-
- GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->unrealize (widget);
-}
-
-static void
-gtk_statusbar_map (GtkWidget *widget)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
- GtkStatusbarPriv *priv = statusbar->priv;
-
- GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->map (widget);
-
- if (priv->grip_window)
- gdk_window_show (priv->grip_window);
-}
-
-static void
-gtk_statusbar_unmap (GtkWidget *widget)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
- GtkStatusbarPriv *priv = statusbar->priv;
-
- if (priv->grip_window)
- gdk_window_hide (priv->grip_window);
-
- GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->unmap (widget);
-}
-
-static gboolean
-gtk_statusbar_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
- GtkStatusbarPriv *priv = statusbar->priv;
- GtkWidget *ancestor;
- GdkWindowEdge edge;
-
- if (!priv->has_resize_grip ||
- event->type != GDK_BUTTON_PRESS ||
- event->window != priv->grip_window)
- return FALSE;
-
- ancestor = gtk_widget_get_toplevel (widget);
-
- if (!GTK_IS_WINDOW (ancestor))
- return FALSE;
-
- edge = get_grip_edge (statusbar);
-
- if (event->button == 1)
- gtk_window_begin_resize_drag (GTK_WINDOW (ancestor),
- edge,
- event->button,
- event->x_root, event->y_root,
- event->time);
- else if (event->button == 2)
- gtk_window_begin_move_drag (GTK_WINDOW (ancestor),
- event->button,
- event->x_root, event->y_root,
- event->time);
- else
- return FALSE;
-
- return TRUE;
-}
-
-static gboolean
-gtk_statusbar_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
- GtkStatusbarPriv *priv = statusbar->priv;
- GdkRectangle rect;
-
- GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->expose_event (widget, event);
-
- if (priv->has_resize_grip)
- {
- GdkWindowEdge edge;
-
- edge = get_grip_edge (statusbar);
-
- get_grip_rect (statusbar, &rect);
-
- gtk_paint_resize_grip (widget->style,
- widget->window,
- gtk_widget_get_state (widget),
- &event->area,
- widget,
- "statusbar",
- edge,
- rect.x, rect.y,
- /* don't draw grip over the frame, though you
- * can click on the frame.
- */
- rect.width - widget->style->xthickness,
- rect.height - widget->style->ythickness);
- }
-
- return FALSE;
-}
-
-static void
-gtk_statusbar_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- GtkStatusbar *statusbar = GTK_STATUSBAR (widget);
- GtkStatusbarPriv *priv = statusbar->priv;
- GtkShadowType shadow_type;
-
- gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), shadow_type);
-
- GTK_WIDGET_CLASS (gtk_statusbar_parent_class)->size_request (widget, requisition);