mirror of
https://gitlab.com/marcandre.lureau/qemu-display.git
synced 2025-03-07 15:25:04 +00:00
gtk: some refactoring
This commit is contained in:
parent
7cda1c29e3
commit
f6bbaf0b2d
@ -1,2 +1,4 @@
|
|||||||
|
paths = ['../gtk4-rs/gtk4']
|
||||||
|
|
||||||
[alias]
|
[alias]
|
||||||
xtask = "run --package xtask --"
|
xtask = "run --package xtask --"
|
||||||
|
@ -74,20 +74,21 @@ mod imp {
|
|||||||
let ec = gtk::EventControllerMotion::new();
|
let ec = gtk::EventControllerMotion::new();
|
||||||
self.area.add_controller(&ec);
|
self.area.add_controller(&ec);
|
||||||
ec.connect_motion(clone!(@weak obj => move |_, x, y| {
|
ec.connect_motion(clone!(@weak obj => move |_, x, y| {
|
||||||
obj.motion(x, y);
|
let priv_ = imp::QemuConsole::from_instance(&obj);
|
||||||
|
priv_.motion(x, y);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let ec = gtk::GestureClick::new();
|
let ec = gtk::GestureClick::new();
|
||||||
ec.set_button(0);
|
ec.set_button(0);
|
||||||
self.area.add_controller(&ec);
|
self.area.add_controller(&ec);
|
||||||
ec.connect_pressed(clone!(@weak obj => @default-panic, move |gesture, _n_press, x, y| {
|
ec.connect_pressed(clone!(@weak obj => @default-panic, move |gesture, _n_press, x, y| {
|
||||||
|
let priv_ = imp::QemuConsole::from_instance(&obj);
|
||||||
let c = obj.qemu_console();
|
let c = obj.qemu_console();
|
||||||
let button = from_gdk_button(gesture.get_current_button());
|
let button = from_gdk_button(gesture.get_current_button());
|
||||||
obj.motion(x, y);
|
priv_.motion(x, y);
|
||||||
let _ = c.mouse.press(button);
|
let _ = c.mouse.press(button);
|
||||||
|
|
||||||
let priv_ = imp::QemuConsole::from_instance(&obj);
|
if let Some(toplevel) = priv_.get_toplevel() {
|
||||||
if let Some(toplevel) = obj.get_toplevel() {
|
|
||||||
if !toplevel.get_property_shortcuts_inhibited() {
|
if !toplevel.get_property_shortcuts_inhibited() {
|
||||||
toplevel.inhibit_system_shortcuts::<gdk::ButtonEvent>(None);
|
toplevel.inhibit_system_shortcuts::<gdk::ButtonEvent>(None);
|
||||||
|
|
||||||
@ -135,9 +136,11 @@ mod imp {
|
|||||||
priv_.area.grab_focus();
|
priv_.area.grab_focus();
|
||||||
}));
|
}));
|
||||||
ec.connect_released(clone!(@weak obj => move |gesture, _n_press, x, y| {
|
ec.connect_released(clone!(@weak obj => move |gesture, _n_press, x, y| {
|
||||||
|
let priv_ = imp::QemuConsole::from_instance(&obj);
|
||||||
let c = obj.qemu_console();
|
let c = obj.qemu_console();
|
||||||
let button = from_gdk_button(gesture.get_current_button());
|
let button = from_gdk_button(gesture.get_current_button());
|
||||||
obj.motion(x, y);
|
|
||||||
|
priv_.motion(x, y);
|
||||||
let _ = c.mouse.release(button);
|
let _ = c.mouse.release(button);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@ -164,6 +167,17 @@ mod imp {
|
|||||||
self.area.set_focusable(true);
|
self.area.set_focusable(true);
|
||||||
self.area.set_focus_on_click(true);
|
self.area.set_focus_on_click(true);
|
||||||
|
|
||||||
|
self.area
|
||||||
|
.connect_create_context(clone!(@weak obj => @default-panic, move |_| {
|
||||||
|
// can't connect-after create-context yet, so idle it
|
||||||
|
glib::idle_add_local(clone!(@weak ec => @default-panic, move || {
|
||||||
|
let priv_ = imp::QemuConsole::from_instance(&obj);
|
||||||
|
priv_.attach_qemu_console(&obj);
|
||||||
|
glib::Continue(false)
|
||||||
|
}));
|
||||||
|
None
|
||||||
|
}));
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
self.area.connect_notify_unsafe(
|
self.area.connect_notify_unsafe(
|
||||||
Some("resize-hack"),
|
Some("resize-hack"),
|
||||||
@ -189,21 +203,37 @@ mod imp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl WidgetImpl for QemuConsole {}
|
impl WidgetImpl for QemuConsole {}
|
||||||
}
|
|
||||||
|
|
||||||
glib::wrapper! {
|
|
||||||
pub struct QemuConsole(ObjectSubclass<imp::QemuConsole>) @extends gtk::Widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl QemuConsole {
|
impl QemuConsole {
|
||||||
pub fn set_qemu_console(&self, console: Console) {
|
fn get_toplevel(&self) -> Option<gdk::Toplevel> {
|
||||||
let priv_ = imp::QemuConsole::from_instance(self);
|
self.area
|
||||||
|
.get_root()
|
||||||
|
.and_then(|r| r.get_native())
|
||||||
|
.and_then(|n| n.get_surface())
|
||||||
|
.and_then(|s| s.downcast::<gdk::Toplevel>().ok())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn motion(&self, x: f64, y: f64) {
|
||||||
|
if let Some((x, y)) = self.area.transform_input(x, y) {
|
||||||
|
let c = self.console.get().unwrap();
|
||||||
|
let _ = c.mouse.set_abs_position(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn attach_qemu_console(&self, obj: &super::QemuConsole) {
|
||||||
|
let console = match self.console.get() {
|
||||||
|
Some(console) => console,
|
||||||
|
None => return,
|
||||||
|
};
|
||||||
|
if !obj.get_realized() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let (rx, wait_tx) = console
|
let (rx, wait_tx) = console
|
||||||
.glib_listen()
|
.glib_listen()
|
||||||
.expect("Failed to listen to the console");
|
.expect("Failed to listen to the console");
|
||||||
priv_
|
self.area
|
||||||
.area
|
.connect_render(clone!(@weak obj => @default-panic, move |_, _| {
|
||||||
.connect_render(clone!(@weak self as obj => @default-panic, move |_, _| {
|
|
||||||
let priv_ = imp::QemuConsole::from_instance(&obj);
|
let priv_ = imp::QemuConsole::from_instance(&obj);
|
||||||
let wait_rendering = priv_.wait_rendering.get();
|
let wait_rendering = priv_.wait_rendering.get();
|
||||||
if wait_rendering > 0 {
|
if wait_rendering > 0 {
|
||||||
@ -216,8 +246,8 @@ impl QemuConsole {
|
|||||||
}));
|
}));
|
||||||
rx.attach(
|
rx.attach(
|
||||||
None,
|
None,
|
||||||
clone!(@weak self as con => @default-panic, move |t| {
|
clone!(@weak obj => @default-panic, move |t| {
|
||||||
let priv_ = imp::QemuConsole::from_instance(&con);
|
let priv_ = imp::QemuConsole::from_instance(&obj);
|
||||||
debug!("Console event: {:?}", t);
|
debug!("Console event: {:?}", t);
|
||||||
match t {
|
match t {
|
||||||
Event::Scanout(s) => {
|
Event::Scanout(s) => {
|
||||||
@ -258,32 +288,25 @@ impl QemuConsole {
|
|||||||
Continue(true)
|
Continue(true)
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
priv_.console.set(console).unwrap();
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_toplevel(&self) -> Option<gdk::Toplevel> {
|
glib::wrapper! {
|
||||||
|
pub struct QemuConsole(ObjectSubclass<imp::QemuConsole>) @extends gtk::Widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl QemuConsole {
|
||||||
|
pub fn set_qemu_console(&self, console: Console) {
|
||||||
let priv_ = imp::QemuConsole::from_instance(self);
|
let priv_ = imp::QemuConsole::from_instance(self);
|
||||||
priv_
|
priv_.console.set(console).unwrap();
|
||||||
.area
|
priv_.attach_qemu_console(self);
|
||||||
.get_root()
|
|
||||||
.and_then(|r| r.get_native())
|
|
||||||
.and_then(|n| n.get_surface())
|
|
||||||
.and_then(|s| s.downcast::<gdk::Toplevel>().ok())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn qemu_console(&self) -> &Console {
|
fn qemu_console(&self) -> &Console {
|
||||||
let priv_ = imp::QemuConsole::from_instance(self);
|
let priv_ = imp::QemuConsole::from_instance(self);
|
||||||
priv_.console.get().expect("Console is not yet set!")
|
priv_.console.get().expect("Console is not yet set!")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn motion(&self, x: f64, y: f64) {
|
|
||||||
let priv_ = imp::QemuConsole::from_instance(self);
|
|
||||||
|
|
||||||
if let Some((x, y)) = priv_.area.transform_input(x, y) {
|
|
||||||
let c = self.qemu_console();
|
|
||||||
let _ = c.mouse.set_abs_position(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_gdk_button(button: u32) -> MouseButton {
|
fn from_gdk_button(button: u32) -> MouseButton {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user