forked from michael/leanshot
sigh
This commit is contained in:
parent
b8a5fb9aeb
commit
c7fc13ed64
8 changed files with 64 additions and 7 deletions
17
src/gui.rs
17
src/gui.rs
|
@ -4,8 +4,8 @@ use xlib::{Display, EventKind, Visual, Window};
|
||||||
use errors::ScreenshotError;
|
use errors::ScreenshotError;
|
||||||
use Options;
|
use Options;
|
||||||
use Rectangle;
|
use Rectangle;
|
||||||
use SelectWindow;
|
|
||||||
use Region;
|
use Region;
|
||||||
|
use SelectWindow;
|
||||||
|
|
||||||
pub struct GUI {
|
pub struct GUI {
|
||||||
pub(crate) display: Display,
|
pub(crate) display: Display,
|
||||||
|
@ -36,8 +36,8 @@ impl GUI {
|
||||||
y = region.y;
|
y = region.y;
|
||||||
width = region.width;
|
width = region.width;
|
||||||
height = region.height;
|
height = region.height;
|
||||||
},
|
}
|
||||||
_ => ()
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
Image2::create_from_drawable(window, 0, x, y, width as i32, height as i32, true)
|
Image2::create_from_drawable(window, 0, x, y, width as i32, height as i32, true)
|
||||||
|
@ -60,10 +60,19 @@ impl GUI {
|
||||||
let root_im = root.get_image();
|
let root_im = root.get_image();
|
||||||
|
|
||||||
let mut done = 0;
|
let mut done = 0;
|
||||||
|
let mut button_press = false;
|
||||||
while done == 0 && self.display.pending()? > 0 {
|
while done == 0 && self.display.pending()? > 0 {
|
||||||
let ev = self.display.next_event()?;
|
let ev = self.display.next_event()?;
|
||||||
match ev.kind() {
|
match ev.kind() {
|
||||||
EventKind::ButtonPress => (),
|
EventKind::ButtonPress => {
|
||||||
|
button_press = true;
|
||||||
|
}
|
||||||
|
EventKind::ButtonRelease => {
|
||||||
|
if button_press {
|
||||||
|
done = 1;
|
||||||
|
}
|
||||||
|
button_press = false;
|
||||||
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,9 +21,9 @@ mod window;
|
||||||
pub mod imlib2;
|
pub mod imlib2;
|
||||||
pub mod xlib;
|
pub mod xlib;
|
||||||
|
|
||||||
|
use errors::ScreenshotError;
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
use xlib::Rectangle;
|
use xlib::Rectangle;
|
||||||
use errors::ScreenshotError;
|
|
||||||
|
|
||||||
pub use capture::capture;
|
pub use capture::capture;
|
||||||
pub use options::{Options, Region};
|
pub use options::{Options, Region};
|
||||||
|
|
13
src/xlib/cursor.rs
Normal file
13
src/xlib/cursor.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
use x11::xlib as x;
|
||||||
|
|
||||||
|
/// Mouse pointer
|
||||||
|
pub struct Cursor {
|
||||||
|
pub(crate) display: *mut x::Display,
|
||||||
|
pub(crate) inner: x::Cursor,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Cursor {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe { x::XFreeCursor(self.display, self.inner) };
|
||||||
|
}
|
||||||
|
}
|
5
src/xlib/cursorfont.rs
Normal file
5
src/xlib/cursorfont.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
pub const XC_crosshair: u32 = 34;
|
||||||
|
pub const XC_ll_angle: u32 = 76;
|
||||||
|
pub const XC_lr_angle: u32 = 78;
|
||||||
|
pub const XC_ul_angle: u32 = 144;
|
||||||
|
pub const XC_ur_angle: u32 = 148;
|
|
@ -3,7 +3,7 @@ use std::ffi::CString;
|
||||||
use libc;
|
use libc;
|
||||||
use x11::xlib as x;
|
use x11::xlib as x;
|
||||||
|
|
||||||
use xlib::{Event, Visual, Window, X11Error};
|
use xlib::{Cursor, Event, Visual, Window, X11Error};
|
||||||
|
|
||||||
/// A connection to an X server.
|
/// A connection to an X server.
|
||||||
pub struct Display {
|
pub struct Display {
|
||||||
|
@ -30,6 +30,18 @@ impl Display {
|
||||||
Ok(Display { inner })
|
Ok(Display { inner })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Wrapper around XCreateFontCursor
|
||||||
|
pub fn create_font_cursor(&self, shape: u32) -> Result<Cursor, X11Error> {
|
||||||
|
let cursor = unsafe { x::XCreateFontCursor(self.inner, shape) as x::Cursor };
|
||||||
|
if cursor == 0 {
|
||||||
|
return Err(X11Error::CreateCursorError);
|
||||||
|
}
|
||||||
|
Ok(Cursor {
|
||||||
|
display: self.inner,
|
||||||
|
inner: cursor,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the next event, blocks until an event is reached.
|
/// Get the next event, blocks until an event is reached.
|
||||||
pub fn next_event(&self) -> Result<Event, X11Error> {
|
pub fn next_event(&self) -> Result<Event, X11Error> {
|
||||||
let event =
|
let event =
|
||||||
|
@ -117,6 +129,11 @@ impl Display {
|
||||||
Ok((rx, ry, child))
|
Ok((rx, ry, child))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sync
|
||||||
|
pub fn sync(&self, discard: bool) {
|
||||||
|
unsafe { x::XSync(self.inner, if discard { 1 } else { 0 }) };
|
||||||
|
}
|
||||||
|
|
||||||
/// eturns the focus window and the current focus state.
|
/// eturns the focus window and the current focus state.
|
||||||
pub fn get_input_focus(&self) -> Result<(Window, i32), X11Error> {
|
pub fn get_input_focus(&self) -> Result<(Window, i32), X11Error> {
|
||||||
let mut focus_return: x::Window = 0;
|
let mut focus_return: x::Window = 0;
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
#[derive(Debug, Fail)]
|
#[derive(Debug, Fail)]
|
||||||
pub enum X11Error {
|
pub enum X11Error {
|
||||||
|
#[fail(display = "failed to create cursor")]
|
||||||
|
CreateCursorError,
|
||||||
|
|
||||||
#[fail(display = "failed to open display")]
|
#[fail(display = "failed to open display")]
|
||||||
DisplayOpenError,
|
DisplayOpenError,
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,12 @@ pub struct Event {
|
||||||
|
|
||||||
/// Type of event
|
/// Type of event
|
||||||
pub enum EventKind {
|
pub enum EventKind {
|
||||||
/// Was a button pressed
|
/// A mouse button was pressed
|
||||||
ButtonPress,
|
ButtonPress,
|
||||||
|
|
||||||
|
/// A mouse button was released
|
||||||
|
ButtonRelease,
|
||||||
|
|
||||||
/// None event
|
/// None event
|
||||||
None,
|
None,
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
//!
|
//!
|
||||||
//! I need this for my project.
|
//! I need this for my project.
|
||||||
|
|
||||||
|
mod cursor;
|
||||||
mod display;
|
mod display;
|
||||||
mod drawable;
|
mod drawable;
|
||||||
mod errors;
|
mod errors;
|
||||||
|
@ -12,6 +13,12 @@ mod rect;
|
||||||
mod visual;
|
mod visual;
|
||||||
mod window;
|
mod window;
|
||||||
|
|
||||||
|
#[allow(non_upper_case_globals)]
|
||||||
|
#[allow(missing_docs)]
|
||||||
|
mod cursorfont;
|
||||||
|
|
||||||
|
pub use self::cursor::Cursor;
|
||||||
|
pub use self::cursorfont::*;
|
||||||
pub use self::display::{Display, GetDisplay};
|
pub use self::display::{Display, GetDisplay};
|
||||||
pub use self::drawable::Drawable;
|
pub use self::drawable::Drawable;
|
||||||
pub use self::errors::X11Error;
|
pub use self::errors::X11Error;
|
||||||
|
|
Loading…
Reference in a new issue