Wrap keys and menus, fix icon, add subsystem to executable.
This commit is contained in:
parent
7d139570b2
commit
6be17a4619
|
|
@ -646,7 +646,7 @@ impl EditorState {
|
||||||
self.computed_images.retain(|img| !block_ids.contains(&img.anchor.block_id));
|
self.computed_images.retain(|img| !block_ids.contains(&img.anchor.block_id));
|
||||||
|
|
||||||
let mut new_srcs: Vec<(Anchor, String, String)> = Vec::new();
|
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) {
|
let block = match self.registry.get(&block_id) {
|
||||||
Some(b) => b,
|
Some(b) => b,
|
||||||
None => continue,
|
None => continue,
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
use std::process::Command;
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
{
|
{
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
let svg = "../assets/Acord.svg";
|
let svg = "../assets/Acord.svg";
|
||||||
let ico = "icon.ico";
|
let ico = "icon.ico";
|
||||||
let tmp = "icon_tmp";
|
let tmp = "icon_tmp";
|
||||||
|
|
||||||
// Only regenerate on release builds or when the SVG changes.
|
|
||||||
println!("cargo:rerun-if-changed={svg}");
|
println!("cargo:rerun-if-changed={svg}");
|
||||||
|
|
||||||
let _ = std::fs::create_dir_all(tmp);
|
let _ = std::fs::create_dir_all(tmp);
|
||||||
|
|
@ -23,7 +22,7 @@ fn main() {
|
||||||
.map(|s| s.success())
|
.map(|s| s.success())
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
if !ok {
|
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);
|
let _ = std::fs::remove_dir_all(tmp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -40,12 +39,14 @@ fn main() {
|
||||||
let _ = std::fs::remove_dir_all(tmp);
|
let _ = std::fs::remove_dir_all(tmp);
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
eprintln!("cargo:warning=magick ico conversion failed — skipping icon embed");
|
eprintln!("cargo:warning=magick (ImageMagick) not found — building without icon");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut res = winres::WindowsResource::new();
|
let mut res = winres::WindowsResource::new();
|
||||||
res.set_icon(ico);
|
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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use std::ffi::{c_void, CString};
|
use std::ffi::CString;
|
||||||
|
|
||||||
use winit::application::ApplicationHandler;
|
use winit::application::ApplicationHandler;
|
||||||
use winit::dpi::{LogicalSize, PhysicalPosition};
|
use winit::dpi::{LogicalSize, PhysicalPosition};
|
||||||
|
|
@ -22,9 +22,10 @@ pub struct App {
|
||||||
window: Option<Window>,
|
window: Option<Window>,
|
||||||
handle: *mut ViewportHandle,
|
handle: *mut ViewportHandle,
|
||||||
config: Config,
|
config: Config,
|
||||||
menu: Option<AppMenu>,
|
_menu: Option<AppMenu>,
|
||||||
cursor_pos: PhysicalPosition<f64>,
|
cursor_pos: PhysicalPosition<f64>,
|
||||||
scale: f32,
|
scale: f32,
|
||||||
|
modifiers: ModifiersState,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
|
|
@ -33,9 +34,10 @@ impl App {
|
||||||
window: None,
|
window: None,
|
||||||
handle: std::ptr::null_mut(),
|
handle: std::ptr::null_mut(),
|
||||||
config: Config::load(),
|
config: Config::load(),
|
||||||
menu: None,
|
_menu: None,
|
||||||
cursor_pos: PhysicalPosition::new(0.0, 0.0),
|
cursor_pos: PhysicalPosition::new(0.0, 0.0),
|
||||||
scale: 1.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(); }
|
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);
|
self.window = Some(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -252,20 +254,15 @@ impl ApplicationHandler for App {
|
||||||
.unwrap_or(std::ptr::null());
|
.unwrap_or(std::ptr::null());
|
||||||
|
|
||||||
let keycode = winit_key_to_code(&event.logical_key);
|
let keycode = winit_key_to_code(&event.logical_key);
|
||||||
let modifiers = if let Some(w) = &self.window {
|
let mod_flags = encode_modifiers(self.modifiers);
|
||||||
// No direct modifier query on winit 0.30 Window.
|
|
||||||
// Modifiers come via ModifiersChanged. We track them.
|
|
||||||
0u32
|
|
||||||
} else {
|
|
||||||
0u32
|
|
||||||
};
|
|
||||||
|
|
||||||
acord_viewport::viewport_key_event(
|
acord_viewport::viewport_key_event(
|
||||||
self.handle, keycode, modifiers, pressed, text_ptr,
|
self.handle, keycode, mod_flags, pressed, text_ptr,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
WindowEvent::ModifiersChanged(mods) => {
|
WindowEvent::ModifiersChanged(mods) => {
|
||||||
|
self.modifiers = mods.state();
|
||||||
if !self.handle.is_null() {
|
if !self.handle.is_null() {
|
||||||
let state = mods.state();
|
let state = mods.state();
|
||||||
let h = unsafe { &mut *self.handle };
|
let h = unsafe { &mut *self.handle };
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
data: HashMap<String, String>,
|
data: HashMap<String, String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
pub fn load() -> Self {
|
pub fn load() -> Self {
|
||||||
let dir = config_dir();
|
let dir = config_dir();
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Hide the console window on release builds.
|
||||||
|
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||||
|
|
||||||
mod app;
|
mod app;
|
||||||
mod config;
|
mod config;
|
||||||
mod menu;
|
mod menu;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ use muda::{Menu, MenuEvent, MenuItem, PredefinedMenuItem, Submenu, accelerator::
|
||||||
use muda::accelerator::{Code, Modifiers};
|
use muda::accelerator::{Code, Modifiers};
|
||||||
|
|
||||||
pub struct AppMenu {
|
pub struct AppMenu {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub menu: Menu,
|
pub menu: Menu,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue