forked from michael/leanshot
wrap slop
This commit is contained in:
parent
bb94c1beb0
commit
491b096dc5
8 changed files with 317 additions and 47 deletions
11
Cargo.lock
generated
11
Cargo.lock
generated
|
@ -105,14 +105,6 @@ dependencies = [
|
||||||
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cmake"
|
|
||||||
version = "0.1.31"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cc 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "failure"
|
name = "failure"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
@ -363,10 +355,10 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cairo-rs 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cairo-rs 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gdk 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gdk 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gdk-pixbuf 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gdk-pixbuf 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"gio 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gtk 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gtk 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
@ -478,7 +470,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum cc 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0ebb87d1116151416c0cf66a0e3fb6430cccd120fd6300794b4dfaa050ac40ba"
|
"checksum cc 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0ebb87d1116151416c0cf66a0e3fb6430cccd120fd6300794b4dfaa050ac40ba"
|
||||||
"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18"
|
"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18"
|
||||||
"checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536"
|
"checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536"
|
||||||
"checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3"
|
|
||||||
"checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82"
|
"checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82"
|
||||||
"checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b"
|
"checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b"
|
||||||
"checksum gdk 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd30051ff3d908ff2fc7e5776ffe1c699821e043809f294c3a61004f11d6c3a9"
|
"checksum gdk 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd30051ff3d908ff2fc7e5776ffe1c699821e043809f294c3a61004f11d6c3a9"
|
||||||
|
|
|
@ -2,9 +2,7 @@
|
||||||
name = "screenshot"
|
name = "screenshot"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Michael Zhang <failed.down@gmail.com>"]
|
authors = ["Michael Zhang <failed.down@gmail.com>"]
|
||||||
|
build = "src/build.rs"
|
||||||
[build-dependencies]
|
|
||||||
cmake = "0.1.31"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.31.2"
|
clap = "2.31.2"
|
||||||
|
@ -12,5 +10,6 @@ cairo-rs = { version = "0.4.1", features = ["png"] }
|
||||||
failure = "0.1.1"
|
failure = "0.1.1"
|
||||||
gdk = "0.8.0"
|
gdk = "0.8.0"
|
||||||
gdk-pixbuf = "0.4.0"
|
gdk-pixbuf = "0.4.0"
|
||||||
|
gio = "0.4.0"
|
||||||
gtk = { version = "0.4.1", features = ["v3_16"] }
|
gtk = { version = "0.4.1", features = ["v3_16"] }
|
||||||
time = "0.1.40"
|
time = "0.1.40"
|
||||||
|
|
|
@ -3,6 +3,8 @@ screenshot
|
||||||
|
|
||||||
Screenshot-capturing utility. Selection isn't fully implemented, so it's disabled for now.
|
Screenshot-capturing utility. Selection isn't fully implemented, so it's disabled for now.
|
||||||
|
|
||||||
|
Bindings for `slop` have been generated by `bindgen`.
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
extern crate cmake;
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let dst = cmake::build("libscreenshot");
|
println!("cargo:rustc-link-lib=slopy");
|
||||||
println!("cargo:rustc-link-lib=static=screenshot");
|
println!("cargo:rustc-link-search=native=/usr/lib");
|
||||||
println!("cargo:rustc-link-search=native={}/libs", dst.display());
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use cairo::{Context, Format, ImageSurface};
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
use gdk::prelude::*;
|
use gdk::prelude::*;
|
||||||
use gdk::{ContextExt, Display, DisplayExt, Screen, ScreenExt, Window as GdkWindow, WindowExt};
|
use gdk::{ContextExt, Display, DisplayExt, Screen, ScreenExt, Window as GdkWindow, WindowExt};
|
||||||
use gdk_pixbuf::Pixbuf;
|
use gdk_pixbuf::{Pixbuf, PixbufExt};
|
||||||
use gtk::{Clipboard, ClipboardExt};
|
use gtk::{Clipboard, ClipboardExt};
|
||||||
use time;
|
use time;
|
||||||
|
|
||||||
|
@ -48,10 +48,12 @@ pub fn capture(options: Options) -> Result<(), Error> {
|
||||||
}?;
|
}?;
|
||||||
|
|
||||||
// launch selection
|
// launch selection
|
||||||
// let pixbuf = match options.region {
|
let pixbuf = match options.region {
|
||||||
// Region::Selection => select_area(pixbuf)?,
|
Region::Selection => select_area(pixbuf)?,
|
||||||
// _ => pixbuf,
|
_ => pixbuf,
|
||||||
// };
|
};
|
||||||
|
let width = pixbuf.get_width();
|
||||||
|
let height = pixbuf.get_height();
|
||||||
|
|
||||||
// create and draw to the surface
|
// create and draw to the surface
|
||||||
let surface = match ImageSurface::create(Format::Rgb24, width, height) {
|
let surface = match ImageSurface::create(Format::Rgb24, width, height) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ extern crate clap;
|
||||||
extern crate failure;
|
extern crate failure;
|
||||||
extern crate gdk;
|
extern crate gdk;
|
||||||
extern crate gdk_pixbuf;
|
extern crate gdk_pixbuf;
|
||||||
|
extern crate gio;
|
||||||
extern crate gtk;
|
extern crate gtk;
|
||||||
extern crate time;
|
extern crate time;
|
||||||
|
|
||||||
|
@ -14,8 +15,8 @@ mod capture;
|
||||||
mod errors;
|
mod errors;
|
||||||
mod options;
|
mod options;
|
||||||
mod selection;
|
mod selection;
|
||||||
|
mod slop;
|
||||||
|
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
|
|
||||||
use clap::{App, Arg};
|
use clap::{App, Arg};
|
||||||
|
|
|
@ -1,29 +1,43 @@
|
||||||
|
use std::ffi::CString;
|
||||||
|
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
use gdk::ContextExt;
|
use gdk_pixbuf::{Pixbuf, PixbufExt};
|
||||||
use gdk_pixbuf::Pixbuf;
|
|
||||||
use gtk::{
|
use errors::ScreenshotError;
|
||||||
self, ContainerExt, DrawingArea, GtkWindowExt, Inhibit, WidgetExt, Window as GtkWindow,
|
use slop::{slop_options, slop_select};
|
||||||
WindowType,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub fn select_area(pixbuf: Pixbuf) -> Result<Pixbuf, Error> {
|
pub fn select_area(pixbuf: Pixbuf) -> Result<Pixbuf, Error> {
|
||||||
let window = GtkWindow::new(WindowType::Popup);
|
let xdisplay = CString::new(":0")?.as_ptr();
|
||||||
let mut pixbuf2 = pixbuf.clone();
|
|
||||||
let drawing_area = Box::new(DrawingArea::new)();
|
|
||||||
drawing_area.connect_draw(move |_, cr| {
|
|
||||||
cr.set_source_pixbuf(&pixbuf, 0.0, 0.0);
|
|
||||||
cr.paint();
|
|
||||||
|
|
||||||
Inhibit(false)
|
let mut options = slop_options {
|
||||||
});
|
quiet: 0,
|
||||||
window.add(&drawing_area);
|
border: 1.0,
|
||||||
|
padding: 1.0,
|
||||||
|
tolerance: 1.0,
|
||||||
|
highlight: 0,
|
||||||
|
nokeyboard: 0,
|
||||||
|
noopengl: 1,
|
||||||
|
nodecorations: 1,
|
||||||
|
shaders: &mut 0,
|
||||||
|
r: 0.7,
|
||||||
|
g: 0.7,
|
||||||
|
b: 0.7,
|
||||||
|
a: 1.0,
|
||||||
|
xdisplay,
|
||||||
|
};
|
||||||
|
let selection = unsafe { slop_select(&mut options) };
|
||||||
|
println!("{:?}", selection);
|
||||||
|
|
||||||
window.connect_key_release_event(|_, key| {
|
if selection.cancelled == 1 {
|
||||||
println!("{:?}", key.get_keyval());
|
bail!(ScreenshotError);
|
||||||
Inhibit(false)
|
}
|
||||||
});
|
match pixbuf.new_subpixbuf(
|
||||||
|
selection.x.round() as i32,
|
||||||
window.show_all();
|
selection.y.round() as i32,
|
||||||
gtk::main();
|
selection.w.round() as i32,
|
||||||
Ok(pixbuf2)
|
selection.h.round() as i32,
|
||||||
|
) {
|
||||||
|
Some(pixbuf) => Ok(pixbuf),
|
||||||
|
None => bail!(ScreenshotError),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
264
src/slop.rs
Normal file
264
src/slop.rs
Normal file
|
@ -0,0 +1,264 @@
|
||||||
|
/* automatically generated by rust-bindgen */
|
||||||
|
|
||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct slop_options {
|
||||||
|
pub quiet: ::std::os::raw::c_int,
|
||||||
|
pub border: f32,
|
||||||
|
pub padding: f32,
|
||||||
|
pub tolerance: f32,
|
||||||
|
pub highlight: ::std::os::raw::c_int,
|
||||||
|
pub noopengl: ::std::os::raw::c_int,
|
||||||
|
pub nokeyboard: ::std::os::raw::c_int,
|
||||||
|
pub nodecorations: ::std::os::raw::c_int,
|
||||||
|
pub shaders: *mut ::std::os::raw::c_char,
|
||||||
|
pub r: f32,
|
||||||
|
pub g: f32,
|
||||||
|
pub b: f32,
|
||||||
|
pub a: f32,
|
||||||
|
pub xdisplay: *const ::std::os::raw::c_char,
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn bindgen_test_layout_slop_options() {
|
||||||
|
assert_eq!(
|
||||||
|
::std::mem::size_of::<slop_options>(),
|
||||||
|
64usize,
|
||||||
|
concat!("Size of: ", stringify!(slop_options))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
::std::mem::align_of::<slop_options>(),
|
||||||
|
8usize,
|
||||||
|
concat!("Alignment of ", stringify!(slop_options))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).quiet as *const _ as usize },
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(quiet)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).border as *const _ as usize },
|
||||||
|
4usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(border)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).padding as *const _ as usize },
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(padding)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).tolerance as *const _ as usize },
|
||||||
|
12usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(tolerance)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).highlight as *const _ as usize },
|
||||||
|
16usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(highlight)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).noopengl as *const _ as usize },
|
||||||
|
20usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(noopengl)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).nokeyboard as *const _ as usize },
|
||||||
|
24usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(nokeyboard)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).nodecorations as *const _ as usize },
|
||||||
|
28usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(nodecorations)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).shaders as *const _ as usize },
|
||||||
|
32usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(shaders)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).r as *const _ as usize },
|
||||||
|
40usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(r)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).g as *const _ as usize },
|
||||||
|
44usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(g)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).b as *const _ as usize },
|
||||||
|
48usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(b)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).a as *const _ as usize },
|
||||||
|
52usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(a)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_options>())).xdisplay as *const _ as usize },
|
||||||
|
56usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_options),
|
||||||
|
"::",
|
||||||
|
stringify!(xdisplay)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct slop_selection {
|
||||||
|
pub cancelled: ::std::os::raw::c_int,
|
||||||
|
pub x: f32,
|
||||||
|
pub y: f32,
|
||||||
|
pub w: f32,
|
||||||
|
pub h: f32,
|
||||||
|
pub id: ::std::os::raw::c_int,
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn bindgen_test_layout_slop_selection() {
|
||||||
|
assert_eq!(
|
||||||
|
::std::mem::size_of::<slop_selection>(),
|
||||||
|
24usize,
|
||||||
|
concat!("Size of: ", stringify!(slop_selection))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
::std::mem::align_of::<slop_selection>(),
|
||||||
|
4usize,
|
||||||
|
concat!("Alignment of ", stringify!(slop_selection))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_selection>())).cancelled as *const _ as usize },
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_selection),
|
||||||
|
"::",
|
||||||
|
stringify!(cancelled)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_selection>())).x as *const _ as usize },
|
||||||
|
4usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_selection),
|
||||||
|
"::",
|
||||||
|
stringify!(x)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_selection>())).y as *const _ as usize },
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_selection),
|
||||||
|
"::",
|
||||||
|
stringify!(y)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_selection>())).w as *const _ as usize },
|
||||||
|
12usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_selection),
|
||||||
|
"::",
|
||||||
|
stringify!(w)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_selection>())).h as *const _ as usize },
|
||||||
|
16usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_selection),
|
||||||
|
"::",
|
||||||
|
stringify!(h)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::std::ptr::null::<slop_selection>())).id as *const _ as usize },
|
||||||
|
20usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(slop_selection),
|
||||||
|
"::",
|
||||||
|
stringify!(id)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub fn slop_options_default() -> slop_options;
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub fn slop_select(options: *mut slop_options) -> slop_selection;
|
||||||
|
}
|
Loading…
Reference in a new issue