Skip to content

Commit 1236a9b

Browse files
authored
feat(client): support for hardware cursor (#804)
1 parent bca455f commit 1236a9b

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

crates/ironrdp-client/src/app.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use winit::event::{self, WindowEvent};
1313
use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop};
1414
use winit::keyboard::ModifiersKeyState;
1515
use winit::platform::scancode::PhysicalKeyExtScancode;
16-
use winit::window::{Window, WindowAttributes};
16+
use winit::window::{CursorIcon, CustomCursor, Window, WindowAttributes};
1717

1818
use crate::rdp::{RdpInputEvent, RdpOutputEvent};
1919

@@ -352,13 +352,28 @@ impl ApplicationHandler<RdpOutputEvent> for App {
352352
window.set_cursor_visible(false);
353353
}
354354
RdpOutputEvent::PointerDefault => {
355+
window.set_cursor(CursorIcon::default());
355356
window.set_cursor_visible(true);
356357
}
357358
RdpOutputEvent::PointerPosition { x, y } => {
358359
if let Err(error) = window.set_cursor_position(LogicalPosition::new(x, y)) {
359360
error!(?error, "Failed to set cursor position");
360361
}
361362
}
363+
RdpOutputEvent::PointerBitmap(pointer) => {
364+
debug!(width = ?pointer.width, height = ?pointer.height, "Received pointer bitmap");
365+
match CustomCursor::from_rgba(
366+
pointer.bitmap_data.clone(),
367+
pointer.width,
368+
pointer.height,
369+
pointer.hotspot_x,
370+
pointer.hotspot_y,
371+
) {
372+
Ok(cursor) => window.set_cursor(event_loop.create_custom_cursor(cursor)),
373+
Err(error) => error!(?error, "Failed to set cursor bitmap"),
374+
}
375+
window.set_cursor_visible(true);
376+
}
362377
}
363378
}
364379
}

crates/ironrdp-client/src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ impl Config {
342342
autologon: args.autologon,
343343
no_audio_playback: false,
344344
request_data: None,
345-
pointer_software_rendering: true,
345+
pointer_software_rendering: false,
346346
performance_flags: PerformanceFlags::default(),
347347
};
348348

crates/ironrdp-client/src/rdp.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
use std::sync::Arc;
2+
13
use ironrdp::cliprdr::backend::{ClipboardMessage, CliprdrBackendFactory};
24
use ironrdp::connector::connection_activation::ConnectionActivationState;
35
use ironrdp::connector::{ConnectionResult, ConnectorResult};
46
use ironrdp::displaycontrol::client::DisplayControlClient;
57
use ironrdp::displaycontrol::pdu::MonitorLayoutEntry;
68
use ironrdp::graphics::image_processing::PixelFormat;
9+
use ironrdp::graphics::pointer::DecodedPointer;
710
use ironrdp::pdu::input::fast_path::FastPathInputEvent;
811
use ironrdp::session::image::DecodedImage;
912
use ironrdp::session::{fast_path, ActiveStage, ActiveStageOutput, GracefulDisconnectReason, SessionResult};
@@ -28,6 +31,7 @@ pub enum RdpOutputEvent {
2831
PointerDefault,
2932
PointerHidden,
3033
PointerPosition { x: u16, y: u16 },
34+
PointerBitmap(Arc<DecodedPointer>),
3135
Terminated(SessionResult<GracefulDisconnectReason>),
3236
}
3337

@@ -509,8 +513,10 @@ async fn active_session(
509513
.send_event(RdpOutputEvent::PointerPosition { x, y })
510514
.map_err(|e| session::custom_err!("event_loop_proxy", e))?;
511515
}
512-
ActiveStageOutput::PointerBitmap(_) => {
513-
// Not applicable, because we use the software cursor rendering.
516+
ActiveStageOutput::PointerBitmap(pointer) => {
517+
event_loop_proxy
518+
.send_event(RdpOutputEvent::PointerBitmap(pointer))
519+
.map_err(|e| session::custom_err!("event_loop_proxy", e))?;
514520
}
515521
ActiveStageOutput::DeactivateAll(mut connection_activation) => {
516522
// Execute the Deactivation-Reactivation Sequence:

0 commit comments

Comments
 (0)