1// LAF OS Library
2// Copyright (c) 2020-2021 Igara Studio S.A.
3//
4// This file is released under the terms of the MIT license.
5// Read LICENSE.txt for more information.
6
7#ifndef OS_X11_SCREEN_H
8#define OS_X11_SCREEN_H
9#pragma once
10
11#include "os/screen.h"
12#include "os/x11/x11.h"
13
14#include <X11/Xatom.h>
15
16namespace os {
17
18class ScreenX11 : public Screen {
19public:
20 ScreenX11(int screen) {
21 auto x11 = X11::instance();
22 auto x11display = x11->display();
23
24 m_bounds.w = XDisplayWidth(x11display, screen);
25 m_bounds.h = XDisplayHeight(x11display, screen);
26
27 ::Window root = XDefaultRootWindow(x11display);
28 Atom _NET_WORKAREA = XInternAtom(x11display, "_NET_WORKAREA", False);
29
30 Atom actual_type;
31 int actual_format;
32 unsigned long nitems;
33 unsigned long bytes_after;
34 unsigned long* prop;
35
36 int res = XGetWindowProperty(x11display, root,
37 _NET_WORKAREA,
38 0, 4,
39 False, XA_CARDINAL,
40 &actual_type, &actual_format,
41 &nitems, &bytes_after,
42 (unsigned char**)&prop);
43 if (res == Success && nitems == 4) {
44 m_workarea.x = prop[0];
45 m_workarea.y = prop[1];
46 m_workarea.w = prop[2];
47 m_workarea.h = prop[3];
48 XFree(prop);
49 }
50 else {
51 m_workarea = m_bounds;
52 }
53 }
54 bool isMainScreen() const override {
55 return (m_screen == XDefaultScreen(X11::instance()->display()));
56 }
57 gfx::Rect bounds() const override { return m_bounds; }
58 gfx::Rect workarea() const override { return m_workarea; }
59 os::ColorSpaceRef colorSpace() const override {
60 // TODO get screen color space
61 return os::instance()->makeColorSpace(gfx::ColorSpace::MakeSRGB());
62 }
63 void* nativeHandle() const override {
64 return reinterpret_cast<void*>(m_screen);
65 }
66private:
67 int m_screen;
68 gfx::Rect m_bounds;
69 gfx::Rect m_workarea;
70};
71
72} // namespace os
73
74#endif
75