193 lines
5.8 KiB
Plaintext
193 lines
5.8 KiB
Plaintext
|
|
static void
|
|
_zxdg_surface_cb_configure(void *data, struct zxdg_surface_v6 *zxdg_surface EINA_UNUSED, uint32_t serial)
|
|
{
|
|
Ecore_Wl2_Window *window;
|
|
|
|
window = data;
|
|
window->def_config.serial = serial;
|
|
|
|
if (window->pending.configure)
|
|
{
|
|
window->saved.w = window->set_config.geometry.w;
|
|
window->saved.h = window->set_config.geometry.h;
|
|
}
|
|
if (window->pending.configure && window->updating)
|
|
ERR("Window shouldn't be rendering before initial configure");
|
|
|
|
if (!window->updating)
|
|
_ecore_wl2_window_configure_send(window);
|
|
|
|
if (window->pending.configure)
|
|
_configure_complete(window);
|
|
}
|
|
|
|
static const struct zxdg_surface_v6_listener _zxdg_surface_listener =
|
|
{
|
|
_zxdg_surface_cb_configure,
|
|
};
|
|
|
|
static void
|
|
_zxdg_toplevel_cb_configure(void *data, struct zxdg_toplevel_v6 *zxdg_toplevel EINA_UNUSED, int32_t width, int32_t height, struct wl_array *states)
|
|
{
|
|
Ecore_Wl2_Window *win = data;
|
|
uint32_t *s;
|
|
|
|
win->def_config.maximized = EINA_FALSE;
|
|
win->def_config.fullscreen = EINA_FALSE;
|
|
win->def_config.focused = EINA_FALSE;
|
|
win->def_config.resizing = EINA_FALSE;
|
|
win->def_config.geometry.w = width;
|
|
win->def_config.geometry.h = height;
|
|
|
|
wl_array_for_each(s, states)
|
|
{
|
|
switch (*s)
|
|
{
|
|
case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
|
|
win->def_config.maximized = EINA_TRUE;
|
|
break;
|
|
case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
|
|
win->def_config.fullscreen = EINA_TRUE;
|
|
break;
|
|
case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
|
|
win->def_config.resizing = EINA_TRUE;
|
|
break;
|
|
case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
|
|
win->def_config.focused = EINA_TRUE;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
_zxdg_toplevel_cb_close(void *data, struct zxdg_toplevel_v6 *zxdg_toplevel EINA_UNUSED)
|
|
{
|
|
Ecore_Wl2_Window *win;
|
|
|
|
win = data;
|
|
if (!win) return;
|
|
|
|
ecore_wl2_window_free(win);
|
|
}
|
|
|
|
static const struct zxdg_toplevel_v6_listener _zxdg_toplevel_listener =
|
|
{
|
|
_zxdg_toplevel_cb_configure,
|
|
_zxdg_toplevel_cb_close,
|
|
};
|
|
|
|
static void
|
|
_zxdg_popup_cb_configure(void *data, struct zxdg_popup_v6 *zxdg_popup EINA_UNUSED, int32_t x EINA_UNUSED, int32_t y EINA_UNUSED, int32_t width, int32_t height)
|
|
{
|
|
Ecore_Wl2_Window *win = data;
|
|
win->def_config.geometry.w = width;
|
|
win->def_config.geometry.h = height;
|
|
}
|
|
|
|
static void
|
|
_zxdg_popup_cb_done(void *data, struct zxdg_popup_v6 *zxdg_popup EINA_UNUSED)
|
|
{
|
|
Ecore_Wl2_Window *win;
|
|
|
|
win = data;
|
|
if (!win) return;
|
|
|
|
if (win->grab) _ecore_wl2_input_ungrab(win->grab);
|
|
}
|
|
|
|
static const struct zxdg_popup_v6_listener _zxdg_popup_listener =
|
|
{
|
|
_zxdg_popup_cb_configure,
|
|
_zxdg_popup_cb_done,
|
|
};
|
|
|
|
static void
|
|
_window_v6_popup_create(Ecore_Wl2_Window *win)
|
|
{
|
|
struct zxdg_positioner_v6 *pos;
|
|
int ww, wh;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(win->parent);
|
|
pos = zxdg_shell_v6_create_positioner(win->display->wl.zxdg_shell);
|
|
if (!pos) return;
|
|
|
|
ecore_wl2_window_geometry_get(win, NULL, NULL, &ww, &wh);
|
|
|
|
zxdg_positioner_v6_set_anchor_rect(pos, 0, 0, 1, 1);
|
|
zxdg_positioner_v6_set_size(pos, ww, wh);
|
|
zxdg_positioner_v6_set_anchor(pos, ZXDG_POSITIONER_V6_ANCHOR_TOP |
|
|
ZXDG_POSITIONER_V6_ANCHOR_LEFT);
|
|
zxdg_positioner_v6_set_gravity(pos, ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
|
|
ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
|
|
|
|
win->zxdg_popup = zxdg_surface_v6_get_popup(win->zxdg_surface,
|
|
win->parent->zxdg_surface, pos);
|
|
|
|
zxdg_positioner_v6_destroy(pos);
|
|
if (win->grab)
|
|
zxdg_popup_v6_grab(win->zxdg_popup, win->grab->wl.seat,
|
|
wl_display_get_serial(win->display->wl.display));
|
|
zxdg_popup_v6_set_user_data(win->zxdg_popup, win);
|
|
zxdg_popup_v6_add_listener(win->zxdg_popup, &_zxdg_popup_listener, win);
|
|
|
|
win->pending.configure = EINA_TRUE;
|
|
|
|
ecore_wl2_window_commit(win, EINA_TRUE);
|
|
}
|
|
|
|
static void
|
|
_window_v6_shell_surface_create(Ecore_Wl2_Window *window)
|
|
{
|
|
if (window->zxdg_surface) return;
|
|
window->zxdg_surface =
|
|
zxdg_shell_v6_get_xdg_surface(window->display->wl.zxdg_shell,
|
|
window->surface);
|
|
zxdg_surface_v6_set_user_data(window->zxdg_surface, window);
|
|
zxdg_surface_v6_add_listener(window->zxdg_surface,
|
|
&_zxdg_surface_listener, window);
|
|
|
|
window->zxdg_configure_ack = zxdg_surface_v6_ack_configure;
|
|
window->pending.configure = EINA_TRUE;
|
|
|
|
if (window->type == ECORE_WL2_WINDOW_TYPE_MENU)
|
|
_window_v6_popup_create(window);
|
|
else
|
|
{
|
|
struct zxdg_toplevel_v6 *ptop = NULL;
|
|
|
|
window->zxdg_toplevel =
|
|
zxdg_surface_v6_get_toplevel(window->zxdg_surface);
|
|
zxdg_toplevel_v6_set_user_data(window->zxdg_toplevel, window);
|
|
zxdg_toplevel_v6_add_listener(window->zxdg_toplevel,
|
|
&_zxdg_toplevel_listener, window);
|
|
|
|
if (window->deferred_minimize)
|
|
zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
|
|
window->deferred_minimize = EINA_FALSE;
|
|
|
|
if (window->title)
|
|
zxdg_toplevel_v6_set_title(window->zxdg_toplevel, window->title);
|
|
if (window->class)
|
|
zxdg_toplevel_v6_set_app_id(window->zxdg_toplevel, window->class);
|
|
|
|
window->zxdg_set_min_size = zxdg_toplevel_v6_set_min_size;
|
|
window->zxdg_set_max_size = zxdg_toplevel_v6_set_max_size;
|
|
|
|
if (window->parent)
|
|
ptop = window->parent->zxdg_toplevel;
|
|
|
|
if (ptop)
|
|
zxdg_toplevel_v6_set_parent(window->zxdg_toplevel, ptop);
|
|
|
|
if (window->set_config.maximized)
|
|
zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
|
|
|
|
if (window->set_config.fullscreen)
|
|
zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
|
|
}
|
|
|
|
ecore_wl2_window_commit(window, EINA_TRUE);
|
|
}
|