Commit iniziale, funzionano delle cose

master
Pietro Brenna 2020-03-13 13:08:30 +01:00
commit 90fecb55c2
8 changed files with 778 additions and 0 deletions

1
.gitignore vendored 100644
View File

@ -0,0 +1 @@
/target

509
Cargo.lock generated 100644
View File

@ -0,0 +1,509 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "atk"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "444daefa55f229af145ea58d77efd23725024ee1f6f3102743709aa6b18c663e"
dependencies = [
"atk-sys",
"bitflags",
"glib",
"glib-sys",
"gobject-sys",
"libc",
]
[[package]]
name = "atk-sys"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e552c1776737a4c80110d06b36d099f47c727335f9aaa5d942a72b6863a8ec6f"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"pkg-config",
]
[[package]]
name = "autocfg"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
[[package]]
name = "bitflags"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
[[package]]
name = "cacca"
version = "0.1.0"
dependencies = [
"crossbeam-channel",
"gdk",
"gdk-sys",
"gio",
"glib",
"gtk",
"pango",
"vte-rs",
]
[[package]]
name = "cairo-rs"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "157049ba9618aa3a61c39d5d785102c04d3b1f40632a706c621a9aedc21e6084"
dependencies = [
"bitflags",
"cairo-sys-rs",
"glib",
"glib-sys",
"gobject-sys",
"libc",
]
[[package]]
name = "cairo-sys-rs"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff65ba02cac715be836f63429ab00a767d48336efc5497c5637afb53b4f14d63"
dependencies = [
"glib-sys",
"libc",
"pkg-config",
]
[[package]]
name = "cc"
version = "1.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"
[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "crossbeam-channel"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061"
dependencies = [
"crossbeam-utils",
"maybe-uninit",
]
[[package]]
name = "crossbeam-utils"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
dependencies = [
"autocfg",
"cfg-if",
"lazy_static",
]
[[package]]
name = "futures-channel"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8"
dependencies = [
"futures-core",
]
[[package]]
name = "futures-core"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a"
[[package]]
name = "futures-executor"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba"
dependencies = [
"futures-core",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-io"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6"
[[package]]
name = "futures-macro"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7"
dependencies = [
"proc-macro-hack",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "futures-task"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27"
[[package]]
name = "futures-util"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5"
dependencies = [
"futures-core",
"futures-macro",
"futures-task",
"pin-utils",
"proc-macro-hack",
"proc-macro-nested",
"slab",
]
[[package]]
name = "gdk"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbe5e8772fc0865c52460cdd7a59d7d47700f44d9809d1dd00eecceb769a7589"
dependencies = [
"bitflags",
"cairo-rs",
"cairo-sys-rs",
"gdk-pixbuf",
"gdk-sys",
"gio",
"gio-sys",
"glib",
"glib-sys",
"gobject-sys",
"libc",
"pango",
]
[[package]]
name = "gdk-pixbuf"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e248220c46b329b097d4b158d2717f8c688f16dd76d0399ace82b3e98062bdd7"
dependencies = [
"gdk-pixbuf-sys",
"gio",
"gio-sys",
"glib",
"glib-sys",
"gobject-sys",
"libc",
]
[[package]]
name = "gdk-pixbuf-sys"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8991b060a9e9161bafd09bf4a202e6fd404f5b4dd1a08d53a1e84256fb34ab0"
dependencies = [
"gio-sys",
"glib-sys",
"gobject-sys",
"libc",
"pkg-config",
]
[[package]]
name = "gdk-sys"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6adf679e91d1bff0c06860287f80403e7db54c2d2424dce0a470023b56c88fbb"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
"gio-sys",
"glib-sys",
"gobject-sys",
"libc",
"pango-sys",
"pkg-config",
]
[[package]]
name = "gio"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0cd10f9415cce39b53f8024bf39a21f84f8157afa52da53837b102e585a296a5"
dependencies = [
"bitflags",
"futures-channel",
"futures-core",
"futures-io",
"futures-util",
"gio-sys",
"glib",
"glib-sys",
"gobject-sys",
"lazy_static",
"libc",
]
[[package]]
name = "gio-sys"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fad225242b9eae7ec8a063bb86974aca56885014672375e5775dc0ea3533911"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"pkg-config",
]
[[package]]
name = "glib"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40fb573a09841b6386ddf15fd4bc6655b4f5b106ca962f57ecaecde32a0061c0"
dependencies = [
"bitflags",
"futures-channel",
"futures-core",
"futures-executor",
"futures-task",
"futures-util",
"glib-sys",
"gobject-sys",
"lazy_static",
"libc",
]
[[package]]
name = "glib-sys"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95856f3802f446c05feffa5e24859fe6a183a7cb849c8449afc35c86b1e316e2"
dependencies = [
"libc",
"pkg-config",
]
[[package]]
name = "gobject-sys"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31d1a804f62034eccf370006ccaef3708a71c31d561fee88564abe71177553d9"
dependencies = [
"glib-sys",
"libc",
"pkg-config",
]
[[package]]
name = "gtk"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87e1e8d70290239c668594002d1b174fcc7d7ef5d26670ee141490ede8facf8f"
dependencies = [
"atk",
"bitflags",
"cairo-rs",
"cairo-sys-rs",
"cc",
"gdk",
"gdk-pixbuf",
"gdk-pixbuf-sys",
"gdk-sys",
"gio",
"gio-sys",
"glib",
"glib-sys",
"gobject-sys",
"gtk-sys",
"lazy_static",
"libc",
"pango",
"pango-sys",
]
[[package]]
name = "gtk-sys"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53def660c7b48b00b510c81ef2d2fbd3c570f1527081d8d7947f471513e1a4c1"
dependencies = [
"atk-sys",
"cairo-sys-rs",
"gdk-pixbuf-sys",
"gdk-sys",
"gio-sys",
"glib-sys",
"gobject-sys",
"libc",
"pango-sys",
"pkg-config",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018"
[[package]]
name = "maybe-uninit"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
[[package]]
name = "pango"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e9c6b728f1be8edb5f9f981420b651d5ea30bdb9de89f1f1262d0084a020577"
dependencies = [
"bitflags",
"glib",
"glib-sys",
"gobject-sys",
"lazy_static",
"libc",
"pango-sys",
]
[[package]]
name = "pango-sys"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86b93d84907b3cf0819bff8f13598ba72843bee579d5ebc2502e4b0367b4be7d"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"pkg-config",
]
[[package]]
name = "pin-utils"
version = "0.1.0-alpha.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587"
[[package]]
name = "pkg-config"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
[[package]]
name = "proc-macro-hack"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "proc-macro-nested"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e"
[[package]]
name = "proc-macro2"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quote"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f"
dependencies = [
"proc-macro2",
]
[[package]]
name = "slab"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
[[package]]
name = "syn"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "unicode-xid"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
[[package]]
name = "vte-rs"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "997bd7569d74e21d943ae4bb76ee6e4865f142fbbd45cf9a9a6a248034c9a208"
dependencies = [
"bitflags",
"gdk",
"gdk-sys",
"gio",
"gio-sys",
"glib",
"glib-sys",
"gobject-sys",
"gtk",
"gtk-sys",
"libc",
"pango",
"vte-sys",
]
[[package]]
name = "vte-sys"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "694c17dcf0b6f6f281fde66911c4450b2f7ccc3c26a90077192189e047d6a544"
dependencies = [
"atk-sys",
"bitflags",
"gdk-sys",
"gio-sys",
"glib-sys",
"gobject-sys",
"gtk-sys",
"libc",
"pango-sys",
"pkg-config",
]

25
Cargo.toml 100644
View File

@ -0,0 +1,25 @@
[package]
name = "cacca"
version = "0.1.0"
authors = ["Pietro Brenna <pietro.brenna@briq.it>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
vte-rs = "*"
gio = "*"
gtk = "*"
gdk-sys="*"
gdk = "*"
pango = "*"
crossbeam-channel="*"
glib = "*"
[[bin]]
name = "cacca"
path = "src/main.rs"
[[bin]]
name = "wake"
path = "src/wake.rs"

106
src/main.rs 100644
View File

@ -0,0 +1,106 @@
extern crate gio;
extern crate gtk;
extern crate vte;
use gio::prelude::*;
use gtk::prelude::*;
use vte::TerminalExt;
use gtk::SettingsExt;
use std::env::args;
use std::sync::{Arc, RwLock};
use std::thread;
use glib::translate::{ToGlibPtr, ToGlib};
mod menu;
mod stato_finestra;
mod wake_listener;
fn build_ui(application: &gtk::Application) {
let window = gtk::ApplicationWindow::new(application);
if let Some(settings) = window.get_settings() {
settings.set_property_gtk_enable_animations(false);
}
window.set_title("First GTK+ Program");
window.set_border_width(0);
window.move_(0, 0);
window.set_default_size(1920, 500);
window.set_decorated(false);
window.set_can_focus(true);
window.set_keep_above(true);
//gtk::Window::set_interactive_debugging(true);
let vte = vte::Terminal::new();
let accel_group = gtk::AccelGroup::new();
let (key,modifier) = gtk::accelerator_parse("<Control><Shift>c");
vte.add_accelerator("copy-clipboard", &accel_group, key, modifier, gtk::AccelFlags::VISIBLE);
window.add_accel_group(&accel_group);
let font = pango::FontDescription::from_string("Iosevka Regular 13");
vte.set_font(Some(&font));
let c = gio::Cancellable::get_current();
let pid = vte
.spawn_sync(
vte::PtyFlags::DEFAULT,
None,
&[&std::path::PathBuf::from("/usr/bin/fish")],
&[],
glib::SpawnFlags::DEFAULT,
Some(&mut || {}),
c.as_ref(),
)
.unwrap();
vte.watch_child(pid);
let button = gtk::Button::new_with_label("Click me!");
button.connect_clicked(|_asd| {
println!("ciao");
});
window.add(&vte);
window.set_skip_taskbar_hint(true);
window.set_skip_pager_hint(true);
window.show_all();
unsafe {
gdk_sys::gdk_window_set_skip_pager_hint(window.get_window().unwrap().to_glib_none().0, true.to_glib());
gdk_sys::gdk_window_set_skip_taskbar_hint(window.get_window().unwrap().to_glib_none().0, true.to_glib());
}
let stato = Arc::new(RwLock::new(stato_finestra::StatoFinestra::Su));
let stato1 = stato.clone();
let stato2 = stato.clone();
let cloned_app = application.clone();
vte.connect_child_exited(move |_a, status| {
println!("Child exited with status {}", status);
cloned_app.quit();
});
window.connect_focus_out_event(move |_widget, _b| stato_finestra::focus_out(&stato1));
window.connect_focus_in_event(move |_widget, _b| stato_finestra::focus_in(&stato2));
vte.connect_popup_menu(move |ref vte| menu::menu(vte, None));
vte.connect_button_press_event(move |ref vte, ev| {
if ev.get_event_type() == gdk::EventType::ButtonPress &&
ev.get_button() == gdk_sys::GDK_BUTTON_SECONDARY as u32 {
menu::menu(vte, Some(ev.get_button()));
}
gtk::Inhibit(false)
});
let (tx, rx) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
rx.attach(None, move |_cmd| {
stato_finestra::esegui_toggle(&window, &vte, &stato)
});
thread::spawn(move || {
wake_listener::listener(&tx);
});
}
fn main() {
let application =
gtk::Application::new(Some("net.ddns.chiocciolo.waydrop"), Default::default())
.expect("Initialization failed...");
application.connect_activate(|app| {
build_ui(app);
});
application.run(&args().collect::<Vec<_>>());
}

33
src/menu.rs 100644
View File

@ -0,0 +1,33 @@
use gdk::Atom;
use gtk::prelude::*;
use gtk::{Menu, MenuItemBuilder};
use vte::TerminalExt;
pub fn menu(widget: &vte::Terminal, btn: Option<u32>) -> bool {
let clipboard = widget.get_clipboard(&Atom::intern("CLIPBOARD"));
let w1 = widget.clone();
let w2 = widget.clone();
let w3 = widget.clone();
clipboard.request_text(move |_clipboard, maybe_str| {
let ctx_menu = Menu::new();
let cpy = MenuItemBuilder::new()
.label("Copy")
.sensitive(w3.get_has_selection())
.parent(&ctx_menu)
.build();
let paste = MenuItemBuilder::new()
.label("Paste")
.sensitive(maybe_str.is_some() && maybe_str != Some(""))
.parent(&ctx_menu)
.build();
cpy.connect_activate(move |_m| {
w1.copy_clipboard();
});
paste.connect_activate(move |_m| {
w2.paste_clipboard();
});
ctx_menu.show_all();
ctx_menu.set_property_attach_widget(Some(&w3));
ctx_menu.popup_easy(btn.unwrap_or(1), gtk::get_current_event_time());
});
true
}

View File

@ -0,0 +1,73 @@
#[derive(Eq, PartialEq, Debug)]
pub enum StatoFinestra {
Su,
TirandoSu,
Nascondendo,
Nascosta,
SuNonFocusata,
}
use gdk::WindowExt;
use gtk::prelude::*;
use std::sync::{Arc, RwLock};
pub fn esegui_toggle(
window: &gtk::ApplicationWindow,
vte: &impl glib::IsA<gtk::Widget>,
stato: &Arc<RwLock<StatoFinestra>>,
) -> glib::source::Continue {
let ts = gtk::get_current_event_time();
if let Ok(mut inner) = stato.write() {
match *inner {
StatoFinestra::Nascosta | StatoFinestra::Nascondendo => {
// Shameless copy from guake
*inner = StatoFinestra::TirandoSu;
window.present();
window.deiconify();
window.show();
window.get_window().unwrap().focus(ts);
window.set_type_hint(gdk::WindowTypeHint::Dock);
window.set_type_hint(gdk::WindowTypeHint::Normal);
window.get_window().unwrap().focus(0);
window.set_focus(Some(vte));
}
StatoFinestra::SuNonFocusata => {
window.hide();
window.show();
window.get_window().unwrap().focus(ts);
window.get_window().unwrap().focus(0);
window.set_focus(Some(vte));
*inner = StatoFinestra::Su;
}
StatoFinestra::Su => {
*inner = StatoFinestra::Nascondendo;
window.hide();
}
_ => {}
}
} else {
eprintln!("Can't acquire lock!");
}
println!("Stato: {:?}", stato);
glib::Continue(true)
}
pub fn focus_out(stato: &Arc<RwLock<StatoFinestra>>) -> gtk::Inhibit {
if let Ok(mut inner) = stato.write() {
if *inner == StatoFinestra::Nascondendo {
*inner = StatoFinestra::Nascosta;
} else {
*inner = StatoFinestra::SuNonFocusata;
//widget.unstick();
}
}
println!("Stato: {:?}", stato);
gtk::Inhibit(false)
}
pub fn focus_in(stato: &Arc<RwLock<StatoFinestra>>) -> gtk::Inhibit {
if let Ok(mut inner) = stato.write() {
*inner = StatoFinestra::Su;
}
println!("Stato: {:?}", stato);
gtk::Inhibit(false)
}

7
src/wake.rs 100644
View File

@ -0,0 +1,7 @@
use std::os::unix::net::UnixStream;
use std::io::prelude::*;
fn main() -> std::io::Result<()>{
let mut s = UnixStream::connect("/tmp/waydrop.sock")?;
s.write_all(b"t")?;
Ok(())
}

View File

@ -0,0 +1,24 @@
use glib::Sender;
use gtk::get_current_event_time;
pub fn listener(tx: &Sender<u32>) {
use std::io::Read;
use std::os::unix::net::UnixListener;
let _a = std::fs::remove_file("/tmp/waydrop.sock");
let sock = UnixListener::bind("/tmp/waydrop.sock").unwrap();
for stream in sock.incoming() {
match stream {
Ok(mut stream) => {
let mut buf = [0u8];
if let Ok(_n) = stream.read_exact(&mut buf) {
let _s = String::from_utf8_lossy(&buf).into_owned();
tx.send(get_current_event_time()).expect("can't send");
}
}
Err(err) => {
eprintln!("{:?}", err);
}
}
}
}