Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
680fa96f32 | ||
|
|
eb0a801921 | ||
|
|
76ecdac081 |
Generated
+1
-1
@@ -1393,7 +1393,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ink-notes"
|
||||
version = "0.19.0"
|
||||
version = "0.20.1"
|
||||
dependencies = [
|
||||
"ab_glyph",
|
||||
"arboard",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "ink-notes"
|
||||
version = "0.19.0"
|
||||
version = "0.20.1"
|
||||
edition = "2021"
|
||||
description = "Notizbuch-App für Stift, Touch und Maus unter Linux"
|
||||
repository = "https://gitea.pansi.eu/harald/ink-notes"
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
Notizbuch-App für Stift, Touch und Maus unter Linux (getestet mit Zorin OS 18 / Ubuntu 24.04).
|
||||
|
||||
### Highlights:
|
||||
- **Fehlerbehebung Stift**: Das erste Antippen mit dem Stift trifft jetzt – Knöpfe und Notizbücher reagieren sofort statt erst beim zweiten Tippen; Striche beginnen nicht mehr mit einer Linie von der vorherigen Stiftposition
|
||||
- **Tasten am Stift belegen**: Im ☰-Menü unter Eingabe jede Stifttaste mit Radieren, Auswählen, Textmarker, Stift oder Nichts belegen (gilt, solange die Taste gedrückt ist); Tasten erscheinen nach dem ersten Drücken und leuchten beim Drücken grün
|
||||
- **Ordner verschieben**: Ordner lassen sich jetzt wie Notizbücher mit 📂 samt Inhalt in andere Ordner oder auf die oberste Ebene verschieben
|
||||
- **Ordner für Notizbücher**: Beliebig verschachtelte Ordner (z. B. 3. Semester › Mathe) im Dokumenten-Manager anlegen, umbenennen und löschen, Notizbücher mit 📂 verschieben; neue Notizbücher landen im geöffneten Ordner. Die Notizbuch-Dateien bleiben unverändert (Zuordnung in library.json)
|
||||
- **Einfügen per Finger**: Lange (½ s) mit dem Finger aufs Blatt drücken öffnet ein Menü „Einfügen“ – Screenshot, kopierter Text oder kopierte Objekte landen genau an dieser Stelle (wie in Rnote)
|
||||
|
||||
@@ -1339,6 +1339,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
if let Ok(tablet_events) = mgr.pump() {
|
||||
let scale = window.scale_factor() as f32;
|
||||
let now = start_time.elapsed().as_secs_f64();
|
||||
// Aufsetzen erst mit der Position desselben Frames verarbeiten
|
||||
let tablet_events = ink_notes::platform::down_after_pose(
|
||||
tablet_events,
|
||||
|e| matches!(e, octotablet::events::Event::Tool { event: octotablet::events::ToolEvent::Down, .. }),
|
||||
|e| matches!(e, octotablet::events::Event::Tool { event: octotablet::events::ToolEvent::Pose(_), .. }),
|
||||
);
|
||||
|
||||
for t_event in tablet_events {
|
||||
if let octotablet::events::Event::Tool { tool, event } = t_event {
|
||||
|
||||
@@ -58,10 +58,62 @@ pub fn display_backend_from_env() -> DisplayBackend {
|
||||
)
|
||||
}
|
||||
|
||||
/// Bringt die Ereignisse eines Tablet-Frames in eine brauchbare Reihenfolge: octotablet meldet
|
||||
/// das Aufsetzen des Stifts (`Down`) vor der Position desselben Frames (`Pose`). Bis dahin
|
||||
/// gälte noch die alte Position – kam der Stift schnell heran (Annähern und Aufsetzen im selben
|
||||
/// Frame), läge sie ganz woanders: Ein Tippen auf einen Knopf ginge daneben, ein Strich begänne
|
||||
/// mit einer Linie von der alten Stelle. Hier folgt jedes `Down` auf die nächste `Pose`, spätestens
|
||||
/// vor dem nächsten anderen Ereignis.
|
||||
pub fn down_after_pose<T>(
|
||||
events: impl IntoIterator<Item = T>,
|
||||
is_down: impl Fn(&T) -> bool,
|
||||
is_pose: impl Fn(&T) -> bool,
|
||||
) -> Vec<T> {
|
||||
let mut ordered = Vec::new();
|
||||
let mut deferred = None;
|
||||
for event in events {
|
||||
if is_down(&event) {
|
||||
if let Some(down) = deferred.replace(event) {
|
||||
ordered.push(down);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
let pose = is_pose(&event);
|
||||
if !pose {
|
||||
ordered.extend(deferred.take());
|
||||
}
|
||||
ordered.push(event);
|
||||
if pose {
|
||||
ordered.extend(deferred.take());
|
||||
}
|
||||
}
|
||||
ordered.extend(deferred);
|
||||
ordered
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_down_follows_pose_of_its_frame() {
|
||||
let order = |events: &str| {
|
||||
down_after_pose(events.chars(), |c| *c == 'D', |c| *c == 'P')
|
||||
.into_iter()
|
||||
.collect::<String>()
|
||||
};
|
||||
// In, Down, Pose, Button, Frame -> Down erst mit der neuen Position
|
||||
assert_eq!(order("IDPBF"), "IPDBF");
|
||||
// Down ohne Pose im Frame: vor dem Frame-Ende
|
||||
assert_eq!(order("DF"), "DF");
|
||||
assert_eq!(order("DBF"), "DBF");
|
||||
// Am Ende ohne weiteres Ereignis
|
||||
assert_eq!(order("PD"), "PD");
|
||||
// Andere Ereignisse bleiben unverändert
|
||||
assert_eq!(order("PFPFUF"), "PFPFUF");
|
||||
assert_eq!(order("IDPFPFUF"), "IPDFPFUF");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_choose_display_backend() {
|
||||
// WSL mit X11-Display: X11 (Wayland unter WSLg bricht ab)
|
||||
|
||||
Reference in New Issue
Block a user