[mutter/wayland] wayland-surface: Remove initial_state
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wayland] wayland-surface: Remove initial_state
- Date: Tue, 12 Nov 2013 21:53:56 +0000 (UTC)
commit 7186841db0406d2e33b8dfffb51de8e40269e320
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Mon Nov 11 17:35:56 2013 -0500
wayland-surface: Remove initial_state
Just put everything in the double buffered state so it all
arrives at the same time; on commit.
src/core/window.c | 2 -
src/wayland/meta-wayland-surface.c | 233 ++++++++++--------------------------
src/wayland/meta-wayland-surface.h | 25 +----
3 files changed, 65 insertions(+), 195 deletions(-)
---
diff --git a/src/core/window.c b/src/core/window.c
index a7517cc..97b41ba 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -1064,8 +1064,6 @@ meta_window_new_shared (MetaDisplay *display,
if (client_type == META_WINDOW_CLIENT_TYPE_X11)
meta_window_load_initial_properties (window);
- else
- meta_wayland_surface_set_initial_state (window->surface, window);
if (window->override_redirect)
{
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 0a9ebf8..3d37c3a 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -59,9 +59,6 @@
#include "meta-weston-launch.h"
#include "monitor-private.h"
-static void ensure_initial_state (MetaWaylandSurface *surface);
-static void free_initial_state (MetaWaylandSurfaceInitialState *surface);
-
static void
surface_process_damage (MetaWaylandSurface *surface,
cairo_region_t *region)
@@ -239,6 +236,30 @@ empty_region (cairo_region_t *region)
cairo_region_intersect_rectangle (region, &rectangle);
}
+static gboolean
+surface_wants_window (MetaWaylandSurface *surface)
+{
+ return (surface->xdg_surface != NULL);
+}
+
+static void
+surface_ensure_window (MetaWaylandSurface *surface)
+{
+ MetaDisplay *display = meta_get_display ();
+ int width, height;
+
+ if (surface->window)
+ return;
+
+ if (!surface_wants_window (surface))
+ return;
+
+ width = surface->buffer_ref.buffer->width;
+ height = surface->buffer_ref.buffer->height;
+
+ surface->window = meta_window_new_for_wayland (display, width, height, surface);
+}
+
static void
meta_wayland_surface_commit (struct wl_client *client,
struct wl_resource *resource)
@@ -290,18 +311,7 @@ meta_wayland_surface_commit (struct wl_client *client,
return;
}
- if (surface->initial_state)
- {
- MetaDisplay *display = meta_get_display ();
- int width;
- int height;
-
- width = surface->buffer_ref.buffer->width;
- height = surface->buffer_ref.buffer->height;
-
- /* This will free and clear initial_state */
- surface->window = meta_window_new_for_wayland (display, width, height, surface);
- }
+ surface_ensure_window (surface);
if (surface == compositor->seat->sprite)
meta_wayland_seat_update_sprite (compositor->seat);
@@ -336,6 +346,27 @@ meta_wayland_surface_commit (struct wl_client *client,
meta_window_set_opaque_region (surface->window, surface->pending.opaque_region);
meta_window_set_input_region (surface->window, surface->pending.input_region);
surface_process_damage (surface, surface->pending.damage);
+
+ meta_window_set_title (surface->window, surface->pending.title);
+ g_clear_pointer (&surface->pending.title, g_free);
+
+ meta_window_set_wm_class (surface->window, surface->pending.app_id, surface->pending.app_id);
+ g_clear_pointer (&surface->pending.app_id, g_free);
+
+ meta_window_set_gtk_dbus_properties (surface->window,
+ surface->pending.gtk_application_id,
+ surface->pending.gtk_unique_bus_name,
+ surface->pending.gtk_app_menu_path,
+ surface->pending.gtk_menubar_path,
+ surface->pending.gtk_application_object_path,
+ surface->pending.gtk_window_object_path);
+
+ g_clear_pointer (&surface->pending.gtk_application_id, g_free);
+ g_clear_pointer (&surface->pending.gtk_unique_bus_name, g_free);
+ g_clear_pointer (&surface->pending.gtk_app_menu_path, g_free);
+ g_clear_pointer (&surface->pending.gtk_menubar_path, g_free);
+ g_clear_pointer (&surface->pending.gtk_application_object_path, g_free);
+ g_clear_pointer (&surface->pending.gtk_window_object_path, g_free);
}
if (surface->pending.buffer)
@@ -390,9 +421,6 @@ meta_wayland_surface_free (MetaWaylandSurface *surface)
MetaWaylandCompositor *compositor = surface->compositor;
MetaWaylandFrameCallback *cb, *next;
- if (surface->initial_state)
- free_initial_state (surface->initial_state);
-
compositor->surfaces = g_list_remove (compositor->surfaces, surface);
meta_wayland_buffer_reference (&surface->buffer_ref, NULL);
@@ -522,15 +550,8 @@ xdg_surface_set_title (struct wl_client *client,
MetaWaylandSurfaceExtension *extension = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = extension->surface;
- if (surface->window)
- meta_window_set_title (surface->window, title);
- else
- {
- ensure_initial_state (surface);
-
- g_free (surface->initial_state->title);
- surface->initial_state->title = g_strdup (title);
- }
+ g_clear_pointer (&surface->pending.title, g_free);
+ surface->pending.title = g_strdup (title);
}
static void
@@ -541,15 +562,8 @@ xdg_surface_set_app_id (struct wl_client *client,
MetaWaylandSurfaceExtension *extension = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = extension->surface;
- if (surface->window)
- meta_window_set_wm_class (surface->window, app_id, app_id);
- else
- {
- ensure_initial_state (surface);
-
- g_free (surface->initial_state->app_id);
- surface->initial_state->app_id = g_strdup (app_id);
- }
+ g_clear_pointer (&surface->pending.app_id, g_free);
+ surface->pending.app_id = g_strdup (app_id);
}
static void
@@ -912,41 +926,18 @@ set_dbus_properties (struct wl_client *client,
return;
}
- if (surface->window)
- {
- meta_window_set_gtk_dbus_properties (surface->window,
- application_id,
- unique_bus_name,
- app_menu_path,
- menubar_path,
- application_object_path,
- window_object_path);
- }
- else
- {
- MetaWaylandSurfaceInitialState *initial;
-
- ensure_initial_state (surface);
- initial = surface->initial_state;
-
- g_free (initial->gtk_application_id);
- initial->gtk_application_id = g_strdup (application_id);
-
- g_free (initial->gtk_unique_bus_name);
- initial->gtk_unique_bus_name = g_strdup (unique_bus_name);
-
- g_free (initial->gtk_app_menu_path);
- initial->gtk_app_menu_path = g_strdup (app_menu_path);
-
- g_free (initial->gtk_menubar_path);
- initial->gtk_menubar_path = g_strdup (menubar_path);
-
- g_free (initial->gtk_application_object_path);
- initial->gtk_application_object_path = g_strdup (application_object_path);
-
- g_free (initial->gtk_window_object_path);
- initial->gtk_window_object_path = g_strdup (window_object_path);
- }
+ g_clear_pointer (&surface->pending.gtk_application_id, g_free);
+ surface->pending.gtk_application_id = g_strdup (application_id);
+ g_clear_pointer (&surface->pending.gtk_unique_bus_name, g_free);
+ surface->pending.gtk_unique_bus_name = g_strdup (unique_bus_name);
+ g_clear_pointer (&surface->pending.gtk_app_menu_path, g_free);
+ surface->pending.gtk_app_menu_path = g_strdup (app_menu_path);
+ g_clear_pointer (&surface->pending.gtk_menubar_path, g_free);
+ surface->pending.gtk_menubar_path = g_strdup (menubar_path);
+ g_clear_pointer (&surface->pending.gtk_application_object_path, g_free);
+ surface->pending.gtk_application_object_path = g_strdup (application_object_path);
+ g_clear_pointer (&surface->pending.gtk_window_object_path, g_free);
+ surface->pending.gtk_window_object_path = g_strdup (window_object_path);
}
static const struct gtk_surface_interface meta_wayland_gtk_surface_interface =
@@ -1014,106 +1005,6 @@ meta_wayland_init_shell (MetaWaylandCompositor *compositor)
}
void
-meta_wayland_surface_set_initial_state (MetaWaylandSurface *surface,
- MetaWindow *window)
-{
- MetaWaylandSurfaceInitialState *initial = surface->initial_state;
- MetaWaylandCompositor *compositor = surface->compositor;
- MetaWaylandSeat *seat = compositor->seat;
-
- if (initial == NULL)
- return;
-
- window->type = META_WINDOW_NORMAL;
-
- /* Note that we poke at the bits directly here, because we're
- in the middle of meta_window_new_shared() */
- switch (initial->initial_type)
- {
- case META_WAYLAND_SURFACE_TOPLEVEL:
- break;
- case META_WAYLAND_SURFACE_FULLSCREEN:
- window->fullscreen = TRUE;
- break;
- case META_WAYLAND_SURFACE_MAXIMIZED:
- window->maximized_horizontally = window->maximized_vertically = TRUE;
- break;
- case META_WAYLAND_SURFACE_POPUP:
- window->override_redirect = TRUE;
- window->type = META_WINDOW_DROPDOWN_MENU;
- window->mapped = TRUE;
- window->showing_for_first_time = FALSE;
- window->placed = TRUE;
- if (!meta_wayland_pointer_start_popup_grab (&seat->pointer, surface))
- xdg_popup_send_popup_done (surface->xdg_surface->resource);
- break;
- default:
- g_assert_not_reached ();
- }
-
- if (initial->transient_for)
- {
- MetaWaylandSurface *parent = wl_resource_get_user_data (initial->transient_for);
- if (parent && parent->window)
- {
- window->transient_for = g_object_ref (parent->window);
-
- if (initial->initial_type == META_WAYLAND_SURFACE_POPUP)
- {
- window->rect.x = parent->window->rect.x + initial->x;
- window->rect.y = parent->window->rect.y + initial->y;
- }
- }
-
- window->type = META_WINDOW_DIALOG;
- }
-
- if (initial->title)
- meta_window_set_title (window, initial->title);
-
- if (initial->app_id)
- meta_window_set_wm_class (window, initial->app_id, initial->app_id);
-
- meta_window_set_gtk_dbus_properties (window,
- initial->gtk_application_id,
- initial->gtk_unique_bus_name,
- initial->gtk_app_menu_path,
- initial->gtk_menubar_path,
- initial->gtk_application_object_path,
- initial->gtk_window_object_path);
-
- meta_window_type_changed (window);
-
- free_initial_state (initial);
- surface->initial_state = NULL;
-}
-
-static void
-ensure_initial_state (MetaWaylandSurface *surface)
-{
- if (surface->initial_state)
- return;
-
- surface->initial_state = g_slice_new0 (MetaWaylandSurfaceInitialState);
-}
-
-static void
-free_initial_state (MetaWaylandSurfaceInitialState *initial)
-{
- g_free (initial->title);
- g_free (initial->app_id);
-
- g_free (initial->gtk_application_id);
- g_free (initial->gtk_unique_bus_name);
- g_free (initial->gtk_app_menu_path);
- g_free (initial->gtk_menubar_path);
- g_free (initial->gtk_application_object_path);
- g_free (initial->gtk_window_object_path);
-
- g_slice_free (MetaWaylandSurfaceInitialState, initial);
-}
-
-void
meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
int new_width,
int new_height,
diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h
index 35348fe..0287f3e 100644
--- a/src/wayland/meta-wayland-surface.h
+++ b/src/wayland/meta-wayland-surface.h
@@ -64,31 +64,19 @@ typedef struct
/* wl_surface.frame */
struct wl_list frame_callback_list;
-} MetaWaylandDoubleBufferedState;
-
-typedef enum {
- META_WAYLAND_SURFACE_TOPLEVEL = 0,
- META_WAYLAND_SURFACE_MAXIMIZED,
- META_WAYLAND_SURFACE_FULLSCREEN,
- META_WAYLAND_SURFACE_POPUP,
-} MetaWaylandSurfaceType;
-
-typedef struct
-{
- MetaWaylandSurfaceType initial_type;
- struct wl_resource *transient_for;
- int x, y;
+ /* xdg_surface */
char *title;
char *app_id;
+ /* gtk_surface */
char *gtk_application_id;
char *gtk_unique_bus_name;
char *gtk_app_menu_path;
char *gtk_menubar_path;
char *gtk_application_object_path;
char *gtk_window_object_path;
-} MetaWaylandSurfaceInitialState;
+} MetaWaylandDoubleBufferedState;
typedef struct
{
@@ -108,10 +96,6 @@ struct _MetaWaylandSurface
/* All the pending state, that wl_surface.commit will apply. */
MetaWaylandDoubleBufferedState pending;
-
- /* All the initial state, that wl_shell_surface.set_* will apply
- (through meta_window_new_for_wayland) */
- MetaWaylandSurfaceInitialState *initial_state;
};
void meta_wayland_init_shell (MetaWaylandCompositor *compositor);
@@ -122,9 +106,6 @@ MetaWaylandSurface *meta_wayland_surface_create (MetaWaylandCompositor *composit
guint32 version);
void meta_wayland_surface_free (MetaWaylandSurface *surface);
-void meta_wayland_surface_set_initial_state (MetaWaylandSurface *surface,
- MetaWindow *window);
-
void meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
int width,
int height,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]