add x11 stuff
This commit is contained in:
parent
a8772d9089
commit
69e226dcf3
6 changed files with 92 additions and 11 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -185,6 +185,7 @@ name = "leanshot"
|
|||
version = "0.5.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"cfg-if",
|
||||
"image",
|
||||
"leanshot-x11",
|
||||
"libc",
|
||||
|
|
12
Cargo.toml
12
Cargo.toml
|
@ -10,13 +10,21 @@ authors = ["Michael Zhang <mail@mzhang.io>"]
|
|||
[workspace]
|
||||
members = ["x11"]
|
||||
|
||||
[features]
|
||||
default = ["backend-x11", "backend-x11-glx"]
|
||||
backend-x11 = []
|
||||
backend-x11-glx = ["backend-x11"]
|
||||
backend-xcb = ["xcb-util", "xcb"]
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.38"
|
||||
image = { version = "0.23.13", default-features = false, features = ["jpeg", "png"] }
|
||||
leanshot-x11 = { path = "x11" }
|
||||
log = "0.4.14"
|
||||
stderrlog = "0.5.1"
|
||||
xcb-util = { version = "0.3.0", features = ["image", "cursor"] }
|
||||
xcb = "0.9.0"
|
||||
structopt = "0.3.21"
|
||||
libc = "0.2.86"
|
||||
|
||||
xcb-util = { version = "0.3.0", features = ["image", "cursor"], optional = true }
|
||||
xcb = { version = "0.9.0", optional = true }
|
||||
cfg-if = "1.0.0"
|
||||
|
|
47
src/gui_x11.rs
Normal file
47
src/gui_x11.rs
Normal file
|
@ -0,0 +1,47 @@
|
|||
use std::path::Path;
|
||||
|
||||
use anyhow::Result;
|
||||
use x11::xlib::Display;
|
||||
|
||||
use crate::gui_trait::{Capture, Gui};
|
||||
use crate::rect::Rectangle;
|
||||
|
||||
pub struct X11Gui {
|
||||
conn: Display,
|
||||
}
|
||||
|
||||
impl X11Gui {
|
||||
pub fn new() -> Result<Self> {
|
||||
let disp = Display::connect(None)?;
|
||||
Ok(X11Gui { conn: disp })
|
||||
}
|
||||
}
|
||||
|
||||
impl Gui for X11Gui {
|
||||
type Capture = ScreenCapture;
|
||||
fn capture_entire_screen(&self) -> Result<<Self as Gui>::Capture, anyhow::Error> {
|
||||
todo!()
|
||||
}
|
||||
fn interactive_select(
|
||||
&self,
|
||||
_: &<Self as Gui>::Capture,
|
||||
) -> Result<Option<Rectangle>, anyhow::Error> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ScreenCapture {}
|
||||
|
||||
impl Capture for ScreenCapture {
|
||||
fn save_to(&self, _: impl AsRef<Path>) -> Result<(), anyhow::Error> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
fn save_cropped_to(
|
||||
&self,
|
||||
_: impl AsRef<Path>,
|
||||
_: Option<Rectangle>,
|
||||
) -> Result<(), anyhow::Error> {
|
||||
todo!()
|
||||
}
|
||||
}
|
|
@ -205,12 +205,8 @@ impl Gui for XcbGui {
|
|||
);
|
||||
xproto::poly_rectangle(&self.conn, window_id, window_gc, &[rect.into()]);
|
||||
|
||||
let rect2 = Rectangle::new(
|
||||
rect.x + 1,
|
||||
rect.y + 1,
|
||||
rect.width - 2,
|
||||
rect.height - 2,
|
||||
);
|
||||
let rect2 =
|
||||
Rectangle::new(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2);
|
||||
xproto::change_gc(
|
||||
&self.conn,
|
||||
window_gc,
|
||||
|
|
26
src/main.rs
26
src/main.rs
|
@ -5,8 +5,17 @@ extern crate anyhow;
|
|||
|
||||
extern crate leanshot_x11 as x11;
|
||||
|
||||
#[cfg(all(feature = "backend-x11", feature = "backend-xcb"))]
|
||||
compile_error!("don't enable both x11 and xcb backends");
|
||||
|
||||
mod gui_trait;
|
||||
|
||||
#[cfg(feature = "backend-xcb")]
|
||||
mod gui_xcb;
|
||||
|
||||
#[cfg(feature = "backend-x11")]
|
||||
mod gui_x11;
|
||||
|
||||
mod rect;
|
||||
mod singleton;
|
||||
|
||||
|
@ -18,7 +27,6 @@ use anyhow::Result;
|
|||
use structopt::StructOpt;
|
||||
|
||||
use crate::gui_trait::{Capture, Gui};
|
||||
use crate::gui_xcb::XcbGui;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let opt = Options::from_args();
|
||||
|
@ -29,7 +37,21 @@ fn main() -> Result<()> {
|
|||
.init()
|
||||
.unwrap();
|
||||
|
||||
let gui = XcbGui::new()?;
|
||||
let gui = get_gui()?;
|
||||
run(&opt, gui)
|
||||
}
|
||||
|
||||
#[cfg(feature = "backend-xcb")]
|
||||
fn get_gui() -> Result<crate::gui_xcb::XcbGui> {
|
||||
crate::gui_xcb::XcbGui::new()
|
||||
}
|
||||
|
||||
#[cfg(feature = "backend-x11")]
|
||||
fn get_gui() -> Result<crate::gui_x11::X11Gui> {
|
||||
crate::gui_x11::X11Gui::new()
|
||||
}
|
||||
|
||||
fn run(opt: &Options, gui: impl Gui) -> Result<()> {
|
||||
let capture = gui.capture_entire_screen()?;
|
||||
|
||||
match opt.region {
|
||||
|
|
|
@ -8,10 +8,16 @@ pub struct Rectangle<T = i16, U = u16> {
|
|||
|
||||
impl<T, U> Rectangle<T, U> {
|
||||
pub fn new(x: T, y: T, width: U, height: U) -> Self {
|
||||
Rectangle { x, y, width, height }
|
||||
Rectangle {
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "backend-xcb")]
|
||||
impl From<xcb::xproto::Rectangle> for Rectangle<i16, u16> {
|
||||
fn from(rect: xcb::xproto::Rectangle) -> Self {
|
||||
Rectangle {
|
||||
|
@ -23,6 +29,7 @@ impl From<xcb::xproto::Rectangle> for Rectangle<i16, u16> {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "backend-xcb")]
|
||||
impl Into<xcb::xproto::Rectangle> for Rectangle<i16, u16> {
|
||||
fn into(self) -> xcb::xproto::Rectangle {
|
||||
xcb::xproto::Rectangle::new(self.x, self.y, self.width, self.height)
|
||||
|
|
Loading…
Reference in a new issue