wayland-surface: Remove initial_state

Just put everything in the double buffered state so it all
arrives at the same time; on commit.
This commit is contained in:
Jasper St. Pierre 2013-11-11 17:35:56 -05:00
parent ab080e3e6b
commit 7186841db0
3 changed files with 65 additions and 195 deletions

View File

@ -1064,8 +1064,6 @@ meta_window_new_shared (MetaDisplay *display,
if (client_type == META_WINDOW_CLIENT_TYPE_X11) if (client_type == META_WINDOW_CLIENT_TYPE_X11)
meta_window_load_initial_properties (window); meta_window_load_initial_properties (window);
else
meta_wayland_surface_set_initial_state (window->surface, window);
if (window->override_redirect) if (window->override_redirect)
{ {

View File

@ -59,9 +59,6 @@
#include "meta-weston-launch.h" #include "meta-weston-launch.h"
#include "monitor-private.h" #include "monitor-private.h"
static void ensure_initial_state (MetaWaylandSurface *surface);
static void free_initial_state (MetaWaylandSurfaceInitialState *surface);
static void static void
surface_process_damage (MetaWaylandSurface *surface, surface_process_damage (MetaWaylandSurface *surface,
cairo_region_t *region) cairo_region_t *region)
@ -239,6 +236,30 @@ empty_region (cairo_region_t *region)
cairo_region_intersect_rectangle (region, &rectangle); 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 static void
meta_wayland_surface_commit (struct wl_client *client, meta_wayland_surface_commit (struct wl_client *client,
struct wl_resource *resource) struct wl_resource *resource)
@ -290,18 +311,7 @@ meta_wayland_surface_commit (struct wl_client *client,
return; return;
} }
if (surface->initial_state) surface_ensure_window (surface);
{
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);
}
if (surface == compositor->seat->sprite) if (surface == compositor->seat->sprite)
meta_wayland_seat_update_sprite (compositor->seat); 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_opaque_region (surface->window, surface->pending.opaque_region);
meta_window_set_input_region (surface->window, surface->pending.input_region); meta_window_set_input_region (surface->window, surface->pending.input_region);
surface_process_damage (surface, surface->pending.damage); 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) if (surface->pending.buffer)
@ -390,9 +421,6 @@ meta_wayland_surface_free (MetaWaylandSurface *surface)
MetaWaylandCompositor *compositor = surface->compositor; MetaWaylandCompositor *compositor = surface->compositor;
MetaWaylandFrameCallback *cb, *next; MetaWaylandFrameCallback *cb, *next;
if (surface->initial_state)
free_initial_state (surface->initial_state);
compositor->surfaces = g_list_remove (compositor->surfaces, surface); compositor->surfaces = g_list_remove (compositor->surfaces, surface);
meta_wayland_buffer_reference (&surface->buffer_ref, NULL); 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); MetaWaylandSurfaceExtension *extension = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = extension->surface; MetaWaylandSurface *surface = extension->surface;
if (surface->window) g_clear_pointer (&surface->pending.title, g_free);
meta_window_set_title (surface->window, title); surface->pending.title = g_strdup (title);
else
{
ensure_initial_state (surface);
g_free (surface->initial_state->title);
surface->initial_state->title = g_strdup (title);
}
} }
static void static void
@ -541,15 +562,8 @@ xdg_surface_set_app_id (struct wl_client *client,
MetaWaylandSurfaceExtension *extension = wl_resource_get_user_data (resource); MetaWaylandSurfaceExtension *extension = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = extension->surface; MetaWaylandSurface *surface = extension->surface;
if (surface->window) g_clear_pointer (&surface->pending.app_id, g_free);
meta_window_set_wm_class (surface->window, app_id, app_id); surface->pending.app_id = g_strdup (app_id);
else
{
ensure_initial_state (surface);
g_free (surface->initial_state->app_id);
surface->initial_state->app_id = g_strdup (app_id);
}
} }
static void static void
@ -912,41 +926,18 @@ set_dbus_properties (struct wl_client *client,
return; return;
} }
if (surface->window) g_clear_pointer (&surface->pending.gtk_application_id, g_free);
{ surface->pending.gtk_application_id = g_strdup (application_id);
meta_window_set_gtk_dbus_properties (surface->window, g_clear_pointer (&surface->pending.gtk_unique_bus_name, g_free);
application_id, surface->pending.gtk_unique_bus_name = g_strdup (unique_bus_name);
unique_bus_name, g_clear_pointer (&surface->pending.gtk_app_menu_path, g_free);
app_menu_path, surface->pending.gtk_app_menu_path = g_strdup (app_menu_path);
menubar_path, g_clear_pointer (&surface->pending.gtk_menubar_path, g_free);
application_object_path, surface->pending.gtk_menubar_path = g_strdup (menubar_path);
window_object_path); g_clear_pointer (&surface->pending.gtk_application_object_path, g_free);
} surface->pending.gtk_application_object_path = g_strdup (application_object_path);
else g_clear_pointer (&surface->pending.gtk_window_object_path, g_free);
{ surface->pending.gtk_window_object_path = g_strdup (window_object_path);
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);
}
} }
static const struct gtk_surface_interface meta_wayland_gtk_surface_interface = static const struct gtk_surface_interface meta_wayland_gtk_surface_interface =
@ -1013,106 +1004,6 @@ meta_wayland_init_shell (MetaWaylandCompositor *compositor)
g_error ("Failed to register a global gtk-shell object"); g_error ("Failed to register a global gtk-shell object");
} }
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 void
meta_wayland_surface_configure_notify (MetaWaylandSurface *surface, meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
int new_width, int new_width,

View File

@ -64,31 +64,19 @@ typedef struct
/* wl_surface.frame */ /* wl_surface.frame */
struct wl_list frame_callback_list; 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 *title;
char *app_id; char *app_id;
/* gtk_surface */
char *gtk_application_id; char *gtk_application_id;
char *gtk_unique_bus_name; char *gtk_unique_bus_name;
char *gtk_app_menu_path; char *gtk_app_menu_path;
char *gtk_menubar_path; char *gtk_menubar_path;
char *gtk_application_object_path; char *gtk_application_object_path;
char *gtk_window_object_path; char *gtk_window_object_path;
} MetaWaylandSurfaceInitialState; } MetaWaylandDoubleBufferedState;
typedef struct typedef struct
{ {
@ -108,10 +96,6 @@ struct _MetaWaylandSurface
/* All the pending state, that wl_surface.commit will apply. */ /* All the pending state, that wl_surface.commit will apply. */
MetaWaylandDoubleBufferedState pending; 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); void meta_wayland_init_shell (MetaWaylandCompositor *compositor);
@ -122,9 +106,6 @@ MetaWaylandSurface *meta_wayland_surface_create (MetaWaylandCompositor *composit
guint32 version); guint32 version);
void meta_wayland_surface_free (MetaWaylandSurface *surface); 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, void meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
int width, int width,
int height, int height,