Skip to content

Commit 944a6ee

Browse files
Desktop: Hook up native window controls (#3161)
* Implement window controls * Fix drag target size * Maximize with drag area double click
1 parent e97d552 commit 944a6ee

File tree

9 files changed

+29
-4
lines changed

9 files changed

+29
-4
lines changed

desktop/src/app.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ impl WinitApp {
164164
window.set_minimized(minimized);
165165
}
166166
}
167+
DesktopFrontendMessage::DragWindow => {
168+
if let Some(window) = &self.window {
169+
let _ = window.drag_window();
170+
}
171+
}
167172
DesktopFrontendMessage::CloseWindow => {
168173
let _ = self.event_loop_proxy.send_event(CustomEvent::CloseWindow);
169174
}
@@ -271,7 +276,9 @@ impl ApplicationHandler<CustomEvent> for WinitApp {
271276
let mut window = Window::default_attributes()
272277
.with_title(APP_NAME)
273278
.with_min_inner_size(winit::dpi::LogicalSize::new(400, 300))
274-
.with_inner_size(winit::dpi::LogicalSize::new(1200, 800));
279+
.with_inner_size(winit::dpi::LogicalSize::new(1200, 800))
280+
.with_decorations(false)
281+
.with_resizable(true);
275282

276283
#[cfg(target_os = "linux")]
277284
{

desktop/wrapper/src/intercept_frontend_message.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD
7070
// Forward this to update the UI
7171
return Some(message);
7272
}
73+
FrontendMessage::DragWindow => {
74+
dispatcher.respond(DesktopFrontendMessage::DragWindow);
75+
}
7376
FrontendMessage::CloseWindow => {
7477
dispatcher.respond(DesktopFrontendMessage::CloseWindow);
7578
}

desktop/wrapper/src/messages.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ pub enum DesktopFrontendMessage {
3636
maximized: bool,
3737
minimized: bool,
3838
},
39+
DragWindow,
40+
CloseWindow,
3941
PersistenceWriteDocument {
4042
id: DocumentId,
4143
document: Document,
@@ -55,7 +57,6 @@ pub enum DesktopFrontendMessage {
5557
preferences: Preferences,
5658
},
5759
PersistenceLoadPreferences,
58-
CloseWindow,
5960
}
6061

6162
pub enum DesktopWrapperMessage {

editor/src/messages/app_window/app_window_message.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ pub enum AppWindowMessage {
88
AppWindowMinimize,
99
AppWindowMaximize,
1010
AppWindowUpdatePlatform { platform: AppWindowPlatform },
11+
AppWindowDrag,
1112
AppWindowClose,
1213
}

editor/src/messages/app_window/app_window_message_handler.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ impl MessageHandler<AppWindowMessage, ()> for AppWindowMessageHandler {
3131
self.platform = platform;
3232
responses.add(FrontendMessage::UpdatePlatform { platform: self.platform });
3333
}
34+
AppWindowMessage::AppWindowDrag => {
35+
responses.add(FrontendMessage::DragWindow);
36+
}
3437
AppWindowMessage::AppWindowClose => {
3538
responses.add(FrontendMessage::CloseWindow);
3639
}

editor/src/messages/frontend/frontend_message.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ pub enum FrontendMessage {
343343
maximized: bool,
344344
minimized: bool,
345345
},
346+
DragWindow,
346347
CloseWindow,
347348
UpdateViewportHolePunch {
348349
active: bool,

frontend/src/components/layout/LayoutRow.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
on:dragover
4444
on:dragstart
4545
on:drop
46+
on:mousedown
4647
on:mouseup
4748
on:pointerdown
4849
on:pointerenter
@@ -67,7 +68,6 @@ on:keydown
6768
on:keypress
6869
on:keyup
6970
on:lostpointercapture
70-
on:mousedown
7171
on:mouseenter
7272
on:mouseleave
7373
on:mousemove

frontend/src/components/window/title-bar/TitleBar.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@
7676
<TextButton label={entry.label} icon={entry.icon} menuListChildren={entry.children} action={entry.action} flush={true} />
7777
{/each}
7878
{/if}
79+
<LayoutRow on:mousedown={() => editor.handle.appWindowDrag()} on:dblclick={() => editor.handle.appWindowMaximize()} />
7980
</LayoutRow>
8081
<!-- Document title -->
81-
<LayoutRow class="center">
82+
<LayoutRow class="center" on:mousedown={() => editor.handle.appWindowDrag()} on:dblclick={() => editor.handle.appWindowMaximize()}>
8283
<WindowTitle text={windowTitle} />
8384
</LayoutRow>
8485
<!-- Window buttons (except on Mac) -->
8586
<LayoutRow class="right">
87+
<LayoutRow on:mousedown={() => editor.handle.appWindowDrag()} on:dblclick={() => editor.handle.appWindowMaximize()} />
8688
{#if platform === "Windows"}
8789
<WindowButtonsWindows {maximized} />
8890
{:else if platform === "Linux"}

frontend/wasm/src/editor_api.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,13 @@ impl EditorHandle {
352352
self.dispatch(message);
353353
}
354354

355+
/// Drag the application window
356+
#[wasm_bindgen(js_name = appWindowDrag)]
357+
pub fn app_window_start_drag(&self) {
358+
let message = AppWindowMessage::AppWindowDrag;
359+
self.dispatch(message);
360+
}
361+
355362
/// Displays a dialog with an error message
356363
#[wasm_bindgen(js_name = errorDialog)]
357364
pub fn error_dialog(&self, title: String, description: String) {

0 commit comments

Comments
 (0)