summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2013-04-21 18:21:37 -0400
committerFederico Mena Quintero <federico@gnome.org>2013-04-21 18:21:37 -0400
commit57c4bcb369891c9035644ec4c84f30ebc241cc9f (patch)
treecdee6a0a483e41f84fdc077d0738242c306ac9d4
parent9b91e06513ce731a16c14dedd6b310677b1dedde (diff)
parent44ba055d03762ca67c8343f147c31cea50c00a0d (diff)
downloadgtk+-57c4bcb369891c9035644ec4c84f30ebc241cc9f.tar.gz
Merge branch 'master' into places-sidebar
-rw-r--r--gtk/gtkapplicationwindow.c7
-rw-r--r--gtk/gtkwindow.c676
-rw-r--r--gtk/gtkwindowprivate.h1
3 files changed, 274 insertions, 410 deletions
diff --git a/gtk/gtkapplicationwindow.c b/gtk/gtkapplicationwindow.c
index 532c1d4717..541baf6a03 100644
--- a/gtk/gtkapplicationwindow.c
+++ b/gtk/gtkapplicationwindow.c
@@ -258,9 +258,6 @@ gtk_application_window_update_menubar (GtkApplicationWindow *window)
window->priv->menubar = gtk_menu_bar_new_from_model (G_MENU_MODEL (combined));
gtk_widget_set_parent (window->priv->menubar, GTK_WIDGET (window));
- if (_gtk_window_get_content_window (GTK_WINDOW (window)) != NULL)
- gtk_widget_set_parent_window (window->priv->menubar,
- _gtk_window_get_content_window (GTK_WINDOW (window)));
gtk_widget_show_all (window->priv->menubar);
g_object_unref (combined);
@@ -763,10 +760,6 @@ gtk_application_window_real_realize (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_application_window_parent_class)
->realize (widget);
- if (window->priv->menubar != NULL)
- gtk_widget_set_parent_window (window->priv->menubar,
- _gtk_window_get_content_window (GTK_WINDOW (window)));
-
#ifdef GDK_WINDOWING_X11
{
GdkWindow *gdkwindow;
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index e10d536277..48972d9436 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -148,9 +148,7 @@ struct _GtkWindowPrivate
GtkWidget *title_close_button;
GtkWidget *popup_menu;
- GdkCursor *default_cursor;
-
- GdkWindow *content_window;
+ GdkWindow *border_window[8];
/* The following flags are initially TRUE (before a window is mapped).
* They cause us to compute a configure request that involves
@@ -372,12 +370,6 @@ static gint gtk_window_key_release_event (GtkWidget *widget,
GdkEventKey *event);
static gint gtk_window_button_press_event (GtkWidget *widget,
GdkEventButton *event);
-static gint gtk_window_enter_notify_event (GtkWidget *widget,
- GdkEventCrossing *event);
-static gint gtk_window_leave_notify_event (GtkWidget *widget,
- GdkEventCrossing *event);
-static gint gtk_window_motion_notify_event (GtkWidget *widget,
- GdkEventMotion *event);
static gint gtk_window_focus_in_event (GtkWidget *widget,
GdkEventFocus *event);
static gint gtk_window_focus_out_event (GtkWidget *widget,
@@ -390,8 +382,6 @@ static void gtk_window_forall (GtkContainer *container,
gboolean include_internals,
GtkCallback callback,
gpointer callback_data);
-static void gtk_window_add (GtkContainer *container,
- GtkWidget *child);
static gint gtk_window_focus (GtkWidget *widget,
GtkDirectionType direction);
static void gtk_window_move_focus (GtkWidget *widget,
@@ -461,7 +451,6 @@ static void resize_grip_create_window (GtkWindow *window);
static void resize_grip_destroy_window (GtkWindow *window);
static void update_grip_visibility (GtkWindow *window);
static void update_window_buttons (GtkWindow *window);
-static void update_cursor_at_position (GtkWidget *widget, gint x, gint y);
static void gtk_window_notify_keys_changed (GtkWindow *window);
static GtkKeyHash *gtk_window_get_key_hash (GtkWindow *window);
@@ -475,9 +464,6 @@ static void gtk_window_on_theme_variant_changed (GtkSettings *settings,
#endif
static void gtk_window_set_theme_variant (GtkWindow *window);
-static void window_cursor_changed (GdkWindow *window,
- GParamSpec *pspec,
- GtkWidget *widget);
static gboolean gtk_window_popup_menu (GtkWidget *widget);
static void gtk_window_do_popup (GtkWindow *window,
GdkEventButton *event);
@@ -646,9 +632,6 @@ gtk_window_class_init (GtkWindowClass *klass)
widget_class->configure_event = gtk_window_configure_event;
widget_class->key_press_event = gtk_window_key_press_event;
widget_class->key_release_event = gtk_window_key_release_event;
- widget_class->enter_notify_event = gtk_window_enter_notify_event;
- widget_class->leave_notify_event = gtk_window_leave_notify_event;
- widget_class->motion_notify_event = gtk_window_motion_notify_event;
widget_class->focus_in_event = gtk_window_focus_in_event;
widget_class->button_press_event = gtk_window_button_press_event;
widget_class->focus_out_event = gtk_window_focus_out_event;
@@ -665,7 +648,6 @@ gtk_window_class_init (GtkWindowClass *klass)
widget_class->get_preferred_height = gtk_window_get_preferred_height;
widget_class->get_preferred_height_for_width = gtk_window_get_preferred_height_for_width;
- container_class->add = gtk_window_add;
container_class->check_resize = gtk_window_check_resize;
container_class->forall = gtk_window_forall;
@@ -5641,7 +5623,7 @@ gtk_window_realize (GtkWidget *widget)
GdkWindowAttr attributes;
gint attributes_mask;
GtkWindowPrivate *priv;
- GtkStyleContext *context;
+ gint i;
window = GTK_WINDOW (widget);
priv = window->priv;
@@ -5674,19 +5656,6 @@ gtk_window_realize (GtkWidget *widget)
gtk_widget_set_window (widget, gdk_window);
gtk_widget_register_window (widget, gdk_window);
- if (priv->type == GTK_WINDOW_TOPLEVEL)
- {
- priv->content_window = gdk_window_new (gdk_window,
- &attributes, attributes_mask);
- gdk_window_show (priv->content_window);
- gtk_widget_register_window (widget, priv->content_window);
-
- gtk_style_context_set_background (gtk_widget_get_style_context (widget), priv->content_window);
-
- if (gtk_bin_get_child (GTK_BIN (window)))
- gtk_widget_set_parent_window (gtk_bin_get_child (GTK_BIN (window)),
- priv->content_window);
- }
return;
}
@@ -5769,9 +5738,14 @@ gtk_window_realize (GtkWidget *widget)
gdk_window = gdk_window_new (parent_window, &attributes, attributes_mask);
gtk_widget_set_window (widget, gdk_window);
-
gtk_widget_register_window (widget, gdk_window);
+ /* We don't need to set a background on the GdkWindow; with decorations
+ * we draw the background ourself
+ */
+ if (!priv->client_decorated)
+ gtk_style_context_set_background (gtk_widget_get_style_context (widget), gdk_window);
+
attributes.x = allocation.x;
attributes.y = allocation.y;
attributes.width = allocation.width;
@@ -5785,19 +5759,34 @@ gtk_window_realize (GtkWidget *widget)
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
- if (priv->type == GTK_WINDOW_TOPLEVEL)
+ if (priv->client_decorated)
{
- priv->content_window = gdk_window_new (gdk_window,
- &attributes, attributes_mask);
- gdk_window_show (priv->content_window);
- gtk_widget_register_window (widget, priv->content_window);
+ GdkCursorType cursor_type[8] = {
+ GDK_TOP_LEFT_CORNER,
+ GDK_TOP_SIDE,
+ GDK_TOP_RIGHT_CORNER,
+ GDK_LEFT_SIDE,
+ GDK_RIGHT_SIDE,
+ GDK_BOTTOM_LEFT_CORNER,
+ GDK_BOTTOM_SIDE,
+ GDK_BOTTOM_RIGHT_CORNER
+ };
- context = gtk_widget_get_style_context (widget);
- gtk_style_context_set_background (context, priv->content_window);
+ attributes.wclass = GDK_INPUT_ONLY;
+ attributes.width = 1;
+ attributes.height = 1;
+ attributes.event_mask = GDK_BUTTON_PRESS_MASK;
+ attributes_mask = GDK_WA_CURSOR;
- if (gtk_bin_get_child (GTK_BIN (window)))
- gtk_widget_set_parent_window (gtk_bin_get_child (GTK_BIN (window)),
- priv->content_window);
+ for (i = 0; i < 8; i++)
+ {
+ attributes.cursor = gdk_cursor_new (cursor_type[i]);
+ priv->border_window[i] = gdk_window_new (gdk_window, &attributes, attributes_mask);
+ g_object_unref (attributes.cursor);
+
+ gdk_window_show (priv->border_window[i]);
+ gtk_widget_register_window (widget, priv->border_window[i]);
+ }
}
if (priv->transient_parent &&
@@ -5859,11 +5848,6 @@ gtk_window_realize (GtkWidget *widget)
}
#endif
- /* get the default cursor */
- g_signal_connect (G_OBJECT (gdk_window), "notify::cursor",
- G_CALLBACK (window_cursor_changed), widget);
- window_cursor_changed (gdk_window, NULL, widget);
-
/* Icons */
gtk_window_realize_icon (window);
@@ -5877,6 +5861,7 @@ gtk_window_unrealize (GtkWidget *widget)
GtkWindow *window = GTK_WINDOW (widget);
GtkWindowPrivate *priv = window->priv;
GtkWindowGeometryInfo *info;
+ gint i;
/* On unrealize, we reset the size of the window such
* that we will re-apply the default sizing stuff
@@ -5909,11 +5894,14 @@ gtk_window_unrealize (GtkWidget *widget)
if (priv->grip_window != NULL)
resize_grip_destroy_window (window);
- if (priv->content_window != NULL)
+ if (priv->border_window[0] != NULL)
{
- gtk_widget_unregister_window (widget, priv->content_window);
- gdk_window_destroy (priv->content_window);
- priv->content_window = NULL;
+ for (i = 0; i < 8; i++)
+ {
+ gtk_widget_unregister_window (widget, priv->border_window[i]);
+ gdk_window_destroy (priv->border_window[i]);
+ priv->border_window[i] = NULL;
+ }
}
GTK_WIDGET_CLASS (gtk_window_parent_class)->unrealize (widget);
@@ -6146,6 +6134,197 @@ get_decoration_borders (GtkWidget *widget,
}
}
+static void
+update_border_windows (GtkWindow *window, GtkBorder *border)
+{
+ GtkWidget *widget = (GtkWidget *)window;
+ GtkWindowPrivate *priv = window->priv;
+ GdkWindowState state;
+ gboolean resize_h, resize_v;
+ gint handle;
+ cairo_region_t *region;
+ cairo_rectangle_int_t rect;
+ gint width, height;
+
+ if (priv->border_window[0] == NULL)
+ return;
+
+ state = gdk_window_get_state (gtk_widget_get_window (widget));
+ if (!priv->resizable || (state & GDK_WINDOW_STATE_MAXIMIZED))
+ {
+ resize_h = resize_v = FALSE;
+ }
+ else
+ {
+ resize_h = resize_v = TRUE;
+ if (priv->geometry_info)
+ {
+ GdkGeometry *geometry = &priv->geometry_info->geometry;
+ GdkWindowHints flags = priv->geometry_info->mask;
+
+ if ((flags & GDK_HINT_MIN_SIZE) && (flags & GDK_HINT_MAX_SIZE))
+ {
+ resize_h = geometry->min_width != geometry->max_width;
+ resize_v = geometry->min_height != geometry->max_height;
+ }
+ }
+ }
+
+ gtk_widget_style_get (widget,
+ "decoration-resize-handle", &handle,
+ NULL);
+
+ width = gtk_widget_get_allocated_width (widget) - (border->left + border->right);
+ height = gtk_widget_get_allocated_height (widget) - (border->top + border->bottom);
+
+ if (resize_h && resize_v)
+ {
+ gdk_window_move_resize (priv->border_window[GDK_WINDOW_EDGE_NORTH_WEST],
+ 0, 0,
+ border->left + handle, border->top + handle);
+ gdk_window_move_resize (priv->border_window[GDK_WINDOW_EDGE_NORTH_EAST],
+ border->left + width - handle, 0,
+ border->right + handle, border->top + handle);
+ gdk_window_move_resize (priv->border_window[GDK_WINDOW_EDGE_SOUTH_WEST],
+ 0, border->top + height - handle,
+ border->left + handle, border->bottom + handle);
+ gdk_window_move_resize (priv->border_window[GDK_WINDOW_EDGE_SOUTH_EAST],
+ border->left + width - handle, border->top + height - handle,
+ border->right + handle, border->bottom + handle);
+
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = border->left + handle;
+ rect.height = border->top + handle;
+ region = cairo_region_create_rectangle (&rect);
+ rect.x = border->left;
+ rect.y = border->top;
+ rect.width = handle;
+ rect.height = handle;
+ cairo_region_subtract_rectangle (region, &rect);
+ gdk_window_shape_combine_region (priv->border_window[GDK_WINDOW_EDGE_NORTH_WEST],
+ region, 0, 0);
+ cairo_region_destroy (region);
+
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = border->right + handle;
+ rect.height = border->top + handle;
+ region = cairo_region_create_rectangle (&rect);
+ rect.x = 0;
+ rect.y = border->top;
+ rect.width = handle;
+ rect.height = handle;
+ cairo_region_subtract_rectangle (region, &rect);
+ gdk_window_shape_combine_region (priv->border_window[GDK_WINDOW_EDGE_NORTH_EAST],
+ region, 0, 0);
+ cairo_region_destroy (region);
+
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = border->left + handle;
+ rect.height = border->bottom + handle;
+ region = cairo_region_create_rectangle (&rect);
+ rect.x = border->left;
+ rect.y = 0;
+ rect.width = handle;
+ rect.height = handle;
+ cairo_region_subtract_rectangle (region, &rect);
+ gdk_window_shape_combine_region (priv->border_window[GDK_WINDOW_EDGE_SOUTH_WEST],
+ region, 0, 0);
+ cairo_region_destroy (region);
+
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = border->right + handle;
+ rect.height = border->bottom + handle;
+ region = cairo_region_create_rectangle (&rect);
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = handle;
+ rect.height = handle;
+ cairo_region_subtract_rectangle (region, &rect);
+ gdk_window_shape_combine_region (priv->border_window[GDK_WINDOW_EDGE_SOUTH_EAST],
+ region, 0, 0);
+ cairo_region_destroy (region);
+
+ gdk_window_show (priv->border_window[GDK_WINDOW_EDGE_NORTH_WEST]);
+ gdk_window_show (priv->border_window[GDK_WINDOW_EDGE_NORTH_EAST]);
+ gdk_window_show (priv->border_window[GDK_WINDOW_EDGE_SOUTH_WEST]);
+ gdk_window_show (priv->border_window[GDK_WINDOW_EDGE_SOUTH_EAST]);
+ }
+ else
+ {
+ gdk_window_hide (priv->border_window[GDK_WINDOW_EDGE_NORTH_WEST]);
+ gdk_window_hide (priv->border_window[GDK_WINDOW_EDGE_NORTH_EAST]);
+ gdk_window_hide (priv->border_window[GDK_WINDOW_EDGE_SOUTH_WEST]);
+ gdk_window_hide (priv->border_window[GDK_WINDOW_EDGE_SOUTH_EAST]);
+ }
+
+ if (resize_v)
+ {
+ gint x, w;
+
+ if (resize_h)
+ {
+ x = border->left + handle;
+ w = width - 2 * handle;
+ }
+ else
+ {
+ x = 0;
+ w = width + border->left + border->right;
+ }
+
+ gdk_window_move_resize (priv->border_window[GDK_WINDOW_EDGE_NORTH],
+ x, 0,
+ w, border->top);
+ gdk_window_move_resize (priv->border_window[GDK_WINDOW_EDGE_SOUTH],
+ x, border->top + height,
+ w, border->bottom);
+
+ gdk_window_show (priv->border_window[GDK_WINDOW_EDGE_NORTH]);
+ gdk_window_show (priv->border_window[GDK_WINDOW_EDGE_SOUTH]);
+ }
+ else
+ {
+ gdk_window_hide (priv->border_window[GDK_WINDOW_EDGE_NORTH]);
+ gdk_window_hide (priv->border_window[GDK_WINDOW_EDGE_SOUTH]);
+ }
+
+ if (resize_h)
+ {
+ gint y, h;
+
+ if (resize_v)
+ {
+ y = border->top + handle;
+ h = height - 2 * handle;
+ }
+ else
+ {
+ y = 0;
+ h = height + border->top + border->bottom;
+ }
+
+ gdk_window_move_resize (priv->border_window[GDK_WINDOW_EDGE_WEST],
+ 0, y,
+ border->left, h);
+
+ gdk_window_move_resize (priv->border_window[GDK_WINDOW_EDGE_EAST],
+ border->left + width, y,
+ border->right, h);
+
+ gdk_window_show (priv->border_window[GDK_WINDOW_EDGE_WEST]);
+ gdk_window_show (priv->border_window[GDK_WINDOW_EDGE_EAST]);
+ }
+ else
+ {
+ gdk_window_hide (priv->border_window[GDK_WINDOW_EDGE_WEST]);
+ gdk_window_hide (priv->border_window[GDK_WINDOW_EDGE_EAST]);
+ }
+}
+
/* _gtk_window_set_allocation:
* @window: a #GtkWindow
* @allocation: the original allocation for the window
@@ -6249,20 +6428,12 @@ _gtk_window_set_allocation (GtkWindow *window,
{
update_grip_visibility (window);
set_grip_position (window);
+ update_border_windows (window, &window_border);
}
-
- if (priv->content_window != NULL)
- gdk_window_move_resize (priv->content_window,
- child_allocation.x,
- child_allocation.y,
- child_allocation.width,
- child_allocation.height);
-
}
- /* Apply border width */
- child_allocation.x = border_width;
- child_allocation.y = border_width;
+ child_allocation.x += border_width;
+ child_allocation.y += border_width;
child_allocation.width = MAX (1, child_allocation.width - border_width * 2);
child_allocation.height = MAX (1, child_allocation.height - border_width * 2);
@@ -6279,7 +6450,7 @@ gtk_window_size_allocate (GtkWidget *widget,
_gtk_window_set_allocation (window, allocation, &child_allocation);
- child = gtk_bin_get_child (&(window->bin));
+ child = gtk_bin_get_child (GTK_BIN (window));
if (child && gtk_widget_get_visible (child))
gtk_widget_size_allocate (child, &child_allocation);
}
@@ -6804,170 +6975,27 @@ gtk_window_key_release_event (GtkWidget *widget,
}
static GtkWindowRegion
-get_region_type (GtkWindow *window, gint x, gint y)
+get_active_region_type (GtkWindow *window, GdkEventAny *event, gint x, gint y)
{
GtkWindowPrivate *priv = window->priv;
- GtkWidget *widget = GTK_WIDGET (window);
- gint title_height = 0;
- gint resize_handle = 0;
- GtkBorder window_border = { 0 };
-
- if (priv->title_box)
- title_height = gtk_widget_get_allocated_height (priv->title_box);
+ GtkAllocation allocation;
+ gint i;
- if (priv->client_decorated)
+ for (i = 0; i < 8; i++)
{
- get_decoration_borders (widget, NULL, &window_border, NULL);
- gtk_widget_style_get (widget,
- "decoration-resize-handle", &resize_handle,
- NULL);
+ if (event->window == priv->border_window[i])
+ return i;
}
- if (x < window_border.left)
- {
- if (y < window_border.top + MAX (title_height, resize_handle))
- return GTK_WINDOW_REGION_EDGE_NW;
- else if (y > gtk_widget_get_allocated_height (widget) - window_border.bottom - resize_handle)
- return GTK_WINDOW_REGION_EDGE_SW;
- else
- return GTK_WINDOW_REGION_EDGE_W;
- }
- else if (x > gtk_widget_get_allocated_width (widget) - window_border.right)
- {
- if (y < window_border.top + MAX (title_height, resize_handle))
- return GTK_WINDOW_REGION_EDGE_NE;
- else if (y > gtk_widget_get_allocated_height (widget) - window_border.bottom - resize_handle)
- return GTK_WINDOW_REGION_EDGE_SE;
- else
- return GTK_WINDOW_REGION_EDGE_E;
- }
- else if (y < window_border.top)
- {
- if (x < window_border.left + resize_handle)
- return GTK_WINDOW_REGION_EDGE_NW;
- else if (x > gtk_widget_get_allocated_width (widget) - window_border.right - resize_handle)
- return GTK_WINDOW_REGION_EDGE_NE;
- else
- return GTK_WINDOW_REGION_EDGE_N;
- }
- else if (y > gtk_widget_get_allocated_height (widget) - window_border.bottom)
- {
- if (x < window_border.left + resize_handle)
- return GTK_WINDOW_REGION_EDGE_SW;
- else if (x > gtk_widget_get_allocated_width (widget) - window_border.right - resize_handle)
- return GTK_WINDOW_REGION_EDGE_SE;
- else
- return GTK_WINDOW_REGION_EDGE_S;
- }
- else
+ if (priv->title_box != NULL)
{
- if (y < window_border.top + title_height)
+ gtk_widget_get_allocation (priv->title_box, &allocation);
+ if (allocation.x <= x && allocation.x + allocation.width > x &&
+ allocation.y <= y && allocation.y + allocation.height > y)
return GTK_WINDOW_REGION_TITLE;
- else
- return GTK_WINDOW_REGION_CONTENT;
- }
-}
-
-static GtkWindowRegion
-get_active_region_type (GtkWindow *window, gint x, gint y)
-{
- GtkWindowPrivate *priv = window->priv;
- GtkWidget *widget = GTK_WIDGET (window);
- GtkWindowRegion region;
- gboolean resize_h, resize_v;
- gint state;
- GtkBorder window_border = { 0 };
-
- region = get_region_type (window, x, y);
- if (priv->client_decorated)
- get_decoration_borders (widget, NULL, &window_border, NULL);
-
- state = gdk_window_get_state (gtk_widget_get_window (widget));
- if (!priv->resizable || (state & GDK_WINDOW_STATE_MAXIMIZED))
- {
- resize_h = resize_v = FALSE;
- }
- else
- {
- resize_h = resize_v = TRUE;
- if (priv->geometry_info)
- {
- GdkGeometry *geometry = &priv->geometry_info->geometry;
- GdkWindowHints flags = priv->geometry_info->mask;
-
- if ((flags & GDK_HINT_MIN_SIZE) && (flags & GDK_HINT_MAX_SIZE))
- {
- resize_h = geometry->min_width != geometry->max_width;
- resize_v = geometry->min_height != geometry->max_height;
- }
- }
}
- switch (region)
- {
- case GTK_WINDOW_REGION_EDGE_N:
- case GTK_WINDOW_REGION_EDGE_S:
- if (resize_v)
- return region;
- else
- return GTK_WINDOW_REGION_EDGE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_W:
- case GTK_WINDOW_REGION_EDGE_E:
- if (resize_h)
- return region;
- else
- return GTK_WINDOW_REGION_EDGE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_NW:
- if (resize_h && resize_v)
- return region;
- else if (resize_h && x < window_border.left)
- return GTK_WINDOW_REGION_EDGE_W;
- else if (resize_v && y < window_border.top)
- return GTK_WINDOW_REGION_EDGE_N;
- else
- return GTK_WINDOW_REGION_EDGE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_NE:
- if (resize_h && resize_v)
- return region;
- else if (resize_h && x > gtk_widget_get_allocated_width (widget) - window_border.right)
- return GTK_WINDOW_REGION_EDGE_E;
- else if (resize_v && y < window_border.top)
- return GTK_WINDOW_REGION_EDGE_N;
- else
- return GTK_WINDOW_REGION_EDGE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_SW:
- if (resize_h && resize_v)
- return region;
- else if (resize_h && x < window_border.left)
- return GTK_WINDOW_REGION_EDGE_W;
- else if (resize_v && y > gtk_widget_get_allocated_height (widget) - window_border.bottom)
- return GTK_WINDOW_REGION_EDGE_N;
- else
- return GTK_WINDOW_REGION_EDGE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_SE:
- if (resize_h && resize_v)
- return region;
- else if (resize_h && x > gtk_widget_get_allocated_width (widget) - window_border.right)
- return GTK_WINDOW_REGION_EDGE_E;
- else if (resize_v && y > gtk_widget_get_allocated_height (widget) - window_border.bottom)
- return GTK_WINDOW_REGION_EDGE_S;
- else
- return GTK_WINDOW_REGION_EDGE;
- break;
-
- default:
- return region;
- }
+ return GTK_WINDOW_REGION_CONTENT;
}
static gint
@@ -7013,7 +7041,7 @@ gtk_window_button_press_event (GtkWidget *widget,
x = event->x;
y = event->y;
}
- region = get_active_region_type (window, x, y);
+ region = get_active_region_type (window, (GdkEventAny*)event, x, y);
if (event->type == GDK_BUTTON_PRESS)
{
@@ -7083,55 +7111,6 @@ gtk_window_real_activate_focus (GtkWindow *window)
gtk_window_activate_focus (window);
}
-static gint
-gtk_window_enter_notify_event (GtkWidget *widget,
- GdkEventCrossing *event)
-{
- GtkWindowPrivate *priv = GTK_WINDOW (widget)->priv;
-
- if (priv->client_decorated)
- {
- gint x, y;
- GdkWindow *gdk_window;
-
- gdk_window = gtk_widget_get_window (widget);
- gdk_window_get_device_position (gdk_window,
- gdk_event_get_device ((GdkEvent*)event),
- &x, &y, NULL);
- update_cursor_at_position (widget, x, y);
- }
-
- return FALSE;
-}
-
-static gint
-gtk_window_leave_notify_event (GtkWidget *widget,
- GdkEventCrossing *event)
-{
- return FALSE;
-}
-
-static gboolean
-gtk_window_motion_notify_event (GtkWidget *widget,
- GdkEventMotion *event)
-{
- GtkWindowPrivate *priv = GTK_WINDOW (widget)->priv;
-
- if (priv->client_decorated)
- {
- gint x, y;
- GdkWindow *gdk_window;
-
- gdk_window = gtk_widget_get_window (widget);
- gdk_window_get_device_position (gdk_window,
- gdk_event_get_device ((GdkEvent*)event),
- &x, &y, NULL);
- update_cursor_at_position (widget, x, y);
- }
-
- return FALSE;
-}
-
static void
do_focus_change (GtkWidget *widget,
gboolean in)
@@ -7292,18 +7271,6 @@ gtk_window_forall (GtkContainer *container,
(* callback) (priv->title_box, callback_data);
}
-static void
-gtk_window_add (GtkContainer *container,
- GtkWidget *child)
-{
- GtkWindowPrivate *priv = GTK_WINDOW (container)->priv;
-
- if (priv->content_window != NULL)
- gtk_widget_set_parent_window (child, priv->content_window);
-
- GTK_CONTAINER_CLASS (gtk_window_parent_class)->add (container, child);
-}
-
static gboolean
gtk_window_focus (GtkWidget *widget,
GtkDirectionType direction)
@@ -7482,104 +7449,6 @@ gtk_window_real_set_focus (GtkWindow *window,
}
static void
-window_cursor_changed (GdkWindow *window,
- GParamSpec *pspec,
- GtkWidget *widget)
-{
- GtkWindowPrivate *priv = GTK_WINDOW (widget)->priv;
-
- priv->default_cursor = gdk_window_get_cursor (window);
- if (priv->default_cursor == NULL)
- priv->default_cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_LEFT_PTR);
- if (priv->content_window != NULL)
- gdk_window_set_cursor (priv->content_window, priv->default_cursor);
-}
-
-static void
-update_cursor_at_position (GtkWidget *widget, gint x, gint y)
-{
- GtkWindow *window = GTK_WINDOW (widget);
- GtkWindowPrivate *priv = window->priv;
- GtkWindowRegion region;
- GdkCursorType cursor_type;
- GdkCursor *cursor;
- GdkWindowState state;
- gboolean use_default = FALSE;
- GdkWindow *gdk_window;
-
- region = get_active_region_type (window, x, y);
-
- state = gdk_window_get_state (gtk_widget_get_window (widget));
-
- if ((state & GDK_WINDOW_STATE_MAXIMIZED) || !priv->resizable || !priv->decorated)
- {
- use_default = TRUE;
- }
- else
- {
- switch (region)
- {
- case GTK_WINDOW_REGION_EDGE_NW:
- cursor_type = GDK_TOP_LEFT_CORNER;
- break;
-
- case GTK_WINDOW_REGION_EDGE_N:
- cursor_type = GDK_TOP_SIDE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_NE:
- cursor_type = GDK_TOP_RIGHT_CORNER;
- break;
-
- case GTK_WINDOW_REGION_EDGE_W:
- cursor_type = GDK_LEFT_SIDE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_E:
- cursor_type = GDK_RIGHT_SIDE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_SW:
- cursor_type = GDK_BOTTOM_LEFT_CORNER;
- break;
-
- case GTK_WINDOW_REGION_EDGE_S:
- cursor_type = GDK_BOTTOM_SIDE;
- break;
-
- case GTK_WINDOW_REGION_EDGE_SE:
- cursor_type = GDK_BOTTOM_RIGHT_CORNER;
- break;
-
- default:
- use_default = TRUE;
- break;
- }
- }
-
- gdk_window = gtk_widget_get_window (widget);
- g_signal_handlers_disconnect_by_func (G_OBJECT (gdk_window),
- G_CALLBACK (window_cursor_changed),
- widget);
-
- if (use_default)
- {
- gdk_window_set_cursor (gdk_window, priv->default_cursor);
- }
- else
- {
- cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), cursor_type);
- gdk_window_set_cursor (gdk_window, cursor);
- g_object_unref (cursor);
- }
-
- g_signal_connect (G_OBJECT (gdk_window), "notify::cursor",
- G_CALLBACK (window_cursor_changed), widget);
-}
-
-
-
-static void
gtk_window_get_preferred_width (GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
@@ -9015,26 +8884,27 @@ gtk_window_draw (GtkWidget *widget,
GtkBorder title_border = { 0 };
GtkBorder inner_border = { 0 };
GtkBorder outer_border = { 0 };
+ gint title_height;
context = gtk_widget_get_style_context (widget);
gtk_widget_get_allocation (widget, &allocation);
- if (priv->title_box != NULL)
+ if (priv->client_decorated)
get_decoration_borders (widget, &title_border, &inner_border, &outer_border);
- else
- get_decoration_borders (widget, NULL, &inner_border, &outer_border);
+ else if (priv->title_box != NULL)
+ get_decoration_borders (widget, &title_border, NULL, NULL);
if (!gtk_widget_get_app_paintable (widget) &&
gtk_cairo_should_draw_window (cr, gtk_widget_get_window (widget)))
{
- gtk_style_context_save (context);
-
if (priv->client_decorated &&
priv->decorated &&
!priv->fullscreen &&
!(gdk_window_get_state (gtk_widget_get_window (widget)) & GDK_WINDOW_STATE_MAXIMIZED))
{
+ gtk_style_context_save (context);
+
gtk_style_context_add_class (context, "window-border");
gtk_render_background (context, cr,
inner_border.left + outer_border.left,
@@ -9054,23 +8924,31 @@ gtk_window_draw (GtkWidget *widget,
gtk_style_context_add_class (context, "window-outer-border");
gtk_render_frame (context, cr,
0, 0, allocation.width, allocation.height);
- gtk_style_context_remove_class (context, "window-outer-border");
+ gtk_style_context_restore (context);
}
+ if (priv->title_box)
+ title_height = gtk_widget_get_allocated_height (priv->title_box);
+ else
+ title_height = 0;
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, "window-content");
+ gtk_render_background (context, cr,
+ inner_border.left + outer_border.left,
+ inner_border.top + outer_border.top +
+ title_border.top + title_border.bottom +
+ title_height,
+ allocation.width -
+ (inner_border.left + inner_border.right +
+ outer_border.left + outer_border.right),
+ allocation.height -
+ (inner_border.top + inner_border.bottom +
+ outer_border.top + outer_border.bottom +
+ title_border.top + title_border.bottom +
+ title_height));
gtk_style_context_restore (context);
}
- if (!gtk_widget_get_app_paintable (widget) &&
- priv->content_window != NULL &&
- gtk_cairo_should_draw_window (cr, priv->content_window))
- {
- gint x, y;
- gdk_window_get_position (priv->content_window, &x, &y);
- gtk_render_background (context, cr, x, y,
- gdk_window_get_width (priv->content_window),
- gdk_window_get_height (priv->content_window));
- }
-
if (GTK_WIDGET_CLASS (gtk_window_parent_class)->draw)
ret = GTK_WIDGET_CLASS (gtk_window_parent_class)->draw (widget, cr);
@@ -11289,9 +11167,3 @@ ensure_state_flag_backdrop (GtkWidget *widget)
gtk_widget_queue_draw (widget);
}
-
-GdkWindow *
-_gtk_window_get_content_window (GtkWindow *window)
-{
- return window->priv->content_window;
-}
diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h
index a1b0427333..507d79671f 100644
--- a/gtk/gtkwindowprivate.h
+++ b/gtk/gtkwindowprivate.h
@@ -64,7 +64,6 @@ void _gtk_window_get_wmclass (GtkWindow *window,
void _gtk_window_set_allocation (GtkWindow *window,
const GtkAllocation *allocation,
GtkAllocation *allocation_out);
-GdkWindow * _gtk_window_get_content_window (GtkWindow *window);
typedef void (*GtkWindowKeysForeachFunc) (GtkWindow *window,
guint keyval,