From ea2245d7b1dd6116bf85b4b903626b4846ad984c Mon Sep 17 00:00:00 2001 From: Gabriel <68819302+obsidianical@users.noreply.github.com> Date: Thu, 21 Jul 2022 10:34:48 +0200 Subject: [PATCH] did stuff --- src/bin/easymacrorec.rs | 267 ++++++++++++++++++++++++---------------- src/lib.rs | 85 ++++++++++--- src/x11_safe_wrapper.rs | 5 +- 3 files changed, 229 insertions(+), 128 deletions(-) diff --git a/src/bin/easymacrorec.rs b/src/bin/easymacrorec.rs index f7e993f..1b74121 100644 --- a/src/bin/easymacrorec.rs +++ b/src/bin/easymacrorec.rs @@ -4,17 +4,25 @@ use std::os::raw::{c_char, c_uchar, c_uint}; use std::process::{exit, ExitCode}; use std::ptr::{addr_of, slice_from_raw_parts}; use std::{io, slice, thread}; +use std::borrow::BorrowMut; +use std::cmp::max; +use std::env::args; use std::io::Write; use std::ffi::c_void; -use std::fmt::{format}; +use std::fmt::format; use std::fs::{File, OpenOptions}; +use std::mem::size_of; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; use clap::Parser; use x11::keysym::XK_Escape; use x11::xinput2::XIGrabModeSync; -use x11::xlib::{ButtonPress, ButtonRelease, CurrentTime, GrabModeAsync, GrabModeSync, GrabSuccess, KeyCode, KeyPress, KeyPressMask, KeyRelease, MotionNotify, SyncPointer, XEvent, XFree, XKeyEvent, XKeyPressedEvent, XPointer}; +use x11::xlib::{ButtonPress, ButtonRelease, CurrentTime, GrabModeAsync, GrabModeSync, GrabSuccess, KeyCode, KeyPress, KeyPressMask, KeyRelease, MotionNotify, SyncPointer, Time, XEvent, XFree, XKeyEvent, XKeyPressedEvent, XPointer}; use x11::xrecord::{XRecordAllocRange, XRecordContext, XRecordCreateContext, XRecordDisableContext, XRecordEndOfData, XRecordFreeData, XRecordInterceptData, XRecordStartOfData}; +use easymacros::{Instructions, Position}; use easymacros::x11_safe_wrapper::{Keycode, XDisplay}; +const DELAY_DEFAULT_MS: u16 = 10; + /// Macro recording module for easymacros. Outputs are partially compatible with xmacro. #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] @@ -23,7 +31,7 @@ struct Args { #[clap(value_parser, value_name = "output_file", value_hint = clap::ValueHint::FilePath)] output_file: Option, /// Display to run the macro on. This uses the $DISPLAY environment variable by default. - #[clap(short='D', long)] + #[clap(short = 'D', long)] display: Option, /// Max Delay in milliseconds for macro delays #[clap(short, long)] @@ -32,25 +40,22 @@ struct Args { #[clap(short, long)] ignore_delay_capturing: bool, } + fn main() { let args = Args::parse(); let display = XDisplay::open(args.display.clone()); let recorded_display = XDisplay::open(args.display.clone()); - let stop_key = get_stop_key(display); + let writer = MacroWriter::new(args.output_file, args.ignore_delay_capturing); - let screen = display.get_default_screen(); - dbg!(stop_key); - - // check if the output file argument is specified, if not use stdout - let mut outfile: Box = if let Some(outfile) = args.output_file { - Box::new(File::create(outfile).expect("Failed to create output file")) - } else { - Box::new(io::stdout()) - }; - - event_loop(display, recorded_display, screen, stop_key, outfile, args.ignore_delay_capturing, args.max_delay); + event_loop( + display, + recorded_display, + stop_key, + writer, + args.max_delay + ); display.close(); } @@ -69,18 +74,11 @@ fn get_stop_key(display: XDisplay) -> Keycode { println!("Press the key you want to use to stop recording the macro."); let mut stop_key: Keycode = XK_Escape; - loop { display.allow_events(SyncPointer, CurrentTime); - let ev = display.window_event(root, KeyPressMask); - - unsafe { - //if it's a key event, save the keycode and break out of the loop - if let XEvent { key } = ev { - stop_key = key.keycode; - break; - } - } + let ev = XKeyEvent::from(display.window_event(root, KeyPressMask)); + stop_key = ev.keycode; + break; } display.ungrab_keyboard(CurrentTime); @@ -89,65 +87,99 @@ fn get_stop_key(display: XDisplay) -> Keycode { stop_key } -fn event_loop(display: XDisplay, recordeddpy: XDisplay, screen: i32, stop_key: Keycode, mut outfile: Box, ignore_delay_capturing: bool, max_delay: Option) { +fn event_loop( + xdpy: XDisplay, + recdpy: XDisplay, + stop_key: Keycode, + mut writer: MacroWriter, + max_delay: Option