Changeset View
Changeset View
Standalone View
Standalone View
kded/generator.cpp
Show First 20 Lines • Show All 171 Lines • ▼ Show 20 Line(s) | 159 | // KDebug::Block switchBlock("Display Switch"); | |||
---|---|---|---|---|---|
172 | } | 172 | } | ||
173 | 173 | | |||
174 | // There's not much else we can do with only one output | 174 | // There's not much else we can do with only one output | ||
175 | if (connectedOutputs.count() < 2) { | 175 | if (connectedOutputs.count() < 2) { | ||
176 | singleOutput(connectedOutputs); | 176 | singleOutput(connectedOutputs); | ||
177 | return config; | 177 | return config; | ||
178 | } | 178 | } | ||
179 | 179 | | |||
180 | // We cannot try all possible combinations with two and more outputs | 180 | KScreen::OutputPtr embedded, external; | ||
181 | if (connectedOutputs.count() > 2) { | 181 | embedded = embeddedOutput(connectedOutputs); | ||
182 | | ||||
183 | // If the lid is closed, the embedded panel is not available | ||||
184 | if (embedded && isLaptop() && isLidClosed()) { | ||||
185 | connectedOutputs.remove(embedded->id()); | ||||
186 | embedded = KScreen::OutputPtr(); | ||||
187 | } | ||||
188 | | ||||
189 | // Use extendToRight / extendToLeft functions for more than two outputs | ||||
190 | if (action == Generator::ExtendToRight && connectedOutputs.count() > 2) { | ||||
182 | extendToRight(connectedOutputs); | 191 | extendToRight(connectedOutputs); | ||
183 | return config; | 192 | return config; | ||
184 | } | 193 | } | ||
194 | else if (action == Generator::ExtendToLeft && connectedOutputs.count() > 2) { | ||||
195 | extendToLeft(connectedOutputs); | ||||
196 | return config; | ||||
197 | } | ||||
185 | 198 | | |||
186 | KScreen::OutputPtr embedded, external; | 199 | bool embeddedIsExternal = false; | ||
187 | embedded = embeddedOutput(connectedOutputs); | | |||
188 | // If we don't have an embedded output (desktop with two external screens | 200 | // If we don't have an embedded output (desktop with two external screens | ||
189 | // for instance), then pretend one of them is embedded | 201 | // for instance), then pretend one of them is embedded | ||
190 | if (!embedded) { | 202 | if (!embedded) { | ||
191 | embedded = connectedOutputs.value(connectedOutputs.keys().first()); | 203 | embedded = connectedOutputs.value(connectedOutputs.keys().first()); | ||
204 | embeddedIsExternal = true; | ||||
192 | } | 205 | } | ||
193 | // Just to be sure | 206 | // Just to be sure | ||
194 | if (embedded->modes().isEmpty()) { | 207 | if (embedded->modes().isEmpty()) { | ||
195 | return config; | 208 | return config; | ||
196 | } | 209 | } | ||
197 | 210 | | |||
198 | if (action == Generator::Clone) { | 211 | if (action == Generator::Clone) { | ||
199 | qCDebug(KSCREEN_KDED) << "Cloning"; | 212 | qCDebug(KSCREEN_KDED) << "Cloning"; | ||
200 | embedded->setPrimary(true); | 213 | embedded->setPrimary(true); | ||
201 | cloneScreens(connectedOutputs); | 214 | cloneScreens(connectedOutputs); | ||
202 | return config; | 215 | return config; | ||
203 | } | 216 | } | ||
204 | 217 | | |||
205 | connectedOutputs.remove(embedded->id()); | 218 | connectedOutputs.remove(embedded->id()); | ||
206 | external = connectedOutputs.value(connectedOutputs.keys().first()); | 219 | external = connectedOutputs.value(connectedOutputs.keys().first()); | ||
220 | | ||||
207 | // Just to be sure | 221 | // Just to be sure | ||
208 | if (external->modes().isEmpty()) { | 222 | if (external->modes().isEmpty()) { | ||
209 | return config; | 223 | return config; | ||
210 | } | 224 | } | ||
211 | 225 | | |||
212 | switch (action) { | 226 | switch (action) { | ||
213 | case Generator::ExtendToLeft: { | 227 | case Generator::ExtendToLeft: { | ||
214 | qCDebug(KSCREEN_KDED) << "Extend to left"; | 228 | qCDebug(KSCREEN_KDED) << "Extend to left"; | ||
Show All 11 Lines | |||||
226 | const KScreen::ModePtr embeddedMode = bestModeForOutput(embedded); | 240 | const KScreen::ModePtr embeddedMode = bestModeForOutput(embedded); | ||
227 | Q_ASSERT(embeddedMode); | 241 | Q_ASSERT(embeddedMode); | ||
228 | embedded->setCurrentModeId(embeddedMode->id()); | 242 | embedded->setCurrentModeId(embeddedMode->id()); | ||
229 | 243 | | |||
230 | return config; | 244 | return config; | ||
231 | } | 245 | } | ||
232 | case Generator::TurnOffEmbedded: { | 246 | case Generator::TurnOffEmbedded: { | ||
233 | qCDebug(KSCREEN_KDED) << "Turn off embedded (laptop)"; | 247 | qCDebug(KSCREEN_KDED) << "Turn off embedded (laptop)"; | ||
248 | if (embeddedIsExternal) { | ||||
249 | qCDebug(KSCREEN_KDED) << "embeddedIsExternal: don't turn off embedded (laptop)"; | ||||
250 | return config; | ||||
251 | } | ||||
234 | embedded->setEnabled(false); | 252 | embedded->setEnabled(false); | ||
235 | embedded->setPrimary(false); | 253 | embedded->setPrimary(false); | ||
236 | 254 | | |||
237 | external->setEnabled(true); | 255 | external->setEnabled(true); | ||
238 | external->setPrimary(true); | 256 | external->setPrimary(true); | ||
239 | const KScreen::ModePtr extMode = bestModeForOutput(external); | 257 | const KScreen::ModePtr extMode = bestModeForOutput(external); | ||
240 | Q_ASSERT(extMode); | 258 | Q_ASSERT(extMode); | ||
241 | external->setCurrentModeId(extMode->id()); | 259 | external->setCurrentModeId(extMode->id()); | ||
260 | | ||||
261 | if (connectedOutputs.count() > 1) { | ||||
262 | connectedOutputs.remove(external->id()); | ||||
263 | QMapIterator<int, KScreen::OutputPtr> i(connectedOutputs); | ||||
264 | while (i.hasNext()) { | ||||
265 | i.next(); | ||||
266 | i.value()->setEnabled(true); | ||||
267 | const KScreen::ModePtr extMode = bestModeForOutput(i.value()); | ||||
268 | Q_ASSERT(extMode); | ||||
269 | i.value()->setCurrentModeId(extMode->id()); | ||||
270 | } | ||||
271 | } | ||||
272 | | ||||
242 | return config; | 273 | return config; | ||
243 | } | 274 | } | ||
244 | case Generator::TurnOffExternal: { | 275 | case Generator::TurnOffExternal: { | ||
245 | qCDebug(KSCREEN_KDED) << "Turn off external screen"; | 276 | qCDebug(KSCREEN_KDED) << "Turn off external screen"; | ||
277 | if (embeddedIsExternal) { | ||||
278 | qCDebug(KSCREEN_KDED) << "embeddedIsExternal: don't turn off external screen"; | ||||
279 | return config; | ||||
280 | } | ||||
246 | embedded->setPos(QPoint(0,0)); | 281 | embedded->setPos(QPoint(0,0)); | ||
247 | embedded->setEnabled(true); | 282 | embedded->setEnabled(true); | ||
248 | embedded->setPrimary(true); | 283 | embedded->setPrimary(true); | ||
249 | const KScreen::ModePtr embeddedMode = bestModeForOutput(embedded); | 284 | const KScreen::ModePtr embeddedMode = bestModeForOutput(embedded); | ||
250 | Q_ASSERT(embeddedMode); | 285 | Q_ASSERT(embeddedMode); | ||
251 | embedded->setCurrentModeId(embeddedMode->id()); | 286 | embedded->setCurrentModeId(embeddedMode->id()); | ||
252 | 287 | | |||
253 | external->setEnabled(false); | 288 | external->setEnabled(false); | ||
254 | external->setPrimary(false); | 289 | external->setPrimary(false); | ||
290 | | ||||
291 | if (connectedOutputs.count() > 1) { | ||||
292 | connectedOutputs.remove(external->id()); | ||||
293 | QMapIterator<int, KScreen::OutputPtr> i(connectedOutputs); | ||||
294 | while (i.hasNext()) { | ||||
295 | i.next(); | ||||
296 | i.value()->setEnabled(false); | ||||
297 | external->setPrimary(false); | ||||
298 | } | ||||
299 | } | ||||
300 | | ||||
255 | return config; | 301 | return config; | ||
256 | } | 302 | } | ||
257 | case Generator::ExtendToRight: { | 303 | case Generator::ExtendToRight: { | ||
258 | qCDebug(KSCREEN_KDED) << "Extend to the right"; | 304 | qCDebug(KSCREEN_KDED) << "Extend to the right"; | ||
259 | embedded->setPos(QPoint(0,0)); | 305 | embedded->setPos(QPoint(0,0)); | ||
260 | embedded->setEnabled(true); | 306 | embedded->setEnabled(true); | ||
261 | embedded->setPrimary(true); | 307 | embedded->setPrimary(true); | ||
262 | const KScreen::ModePtr embeddedMode = bestModeForOutput(embedded); | 308 | const KScreen::ModePtr embeddedMode = bestModeForOutput(embedded); | ||
263 | Q_ASSERT(embeddedMode); | 309 | Q_ASSERT(embeddedMode); | ||
264 | embedded->setCurrentModeId(embeddedMode->id()); | 310 | embedded->setCurrentModeId(embeddedMode->id()); | ||
265 | 311 | | |||
266 | | ||||
267 | Q_ASSERT(embedded->currentMode()); // we must have a mode now | 312 | Q_ASSERT(embedded->currentMode()); // we must have a mode now | ||
268 | const QSize size = embedded->geometry().size(); | 313 | const QSize size = embedded->geometry().size(); | ||
269 | external->setPos(QPoint(size.width(), 0)); | 314 | external->setPos(QPoint(size.width(), 0)); | ||
270 | external->setEnabled(true); | 315 | external->setEnabled(true); | ||
271 | external->setPrimary(false); | 316 | external->setPrimary(false); | ||
272 | const KScreen::ModePtr extMode = bestModeForOutput(external); | 317 | const KScreen::ModePtr extMode = bestModeForOutput(external); | ||
273 | Q_ASSERT(extMode); | 318 | Q_ASSERT(extMode); | ||
274 | external->setCurrentModeId(extMode->id()); | 319 | external->setCurrentModeId(extMode->id()); | ||
▲ Show 20 Lines • Show All 90 Lines • ▼ Show 20 Line(s) | 403 | { | |||
365 | if (output->modes().isEmpty()) { | 410 | if (output->modes().isEmpty()) { | ||
366 | return; | 411 | return; | ||
367 | } | 412 | } | ||
368 | 413 | | |||
369 | const KScreen::ModePtr bestMode = bestModeForOutput(output); | 414 | const KScreen::ModePtr bestMode = bestModeForOutput(output); | ||
370 | Q_ASSERT(bestMode); | 415 | Q_ASSERT(bestMode); | ||
371 | output->setCurrentModeId(bestMode->id()); | 416 | output->setCurrentModeId(bestMode->id()); | ||
372 | output->setEnabled(true); | 417 | output->setEnabled(true); | ||
418 | | ||||
373 | output->setPrimary(true); | 419 | output->setPrimary(true); | ||
374 | output->setPos(QPoint(0,0)); | 420 | output->setPos(QPoint(0,0)); | ||
375 | } | 421 | } | ||
376 | 422 | | |||
377 | void Generator::laptop(KScreen::OutputList &connectedOutputs) | 423 | void Generator::laptop(KScreen::OutputList &connectedOutputs) | ||
378 | { | 424 | { | ||
379 | ASSERT_OUTPUTS(connectedOutputs) | 425 | ASSERT_OUTPUTS(connectedOutputs) | ||
380 | if (connectedOutputs.isEmpty()) { | 426 | if (connectedOutputs.isEmpty()) { | ||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Line(s) | 430 | // KDebug::Block laptopBlock("Laptop config"); | |||
465 | 511 | | |||
466 | if (isDocked()) { | 512 | if (isDocked()) { | ||
467 | qCDebug(KSCREEN_KDED) << "Docked"; | 513 | qCDebug(KSCREEN_KDED) << "Docked"; | ||
468 | embedded->setPrimary(false); | 514 | embedded->setPrimary(false); | ||
469 | biggest->setPrimary(true); | 515 | biggest->setPrimary(true); | ||
470 | } | 516 | } | ||
471 | } | 517 | } | ||
472 | 518 | | |||
473 | void Generator::extendToRight(KScreen::OutputList &connectedOutputs) | 519 | void Generator::extendToLeftOrRight(KScreen::OutputList &connectedOutputs, LeftOrRight leftOrRight) | ||
474 | { | 520 | { | ||
475 | ASSERT_OUTPUTS(connectedOutputs); | 521 | ASSERT_OUTPUTS(connectedOutputs); | ||
476 | if (connectedOutputs.isEmpty()) { | 522 | if (connectedOutputs.isEmpty()) { | ||
477 | return; | 523 | return; | ||
478 | } | 524 | } | ||
479 | 525 | | |||
526 | if (leftOrRight == Left) | ||||
527 | qCDebug(KSCREEN_KDED) << "Extending to the left"; | ||||
528 | else | ||||
480 | qCDebug(KSCREEN_KDED) << "Extending to the right"; | 529 | qCDebug(KSCREEN_KDED) << "Extending to the right"; | ||
530 | | ||||
481 | KScreen::OutputPtr biggest = biggestOutput(connectedOutputs); | 531 | KScreen::OutputPtr biggest = biggestOutput(connectedOutputs); | ||
482 | Q_ASSERT(biggest); | 532 | Q_ASSERT(biggest); | ||
483 | 533 | | |||
484 | connectedOutputs.remove(biggest->id()); | 534 | connectedOutputs.remove(biggest->id()); | ||
485 | 535 | | |||
486 | biggest->setEnabled(true); | 536 | biggest->setEnabled(true); | ||
487 | biggest->setPrimary(true); | 537 | biggest->setPrimary(true); | ||
538 | | ||||
539 | if (leftOrRight == Right) | ||||
488 | biggest->setPos(QPoint(0,0)); | 540 | biggest->setPos(QPoint(0,0)); | ||
489 | const KScreen::ModePtr mode = bestModeForOutput(biggest); | | |||
490 | Q_ASSERT(mode); | | |||
491 | biggest->setCurrentModeId(mode->id()); | | |||
492 | 541 | | |||
493 | int globalWidth = biggest->geometry().width(); | 542 | const KScreen::ModePtr biggestMode = bestModeForOutput(biggest); | ||
543 | Q_ASSERT(biggestMode); | ||||
544 | biggest->setCurrentModeId(biggestMode->id()); | ||||
545 | | ||||
546 | int globalWidth = 0; | ||||
547 | | ||||
548 | if (leftOrRight == Right) | ||||
549 | globalWidth = biggest->geometry().width(); | ||||
494 | 550 | | |||
495 | Q_FOREACH(KScreen::OutputPtr output, connectedOutputs) { | 551 | Q_FOREACH(KScreen::OutputPtr output, connectedOutputs) { | ||
496 | output->setEnabled(true); | 552 | output->setEnabled(true); | ||
497 | output->setPrimary(false); | 553 | output->setPrimary(false); | ||
498 | output->setPos(QPoint(globalWidth, 0)); | 554 | output->setPos(QPoint(globalWidth, 0)); | ||
499 | const KScreen::ModePtr mode = bestModeForOutput(output); | 555 | const KScreen::ModePtr otherMode = bestModeForOutput(output); | ||
500 | Q_ASSERT(mode); | 556 | Q_ASSERT(otherMode); | ||
501 | output->setCurrentModeId(mode->id()); | 557 | output->setCurrentModeId(otherMode->id()); | ||
502 | 558 | | |||
503 | globalWidth += output->geometry().width(); | 559 | globalWidth += output->geometry().width(); | ||
504 | } | 560 | } | ||
561 | | ||||
562 | if (leftOrRight == Left) | ||||
563 | biggest->setPos(QPoint(globalWidth,0)); | ||||
564 | } | ||||
565 | | ||||
566 | void Generator::extendToRight(KScreen::OutputList &connectedOutputs) | ||||
567 | { | ||||
568 | extendToLeftOrRight(connectedOutputs, Right); | ||||
569 | } | ||||
570 | | ||||
571 | void Generator::extendToLeft(KScreen::OutputList &connectedOutputs) | ||||
572 | { | ||||
573 | extendToLeftOrRight(connectedOutputs, Left); | ||||
505 | } | 574 | } | ||
506 | 575 | | |||
507 | KScreen::ModePtr Generator::biggestMode(const KScreen::ModeList &modes) | 576 | KScreen::ModePtr Generator::biggestMode(const KScreen::ModeList &modes) | ||
508 | { | 577 | { | ||
509 | Q_ASSERT(!modes.isEmpty()); | 578 | Q_ASSERT(!modes.isEmpty()); | ||
510 | 579 | | |||
511 | int modeArea, biggestArea = 0; | 580 | int modeArea, biggestArea = 0; | ||
512 | KScreen::ModePtr biggestMode; | 581 | KScreen::ModePtr biggestMode; | ||
▲ Show 20 Lines • Show All 167 Lines • Show Last 20 Lines |