Compare commits
31 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
2886a62fb0 | ||
|
eadffb6f0b | ||
|
8772ed83df | ||
|
1f2419f0f2 | ||
|
8868523297 | ||
|
c8774aaf32 | ||
|
9c63dff13d | ||
|
6e45aa8511 | ||
|
818d76649a | ||
|
0d139480d3 | ||
|
7bde237c43 | ||
|
5324ace933 | ||
|
ab1987f41e | ||
|
7e1115479b | ||
|
6f26c009c1 | ||
|
ef39bc3db9 | ||
|
55986c4288 | ||
|
babb476166 | ||
|
bfc7ce3b88 | ||
|
2fb140918e | ||
|
0806922cd5 | ||
|
c88001e5a0 | ||
|
ea821df74b | ||
|
8b0c2e313e | ||
|
46c94eb315 | ||
|
6bfe0da0f5 | ||
|
314bb81098 | ||
|
b9b56edc68 | ||
|
502162d55a | ||
|
d39fc4dac0 | ||
|
e6f5e50816 |
@ -1586,7 +1586,7 @@ int main(int argc, char *argv[])
|
||||
if (desktop.want_panel)
|
||||
weston_desktop_shell_set_panel_position(desktop.shell, desktop.panel_position);
|
||||
wl_list_for_each(output, &desktop.outputs, link)
|
||||
if (!output->panel)
|
||||
if (!output->background)
|
||||
output_init(output, &desktop);
|
||||
|
||||
grab_surface_create(&desktop);
|
||||
|
@ -1287,6 +1287,11 @@ int main(int argc, char **argv)
|
||||
wlCtx_WorkSpaceBackGround.cmm = &wlCtxCommon;
|
||||
|
||||
/* create desktop widgets */
|
||||
create_launchers(&wlCtxCommon, &hmi_setting->launcher_list);
|
||||
|
||||
create_workspace_background(&wlCtx_WorkSpaceBackGround,
|
||||
&hmi_setting->workspace_background);
|
||||
|
||||
for (i = 0; i < hmi_setting->screen_num; i++) {
|
||||
wlCtx_BackGround[i].cmm = &wlCtxCommon;
|
||||
create_background(&wlCtx_BackGround[i],
|
||||
@ -1312,11 +1317,6 @@ int main(int argc, char **argv)
|
||||
create_button(&wlCtx_Button_4, hmi_setting->random.id,
|
||||
hmi_setting->random.filePath, 3);
|
||||
|
||||
create_workspace_background(&wlCtx_WorkSpaceBackGround,
|
||||
&hmi_setting->workspace_background);
|
||||
|
||||
create_launchers(&wlCtxCommon, &hmi_setting->launcher_list);
|
||||
|
||||
create_home_button(&wlCtx_HomeButton, hmi_setting->home.id,
|
||||
hmi_setting->home.filePath);
|
||||
|
||||
|
@ -506,7 +506,7 @@ delete_before_cursor(struct virtual_keyboard *keyboard)
|
||||
end = keyboard->surrounding_text + keyboard->surrounding_cursor;
|
||||
|
||||
zwp_input_method_context_v1_delete_surrounding_text(keyboard->context,
|
||||
(start - keyboard->surrounding_text) - keyboard->surrounding_cursor,
|
||||
start - keyboard->surrounding_text,
|
||||
end - start);
|
||||
zwp_input_method_context_v1_commit_string(keyboard->context,
|
||||
keyboard->serial,
|
||||
|
@ -1661,7 +1661,7 @@ widget_cairo_update_transform(struct widget *widget, cairo_t *cr)
|
||||
surface->allocation.width,
|
||||
surface->allocation.height,
|
||||
surface->buffer_scale);
|
||||
cairo_matrix_init(&m, matrix.d[0], matrix.d[4], matrix.d[1],
|
||||
cairo_matrix_init(&m, matrix.d[0], matrix.d[1], matrix.d[4],
|
||||
matrix.d[5], matrix.d[12], matrix.d[13]);
|
||||
cairo_transform(cr, &m);
|
||||
}
|
||||
|
@ -3459,11 +3459,7 @@ surface_opacity_binding(struct weston_pointer *pointer,
|
||||
return;
|
||||
|
||||
shsurf->view->alpha -= event->value * step;
|
||||
|
||||
if (shsurf->view->alpha > 1.0)
|
||||
shsurf->view->alpha = 1.0;
|
||||
if (shsurf->view->alpha < step)
|
||||
shsurf->view->alpha = step;
|
||||
shsurf->view->alpha = CLIP(shsurf->view->alpha, step, 1.0);
|
||||
|
||||
weston_view_geometry_dirty(shsurf->view);
|
||||
weston_surface_damage(surface);
|
||||
|
@ -583,9 +583,25 @@ set_notification_remove_surface(struct wl_listener *listener, void *data)
|
||||
struct hmi_controller *hmi_ctrl =
|
||||
wl_container_of(listener, hmi_ctrl,
|
||||
surface_removed);
|
||||
(void)data;
|
||||
struct ivi_layout_surface *ivisurf = data;
|
||||
|
||||
switch_mode(hmi_ctrl, hmi_ctrl->layout_mode);
|
||||
|
||||
/* set focus */
|
||||
if (hmi_ctrl->interface->surface_is_active(ivisurf)) {
|
||||
struct ivi_layout_surface **pp_surface = NULL;
|
||||
int32_t surface_length = 0;
|
||||
int32_t i;
|
||||
|
||||
hmi_ctrl->interface->get_surfaces(&surface_length, &pp_surface);
|
||||
|
||||
for (i = 0; i < surface_length; i++) {
|
||||
if (pp_surface[i] != ivisurf) {
|
||||
hmi_ctrl->interface->surface_activate(pp_surface[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -643,6 +659,9 @@ set_notification_configure_surface(struct wl_listener *listener, void *data)
|
||||
ivisurfs = NULL;
|
||||
}
|
||||
|
||||
hmi_ctrl->interface->layer_add_surface(application_layer, ivisurf);
|
||||
hmi_ctrl->interface->surface_activate(ivisurf);
|
||||
|
||||
switch_mode(hmi_ctrl, hmi_ctrl->layout_mode);
|
||||
}
|
||||
|
||||
@ -678,7 +697,9 @@ set_notification_configure_desktop_surface(struct wl_listener *listener, void *d
|
||||
0, surface->width, surface->height);
|
||||
}
|
||||
|
||||
hmi_ctrl->interface->surface_activate(ivisurf);
|
||||
hmi_ctrl->interface->commit_changes();
|
||||
|
||||
switch_mode(hmi_ctrl, hmi_ctrl->layout_mode);
|
||||
}
|
||||
|
||||
|
@ -330,6 +330,18 @@ struct ivi_layout_interface {
|
||||
int32_t (*surface_set_id)(struct ivi_layout_surface *ivisurf,
|
||||
uint32_t id_surface);
|
||||
|
||||
/**
|
||||
* \brief activate ivi_layout_surface
|
||||
*
|
||||
* The surface must be added to a layer before it can be activated.
|
||||
*/
|
||||
void (*surface_activate)(struct ivi_layout_surface *ivisurf);
|
||||
|
||||
/**
|
||||
* \brief check if ivi_layout_surface is active
|
||||
*/
|
||||
bool (*surface_is_active)(struct ivi_layout_surface *ivisurf);
|
||||
|
||||
/**
|
||||
* layer controller interface
|
||||
*/
|
||||
|
@ -55,6 +55,8 @@ struct ivi_layout_surface {
|
||||
struct weston_surface *surface;
|
||||
struct weston_desktop_surface *weston_desktop_surface;
|
||||
|
||||
int focus_count;
|
||||
|
||||
struct ivi_layout_view *ivi_view;
|
||||
|
||||
struct ivi_layout_surface_properties prop;
|
||||
|
@ -76,6 +76,11 @@ void
|
||||
ivi_layout_surface_configure(struct ivi_layout_surface *ivisurf,
|
||||
int32_t width, int32_t height);
|
||||
|
||||
void
|
||||
ivi_layout_surface_activate_with_seat(struct ivi_layout_surface *ivisurf,
|
||||
struct weston_seat *seat,
|
||||
uint32_t activate_flags);
|
||||
|
||||
struct ivi_layout_surface*
|
||||
ivi_layout_surface_create(struct weston_surface *wl_surface,
|
||||
uint32_t id_surface);
|
||||
|
@ -1785,6 +1785,67 @@ ivi_layout_surface_set_id(struct ivi_layout_surface *ivisurf,
|
||||
return IVI_SUCCEEDED;
|
||||
}
|
||||
|
||||
static void
|
||||
deactivate_current_surface(struct weston_seat *seat)
|
||||
{
|
||||
struct ivi_layout_surface *ivisurf =
|
||||
shell_get_focused_ivi_layout_surface(seat);
|
||||
struct weston_desktop_surface *desktop_surface;
|
||||
|
||||
if (!ivisurf)
|
||||
return;
|
||||
|
||||
shell_set_focused_ivi_layout_surface(NULL, seat);
|
||||
desktop_surface = ivisurf->weston_desktop_surface;
|
||||
if (--ivisurf->focus_count == 0 && desktop_surface)
|
||||
weston_desktop_surface_set_activated(desktop_surface, false);
|
||||
}
|
||||
|
||||
static void
|
||||
surface_activate(struct ivi_layout_surface *ivisurf, struct weston_seat *seat)
|
||||
{
|
||||
struct weston_desktop_surface *dsurf = ivisurf->weston_desktop_surface;
|
||||
|
||||
deactivate_current_surface(seat);
|
||||
|
||||
shell_set_focused_ivi_layout_surface(ivisurf, seat);
|
||||
if (ivisurf->focus_count++ == 0 && dsurf)
|
||||
weston_desktop_surface_set_activated(dsurf, true);
|
||||
}
|
||||
|
||||
static void
|
||||
ivi_layout_surface_activate(struct ivi_layout_surface *ivisurf)
|
||||
{
|
||||
struct weston_seat *seat;
|
||||
|
||||
assert(ivisurf->ivi_view);
|
||||
|
||||
wl_list_for_each(seat, &ivisurf->surface->compositor->seat_list, link) {
|
||||
weston_view_activate_input(ivisurf->ivi_view->view, seat,
|
||||
WESTON_ACTIVATE_FLAG_NONE);
|
||||
surface_activate(ivisurf, seat);
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
ivi_layout_surface_is_active(struct ivi_layout_surface *ivisurf)
|
||||
{
|
||||
assert(ivisurf);
|
||||
|
||||
return (ivisurf->focus_count > 0);
|
||||
}
|
||||
|
||||
void
|
||||
ivi_layout_surface_activate_with_seat(struct ivi_layout_surface *ivisurf,
|
||||
struct weston_seat *seat,
|
||||
uint32_t activate_flags)
|
||||
{
|
||||
weston_view_activate_input(ivisurf->ivi_view->view,
|
||||
seat, activate_flags);
|
||||
|
||||
surface_activate(ivisurf, seat);
|
||||
}
|
||||
|
||||
static void
|
||||
ivi_layout_surface_set_transition(struct ivi_layout_surface *ivisurf,
|
||||
enum ivi_layout_transition_type type,
|
||||
@ -2132,6 +2193,8 @@ static struct ivi_layout_interface ivi_layout_interface = {
|
||||
.surface_set_transition = ivi_layout_surface_set_transition,
|
||||
.surface_set_transition_duration = ivi_layout_surface_set_transition_duration,
|
||||
.surface_set_id = ivi_layout_surface_set_id,
|
||||
.surface_activate = ivi_layout_surface_activate,
|
||||
.surface_is_active = ivi_layout_surface_is_active,
|
||||
|
||||
/**
|
||||
* layer controller interfaces
|
||||
|
@ -95,6 +95,14 @@ struct ivi_input_panel_surface
|
||||
struct wl_list link;
|
||||
};
|
||||
|
||||
struct ivi_shell_seat {
|
||||
struct weston_seat *seat;
|
||||
struct wl_listener seat_destroy_listener;
|
||||
struct ivi_layout_surface *focused_ivisurf;
|
||||
|
||||
struct wl_list link; /** ivi_shell::seat_list */
|
||||
};
|
||||
|
||||
/*
|
||||
* Implementation of ivi_surface
|
||||
*/
|
||||
@ -128,6 +136,43 @@ shell_get_ivi_layout_surface(struct weston_surface *surface)
|
||||
return shsurf->layout_surface;
|
||||
}
|
||||
|
||||
static void
|
||||
ivi_shell_seat_handle_destroy(struct wl_listener *listener, void *data);
|
||||
|
||||
static struct ivi_shell_seat *
|
||||
get_ivi_shell_seat(struct weston_seat *seat)
|
||||
{
|
||||
struct wl_listener *listener;
|
||||
|
||||
if (!seat)
|
||||
return NULL;
|
||||
|
||||
listener = wl_signal_get(&seat->destroy_signal,
|
||||
ivi_shell_seat_handle_destroy);
|
||||
if (!listener)
|
||||
return NULL;
|
||||
|
||||
return container_of(listener, struct ivi_shell_seat,
|
||||
seat_destroy_listener);
|
||||
}
|
||||
|
||||
struct ivi_layout_surface *
|
||||
shell_get_focused_ivi_layout_surface(struct weston_seat *seat)
|
||||
{
|
||||
struct ivi_shell_seat *shseat = get_ivi_shell_seat(seat);
|
||||
|
||||
return shseat->focused_ivisurf;
|
||||
}
|
||||
|
||||
void
|
||||
shell_set_focused_ivi_layout_surface(struct ivi_layout_surface *ivisurf,
|
||||
struct weston_seat *seat)
|
||||
{
|
||||
struct ivi_shell_seat *shseat = get_ivi_shell_seat(seat);
|
||||
|
||||
shseat->focused_ivisurf = ivisurf;
|
||||
}
|
||||
|
||||
void
|
||||
shell_surface_send_configure(struct weston_surface *surface,
|
||||
int32_t width, int32_t height)
|
||||
@ -175,12 +220,19 @@ ivi_shell_surface_get_label(struct weston_surface *surface,
|
||||
static void
|
||||
layout_surface_cleanup(struct ivi_shell_surface *ivisurf)
|
||||
{
|
||||
struct weston_seat *seat;
|
||||
assert(ivisurf->layout_surface != NULL);
|
||||
|
||||
/* destroy weston_surface destroy signal. */
|
||||
if (!ivisurf->layout_surface->weston_desktop_surface)
|
||||
wl_list_remove(&ivisurf->surface_destroy_listener.link);
|
||||
|
||||
wl_list_for_each(seat, &ivisurf->surface->compositor->seat_list, link) {
|
||||
struct ivi_shell_seat *shseat = get_ivi_shell_seat(seat);
|
||||
if (shseat->focused_ivisurf == ivisurf->layout_surface)
|
||||
shseat->focused_ivisurf = NULL;
|
||||
}
|
||||
|
||||
ivi_layout_surface_destroy(ivisurf->layout_surface);
|
||||
ivisurf->layout_surface = NULL;
|
||||
|
||||
@ -357,6 +409,44 @@ bind_ivi_application(struct wl_client *client,
|
||||
shell, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* ivi_shell_seat
|
||||
*/
|
||||
static void
|
||||
ivi_shell_seat_destroy(struct ivi_shell_seat *shseat)
|
||||
{
|
||||
wl_list_remove(&shseat->seat_destroy_listener.link);
|
||||
wl_list_remove(&shseat->link);
|
||||
free(shseat);
|
||||
}
|
||||
|
||||
static void
|
||||
ivi_shell_seat_handle_destroy(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct ivi_shell_seat *shseat = container_of(listener,
|
||||
struct ivi_shell_seat,
|
||||
seat_destroy_listener);
|
||||
|
||||
ivi_shell_seat_destroy(shseat);
|
||||
}
|
||||
|
||||
static struct ivi_shell_seat *
|
||||
ivi_shell_seat_create(struct ivi_shell *shell, struct weston_seat *seat)
|
||||
{
|
||||
struct ivi_shell_seat *shseat;
|
||||
|
||||
shseat = xzalloc(sizeof *shseat);
|
||||
|
||||
shseat->seat = seat;
|
||||
|
||||
shseat->seat_destroy_listener.notify = ivi_shell_seat_handle_destroy;
|
||||
wl_signal_add(&seat->destroy_signal, &shseat->seat_destroy_listener);
|
||||
|
||||
wl_list_insert(&shell->seat_list, &shseat->link);
|
||||
|
||||
return shseat;
|
||||
}
|
||||
|
||||
void
|
||||
input_panel_destroy(struct ivi_shell *shell);
|
||||
|
||||
@ -369,11 +459,13 @@ shell_destroy(struct wl_listener *listener, void *data)
|
||||
struct ivi_shell *shell =
|
||||
container_of(listener, struct ivi_shell, destroy_listener);
|
||||
struct ivi_shell_surface *ivisurf, *next;
|
||||
struct ivi_shell_seat *shseat, *shseat_next;
|
||||
|
||||
ivi_layout_ivi_shell_destroy();
|
||||
|
||||
wl_list_remove(&shell->destroy_listener.link);
|
||||
wl_list_remove(&shell->wake_listener.link);
|
||||
wl_list_remove(&shell->seat_created_listener.link);
|
||||
|
||||
if (shell->text_backend) {
|
||||
text_backend_destroy(shell->text_backend);
|
||||
@ -387,6 +479,9 @@ shell_destroy(struct wl_listener *listener, void *data)
|
||||
free(ivisurf);
|
||||
}
|
||||
|
||||
wl_list_for_each_safe(shseat, shseat_next, &shell->seat_list, link)
|
||||
ivi_shell_seat_destroy(shseat);
|
||||
|
||||
ivi_layout_fini();
|
||||
|
||||
weston_desktop_destroy(shell->desktop);
|
||||
@ -473,9 +568,8 @@ activate_binding(struct weston_seat *seat,
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: need to activate the surface like
|
||||
kiosk_shell_surface_activate() */
|
||||
weston_view_activate_input(focus_view, seat, flags);
|
||||
ivi_layout_surface_activate_with_seat(ivisurf->layout_surface, seat,
|
||||
flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -706,6 +800,16 @@ static const struct weston_desktop_api shell_desktop_api = {
|
||||
.set_xwayland_position = desktop_surface_set_xwayland_position,
|
||||
};
|
||||
|
||||
static void
|
||||
ivi_shell_handle_seat_created(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct weston_seat *seat = data;
|
||||
struct ivi_shell *shell =
|
||||
container_of(listener, struct ivi_shell, seat_created_listener);
|
||||
|
||||
ivi_shell_seat_create(shell, seat);
|
||||
}
|
||||
|
||||
/*
|
||||
* end of libweston-desktop
|
||||
*/
|
||||
@ -1042,6 +1146,7 @@ wet_shell_init(struct weston_compositor *compositor,
|
||||
int *argc, char *argv[])
|
||||
{
|
||||
struct ivi_shell *shell;
|
||||
struct weston_seat *seat;
|
||||
|
||||
shell = xzalloc(sizeof *shell);
|
||||
|
||||
@ -1066,6 +1171,13 @@ wet_shell_init(struct weston_compositor *compositor,
|
||||
shell, bind_ivi_application) == NULL)
|
||||
goto err_desktop;
|
||||
|
||||
wl_list_init(&shell->seat_list);
|
||||
wl_list_for_each(seat, &compositor->seat_list, link)
|
||||
ivi_shell_seat_create(shell, seat);
|
||||
shell->seat_created_listener.notify = ivi_shell_handle_seat_created;
|
||||
wl_signal_add(&compositor->seat_created_signal,
|
||||
&shell->seat_created_listener);
|
||||
|
||||
ivi_layout_init(compositor, shell);
|
||||
|
||||
screenshooter_create(compositor);
|
||||
|
@ -39,6 +39,7 @@ struct ivi_shell
|
||||
struct wl_listener show_input_panel_listener;
|
||||
struct wl_listener hide_input_panel_listener;
|
||||
struct wl_listener update_input_panel_listener;
|
||||
struct wl_listener seat_created_listener;
|
||||
|
||||
struct weston_compositor *compositor;
|
||||
|
||||
@ -52,6 +53,8 @@ struct ivi_shell
|
||||
struct wl_resource *binding;
|
||||
struct wl_list surfaces;
|
||||
} input_panel;
|
||||
|
||||
struct wl_list seat_list;
|
||||
};
|
||||
|
||||
void
|
||||
@ -63,6 +66,13 @@ struct ivi_layout_surface;
|
||||
struct ivi_layout_surface *
|
||||
shell_get_ivi_layout_surface(struct weston_surface *surface);
|
||||
|
||||
struct ivi_layout_surface *
|
||||
shell_get_focused_ivi_layout_surface(struct weston_seat *seat);
|
||||
|
||||
void
|
||||
shell_set_focused_ivi_layout_surface(struct ivi_layout_surface *ivisurface,
|
||||
struct weston_seat *seat);
|
||||
|
||||
void
|
||||
shell_ensure_text_input(struct ivi_shell *shell);
|
||||
bool
|
||||
|
@ -75,56 +75,78 @@ static void
|
||||
drm_backend_create_faked_zpos(struct drm_device *device)
|
||||
{
|
||||
struct drm_backend *b = device->backend;
|
||||
struct drm_plane *plane;
|
||||
struct drm_plane *plane, *tmp;
|
||||
struct wl_list tmp_list;
|
||||
uint64_t zpos = 0ULL;
|
||||
uint64_t zpos_min_primary;
|
||||
uint64_t zpos_min_overlay;
|
||||
uint64_t zpos_min_cursor;
|
||||
|
||||
zpos_min_primary = zpos;
|
||||
/* if the property is there, bail out sooner */
|
||||
wl_list_for_each(plane, &device->plane_list, link) {
|
||||
/* if the property is there, bail out sooner */
|
||||
if (plane->props[WDRM_PLANE_ZPOS].prop_id != 0)
|
||||
return;
|
||||
|
||||
if (plane->type != WDRM_PLANE_TYPE_PRIMARY)
|
||||
continue;
|
||||
zpos++;
|
||||
}
|
||||
|
||||
zpos_min_overlay = zpos;
|
||||
wl_list_for_each(plane, &device->plane_list, link) {
|
||||
if (plane->type != WDRM_PLANE_TYPE_OVERLAY)
|
||||
continue;
|
||||
zpos++;
|
||||
}
|
||||
|
||||
zpos_min_cursor = zpos;
|
||||
wl_list_for_each(plane, &device->plane_list, link) {
|
||||
if (plane->type != WDRM_PLANE_TYPE_CURSOR)
|
||||
continue;
|
||||
zpos++;
|
||||
}
|
||||
|
||||
drm_debug(b, "[drm-backend] zpos property not found. "
|
||||
"Using invented immutable zpos values:\n");
|
||||
/* assume that invented zpos values are immutable */
|
||||
wl_list_for_each(plane, &device->plane_list, link) {
|
||||
if (plane->type == WDRM_PLANE_TYPE_PRIMARY) {
|
||||
plane->zpos_min = zpos_min_primary;
|
||||
plane->zpos_max = zpos_min_primary;
|
||||
} else if (plane->type == WDRM_PLANE_TYPE_OVERLAY) {
|
||||
plane->zpos_min = zpos_min_overlay;
|
||||
plane->zpos_max = zpos_min_overlay;
|
||||
} else if (plane->type == WDRM_PLANE_TYPE_CURSOR) {
|
||||
plane->zpos_min = zpos_min_cursor;
|
||||
plane->zpos_max = zpos_min_cursor;
|
||||
}
|
||||
|
||||
wl_list_init(&tmp_list);
|
||||
wl_list_insert_list(&tmp_list, &device->plane_list);
|
||||
wl_list_init(&device->plane_list);
|
||||
|
||||
zpos_min_primary = zpos;
|
||||
wl_list_for_each_safe(plane, tmp, &tmp_list, link) {
|
||||
if (plane->type != WDRM_PLANE_TYPE_PRIMARY)
|
||||
continue;
|
||||
|
||||
plane->zpos_min = zpos_min_primary;
|
||||
plane->zpos_max = zpos_min_primary;
|
||||
wl_list_remove(&plane->link);
|
||||
wl_list_insert(&device->plane_list, &plane->link);
|
||||
zpos++;
|
||||
|
||||
drm_debug(b, "\t[plane] %s plane %d, zpos_min %"PRIu64", "
|
||||
"zpos_max %"PRIu64"\n",
|
||||
drm_output_get_plane_type_name(plane),
|
||||
plane->plane_id, plane->zpos_min, plane->zpos_max);
|
||||
}
|
||||
|
||||
zpos_min_overlay = zpos;
|
||||
wl_list_for_each_safe(plane, tmp, &tmp_list, link) {
|
||||
if (plane->type != WDRM_PLANE_TYPE_OVERLAY)
|
||||
continue;
|
||||
|
||||
plane->zpos_min = zpos_min_overlay;
|
||||
plane->zpos_max = zpos_min_overlay;
|
||||
wl_list_remove(&plane->link);
|
||||
wl_list_insert(&device->plane_list, &plane->link);
|
||||
zpos++;
|
||||
|
||||
drm_debug(b, "\t[plane] %s plane %d, zpos_min %"PRIu64", "
|
||||
"zpos_max %"PRIu64"\n",
|
||||
drm_output_get_plane_type_name(plane),
|
||||
plane->plane_id, plane->zpos_min, plane->zpos_max);
|
||||
}
|
||||
|
||||
zpos_min_cursor = zpos;
|
||||
wl_list_for_each_safe(plane, tmp, &tmp_list, link) {
|
||||
if (plane->type != WDRM_PLANE_TYPE_CURSOR)
|
||||
continue;
|
||||
|
||||
plane->zpos_min = zpos_min_cursor;
|
||||
plane->zpos_max = zpos_min_cursor;
|
||||
wl_list_remove(&plane->link);
|
||||
wl_list_insert(&device->plane_list, &plane->link);
|
||||
zpos++;
|
||||
|
||||
drm_debug(b, "\t[plane] %s plane %d, zpos_min %"PRIu64", "
|
||||
"zpos_max %"PRIu64"\n",
|
||||
drm_output_get_plane_type_name(plane),
|
||||
plane->plane_id, plane->zpos_min, plane->zpos_max);
|
||||
}
|
||||
|
||||
assert(wl_list_empty(&tmp_list));
|
||||
}
|
||||
|
||||
static int
|
||||
@ -553,13 +575,19 @@ drm_output_pick_writeback_capture_task(struct drm_output *output)
|
||||
int32_t height = output->base.current_mode->height;
|
||||
uint32_t format = output->format->format;
|
||||
|
||||
assert(output->device->atomic_modeset);
|
||||
|
||||
ct = weston_output_pull_capture_task(&output->base,
|
||||
WESTON_OUTPUT_CAPTURE_SOURCE_WRITEBACK,
|
||||
width, height, pixel_format_get_info(format));
|
||||
if (!ct)
|
||||
return;
|
||||
|
||||
assert(output->device->atomic_modeset);
|
||||
if (output->base.disable_planes > 0) {
|
||||
msg = "drm: KMS planes usage is disabled for now, so " \
|
||||
"writeback capture tasks are rejected";
|
||||
goto err;
|
||||
}
|
||||
|
||||
wb = drm_output_find_compatible_writeback(output);
|
||||
if (!wb) {
|
||||
@ -636,7 +664,8 @@ drm_output_repaint(struct weston_output *output_base, pixman_region32_t *damage)
|
||||
if (drm_output_ensure_hdr_output_metadata_blob(output) < 0)
|
||||
goto err;
|
||||
|
||||
drm_output_pick_writeback_capture_task(output);
|
||||
if (device->atomic_modeset)
|
||||
drm_output_pick_writeback_capture_task(output);
|
||||
|
||||
drm_output_render(state, damage);
|
||||
scanout_state = drm_output_state_get_plane(state,
|
||||
@ -948,7 +977,7 @@ drm_output_apply_mode(struct drm_output *output)
|
||||
}
|
||||
}
|
||||
|
||||
if (device->atomic_modeset && !output->base.disable_planes)
|
||||
if (device->atomic_modeset)
|
||||
weston_output_update_capture_info(&output->base,
|
||||
WESTON_OUTPUT_CAPTURE_SOURCE_WRITEBACK,
|
||||
output->base.current_mode->width,
|
||||
@ -2138,7 +2167,7 @@ drm_output_enable(struct weston_output *base)
|
||||
output->base.switch_mode = drm_output_switch_mode;
|
||||
output->base.set_gamma = drm_output_set_gamma;
|
||||
|
||||
if (device->atomic_modeset && !base->disable_planes)
|
||||
if (device->atomic_modeset)
|
||||
weston_output_update_capture_info(base, WESTON_OUTPUT_CAPTURE_SOURCE_WRITEBACK,
|
||||
base->current_mode->width,
|
||||
base->current_mode->height,
|
||||
|
@ -42,10 +42,6 @@
|
||||
#include "pixel-formats.h"
|
||||
#include "presentation-time-server-protocol.h"
|
||||
|
||||
#ifndef DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
|
||||
#define DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP 0x15
|
||||
#endif
|
||||
|
||||
struct drm_property_enum_info plane_type_enums[] = {
|
||||
[WDRM_PLANE_TYPE_PRIMARY] = {
|
||||
.name = "Primary",
|
||||
@ -1851,10 +1847,19 @@ init_kms_caps(struct drm_device *device)
|
||||
|
||||
drmSetClientCap(device->drm.fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1);
|
||||
|
||||
#if 0
|
||||
/* FIXME: DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP isn't merged into mainline so
|
||||
* we can't really use it at this point. Until then, make it so we
|
||||
* don't support it. After it gets merged, we can flip this back such
|
||||
* that we don't need to revert the entire tearing work, and we can
|
||||
* still get it all back, when the capability is actually available in
|
||||
* the kernel. */
|
||||
ret = drmGetCap(device->drm.fd, DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP, &cap);
|
||||
if (ret != 0)
|
||||
cap = 0;
|
||||
device->tearing_supported = cap;
|
||||
#endif
|
||||
device->tearing_supported = 0;
|
||||
weston_log("DRM: does not support async page flipping\n");
|
||||
|
||||
/*
|
||||
* KMS support for hardware planes cannot properly synchronize
|
||||
|
@ -58,7 +58,7 @@ deps_drm = [
|
||||
]
|
||||
|
||||
if get_option('renderer-gl')
|
||||
dep_gbm = dependency('gbm', required: false)
|
||||
dep_gbm = dependency('gbm', required: false, version: '>= 21.1.1')
|
||||
if not dep_gbm.found()
|
||||
error('drm-backend with GL renderer requires gbm which was not found. Or, you can use \'-Drenderer-gl=false\'.')
|
||||
endif
|
||||
|
@ -566,6 +566,7 @@ drm_output_find_plane_for_view(struct drm_output_state *state,
|
||||
/* if the view covers the whole output, put it in the
|
||||
* scanout plane, not overlay */
|
||||
if (view_matches_entire_output &&
|
||||
weston_view_is_opaque(ev, &ev->transform.boundingbox) &&
|
||||
!scanout_has_view_assigned)
|
||||
continue;
|
||||
break;
|
||||
|
@ -338,72 +338,19 @@ finish_frame_handler(void *data)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct weston_mode *
|
||||
rdp_insert_new_mode(struct weston_output *output, int width, int height, int rate)
|
||||
{
|
||||
struct weston_mode *ret;
|
||||
ret = xzalloc(sizeof *ret);
|
||||
ret->width = width;
|
||||
ret->height = height;
|
||||
ret->refresh = rate;
|
||||
ret->flags = WL_OUTPUT_MODE_PREFERRED;
|
||||
wl_list_insert(&output->mode_list, &ret->link);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* It doesn't make sense for RDP to have more than one mode, so
|
||||
* we make sure that we have only one.
|
||||
*/
|
||||
static struct weston_mode *
|
||||
ensure_single_mode(struct weston_output *output, struct weston_mode *target)
|
||||
{
|
||||
struct rdp_output *rdpOutput = to_rdp_output(output);
|
||||
struct rdp_backend *b = rdpOutput->backend;
|
||||
struct weston_mode *iter, *local = NULL, *new_mode;
|
||||
|
||||
wl_list_for_each(iter, &output->mode_list, link) {
|
||||
assert(!local);
|
||||
|
||||
if ((iter->width == target->width) &&
|
||||
(iter->height == target->height) &&
|
||||
(iter->refresh == target->refresh)) {
|
||||
return iter;
|
||||
} else {
|
||||
local = iter;
|
||||
}
|
||||
}
|
||||
/* Make sure we create the new one before freeing the old one
|
||||
* because some mode switch code uses pointer comparisons! If
|
||||
* we freed the old mode first, malloc could theoretically give
|
||||
* us back the same pointer.
|
||||
*/
|
||||
new_mode = rdp_insert_new_mode(output,
|
||||
target->width, target->height,
|
||||
b->rdp_monitor_refresh_rate);
|
||||
if (local) {
|
||||
wl_list_remove(&local->link);
|
||||
free(local);
|
||||
}
|
||||
|
||||
return new_mode;
|
||||
}
|
||||
|
||||
static void
|
||||
rdp_output_set_mode(struct weston_output *base, struct weston_mode *mode)
|
||||
{
|
||||
struct rdp_output *rdpOutput = container_of(base, struct rdp_output, base);
|
||||
struct rdp_backend *b = rdpOutput->backend;
|
||||
struct weston_mode *cur;
|
||||
struct weston_output *output = base;
|
||||
struct rdp_peers_item *rdpPeer;
|
||||
rdpSettings *settings;
|
||||
struct weston_renderbuffer *new_renderbuffer;
|
||||
|
||||
mode->refresh = b->rdp_monitor_refresh_rate;
|
||||
cur = ensure_single_mode(base, mode);
|
||||
weston_output_set_single_mode(base, mode);
|
||||
|
||||
base->current_mode = cur;
|
||||
base->native_mode = cur;
|
||||
if (base->enabled) {
|
||||
const struct pixman_renderer_interface *pixman;
|
||||
const struct pixel_format_info *pfmt;
|
||||
|
@ -947,56 +947,15 @@ vnc_output_assign_planes(struct weston_output *base)
|
||||
vnc_output_update_cursor(output);
|
||||
}
|
||||
|
||||
static struct weston_mode *
|
||||
vnc_insert_new_mode(struct weston_output *output, int width, int height,
|
||||
int rate)
|
||||
{
|
||||
struct weston_mode *mode;
|
||||
|
||||
mode = xzalloc(sizeof *mode);
|
||||
mode->width = width;
|
||||
mode->height = height;
|
||||
mode->refresh = rate;
|
||||
wl_list_insert(&output->mode_list, &mode->link);
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
static struct weston_mode *
|
||||
vnc_ensure_matching_mode(struct vnc_output *output,
|
||||
struct weston_mode *target)
|
||||
{
|
||||
struct vnc_backend *backend = output->backend;
|
||||
struct weston_mode *local;
|
||||
|
||||
wl_list_for_each(local, &output->base.mode_list, link) {
|
||||
if ((local->width == target->width) &&
|
||||
(local->height == target->height))
|
||||
return local;
|
||||
}
|
||||
|
||||
return vnc_insert_new_mode(&output->base, target->width, target->height,
|
||||
backend->vnc_monitor_refresh_rate);
|
||||
}
|
||||
|
||||
static int
|
||||
vnc_switch_mode(struct weston_output *base, struct weston_mode *target_mode)
|
||||
{
|
||||
struct vnc_output *output = to_vnc_output(base);
|
||||
struct weston_mode *local_mode;
|
||||
struct weston_size fb_size;
|
||||
|
||||
assert(output);
|
||||
|
||||
local_mode = vnc_ensure_matching_mode(output, target_mode);
|
||||
|
||||
if (local_mode == base->current_mode)
|
||||
return 0;
|
||||
|
||||
base->current_mode->flags &= ~WL_OUTPUT_MODE_CURRENT;
|
||||
|
||||
base->current_mode = base->native_mode = local_mode;
|
||||
base->current_mode->flags |= WL_OUTPUT_MODE_CURRENT;
|
||||
weston_output_set_single_mode(base, target_mode);
|
||||
|
||||
fb_size.width = target_mode->width;
|
||||
fb_size.height = target_mode->height;
|
||||
@ -1015,7 +974,6 @@ vnc_output_set_size(struct weston_output *base, int width, int height)
|
||||
{
|
||||
struct vnc_output *output = to_vnc_output(base);
|
||||
struct vnc_backend *backend = output->backend;
|
||||
struct weston_mode *current_mode;
|
||||
struct weston_mode init_mode;
|
||||
|
||||
/* We can only be called once. */
|
||||
@ -1027,10 +985,7 @@ vnc_output_set_size(struct weston_output *base, int width, int height)
|
||||
init_mode.height = height;
|
||||
init_mode.refresh = backend->vnc_monitor_refresh_rate;
|
||||
|
||||
current_mode = vnc_ensure_matching_mode(output, &init_mode);
|
||||
current_mode->flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED;
|
||||
|
||||
output->base.current_mode = output->base.native_mode = current_mode;
|
||||
weston_output_set_single_mode(base, &init_mode);
|
||||
|
||||
output->base.start_repaint_loop = vnc_output_start_repaint_loop;
|
||||
output->base.repaint = vnc_output_repaint;
|
||||
|
@ -2897,6 +2897,8 @@ wayland_backend_create(struct weston_compositor *compositor,
|
||||
|
||||
create_cursor(b, new_config);
|
||||
|
||||
b->fullscreen = new_config->fullscreen;
|
||||
|
||||
b->formats_count = ARRAY_LENGTH(wayland_formats);
|
||||
b->formats = pixel_format_get_array(wayland_formats, b->formats_count);
|
||||
|
||||
|
@ -7045,6 +7045,45 @@ weston_output_get_color_characteristics(struct weston_output *output)
|
||||
return &output->color_characteristics;
|
||||
}
|
||||
|
||||
WL_EXPORT void
|
||||
weston_output_set_single_mode(struct weston_output *output,
|
||||
struct weston_mode *target)
|
||||
{
|
||||
struct weston_mode *iter, *local = NULL, *mode;
|
||||
|
||||
wl_list_for_each(iter, &output->mode_list, link) {
|
||||
assert(!local);
|
||||
|
||||
if ((iter->width == target->width) &&
|
||||
(iter->height == target->height) &&
|
||||
(iter->refresh == target->refresh)) {
|
||||
mode = iter;
|
||||
goto out;
|
||||
} else {
|
||||
local = iter;
|
||||
}
|
||||
}
|
||||
/* Make sure we create the new one before freeing the old one
|
||||
* because some mode switch code uses pointer comparisons! If
|
||||
* we freed the old mode first, malloc could theoretically give
|
||||
* us back the same pointer.
|
||||
*/
|
||||
mode = xzalloc(sizeof *mode);
|
||||
mode->width = target->width;
|
||||
mode->height = target->height;
|
||||
mode->refresh = target->refresh;
|
||||
mode->flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED;
|
||||
wl_list_insert(&output->mode_list, &mode->link);
|
||||
out:
|
||||
output->current_mode = mode;
|
||||
output->native_mode = mode;
|
||||
|
||||
if (local) {
|
||||
wl_list_remove(&local->link);
|
||||
free(local);
|
||||
}
|
||||
}
|
||||
|
||||
/** Initializes a weston_output object with enough data so
|
||||
** an output can be configured.
|
||||
*
|
||||
|
@ -972,6 +972,7 @@ weston_pointer_start_drag(struct weston_pointer *pointer,
|
||||
icon->committed_private = drag;
|
||||
weston_surface_set_label_func(icon,
|
||||
pointer_drag_surface_get_label);
|
||||
drag->base.offset = weston_coord_surface(0, 0, icon);
|
||||
} else {
|
||||
drag->base.icon = NULL;
|
||||
}
|
||||
@ -990,7 +991,6 @@ weston_pointer_start_drag(struct weston_pointer *pointer,
|
||||
if (keyboard)
|
||||
weston_keyboard_start_grab(keyboard, &drag->base.keyboard_grab);
|
||||
|
||||
drag->base.offset = weston_coord_surface(0, 0, icon);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1036,6 +1036,7 @@ weston_touch_start_drag(struct weston_touch *touch,
|
||||
icon->committed_private = drag;
|
||||
weston_surface_set_label_func(icon,
|
||||
touch_drag_surface_get_label);
|
||||
drag->base.offset = weston_coord_surface(0, 0, icon);
|
||||
} else {
|
||||
drag->base.icon = NULL;
|
||||
}
|
||||
@ -1055,7 +1056,6 @@ weston_touch_start_drag(struct weston_touch *touch,
|
||||
|
||||
drag_grab_touch_focus(drag);
|
||||
|
||||
drag->base.offset = weston_coord_surface(0, 0, icon);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -538,6 +538,9 @@ weston_desktop_seat_popup_grab_add_surface(struct weston_desktop_seat *seat,
|
||||
|
||||
wl_list_insert(&seat->popup_grab.surfaces, link);
|
||||
|
||||
if (!seat->popup_grab.keyboard.keyboard)
|
||||
return;
|
||||
|
||||
desktop_surface =
|
||||
weston_desktop_seat_popup_grab_get_topmost_surface(seat);
|
||||
surface = weston_desktop_surface_get_surface(desktop_surface);
|
||||
@ -558,6 +561,9 @@ weston_desktop_seat_popup_grab_remove_surface(struct weston_desktop_seat *seat,
|
||||
struct weston_desktop_surface *desktop_surface;
|
||||
struct weston_surface *surface;
|
||||
|
||||
if (!seat->popup_grab.keyboard.keyboard)
|
||||
return;
|
||||
|
||||
desktop_surface =
|
||||
weston_desktop_seat_popup_grab_get_topmost_surface(seat);
|
||||
surface = weston_desktop_surface_get_surface(desktop_surface);
|
||||
|
@ -888,6 +888,8 @@ weston_desktop_surface_foreach_child(struct weston_desktop_surface *surface,
|
||||
{
|
||||
struct weston_desktop_surface *child;
|
||||
|
||||
wl_list_for_each(child, &surface->children_list, children_link)
|
||||
callback(child, user_data);
|
||||
wl_list_for_each(child, &surface->children_list, children_link) {
|
||||
if (weston_desktop_surface_get_user_data(child))
|
||||
callback(child, user_data);
|
||||
}
|
||||
}
|
||||
|
@ -260,6 +260,10 @@ weston_output_disable_planes_incr(struct weston_output *output);
|
||||
void
|
||||
weston_output_disable_planes_decr(struct weston_output *output);
|
||||
|
||||
void
|
||||
weston_output_set_single_mode(struct weston_output *output,
|
||||
struct weston_mode *target);
|
||||
|
||||
/* weston_plane */
|
||||
|
||||
void
|
||||
|
@ -112,11 +112,6 @@ lib_weston = shared_library(
|
||||
dependencies: deps_libweston
|
||||
)
|
||||
|
||||
deps_for_libweston_users = [
|
||||
dep_wayland_server,
|
||||
dep_pixman,
|
||||
dep_xkbcommon,
|
||||
]
|
||||
|
||||
# For external users, like Weston.
|
||||
dep_libweston_public = declare_dependency(
|
||||
@ -255,6 +250,7 @@ lib_gl_borders = static_library(
|
||||
dependencies: [
|
||||
dep_lib_cairo_shared,
|
||||
dep_egl, # for gl-renderer.h
|
||||
deps_for_libweston_users,
|
||||
],
|
||||
build_by_default: false,
|
||||
install: false
|
||||
|
@ -207,6 +207,7 @@ with this value in the environment for all child processes to allow them to
|
||||
connect to the right server automatically.
|
||||
.BR \-\-version
|
||||
Print the program version.
|
||||
.TP
|
||||
\fB\-\-wait-for-debugger\fR
|
||||
Raises SIGSTOP before initializing the compositor. This allows the user to
|
||||
attach with a debugger and continue execution by sending SIGCONT. This is
|
||||
|
@ -1,6 +1,6 @@
|
||||
project('weston',
|
||||
'c',
|
||||
version: '12.0.0',
|
||||
version: '12.0.4',
|
||||
default_options: [
|
||||
'warning_level=3',
|
||||
'c_std=gnu99',
|
||||
@ -153,6 +153,13 @@ prog_python = import('python').find_installation('python3')
|
||||
files_xxd_py = files('tools/xxd.py')
|
||||
cmd_xxd = [ prog_python, files_xxd_py, '@INPUT@', '@OUTPUT@' ]
|
||||
|
||||
deps_for_libweston_users = [
|
||||
dep_wayland_server,
|
||||
dep_pixman,
|
||||
dep_xkbcommon,
|
||||
]
|
||||
|
||||
|
||||
subdir('include')
|
||||
subdir('protocol')
|
||||
subdir('shared')
|
||||
|
@ -7,7 +7,8 @@ srcs_libshared = [
|
||||
'process-util.c',
|
||||
'hash.c',
|
||||
]
|
||||
deps_libshared = [dep_wayland_client, dep_wayland_server, dep_pixman]
|
||||
deps_libshared = [dep_wayland_client, dep_wayland_server,
|
||||
dep_pixman, deps_for_libweston_users]
|
||||
|
||||
lib_libshared = static_library(
|
||||
'shared',
|
||||
|
@ -323,7 +323,8 @@ if get_option('xwayland')
|
||||
include_directories: common_inc,
|
||||
dependencies: [
|
||||
dep_pixman, dep_xcb_xwayland,
|
||||
xcb_dep, xcb_cursor_dep
|
||||
xcb_dep, xcb_cursor_dep,
|
||||
dep_wayland_client,
|
||||
],
|
||||
install: false,
|
||||
)
|
||||
|
@ -1705,6 +1705,9 @@ client_capture_output(struct client *client,
|
||||
|
||||
client_roundtrip(client);
|
||||
|
||||
assert(capt.width != 0 && capt.height != 0 && capt.drm_format != 0 &&
|
||||
"capture source not available");
|
||||
|
||||
buf = create_shm_buffer(client,
|
||||
capt.width, capt.height, capt.drm_format);
|
||||
|
||||
|
@ -215,6 +215,12 @@ static void
|
||||
xserver_map_shell_surface(struct weston_wm_window *window,
|
||||
struct weston_surface *surface);
|
||||
|
||||
static inline bool
|
||||
weston_wm_window_is_maximized(struct weston_wm_window *window)
|
||||
{
|
||||
return window->maximized_horz && window->maximized_vert;
|
||||
}
|
||||
|
||||
static bool
|
||||
wm_debug_is_enabled(struct weston_wm *wm)
|
||||
{
|
||||
@ -822,10 +828,16 @@ weston_wm_handle_configure_request(struct weston_wm *wm, xcb_generic_event_t *ev
|
||||
return;
|
||||
}
|
||||
|
||||
if (configure_request->value_mask & XCB_CONFIG_WINDOW_WIDTH)
|
||||
if (configure_request->value_mask & XCB_CONFIG_WINDOW_WIDTH) {
|
||||
window->width = configure_request->width;
|
||||
if (configure_request->value_mask & XCB_CONFIG_WINDOW_HEIGHT)
|
||||
if (!weston_wm_window_is_maximized(window))
|
||||
window->saved_width = window->width;
|
||||
}
|
||||
if (configure_request->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
|
||||
window->height = configure_request->height;
|
||||
if (!weston_wm_window_is_maximized(window))
|
||||
window->saved_height = window->height;
|
||||
}
|
||||
|
||||
if (window->frame) {
|
||||
weston_wm_window_set_allow_commits(window, false);
|
||||
@ -1871,12 +1883,6 @@ weston_wm_window_set_toplevel(struct weston_wm_window *window)
|
||||
weston_wm_window_configure(window);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
weston_wm_window_is_maximized(struct weston_wm_window *window)
|
||||
{
|
||||
return window->maximized_horz && window->maximized_vert;
|
||||
}
|
||||
|
||||
static void
|
||||
weston_wm_window_handle_state(struct weston_wm_window *window,
|
||||
xcb_client_message_event_t *client_message)
|
||||
@ -3272,7 +3278,9 @@ xserver_map_shell_surface(struct weston_wm_window *window,
|
||||
} else if (window->override_redirect) {
|
||||
xwayland_interface->set_xwayland(window->shsurf,
|
||||
window->x, window->y);
|
||||
} else if (window->transient_for && window->transient_for->surface) {
|
||||
} else if (window->transient_for &&
|
||||
!window->transient_for->override_redirect &&
|
||||
window->transient_for->surface) {
|
||||
parent = window->transient_for;
|
||||
if (weston_wm_window_type_inactive(window)) {
|
||||
xwayland_interface->set_transient(window->shsurf,
|
||||
|
Loading…
Reference in New Issue
Block a user