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