@@ -232,6 +232,24 @@ impl Connection { |
| 232 | 232 | Ok(()) |
| 233 | 233 | } |
| 234 | 234 | |
| 235 | + /// Warp the mouse pointer to the center of a window. |
| 236 | + pub fn warp_pointer_to_window(&self, window: Window) -> Result<(), Error> { |
| 237 | + // Get window geometry |
| 238 | + let geom = self.conn.get_geometry(window)?.reply()?; |
| 239 | + let center_x = (geom.width / 2) as i16; |
| 240 | + let center_y = (geom.height / 2) as i16; |
| 241 | + |
| 242 | + self.conn.warp_pointer( |
| 243 | + x11rb::NONE, // src_window (none = don't check source) |
| 244 | + window, // dst_window |
| 245 | + 0, 0, // src_x, src_y (ignored when src_window is none) |
| 246 | + 0, 0, // src_width, src_height (ignored) |
| 247 | + center_x, // dst_x (relative to dst_window) |
| 248 | + center_y, // dst_y (relative to dst_window) |
| 249 | + )?; |
| 250 | + Ok(()) |
| 251 | + } |
| 252 | + |
| 235 | 253 | /// Set window border width and color. |
| 236 | 254 | pub fn set_border(&self, window: Window, width: u32, color: u32) -> Result<(), Error> { |
| 237 | 255 | let aux = ChangeWindowAttributesAux::new().border_pixel(color); |
@@ -636,13 +654,27 @@ impl Connection { |
| 636 | 654 | monitors.push(monitor); |
| 637 | 655 | } |
| 638 | 656 | |
| 657 | + // Log raw (pre-sorted) monitor info from RandR |
| 658 | + tracing::debug!("Raw monitor order from RandR:"); |
| 659 | + for m in &monitors { |
| 660 | + tracing::debug!( |
| 661 | + " '{}' at ({}, {}) size {}x{}", |
| 662 | + m.name, m.geometry.x, m.geometry.y, m.geometry.width, m.geometry.height |
| 663 | + ); |
| 664 | + } |
| 665 | + |
| 639 | 666 | // Sort monitors by X position (left to right) |
| 640 | 667 | monitors.sort_by_key(|m| m.geometry.x); |
| 641 | 668 | |
| 642 | | - tracing::info!("Detected {} monitors: {:?}", |
| 643 | | - monitors.len(), |
| 644 | | - monitors.iter().map(|m| &m.name).collect::<Vec<_>>() |
| 645 | | - ); |
| 669 | + // Log sorted monitor info |
| 670 | + for (i, m) in monitors.iter().enumerate() { |
| 671 | + tracing::info!( |
| 672 | + "Monitor {}: '{}' at ({}, {}) size {}x{} {}", |
| 673 | + i, m.name, m.geometry.x, m.geometry.y, |
| 674 | + m.geometry.width, m.geometry.height, |
| 675 | + if m.primary { "(primary)" } else { "" } |
| 676 | + ); |
| 677 | + } |
| 646 | 678 | |
| 647 | 679 | Ok(monitors) |
| 648 | 680 | } |