forked from quickshell/quickshell
		
	x11/panelwindow: fix multi monitor struts
This commit is contained in:
		
							parent
							
								
									95245cb6a5
								
							
						
					
					
						commit
						6cb7d894ab
					
				
					 2 changed files with 30 additions and 4 deletions
				
			
		| 
						 | 
					@ -239,11 +239,28 @@ void XPanelWindow::connectScreen() {
 | 
				
			||||||
		    this,
 | 
							    this,
 | 
				
			||||||
		    &XPanelWindow::updateDimensionsSlot
 | 
							    &XPanelWindow::updateDimensionsSlot
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							QObject::connect(
 | 
				
			||||||
 | 
							    this->mTrackedScreen,
 | 
				
			||||||
 | 
							    &QScreen::virtualGeometryChanged,
 | 
				
			||||||
 | 
							    this,
 | 
				
			||||||
 | 
							    &XPanelWindow::onScreenVirtualGeometryChanged
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this->updateDimensions();
 | 
						this->updateDimensions();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// For some reason this gets sent multiple times with the same value.
 | 
				
			||||||
 | 
					void XPanelWindow::onScreenVirtualGeometryChanged() {
 | 
				
			||||||
 | 
						auto geometry = this->mTrackedScreen->virtualGeometry();
 | 
				
			||||||
 | 
						if (geometry != this->lastScreenVirtualGeometry) {
 | 
				
			||||||
 | 
							this->lastScreenVirtualGeometry = geometry;
 | 
				
			||||||
 | 
							this->updateStrut(false);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void XPanelWindow::updateDimensionsSlot() { this->updateDimensions(); }
 | 
					void XPanelWindow::updateDimensionsSlot() { this->updateDimensions(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void XPanelWindow::updateDimensions(bool propagate) {
 | 
					void XPanelWindow::updateDimensions(bool propagate) {
 | 
				
			||||||
| 
						 | 
					@ -384,16 +401,22 @@ void XPanelWindow::updateStrut(bool propagate) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Due to missing headers it isn't even possible to do this right.
 | 
						auto rootGeometry = this->window->screen()->virtualGeometry();
 | 
				
			||||||
	// We assume a single xinerama monitor with a matching size root.
 | 
					 | 
				
			||||||
	auto screenGeometry = this->window->screen()->geometry();
 | 
						auto screenGeometry = this->window->screen()->geometry();
 | 
				
			||||||
	auto horizontal = side == 0 || side == 1;
 | 
						auto horizontal = side == 0 || side == 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (side) {
 | 
				
			||||||
 | 
						case 0: exclusiveZone += screenGeometry.left(); break;
 | 
				
			||||||
 | 
						case 1: exclusiveZone += rootGeometry.right() - screenGeometry.right(); break;
 | 
				
			||||||
 | 
						case 2: exclusiveZone += screenGeometry.top(); break;
 | 
				
			||||||
 | 
						case 3: exclusiveZone += rootGeometry.bottom() - screenGeometry.bottom(); break;
 | 
				
			||||||
 | 
						default: break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto data = std::array<quint32, 12>();
 | 
						auto data = std::array<quint32, 12>();
 | 
				
			||||||
	data[side] = exclusiveZone;
 | 
						data[side] = exclusiveZone;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto start = horizontal ? screenGeometry.top() + this->window->y()
 | 
						auto start = horizontal ? this->window->y() : this->window->x();
 | 
				
			||||||
	                        : screenGeometry.left() + this->window->x();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data[4 + side * 2] = start;
 | 
						data[4 + side * 2] = start;
 | 
				
			||||||
	data[5 + side * 2] = start + (horizontal ? this->window->height() : this->window->width());
 | 
						data[5 + side * 2] = start + (horizontal ? this->window->height() : this->window->width());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,6 +81,7 @@ private slots:
 | 
				
			||||||
	void xInit();
 | 
						void xInit();
 | 
				
			||||||
	void updatePanelStack();
 | 
						void updatePanelStack();
 | 
				
			||||||
	void updateDimensionsSlot();
 | 
						void updateDimensionsSlot();
 | 
				
			||||||
 | 
						void onScreenVirtualGeometryChanged();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	void connectScreen();
 | 
						void connectScreen();
 | 
				
			||||||
| 
						 | 
					@ -97,6 +98,8 @@ private:
 | 
				
			||||||
	Margins mMargins;
 | 
						Margins mMargins;
 | 
				
			||||||
	qint32 mExclusiveZone = 0;
 | 
						qint32 mExclusiveZone = 0;
 | 
				
			||||||
	ExclusionMode::Enum mExclusionMode = ExclusionMode::Auto;
 | 
						ExclusionMode::Enum mExclusionMode = ExclusionMode::Auto;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						QRect lastScreenVirtualGeometry;
 | 
				
			||||||
	XPanelEventFilter eventFilter;
 | 
						XPanelEventFilter eventFilter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	friend class XPanelStack;
 | 
						friend class XPanelStack;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue