Wrap keys and menus, fix icon, add subsystem to executable.

This commit is contained in:
jess 2026-04-17 22:18:43 -07:00
parent 7d139570b2
commit 6be17a4619
6 changed files with 24 additions and 19 deletions

View File

@ -646,7 +646,7 @@ impl EditorState {
self.computed_images.retain(|img| !block_ids.contains(&img.anchor.block_id));
let mut new_srcs: Vec<(Anchor, String, String)> = Vec::new();
for &(start, block_id) in boundaries {
for &(_start, block_id) in boundaries {
let block = match self.registry.get(&block_id) {
Some(b) => b,
None => continue,

View File

@ -1,13 +1,12 @@
use std::process::Command;
fn main() {
#[cfg(target_os = "windows")]
{
use std::process::Command;
let svg = "../assets/Acord.svg";
let ico = "icon.ico";
let tmp = "icon_tmp";
// Only regenerate on release builds or when the SVG changes.
println!("cargo:rerun-if-changed={svg}");
let _ = std::fs::create_dir_all(tmp);
@ -23,7 +22,7 @@ fn main() {
.map(|s| s.success())
.unwrap_or(false);
if !ok {
eprintln!("cargo:warning=rsvg-convert failed for {size}px — skipping icon embed");
eprintln!("cargo:warning=rsvg-convert not found or failed — building without icon");
let _ = std::fs::remove_dir_all(tmp);
return;
}
@ -40,12 +39,14 @@ fn main() {
let _ = std::fs::remove_dir_all(tmp);
if !ok {
eprintln!("cargo:warning=magick ico conversion failed — skipping icon embed");
eprintln!("cargo:warning=magick (ImageMagick) not found — building without icon");
return;
}
let mut res = winres::WindowsResource::new();
res.set_icon(ico);
res.compile().expect("winres icon embed");
if let Err(e) = res.compile() {
eprintln!("cargo:warning=winres failed: {e} — building without icon");
}
}
}

View File

@ -1,4 +1,4 @@
use std::ffi::{c_void, CString};
use std::ffi::CString;
use winit::application::ApplicationHandler;
use winit::dpi::{LogicalSize, PhysicalPosition};
@ -22,9 +22,10 @@ pub struct App {
window: Option<Window>,
handle: *mut ViewportHandle,
config: Config,
menu: Option<AppMenu>,
_menu: Option<AppMenu>,
cursor_pos: PhysicalPosition<f64>,
scale: f32,
modifiers: ModifiersState,
}
impl App {
@ -33,9 +34,10 @@ impl App {
window: None,
handle: std::ptr::null_mut(),
config: Config::load(),
menu: None,
_menu: None,
cursor_pos: PhysicalPosition::new(0.0, 0.0),
scale: 1.0,
modifiers: ModifiersState::empty(),
}
}
@ -178,7 +180,7 @@ impl ApplicationHandler for App {
unsafe { app_menu.menu.init_for_hwnd(h.hwnd.get()).ok(); }
}
}
self.menu = Some(app_menu);
self._menu = Some(app_menu);
self.window = Some(window);
}
@ -252,20 +254,15 @@ impl ApplicationHandler for App {
.unwrap_or(std::ptr::null());
let keycode = winit_key_to_code(&event.logical_key);
let modifiers = if let Some(w) = &self.window {
// No direct modifier query on winit 0.30 Window.
// Modifiers come via ModifiersChanged. We track them.
0u32
} else {
0u32
};
let mod_flags = encode_modifiers(self.modifiers);
acord_viewport::viewport_key_event(
self.handle, keycode, modifiers, pressed, text_ptr,
self.handle, keycode, mod_flags, pressed, text_ptr,
);
}
WindowEvent::ModifiersChanged(mods) => {
self.modifiers = mods.state();
if !self.handle.is_null() {
let state = mods.state();
let h = unsafe { &mut *self.handle };

View File

@ -1,11 +1,14 @@
use std::collections::HashMap;
use std::path::PathBuf;
#[allow(dead_code)]
pub struct Config {
path: PathBuf,
data: HashMap<String, String>,
}
#[allow(dead_code)]
impl Config {
pub fn load() -> Self {
let dir = config_dir();

View File

@ -1,3 +1,6 @@
// Hide the console window on release builds.
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
mod app;
mod config;
mod menu;

View File

@ -2,6 +2,7 @@ use muda::{Menu, MenuEvent, MenuItem, PredefinedMenuItem, Submenu, accelerator::
use muda::accelerator::{Code, Modifiers};
pub struct AppMenu {
#[allow(dead_code)]
pub menu: Menu,
}