File indexing completed on 2024-05-19 16:35:19
0001 /* 0002 SPDX-FileCopyrightText: 2022 David Edmundson <davidedmundson@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "fractionalscale_v1_interface.h" 0008 0009 #include "display.h" 0010 #include "fractionalscale_v1_interface_p.h" 0011 #include "surface_interface_p.h" 0012 0013 #include <cmath> 0014 0015 static const int s_version = 1; 0016 0017 namespace KWaylandServer 0018 { 0019 class FractionalScaleManagerV1InterfacePrivate : public QtWaylandServer::wp_fractional_scale_manager_v1 0020 { 0021 protected: 0022 void wp_fractional_scale_manager_v1_destroy(Resource *resource) override; 0023 void wp_fractional_scale_manager_v1_get_fractional_scale(Resource *resource, uint32_t id, wl_resource *surface) override; 0024 }; 0025 0026 void FractionalScaleManagerV1InterfacePrivate::wp_fractional_scale_manager_v1_destroy(Resource *resource) 0027 { 0028 wl_resource_destroy(resource->handle); 0029 } 0030 0031 void FractionalScaleManagerV1InterfacePrivate::wp_fractional_scale_manager_v1_get_fractional_scale(Resource *resource, uint32_t id, struct ::wl_resource *surface_resource) 0032 { 0033 SurfaceInterface *surface = SurfaceInterface::get(surface_resource); 0034 0035 FractionalScaleV1Interface *scaleIface = FractionalScaleV1Interface::get(surface); 0036 if (scaleIface) { 0037 wl_resource_post_error(resource->handle, error_fractional_scale_exists, "the specified surface already has a fractional scale"); 0038 return; 0039 } 0040 0041 wl_resource *surfaceScalerResource = wl_resource_create(resource->client(), &wp_fractional_scale_v1_interface, resource->version(), id); 0042 0043 new FractionalScaleV1Interface(surface, surfaceScalerResource); 0044 } 0045 0046 FractionalScaleV1Interface::FractionalScaleV1Interface(SurfaceInterface *surface, wl_resource *resource) 0047 : QtWaylandServer::wp_fractional_scale_v1(resource) 0048 , surface(surface) 0049 { 0050 SurfaceInterfacePrivate *surfacePrivate = SurfaceInterfacePrivate::get(surface); 0051 surfacePrivate->fractionalScaleExtension = this; 0052 setPreferredScale(surfacePrivate->preferredScale); 0053 } 0054 0055 FractionalScaleV1Interface::~FractionalScaleV1Interface() 0056 { 0057 if (surface) { 0058 SurfaceInterfacePrivate *surfacePrivate = SurfaceInterfacePrivate::get(surface); 0059 surfacePrivate->fractionalScaleExtension = nullptr; 0060 } 0061 } 0062 0063 FractionalScaleV1Interface *FractionalScaleV1Interface::get(SurfaceInterface *surface) 0064 { 0065 return SurfaceInterfacePrivate::get(surface)->fractionalScaleExtension; 0066 } 0067 0068 void FractionalScaleV1Interface::setPreferredScale(qreal scale) 0069 { 0070 send_preferred_scale(std::round(scale * 120)); 0071 } 0072 0073 void FractionalScaleV1Interface::wp_fractional_scale_v1_destroy(Resource *resource) 0074 { 0075 wl_resource_destroy(resource->handle); 0076 } 0077 0078 void FractionalScaleV1Interface::wp_fractional_scale_v1_destroy_resource(Resource *) 0079 { 0080 delete this; 0081 } 0082 0083 FractionalScaleManagerV1Interface::FractionalScaleManagerV1Interface(Display *display, QObject *parent) 0084 : QObject(parent) 0085 , d(new FractionalScaleManagerV1InterfacePrivate) 0086 { 0087 d->init(*display, s_version); 0088 } 0089 0090 FractionalScaleManagerV1Interface::~FractionalScaleManagerV1Interface() 0091 { 0092 } 0093 0094 } // namespace KWaylandServer