Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
monitor.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
/*
5 * Authors:
6 * see git history
7 * Patrick Storz <eduard.braun2@gmx.de>
8 *
9 * Copyright (C) 2018 Authors
10 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
11 */
12
13#include "monitor.h"
14
15#include <limits>
16#include <gdkmm/display.h>
17#include <gdkmm/monitor.h>
18#include <gdkmm/surface.h>
19#include <2geom/point.h>
20#include <2geom/rect.h>
21
22#ifdef GDK_WINDOWING_X11
23#include <gdk/x11/gdkx.h>
24#endif
25#ifdef GDK_WINDOWING_WIN32
26#include <gdk/win32/gdkwin32.h>
27#endif
28
29namespace Inkscape::UI {
30namespace {
31
32// Removed from Gtk in commit a46f9af1, so we have to reimplement it here.
33Glib::RefPtr<Gdk::Monitor> get_primary_monitor(Glib::RefPtr<Gdk::Display> const &display)
34{
35 auto display_c = display->gobj();
36
37 GdkMonitor *monitor = nullptr;
38#ifdef GDK_WINDOWING_X11
39 if (GDK_IS_X11_DISPLAY(display_c)) {
40 monitor = gdk_x11_display_get_primary_monitor(display_c);
41 }
42#endif
43#ifdef GDK_WINDOWING_WIN32
44 if (GDK_IS_WIN32_DISPLAY(display_c)) {
45 monitor = gdk_win32_display_get_primary_monitor(display_c);
46 }
47#endif
48
49 if (monitor) {
50 return Glib::wrap(monitor, true);
51 }
52
53 // Fallback to monitor number 0 if the user hasn't configured a primary monitor,
54 // or if the backend doesn't support it.
55 return display->get_monitors()->get_typed_object<Gdk::Monitor>(0);
56}
57
58} // namespace
59
62 Gdk::Rectangle monitor_geometry;
63 auto const display = Gdk::Display::get_default();
64 auto monitor = get_primary_monitor(display);
65
66 monitor->get_geometry(monitor_geometry);
67 return monitor_geometry;
68}
69
71Gdk::Rectangle get_monitor_geometry_at_surface(Glib::RefPtr<Gdk::Surface> const &surface) {
72 Gdk::Rectangle monitor_geometry;
73 auto const display = Gdk::Display::get_default();
74 auto const monitor = display->get_monitor_at_surface(surface);
75 if (monitor) {
76 monitor->get_geometry(monitor_geometry);
77 }
78 return monitor_geometry;
79}
80
82Gdk::Rectangle get_monitor_geometry_at_point(int x, int y) {
83 Gdk::Rectangle monitor_geometry;
84 double dist = std::numeric_limits<double>::max();
85 auto const display = Gdk::Display::get_default();
86 for (unsigned i = 0; i < display->get_monitors()->get_n_items(); ++i) {
87 auto monitor = display->get_monitors()->get_typed_object<Gdk::Monitor>(i);
88 Gdk::Rectangle tmp_monitor_geometry;
89 monitor->get_geometry(tmp_monitor_geometry);
90 double cdist = Geom::distance(Geom::Point(x, y),
91 Geom::Rect(tmp_monitor_geometry.get_x(),
92 tmp_monitor_geometry.get_y(),
93 tmp_monitor_geometry.get_width(),
94 tmp_monitor_geometry.get_height()));
95 if (cdist < dist) {
96 monitor_geometry = tmp_monitor_geometry;
97 }
98 }
99 return monitor_geometry;
100}
101
102} // namespace Inkscape::UI
103
104/*
105 Local Variables:
106 mode:c++
107 c-file-style:"stroustrup"
108 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
109 indent-tabs-mode:nil
110 fill-column:99
111 End:
112*/
113// vim:filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99:
Cartesian point / 2D vector and related operations.
Cairo::RefPtr< Cairo::ImageSurface > surface
Definition canvas.cpp:137
Two-dimensional point that doubles as a vector.
Definition point.h:66
Axis aligned, non-empty rectangle.
Definition rect.h:92
Glib::RefPtr< Gio::FileMonitor > monitor
helper functions for retrieving monitor geometry, etc.
Angle distance(Angle const &a, Angle const &b)
Definition angle.h:163
User interface code.
Definition desktop.h:113
Gdk::Rectangle get_monitor_geometry_at_surface(Glib::RefPtr< Gdk::Surface > const &surface)
get monitor geometry of monitor containing largest part of surface
Definition monitor.cpp:71
Gdk::Rectangle get_monitor_geometry_at_point(int x, int y)
get monitor geometry of monitor at (or closest to) point on combined screen area
Definition monitor.cpp:82
Gdk::Rectangle get_monitor_geometry_primary()
get monitor geometry of primary monitor
Definition monitor.cpp:61
Axis-aligned rectangle.