Lines Matching refs:window

196 static void createFallbackEdge(_GLFWwindow* window,
204 wl_surface_set_user_data(edge->surface, window);
221 static void createFallbackDecorations(_GLFWwindow* window)
229 if (!window->wl.fallback.buffer)
230 window->wl.fallback.buffer = createShmBuffer(&image);
231 if (!window->wl.fallback.buffer)
234 createFallbackEdge(window, &window->wl.fallback.top, window->wl.surface,
235 window->wl.fallback.buffer,
237 window->wl.width, GLFW_CAPTION_HEIGHT);
238 createFallbackEdge(window, &window->wl.fallback.left, window->wl.surface,
239 window->wl.fallback.buffer,
241 GLFW_BORDER_SIZE, window->wl.height + GLFW_CAPTION_HEIGHT);
242 createFallbackEdge(window, &window->wl.fallback.right, window->wl.surface,
243 window->wl.fallback.buffer,
244 window->wl.width, -GLFW_CAPTION_HEIGHT,
245 GLFW_BORDER_SIZE, window->wl.height + GLFW_CAPTION_HEIGHT);
246 createFallbackEdge(window, &window->wl.fallback.bottom, window->wl.surface,
247 window->wl.fallback.buffer,
248 -GLFW_BORDER_SIZE, window->wl.height,
249 window->wl.width + GLFW_BORDER_SIZE * 2, GLFW_BORDER_SIZE);
251 window->wl.fallback.decorations = GLFW_TRUE;
268 static void destroyFallbackDecorations(_GLFWwindow* window)
270 window->wl.fallback.decorations = GLFW_FALSE;
272 destroyFallbackEdge(&window->wl.fallback.top);
273 destroyFallbackEdge(&window->wl.fallback.left);
274 destroyFallbackEdge(&window->wl.fallback.right);
275 destroyFallbackEdge(&window->wl.fallback.bottom);
282 _GLFWwindow* window = userData;
284 window->wl.xdg.decorationMode = mode;
288 if (window->decorated && !window->monitor)
289 createFallbackDecorations(window);
292 destroyFallbackDecorations(window);
301 static void setContentAreaOpaque(_GLFWwindow* window)
309 wl_region_add(region, 0, 0, window->wl.width, window->wl.height);
310 wl_surface_set_opaque_region(window->wl.surface, region);
314 static void resizeFramebuffer(_GLFWwindow* window)
316 if (window->wl.fractionalScale)
318 window->wl.fbWidth = (window->wl.width * window->wl.scalingNumerator) / 120;
319 window->wl.fbHeight = (window->wl.height * window->wl.scalingNumerator) / 120;
323 window->wl.fbWidth = window->wl.width * window->wl.bufferScale;
324 window->wl.fbHeight = window->wl.height * window->wl.bufferScale;
327 if (window->wl.egl.window)
329 wl_egl_window_resize(window->wl.egl.window,
330 window->wl.fbWidth,
331 window->wl.fbHeight,
335 if (!window->wl.transparent)
336 setContentAreaOpaque(window);
338 _glfwInputFramebufferSize(window, window->wl.fbWidth, window->wl.fbHeight);
341 static GLFWbool resizeWindow(_GLFWwindow* window, int width, int height)
346 if (width == window->wl.width && height == window->wl.height)
349 window->wl.width = width;
350 window->wl.height = height;
352 resizeFramebuffer(window);
354 if (window->wl.scalingViewport)
356 wp_viewport_set_destination(window->wl.scalingViewport,
357 window->wl.width,
358 window->wl.height);
361 if (window->wl.fallback.decorations)
363 wp_viewport_set_destination(window->wl.fallback.top.viewport,
364 window->wl.width,
366 wl_surface_commit(window->wl.fallback.top.surface);
368 wp_viewport_set_destination(window->wl.fallback.left.viewport,
370 window->wl.height + GLFW_CAPTION_HEIGHT);
371 wl_surface_commit(window->wl.fallback.left.surface);
373 wl_subsurface_set_position(window->wl.fallback.right.subsurface,
374 window->wl.width, -GLFW_CAPTION_HEIGHT);
375 wp_viewport_set_destination(window->wl.fallback.right.viewport,
377 window->wl.height + GLFW_CAPTION_HEIGHT);
378 wl_surface_commit(window->wl.fallback.right.surface);
380 wl_subsurface_set_position(window->wl.fallback.bottom.subsurface,
381 -GLFW_BORDER_SIZE, window->wl.height);
382 wp_viewport_set_destination(window->wl.fallback.bottom.viewport,
383 window->wl.width + GLFW_BORDER_SIZE * 2,
385 wl_surface_commit(window->wl.fallback.bottom.surface);
391 void _glfwUpdateBufferScaleFromOutputsWayland(_GLFWwindow* window)
399 if (!window->wl.scaleFramebuffer)
403 if (window->wl.fractionalScale)
409 for (size_t i = 0; i < window->wl.outputScaleCount; i++)
410 maxScale = _glfw_max(window->wl.outputScales[i].factor, maxScale);
413 if (window->wl.bufferScale != maxScale)
415 window->wl.bufferScale = maxScale;
416 wl_surface_set_buffer_scale(window->wl.surface, maxScale);
417 _glfwInputWindowContentScale(window, maxScale, maxScale);
418 resizeFramebuffer(window);
420 if (window->wl.visible)
421 _glfwInputWindowDamage(window);
432 _GLFWwindow* window = userData;
434 if (!window || !monitor)
437 if (window->wl.outputScaleCount + 1 > window->wl.outputScaleSize)
439 window->wl.outputScaleSize++;
440 window->wl.outputScales =
441 _glfw_realloc(window->wl.outputScales,
442 window->wl.outputScaleSize * sizeof(_GLFWscaleWayland));
445 window->wl.outputScaleCount++;
446 window->wl.outputScales[window->wl.outputScaleCount - 1] =
449 _glfwUpdateBufferScaleFromOutputsWayland(window);
459 _GLFWwindow* window = userData;
461 for (size_t i = 0; i < window->wl.outputScaleCount; i++)
463 if (window->wl.outputScales[i].output == output)
465 window->wl.outputScales[i] =
466 window->wl.outputScales[window->wl.outputScaleCount - 1];
467 window->wl.outputScaleCount--;
472 _glfwUpdateBufferScaleFromOutputsWayland(window);
481 static void setIdleInhibitor(_GLFWwindow* window, GLFWbool enable)
483 if (enable && !window->wl.idleInhibitor && _glfw.wl.idleInhibitManager)
485 window->wl.idleInhibitor =
487 _glfw.wl.idleInhibitManager, window->wl.surface);
488 if (!window->wl.idleInhibitor)
492 else if (!enable && window->wl.idleInhibitor)
494 zwp_idle_inhibitor_v1_destroy(window->wl.idleInhibitor);
495 window->wl.idleInhibitor = NULL;
499 // Make the specified window and its video mode active on its monitor
501 static void acquireMonitor(_GLFWwindow* window)
503 if (window->wl.libdecor.frame)
505 libdecor_frame_set_fullscreen(window->wl.libdecor.frame,
506 window->monitor->wl.output);
508 else if (window->wl.xdg.toplevel)
510 xdg_toplevel_set_fullscreen(window->wl.xdg.toplevel,
511 window->monitor->wl.output);
514 setIdleInhibitor(window, GLFW_TRUE);
516 if (window->wl.fallback.decorations)
517 destroyFallbackDecorations(window);
520 // Remove the window and restore the original video mode
522 static void releaseMonitor(_GLFWwindow* window)
524 if (window->wl.libdecor.frame)
525 libdecor_frame_unset_fullscreen(window->wl.libdecor.frame);
526 else if (window->wl.xdg.toplevel)
527 xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel);
529 setIdleInhibitor(window, GLFW_FALSE);
531 if (!window->wl.libdecor.frame &&
532 window->wl.xdg.decorationMode != ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE)
534 if (window->decorated)
535 createFallbackDecorations(window);
543 _GLFWwindow* window = userData;
545 window->wl.scalingNumerator = numerator;
546 _glfwInputWindowContentScale(window, numerator / 120.f, numerator / 120.f);
547 resizeFramebuffer(window);
549 if (window->wl.visible)
550 _glfwInputWindowDamage(window);
564 _GLFWwindow* window = userData;
567 window->wl.pending.activated = GLFW_FALSE;
568 window->wl.pending.maximized = GLFW_FALSE;
569 window->wl.pending.fullscreen = GLFW_FALSE;
576 window->wl.pending.maximized = GLFW_TRUE;
579 window->wl.pending.fullscreen = GLFW_TRUE;
584 window->wl.pending.activated = GLFW_TRUE;
591 if (window->wl.fallback.decorations)
593 window->wl.pending.width = _glfw_max(0, width - GLFW_BORDER_SIZE * 2);
594 window->wl.pending.height =
599 window->wl.pending.width = width;
600 window->wl.pending.height = height;
605 window->wl.pending.width = window->wl.width;
606 window->wl.pending.height = window->wl.height;
613 _GLFWwindow* window = userData;
614 _glfwInputWindowCloseRequest(window);
627 _GLFWwindow* window = userData;
631 if (window->wl.activated != window->wl.pending.activated)
633 window->wl.activated = window->wl.pending.activated;
634 if (!window->wl.activated)
636 if (window->monitor && window->autoIconify)
637 xdg_toplevel_set_minimized(window->wl.xdg.toplevel);
641 if (window->wl.maximized != window->wl.pending.maximized)
643 window->wl.maximized = window->wl.pending.maximized;
644 _glfwInputWindowMaximize(window, window->wl.maximized);
647 window->wl.fullscreen = window->wl.pending.fullscreen;
649 int width = window->wl.pending.width;
650 int height = window->wl.pending.height;
652 if (!window->wl.maximized && !window->wl.fullscreen)
654 if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE)
657 const float targetRatio = (float) window->numer / (float) window->denom;
665 if (resizeWindow(window, width, height))
667 _glfwInputWindowSize(window, window->wl.width, window->wl.height);
669 if (window->wl.visible)
670 _glfwInputWindowDamage(window);
673 if (!window->wl.visible)
675 // Allow the window to be mapped only if it either has no XDG
677 if (!window->wl.xdg.decoration || window->wl.xdg.decorationMode)
679 window->wl.visible = GLFW_TRUE;
680 _glfwInputWindowDamage(window);
694 _GLFWwindow* window = userData;
708 fullscreen = window->wl.fullscreen;
709 activated = window->wl.activated;
710 maximized = window->wl.maximized;
715 width = window->wl.width;
716 height = window->wl.height;
721 if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE)
724 const float targetRatio = (float) window->numer / (float) window->denom;
736 if (window->wl.activated != activated)
738 window->wl.activated = activated;
739 if (!window->wl.activated)
741 if (window->monitor && window->autoIconify)
742 libdecor_frame_set_minimized(window->wl.libdecor.frame);
746 if (window->wl.maximized != maximized)
748 window->wl.maximized = maximized;
749 _glfwInputWindowMaximize(window, window->wl.maximized);
752 window->wl.fullscreen = fullscreen;
756 if (!window->wl.visible)
758 window->wl.visible = GLFW_TRUE;
762 if (resizeWindow(window, width, height))
764 _glfwInputWindowSize(window, window->wl.width, window->wl.height);
769 _glfwInputWindowDamage(window);
771 wl_surface_commit(window->wl.surface);
776 _GLFWwindow* window = userData;
777 _glfwInputWindowCloseRequest(window);
782 _GLFWwindow* window = userData;
783 wl_surface_commit(window->wl.surface);
800 static GLFWbool createLibdecorFrame(_GLFWwindow* window)
806 window->wl.libdecor.frame = libdecor_decorate(_glfw.wl.libdecor.context,
807 window->wl.surface,
809 window);
810 if (!window->wl.libdecor.frame)
818 libdecor_state_new(window->wl.width, window->wl.height);
819 libdecor_frame_commit(window->wl.libdecor.frame, frameState, NULL);
822 if (strlen(window->wl.appId))
823 libdecor_frame_set_app_id(window->wl.libdecor.frame, window->wl.appId);
825 libdecor_frame_set_title(window->wl.libdecor.frame, window->title);
827 if (window->minwidth != GLFW_DONT_CARE &&
828 window->minheight != GLFW_DONT_CARE)
830 libdecor_frame_set_min_content_size(window->wl.libdecor.frame,
831 window->minwidth,
832 window->minheight);
835 if (window->maxwidth != GLFW_DONT_CARE &&
836 window->maxheight != GLFW_DONT_CARE)
838 libdecor_frame_set_max_content_size(window->wl.libdecor.frame,
839 window->maxwidth,
840 window->maxheight);
843 if (!window->resizable)
845 libdecor_frame_unset_capabilities(window->wl.libdecor.frame,
849 if (window->monitor)
851 libdecor_frame_set_fullscreen(window->wl.libdecor.frame,
852 window->monitor->wl.output);
853 setIdleInhibitor(window, GLFW_TRUE);
857 if (window->wl.maximized)
858 libdecor_frame_set_maximized(window->wl.libdecor.frame);
860 if (!window->decorated)
861 libdecor_frame_set_visibility(window->wl.libdecor.frame, false);
863 setIdleInhibitor(window, GLFW_FALSE);
866 libdecor_frame_map(window->wl.libdecor.frame);
871 static void updateXdgSizeLimits(_GLFWwindow* window)
875 if (window->resizable)
877 if (window->minwidth == GLFW_DONT_CARE || window->minheight == GLFW_DONT_CARE)
881 minwidth = window->minwidth;
882 minheight = window->minheight;
884 if (window->wl.fallback.decorations)
891 if (window->maxwidth == GLFW_DONT_CARE || window->maxheight == GLFW_DONT_CARE)
895 maxwidth = window->maxwidth;
896 maxheight = window->maxheight;
898 if (window->wl.fallback.decorations)
907 minwidth = maxwidth = window->wl.width;
908 minheight = maxheight = window->wl.height;
911 xdg_toplevel_set_min_size(window->wl.xdg.toplevel, minwidth, minheight);
912 xdg_toplevel_set_max_size(window->wl.xdg.toplevel, maxwidth, maxheight);
915 static GLFWbool createXdgShellObjects(_GLFWwindow* window)
917 window->wl.xdg.surface = xdg_wm_base_get_xdg_surface(_glfw.wl.wmBase,
918 window->wl.surface);
919 if (!window->wl.xdg.surface)
922 "Wayland: Failed to create xdg-surface for window");
926 xdg_surface_add_listener(window->wl.xdg.surface, &xdgSurfaceListener, window);
928 window->wl.xdg.toplevel = xdg_surface_get_toplevel(window->wl.xdg.surface);
929 if (!window->wl.xdg.toplevel)
932 "Wayland: Failed to create xdg-toplevel for window");
936 xdg_toplevel_add_listener(window->wl.xdg.toplevel, &xdgToplevelListener, window);
938 if (window->wl.appId)
939 xdg_toplevel_set_app_id(window->wl.xdg.toplevel, window->wl.appId);
941 xdg_toplevel_set_title(window->wl.xdg.toplevel, window->title);
943 if (window->monitor)
945 xdg_toplevel_set_fullscreen(window->wl.xdg.toplevel, window->monitor->wl.output);
946 setIdleInhibitor(window, GLFW_TRUE);
950 if (window->wl.maximized)
951 xdg_toplevel_set_maximized(window->wl.xdg.toplevel);
953 setIdleInhibitor(window, GLFW_FALSE);
958 window->wl.xdg.decoration =
960 _glfw.wl.decorationManager, window->wl.xdg.toplevel);
961 zxdg_toplevel_decoration_v1_add_listener(window->wl.xdg.decoration,
963 window);
967 if (window->decorated)
972 zxdg_toplevel_decoration_v1_set_mode(window->wl.xdg.decoration, mode);
976 if (window->decorated && !window->monitor)
977 createFallbackDecorations(window);
980 updateXdgSizeLimits(window);
982 wl_surface_commit(window->wl.surface);
987 static GLFWbool createShellObjects(_GLFWwindow* window)
991 if (createLibdecorFrame(window))
995 return createXdgShellObjects(window);
998 static void destroyShellObjects(_GLFWwindow* window)
1000 destroyFallbackDecorations(window);
1002 if (window->wl.libdecor.frame)
1003 libdecor_frame_unref(window->wl.libdecor.frame);
1005 if (window->wl.xdg.decoration)
1006 zxdg_toplevel_decoration_v1_destroy(window->wl.xdg.decoration);
1008 if (window->wl.xdg.toplevel)
1009 xdg_toplevel_destroy(window->wl.xdg.toplevel);
1011 if (window->wl.xdg.surface)
1012 xdg_surface_destroy(window->wl.xdg.surface);
1014 window->wl.libdecor.frame = NULL;
1015 window->wl.xdg.decoration = NULL;
1016 window->wl.xdg.decorationMode = 0;
1017 window->wl.xdg.toplevel = NULL;
1018 window->wl.xdg.surface = NULL;
1021 static GLFWbool createNativeSurface(_GLFWwindow* window,
1025 window->wl.surface = wl_compositor_create_surface(_glfw.wl.compositor);
1026 if (!window->wl.surface)
1028 _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Failed to create window surface");
1032 wl_proxy_set_tag((struct wl_proxy*) window->wl.surface, &_glfw.wl.tag);
1033 wl_surface_add_listener(window->wl.surface,
1035 window);
1037 window->wl.width = wndconfig->width;
1038 window->wl.height = wndconfig->height;
1039 window->wl.fbWidth = wndconfig->width;
1040 window->wl.fbHeight = wndconfig->height;
1041 window->wl.appId = _glfw_strdup(wndconfig->wl.appId);
1043 window->wl.bufferScale = 1;
1044 window->wl.scalingNumerator = 120;
1045 window->wl.scaleFramebuffer = wndconfig->scaleFramebuffer;
1047 window->wl.maximized = wndconfig->maximized;
1049 window->wl.transparent = fbconfig->transparent;
1050 if (!window->wl.transparent)
1051 setContentAreaOpaque(window);
1055 if (window->wl.scaleFramebuffer)
1057 window->wl.scalingViewport =
1058 wp_viewporter_get_viewport(_glfw.wl.viewporter, window->wl.surface);
1060 wp_viewport_set_destination(window->wl.scalingViewport,
1061 window->wl.width,
1062 window->wl.height);
1064 window->wl.fractionalScale =
1067 window->wl.surface);
1069 wp_fractional_scale_v1_add_listener(window->wl.fractionalScale,
1071 window);
1078 static void setCursorImage(_GLFWwindow* window,
1092 if (window->wl.bufferScale > 1 && cursorWayland->cursorHiDPI)
1124 static void incrementCursorImage(_GLFWwindow* window)
1128 if (!window || !window->wl.hovered)
1131 cursor = window->wl.currentCursor;
1136 setCursorImage(window, &cursor->wl);
1187 static void inputText(_GLFWwindow* window, uint32_t scancode)
1200 _glfwInputChar(window, codepoint, mods, plain);
1239 _GLFWwindow* window = _glfw.windowListHead;
1240 while (window)
1242 _glfwInputWindowCloseRequest(window);
1243 window = window->next;
1378 _GLFWwindow* window = wl_surface_get_user_data(surface);
1382 _glfw.wl.pointerFocus = window;
1384 if (surface == window->wl.surface)
1386 window->wl.hovered = GLFW_TRUE;
1387 _glfwSetCursorWayland(window, window->wl.currentCursor);
1388 _glfwInputCursorEnter(window, GLFW_TRUE);
1392 if (window->wl.fallback.decorations)
1393 window->wl.fallback.focus = surface;
1408 _GLFWwindow* window = _glfw.wl.pointerFocus;
1409 if (!window)
1416 if (window->wl.hovered)
1418 window->wl.hovered = GLFW_FALSE;
1419 _glfwInputCursorEnter(window, GLFW_FALSE);
1423 if (window->wl.fallback.decorations)
1424 window->wl.fallback.focus = NULL;
1434 _GLFWwindow* window = _glfw.wl.pointerFocus;
1435 if (!window)
1438 if (window->cursorMode == GLFW_CURSOR_DISABLED)
1443 window->wl.cursorPosX = xpos;
1444 window->wl.cursorPosY = ypos;
1446 if (window->wl.hovered)
1449 _glfwInputCursorPos(window, xpos, ypos);
1453 if (window->wl.fallback.decorations)
1457 if (window->resizable)
1459 if (window->wl.fallback.focus == window->wl.fallback.top.surface)
1464 else if (window->wl.fallback.focus == window->wl.fallback.left.surface)
1471 else if (window->wl.fallback.focus == window->wl.fallback.right.surface)
1478 else if (window->wl.fallback.focus == window->wl.fallback.bottom.surface)
1482 else if (xpos > window->wl.width + GLFW_BORDER_SIZE)
1495 if (window->wl.bufferScale > 1 && _glfw.wl.cursorThemeHiDPI)
1537 _GLFWwindow* window = _glfw.wl.pointerFocus;
1538 if (!window)
1541 if (window->wl.hovered)
1545 _glfwInputMouseClick(window,
1552 if (window->wl.fallback.decorations)
1558 if (window->wl.fallback.focus == window->wl.fallback.top.surface)
1560 if (window->wl.cursorPosY < GLFW_BORDER_SIZE)
1563 xdg_toplevel_move(window->wl.xdg.toplevel, _glfw.wl.seat, serial);
1565 else if (window->wl.fallback.focus == window->wl.fallback.left.surface)
1567 if (window->wl.cursorPosY < GLFW_BORDER_SIZE)
1572 else if (window->wl.fallback.focus == window->wl.fallback.right.surface)
1574 if (window->wl.cursorPosY < GLFW_BORDER_SIZE)
1579 else if (window->wl.fallback.focus == window->wl.fallback.bottom.surface)
1581 if (window->wl.cursorPosX < GLFW_BORDER_SIZE)
1583 else if (window->wl.cursorPosX > window->wl.width + GLFW_BORDER_SIZE)
1591 xdg_toplevel_resize(window->wl.xdg.toplevel, _glfw.wl.seat,
1597 if (window->wl.xdg.toplevel)
1599 xdg_toplevel_show_window_menu(window->wl.xdg.toplevel,
1601 window->wl.cursorPosX,
1602 window->wl.cursorPosY);
1614 _GLFWwindow* window = _glfw.wl.pointerFocus;
1615 if (!window)
1620 _glfwInputScroll(window, -wl_fixed_to_double(value) / 10.0, 0.0);
1622 _glfwInputScroll(window, 0.0, -wl_fixed_to_double(value) / 10.0);
1738 _GLFWwindow* window = wl_surface_get_user_data(surface);
1739 if (surface != window->wl.surface)
1743 _glfw.wl.keyboardFocus = window;
1744 _glfwInputWindowFocus(window, GLFW_TRUE);
1752 _GLFWwindow* window = _glfw.wl.keyboardFocus;
1754 if (!window)
1762 _glfwInputWindowFocus(window, GLFW_FALSE);
1772 _GLFWwindow* window = _glfw.wl.keyboardFocus;
1773 if (!window)
1804 _glfwInputKey(window, key, scancode, action, _glfw.wl.xkb.modifiers);
1807 inputText(window, scancode);
1990 _GLFWwindow* window = wl_surface_get_user_data(surface);
1991 if (window->wl.surface == surface)
1996 _glfw.wl.dragFocus = window;
2098 _GLFWwindow* window = userData;
2100 if (activationToken != window->wl.activationToken)
2103 xdg_activation_v1_activate(_glfw.wl.activationManager, token, window->wl.surface);
2104 xdg_activation_token_v1_destroy(window->wl.activationToken);
2105 window->wl.activationToken = NULL;
2128 GLFWbool _glfwCreateWindowWayland(_GLFWwindow* window,
2133 if (!createNativeSurface(window, wndconfig, fbconfig))
2141 window->wl.egl.window = wl_egl_window_create(window->wl.surface,
2142 window->wl.fbWidth,
2143 window->wl.fbHeight);
2144 if (!window->wl.egl.window)
2147 "Wayland: Failed to create EGL window");
2153 if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig))
2160 if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))
2164 if (!_glfwRefreshContextAttribs(window, ctxconfig))
2169 _glfwSetWindowMousePassthroughWayland(window, GLFW_TRUE);
2171 if (window->monitor || wndconfig->visible)
2173 if (!createShellObjects(window))
2180 void _glfwDestroyWindowWayland(_GLFWwindow* window)
2182 if (window == _glfw.wl.pointerFocus)
2185 if (window == _glfw.wl.keyboardFocus)
2188 if (window->wl.fractionalScale)
2189 wp_fractional_scale_v1_destroy(window->wl.fractionalScale);
2191 if (window->wl.scalingViewport)
2192 wp_viewport_destroy(window->wl.scalingViewport);
2194 if (window->wl.activationToken)
2195 xdg_activation_token_v1_destroy(window->wl.activationToken);
2197 if (window->wl.idleInhibitor)
2198 zwp_idle_inhibitor_v1_destroy(window->wl.idleInhibitor);
2200 if (window->wl.relativePointer)
2201 zwp_relative_pointer_v1_destroy(window->wl.relativePointer);
2203 if (window->wl.lockedPointer)
2204 zwp_locked_pointer_v1_destroy(window->wl.lockedPointer);
2206 if (window->wl.confinedPointer)
2207 zwp_confined_pointer_v1_destroy(window->wl.confinedPointer);
2209 if (window->context.destroy)
2210 window->context.destroy(window);
2212 destroyShellObjects(window);
2214 if (window->wl.fallback.buffer)
2215 wl_buffer_destroy(window->wl.fallback.buffer);
2217 if (window->wl.egl.window)
2218 wl_egl_window_destroy(window->wl.egl.window);
2220 if (window->wl.surface)
2221 wl_surface_destroy(window->wl.surface);
2223 _glfw_free(window->wl.appId);
2224 _glfw_free(window->wl.outputScales);
2227 void _glfwSetWindowTitleWayland(_GLFWwindow* window, const char* title)
2229 if (window->wl.libdecor.frame)
2230 libdecor_frame_set_title(window->wl.libdecor.frame, title);
2231 else if (window->wl.xdg.toplevel)
2232 xdg_toplevel_set_title(window->wl.xdg.toplevel, title);
2235 void _glfwSetWindowIconWayland(_GLFWwindow* window,
2239 "Wayland: The platform does not support setting the window icon");
2242 void _glfwGetWindowPosWayland(_GLFWwindow* window, int* xpos, int* ypos)
2248 "Wayland: The platform does not provide the window position");
2251 void _glfwSetWindowPosWayland(_GLFWwindow* window, int xpos, int ypos)
2256 "Wayland: The platform does not support setting the window position");
2259 void _glfwGetWindowSizeWayland(_GLFWwindow* window, int* width, int* height)
2262 *width = window->wl.width;
2264 *height = window->wl.height;
2267 void _glfwSetWindowSizeWayland(_GLFWwindow* window, int width, int height)
2269 if (window->monitor)
2275 if (!resizeWindow(window, width, height))
2278 if (window->wl.libdecor.frame)
2281 libdecor_state_new(window->wl.width, window->wl.height);
2282 libdecor_frame_commit(window->wl.libdecor.frame, frameState, NULL);
2286 if (window->wl.visible)
2287 _glfwInputWindowDamage(window);
2291 void _glfwSetWindowSizeLimitsWayland(_GLFWwindow* window,
2295 if (window->wl.libdecor.frame)
2303 libdecor_frame_set_min_content_size(window->wl.libdecor.frame,
2305 libdecor_frame_set_max_content_size(window->wl.libdecor.frame,
2308 else if (window->wl.xdg.toplevel)
2309 updateXdgSizeLimits(window);
2312 void _glfwSetWindowAspectRatioWayland(_GLFWwindow* window, int numer, int denom)
2314 if (window->wl.maximized || window->wl.fullscreen)
2317 int width = window->wl.width, height = window->wl.height;
2329 if (resizeWindow(window, width, height))
2331 if (window->wl.libdecor.frame)
2334 libdecor_state_new(window->wl.width, window->wl.height);
2335 libdecor_frame_commit(window->wl.libdecor.frame, frameState, NULL);
2339 _glfwInputWindowSize(window, window->wl.width, window->wl.height);
2341 if (window->wl.visible)
2342 _glfwInputWindowDamage(window);
2346 void _glfwGetFramebufferSizeWayland(_GLFWwindow* window, int* width, int* height)
2349 *width = window->wl.fbWidth;
2351 *height = window->wl.fbHeight;
2354 void _glfwGetWindowFrameSizeWayland(_GLFWwindow* window,
2358 if (window->wl.fallback.decorations)
2371 void _glfwGetWindowContentScaleWayland(_GLFWwindow* window,
2374 if (window->wl.fractionalScale)
2377 *xscale = (float) window->wl.scalingNumerator / 120.f;
2379 *yscale = (float) window->wl.scalingNumerator / 120.f;
2384 *xscale = (float) window->wl.bufferScale;
2386 *yscale = (float) window->wl.bufferScale;
2390 void _glfwIconifyWindowWayland(_GLFWwindow* window)
2392 if (window->wl.libdecor.frame)
2393 libdecor_frame_set_minimized(window->wl.libdecor.frame);
2394 else if (window->wl.xdg.toplevel)
2395 xdg_toplevel_set_minimized(window->wl.xdg.toplevel);
2398 void _glfwRestoreWindowWayland(_GLFWwindow* window)
2400 if (window->monitor)
2409 if (window->wl.maximized)
2411 if (window->wl.libdecor.frame)
2412 libdecor_frame_unset_maximized(window->wl.libdecor.frame);
2413 else if (window->wl.xdg.toplevel)
2414 xdg_toplevel_unset_maximized(window->wl.xdg.toplevel);
2416 window->wl.maximized = GLFW_FALSE;
2421 void _glfwMaximizeWindowWayland(_GLFWwindow* window)
2423 if (window->wl.libdecor.frame)
2424 libdecor_frame_set_maximized(window->wl.libdecor.frame);
2425 else if (window->wl.xdg.toplevel)
2426 xdg_toplevel_set_maximized(window->wl.xdg.toplevel);
2428 window->wl.maximized = GLFW_TRUE;
2431 void _glfwShowWindowWayland(_GLFWwindow* window)
2433 if (!window->wl.libdecor.frame && !window->wl.xdg.toplevel)
2437 createShellObjects(window);
2441 void _glfwHideWindowWayland(_GLFWwindow* window)
2443 if (window->wl.visible)
2445 window->wl.visible = GLFW_FALSE;
2446 destroyShellObjects(window);
2448 wl_surface_attach(window->wl.surface, NULL, 0, 0);
2449 wl_surface_commit(window->wl.surface);
2453 void _glfwRequestWindowAttentionWayland(_GLFWwindow* window)
2459 if (window->wl.activationToken)
2460 xdg_activation_token_v1_destroy(window->wl.activationToken);
2462 window->wl.activationToken =
2464 xdg_activation_token_v1_add_listener(window->wl.activationToken,
2466 window);
2468 xdg_activation_token_v1_commit(window->wl.activationToken);
2471 void _glfwFocusWindowWayland(_GLFWwindow* window)
2476 if (window->wl.activationToken)
2477 xdg_activation_token_v1_destroy(window->wl.activationToken);
2479 window->wl.activationToken =
2481 xdg_activation_token_v1_add_listener(window->wl.activationToken,
2483 window);
2485 xdg_activation_token_v1_set_serial(window->wl.activationToken,
2492 xdg_activation_token_v1_set_surface(window->wl.activationToken,
2497 xdg_activation_token_v1_set_app_id(window->wl.activationToken,
2502 xdg_activation_token_v1_commit(window->wl.activationToken);
2505 void _glfwSetWindowMonitorWayland(_GLFWwindow* window,
2511 if (window->monitor == monitor)
2514 _glfwSetWindowSizeWayland(window, width, height);
2519 if (window->monitor)
2520 releaseMonitor(window);
2522 _glfwInputWindowMonitor(window, monitor);
2524 if (window->monitor)
2525 acquireMonitor(window);
2527 _glfwSetWindowSizeWayland(window, width, height);
2530 GLFWbool _glfwWindowFocusedWayland(_GLFWwindow* window)
2532 return _glfw.wl.keyboardFocus == window;
2535 GLFWbool _glfwWindowIconifiedWayland(_GLFWwindow* window)
2542 GLFWbool _glfwWindowVisibleWayland(_GLFWwindow* window)
2544 return window->wl.visible;
2547 GLFWbool _glfwWindowMaximizedWayland(_GLFWwindow* window)
2549 return window->wl.maximized;
2552 GLFWbool _glfwWindowHoveredWayland(_GLFWwindow* window)
2554 return window->wl.hovered;
2557 GLFWbool _glfwFramebufferTransparentWayland(_GLFWwindow* window)
2559 return window->wl.transparent;
2562 void _glfwSetWindowResizableWayland(_GLFWwindow* window, GLFWbool enabled)
2564 if (window->wl.libdecor.frame)
2568 libdecor_frame_set_capabilities(window->wl.libdecor.frame,
2573 libdecor_frame_unset_capabilities(window->wl.libdecor.frame,
2577 else if (window->wl.xdg.toplevel)
2578 updateXdgSizeLimits(window);
2581 void _glfwSetWindowDecoratedWayland(_GLFWwindow* window, GLFWbool enabled)
2583 if (window->wl.libdecor.frame)
2585 libdecor_frame_set_visibility(window->wl.libdecor.frame, enabled);
2587 else if (window->wl.xdg.decoration)
2596 zxdg_toplevel_decoration_v1_set_mode(window->wl.xdg.decoration, mode);
2598 else if (window->wl.xdg.toplevel)
2601 createFallbackDecorations(window);
2603 destroyFallbackDecorations(window);
2607 void _glfwSetWindowFloatingWayland(_GLFWwindow* window, GLFWbool enabled)
2610 "Wayland: Platform does not support making a window floating");
2613 void _glfwSetWindowMousePassthroughWayland(_GLFWwindow* window, GLFWbool enabled)
2618 wl_surface_set_input_region(window->wl.surface, region);
2622 wl_surface_set_input_region(window->wl.surface, NULL);
2625 float _glfwGetWindowOpacityWayland(_GLFWwindow* window)
2630 void _glfwSetWindowOpacityWayland(_GLFWwindow* window, float opacity)
2633 "Wayland: The platform does not support setting the window opacity");
2636 void _glfwSetRawMouseMotionWayland(_GLFWwindow* window, GLFWbool enabled)
2668 void _glfwGetCursorPosWayland(_GLFWwindow* window, double* xpos, double* ypos)
2671 *xpos = window->wl.cursorPosX;
2673 *ypos = window->wl.cursorPosY;
2676 void _glfwSetCursorPosWayland(_GLFWwindow* window, double x, double y)
2682 void _glfwSetCursorModeWayland(_GLFWwindow* window, int mode)
2684 _glfwSetCursorWayland(window, window->wl.currentCursor);
2884 _GLFWwindow* window = userData;
2885 double xpos = window->virtualCursorPosX;
2886 double ypos = window->virtualCursorPosY;
2888 if (window->cursorMode != GLFW_CURSOR_DISABLED)
2891 if (window->rawMouseMotion)
2902 _glfwInputCursorPos(window, xpos, ypos);
2926 static void lockPointer(_GLFWwindow* window)
2935 window->wl.relativePointer =
2939 zwp_relative_pointer_v1_add_listener(window->wl.relativePointer,
2941 window);
2943 window->wl.lockedPointer =
2946 window->wl.surface,
2950 zwp_locked_pointer_v1_add_listener(window->wl.lockedPointer,
2952 window);
2955 static void unlockPointer(_GLFWwindow* window)
2957 zwp_relative_pointer_v1_destroy(window->wl.relativePointer);
2958 window->wl.relativePointer = NULL;
2960 zwp_locked_pointer_v1_destroy(window->wl.lockedPointer);
2961 window->wl.lockedPointer = NULL;
2980 static void confinePointer(_GLFWwindow* window)
2982 window->wl.confinedPointer =
2985 window->wl.surface,
2990 zwp_confined_pointer_v1_add_listener(window->wl.confinedPointer,
2992 window);
2995 static void unconfinePointer(_GLFWwindow* window)
2997 zwp_confined_pointer_v1_destroy(window->wl.confinedPointer);
2998 window->wl.confinedPointer = NULL;
3001 void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
3006 window->wl.currentCursor = cursor;
3008 // If we're not in the correct window just save the cursor
3009 // the next time the pointer enters the window the cursor will change
3010 if (!window->wl.hovered)
3014 if (window->cursorMode == GLFW_CURSOR_DISABLED)
3016 if (window->wl.confinedPointer)
3017 unconfinePointer(window);
3018 if (!window->wl.lockedPointer)
3019 lockPointer(window);
3021 else if (window->cursorMode == GLFW_CURSOR_CAPTURED)
3023 if (window->wl.lockedPointer)
3024 unlockPointer(window);
3025 if (!window->wl.confinedPointer)
3026 confinePointer(window);
3028 else if (window->cursorMode == GLFW_CURSOR_NORMAL ||
3029 window->cursorMode == GLFW_CURSOR_HIDDEN)
3031 if (window->wl.lockedPointer)
3032 unlockPointer(window);
3033 else if (window->wl.confinedPointer)
3034 unconfinePointer(window);
3037 if (window->cursorMode == GLFW_CURSOR_NORMAL ||
3038 window->cursorMode == GLFW_CURSOR_CAPTURED)
3041 setCursorImage(window, &cursor->wl);
3070 setCursorImage(window, &cursorWayland);
3073 else if (window->cursorMode == GLFW_CURSOR_HIDDEN ||
3074 window->cursorMode == GLFW_CURSOR_DISABLED)
3213 EGLNativeWindowType _glfwGetEGLNativeWindowWayland(_GLFWwindow* window)
3215 return window->wl.egl.window;
3248 _GLFWwindow* window,
3268 sci.surface = window->wl.surface;
3311 _GLFWwindow* window = (_GLFWwindow*) handle;
3312 assert(window != NULL);
3314 return window->wl.surface;