1 /*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
6 SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
7
8 SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include "kwinscreenedge.h"
12
13 #include "monitor.h"
14
15 namespace KWin
16 {
17
KWinScreenEdge(QWidget * parent)18 KWinScreenEdge::KWinScreenEdge(QWidget *parent)
19 : QWidget(parent)
20 {
21 QMetaObject::invokeMethod(this, "createConnection", Qt::QueuedConnection);
22 }
23
~KWinScreenEdge()24 KWinScreenEdge::~KWinScreenEdge()
25 {
26 }
27
monitorHideEdge(ElectricBorder border,bool hidden)28 void KWinScreenEdge::monitorHideEdge(ElectricBorder border, bool hidden)
29 {
30 const int edge = KWinScreenEdge::electricBorderToMonitorEdge(border);
31 monitor()->setEdgeHidden(edge, hidden);
32 }
33
monitorEnableEdge(ElectricBorder border,bool enabled)34 void KWinScreenEdge::monitorEnableEdge(ElectricBorder border, bool enabled)
35 {
36 const int edge = KWinScreenEdge::electricBorderToMonitorEdge(border);
37 monitor()->setEdgeEnabled(edge, enabled);
38 }
39
monitorAddItem(const QString & item)40 void KWinScreenEdge::monitorAddItem(const QString &item)
41 {
42 for (int i = 0; i < 8; i++) {
43 monitor()->addEdgeItem(i, item);
44 }
45 }
46
monitorItemSetEnabled(int index,bool enabled)47 void KWinScreenEdge::monitorItemSetEnabled(int index, bool enabled)
48 {
49 for (int i = 0; i < 8; i++) {
50 monitor()->setEdgeItemEnabled(i, index, enabled);
51 }
52 }
53
monitorChangeEdge(const QList<int> & borderList,int index)54 void KWinScreenEdge::monitorChangeEdge(const QList<int> &borderList, int index)
55 {
56 for (int border : borderList) {
57 monitorChangeEdge(static_cast<ElectricBorder>(border), index);
58 }
59 }
60
monitorChangeEdge(ElectricBorder border,int index)61 void KWinScreenEdge::monitorChangeEdge(ElectricBorder border, int index)
62 {
63 if (ELECTRIC_COUNT == border || ElectricNone == border) {
64 return;
65 }
66 m_reference[border] = index;
67 monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(border), index);
68 }
69
monitorCheckEffectHasEdge(int index) const70 QList<int> KWinScreenEdge::monitorCheckEffectHasEdge(int index) const
71 {
72 QList<int> list;
73 if (monitor()->selectedEdgeItem(Monitor::Top) == index) {
74 list.append(ElectricTop);
75 }
76 if (monitor()->selectedEdgeItem(Monitor::TopRight) == index) {
77 list.append(ElectricTopRight);
78 }
79 if (monitor()->selectedEdgeItem(Monitor::Right) == index) {
80 list.append(ElectricRight);
81 }
82 if (monitor()->selectedEdgeItem(Monitor::BottomRight) == index) {
83 list.append(ElectricBottomRight);
84 }
85 if (monitor()->selectedEdgeItem(Monitor::Bottom) == index) {
86 list.append(ElectricBottom);
87 }
88 if (monitor()->selectedEdgeItem(Monitor::BottomLeft) == index) {
89 list.append(ElectricBottomLeft);
90 }
91 if (monitor()->selectedEdgeItem(Monitor::Left) == index) {
92 list.append(ElectricLeft);
93 }
94 if (monitor()->selectedEdgeItem(Monitor::TopLeft) == index) {
95 list.append(ElectricTopLeft);
96 }
97
98 if (list.isEmpty()) {
99 list.append(ElectricNone);
100 }
101 return list;
102 }
103
selectedEdgeItem(ElectricBorder border) const104 int KWinScreenEdge::selectedEdgeItem(ElectricBorder border) const
105 {
106 return monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(border));
107 }
108
monitorChangeDefaultEdge(ElectricBorder border,int index)109 void KWinScreenEdge::monitorChangeDefaultEdge(ElectricBorder border, int index)
110 {
111 if (ELECTRIC_COUNT == border || ElectricNone == border) {
112 return;
113 }
114 m_default[border] = index;
115 }
116
monitorChangeDefaultEdge(const QList<int> & borderList,int index)117 void KWinScreenEdge::monitorChangeDefaultEdge(const QList<int> &borderList, int index)
118 {
119 for (int border : borderList) {
120 monitorChangeDefaultEdge(static_cast<ElectricBorder>(border), index);
121 }
122 }
123
reload()124 void KWinScreenEdge::reload()
125 {
126 for (auto it = m_reference.cbegin(); it != m_reference.cend(); ++it) {
127 monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()), it.value());
128 }
129 onChanged();
130 }
131
setDefaults()132 void KWinScreenEdge::setDefaults()
133 {
134 for (auto it = m_default.cbegin(); it != m_default.cend(); ++it) {
135 monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()), it.value());
136 }
137 onChanged();
138 }
139
electricBorderToMonitorEdge(ElectricBorder border)140 int KWinScreenEdge::electricBorderToMonitorEdge(ElectricBorder border)
141 {
142 switch(border) {
143 case ElectricTop:
144 return Monitor::Top;
145 case ElectricTopRight:
146 return Monitor::TopRight;
147 case ElectricRight:
148 return Monitor::Right;
149 case ElectricBottomRight:
150 return Monitor::BottomRight;
151 case ElectricBottom:
152 return Monitor::Bottom;
153 case ElectricBottomLeft:
154 return Monitor::BottomLeft;
155 case ElectricLeft:
156 return Monitor::Left;
157 case ElectricTopLeft:
158 return Monitor::TopLeft;
159 default: // ELECTRIC_COUNT and ElectricNone
160 return Monitor::None;
161 }
162 }
163
monitorEdgeToElectricBorder(int edge)164 ElectricBorder KWinScreenEdge::monitorEdgeToElectricBorder(int edge)
165 {
166 const Monitor::Edges monitorEdge = static_cast<Monitor::Edges>(edge);
167 switch (monitorEdge) {
168 case Monitor::Left:
169 return ElectricLeft;
170 case Monitor::Right:
171 return ElectricRight;
172 case Monitor::Top:
173 return ElectricTop;
174 case Monitor::Bottom:
175 return ElectricBottom;
176 case Monitor::TopLeft:
177 return ElectricTopLeft;
178 case Monitor::TopRight:
179 return ElectricTopRight;
180 case Monitor::BottomLeft:
181 return ElectricBottomLeft;
182 case Monitor::BottomRight:
183 return ElectricBottomRight;
184 default:
185 return ElectricNone;
186 }
187 }
188
onChanged()189 void KWinScreenEdge::onChanged()
190 {
191 bool needSave = isSaveNeeded();
192 for (auto it = m_reference.cbegin(); it != m_reference.cend(); ++it) {
193 needSave |= it.value() != monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()));
194 }
195 Q_EMIT saveNeededChanged(needSave);
196
197 bool defaults = isDefault();
198 for (auto it = m_default.cbegin(); it != m_default.cend(); ++it) {
199 defaults &= it.value() == monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()));
200 }
201 Q_EMIT defaultChanged(defaults);
202 }
203
createConnection()204 void KWinScreenEdge::createConnection()
205 {
206 connect(monitor(),
207 &Monitor::changed,
208 this,
209 &KWinScreenEdge::onChanged);
210 }
211
isSaveNeeded() const212 bool KWinScreenEdge::isSaveNeeded() const
213 {
214 return false;
215 }
216
isDefault() const217 bool KWinScreenEdge::isDefault() const
218 {
219 return true;
220 }
221
222 } // namespace
223