fix select-window

This commit is contained in:
ochibani 2024-12-20 15:22:25 +02:00
parent f4e7e0035e
commit 020b1b9328
No known key found for this signature in database
GPG Key ID: 2C6B61CE0C704ED4
11 changed files with 145 additions and 37 deletions

1
Cargo.lock generated
View File

@ -479,6 +479,7 @@ dependencies = [
"regex", "regex",
"rust-ini 0.16.1", "rust-ini 0.16.1",
"secfmt", "secfmt",
"winapi",
"x-win", "x-win",
] ]

View File

@ -10,7 +10,6 @@ blue-recorder-core = { git = "https://github.com/ochibani/blue-recorder-core.git
cpal = "0.15.3" cpal = "0.15.3"
dark-light = "1.0.0" dark-light = "1.0.0"
dirs = "4.0.0" dirs = "4.0.0"
display-info = "0.5.1"
fluent-bundle = "0.15.3" fluent-bundle = "0.15.3"
glib = "0.10.3" glib = "0.10.3"
libadwaita = { version = "0.1.1" } libadwaita = { version = "0.1.1" }
@ -18,4 +17,9 @@ rdev = "0.5"
regex = "1.4.3" regex = "1.4.3"
rust-ini = "0.16" rust-ini = "0.16"
secfmt = "0.1.1" secfmt = "0.1.1"
# Windows-only dependency
[target.'cfg(windows)'.dependencies]
display-info = "0.5.1"
x-win = "2.0.2" x-win = "2.0.2"
winapi = { version = "0.3", features = ["winuser"] }

View File

@ -25,7 +25,7 @@
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="halign">fill</property> <property name="halign">fill</property>
<property name="valign">filr</property> <property name="valign">fill</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk" version="4.0"/> <requires lib="gtk" version="4.0"/>
<object class="GtkMessageDialog" id="select_window"> <object class="AdwWindow" id="select_window">
<property name="name">select_window</property> <property name="name">select_window</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="destroy-with-parent">True</property> <property name="destroy-with-parent">True</property>
@ -9,5 +9,32 @@
<property name="resizable">False</property> <property name="resizable">False</property>
<property name="decorated">False</property> <property name="decorated">False</property>
<property name="modal">True</property> <property name="modal">True</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="orientation">horizontal</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="vexpand">True</property>
<child>
<object class="GtkLabel" id="select_window_label">
<property name="name">select_window_label</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="label" translatable="yes">label</property>
<property name="halign">center</property>
<property name="valign">center</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object> </object>
</interface> </interface>

View File

@ -61,7 +61,7 @@ wmv-format = WMV (Windows Media Video)
blue-recorder = المسجّل الأزرق blue-recorder = المسجّل الأزرق
# Click to select window # Click to select window
click-window = Left click to select a window click-window = Left click to select window
# Close error dialog # Close error dialog
close = Close close = Close
@ -182,4 +182,4 @@ tray-minimize-tooltip = Minimize application to tray icon
video-tooltip = يسجل الشاشة video-tooltip = يسجل الشاشة
wayland-tooltip = غير مدعوم في وايلاند wayland-tooltip = غير مدعوم في وايلاند
window-tooltip = يحدد نافذة ليسجلها window-tooltip = يحدد نافذة ليسجلها
windows-unsupported-tooltip = Not supported in windows platform windows-unsupported-tooltip = Not supported on windows platform

View File

@ -61,7 +61,7 @@ wmv-format = WMV (Windows Media Video)
blue-recorder = المسجّل الأزرق blue-recorder = المسجّل الأزرق
# Click to select window # Click to select window
click-window = Left click to select a window click-window = Left click to select window
# Close error dialog # Close error dialog
close = Close close = Close
@ -182,4 +182,4 @@ tray-minimize-tooltip = Minimize application to tray icon
video-tooltip = يسجل الشاشة video-tooltip = يسجل الشاشة
wayland-tooltip = غير مدعوم في وايلاند wayland-tooltip = غير مدعوم في وايلاند
window-tooltip = يحدد نافذة ليسجلها window-tooltip = يحدد نافذة ليسجلها
windows-unsupported-tooltip = Not supported in windows platform windows-unsupported-tooltip = Not supported on windows platform

View File

@ -61,7 +61,7 @@ wmv-format = WMV (Windows Media Video)
blue-recorder = Blue Recorder blue-recorder = Blue Recorder
# Click to select window # Click to select window
click-window = Left click to select a window click-window = Left click to select window
# Close error dialog # Close error dialog
close = Close close = Close
@ -182,4 +182,4 @@ tray-minimize-tooltip = Minimize application to tray icon
video-tooltip = Video recording video-tooltip = Video recording
wayland-tooltip = Not supported in Wayland wayland-tooltip = Not supported in Wayland
window-tooltip = Select window to record window-tooltip = Select window to record
windows-unsupported-tooltip = Not supported in windows platform windows-unsupported-tooltip = Not supported on windows platform

View File

@ -61,7 +61,7 @@ wmv-format = WMV (Windows Media Video)
blue-recorder = Blue Recorder blue-recorder = Blue Recorder
# Click to select window # Click to select window
click-window = Left click to select a window click-window = Left click to select window
# Close error dialog # Close error dialog
close = Close close = Close
@ -182,4 +182,4 @@ tray-minimize-tooltip = Minimize application to tray icon
video-tooltip = Video recording video-tooltip = Video recording
wayland-tooltip = Not supported in Wayland wayland-tooltip = Not supported in Wayland
window-tooltip = Select window to record window-tooltip = Select window to record
windows-unsupported-tooltip = Not supported in windows platform windows-unsupported-tooltip = Not supported on windows platform

View File

@ -1,13 +1,18 @@
extern crate regex; extern crate regex;
use anyhow::{anyhow, Result}; #[cfg(any(target_os = "freebsd", target_os = "linux"))]
use anyhow::anyhow;
use anyhow::Result;
#[cfg(target_os = "windows")]
use display_info::DisplayInfo; use display_info::DisplayInfo;
use glib::Continue; use glib::Continue;
use libadwaita::gtk::Label; use libadwaita::gtk::Label;
use libadwaita::Window; use libadwaita::Window;
use libadwaita::prelude::*; use libadwaita::prelude::*;
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
use regex::Regex; use regex::Regex;
use std::cell::RefCell; use std::cell::RefCell;
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
use std::process::Command; use std::process::Command;
use std::rc::Rc; use std::rc::Rc;
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
@ -113,7 +118,7 @@ impl AreaCapture {
} }
Ok(*self) Ok(*self)
} }
} }
#[cfg(any(target_os = "freebsd", target_os = "linux"))] #[cfg(any(target_os = "freebsd", target_os = "linux"))]
@ -189,3 +194,23 @@ pub fn show_size(area_chooser_window: Window, area_size_bottom_label: Label, are
Ok(()) Ok(())
} }
// Returns `true` if the left mouse button is clicked, and `false` if the `Esc` key is pressed.
#[cfg(target_os = "windows")]
pub fn check_input() -> bool {
use winapi::um::winuser::{GetAsyncKeyState, VK_LBUTTON, VK_ESCAPE};
loop {
// Check if the left mouse button (VK_LBUTTON) is pressed
if unsafe { GetAsyncKeyState(VK_LBUTTON) } & 0x8000u16 as i16 != 0 {
break true;
}
// Check if the Esc key is pressed
if unsafe { GetAsyncKeyState(VK_ESCAPE) } & 0x8000u16 as i16 != 0 {
break false;
}
// Add a small delay to avoid busy-waiting
std::thread::sleep(std::time::Duration::from_millis(10));
}
}

View File

@ -102,9 +102,16 @@
} }
#select_window { #select_window {
background: none;
border: none;
border-radius: 0px;
font-weight: bold; font-weight: bold;
} }
#select_window_label {
color: @theme_selected_bg_color;
}
#stop_button { #stop_button {
background: #ed333b; background: #ed333b;
border: 1px solid #ed333b; border: 1px solid #ed333b;

View File

@ -30,7 +30,7 @@ pub fn run_ui(application: &Application) {
error_dialog_button.set_label(&get_bundle("close", None)); error_dialog_button.set_label(&get_bundle("close", None));
error_expander_label.set_label(&get_bundle("details-button", None)); error_expander_label.set_label(&get_bundle("details-button", None));
let _error_dialog = error_dialog.clone(); let _error_dialog = error_dialog.clone();
error_dialog_button.connect_clicked(move |_|{ error_dialog_button.connect_clicked(move |_| {
_error_dialog.close(); _error_dialog.close();
}); });
@ -114,7 +114,8 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
let screen_grab_button: ToggleButton = builder.object("screen_grab_button").unwrap(); let screen_grab_button: ToggleButton = builder.object("screen_grab_button").unwrap();
let screen_grab_icon: Image = builder.object("screen_grab_icon").unwrap(); let screen_grab_icon: Image = builder.object("screen_grab_icon").unwrap();
let screen_grab_label: Label = builder.object("screen_grab_label").unwrap(); let screen_grab_label: Label = builder.object("screen_grab_label").unwrap();
let select_window: MessageDialog = builder.object("select_window").unwrap(); let select_window: Window = builder.object("select_window").unwrap();
let select_window_label: Label = builder.object("select_window_label").unwrap();
let speaker_switch: CheckButton = builder.object("speakerswitch").unwrap(); let speaker_switch: CheckButton = builder.object("speakerswitch").unwrap();
let stop_button: Button = builder.object("stopbutton").unwrap(); let stop_button: Button = builder.object("stopbutton").unwrap();
let stop_label: Label = builder.object("stop_label").unwrap(); let stop_label: Label = builder.object("stop_label").unwrap();
@ -130,8 +131,6 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
area_chooser_window.set_title(Some(&get_bundle("area-chooser", None))); // Title is hidden area_chooser_window.set_title(Some(&get_bundle("area-chooser", None))); // Title is hidden
error_dialog.set_transient_for(Some(&main_window)); error_dialog.set_transient_for(Some(&main_window));
select_window.set_transient_for(Some(&main_window)); select_window.set_transient_for(Some(&main_window));
select_window.set_message_type(libadwaita::gtk::MessageType::Info);
select_window.set_secondary_text(Some(&get_bundle("click-window", None)));
main_window.set_application(Some(application)); main_window.set_application(Some(application));
main_window.set_title(Some(&get_bundle("blue-recorder", None))); main_window.set_title(Some(&get_bundle("blue-recorder", None)));
@ -160,6 +159,12 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
area_grab_button.set_sensitive(false); area_grab_button.set_sensitive(false);
area_grab_button.set_tooltip_text(Some(&get_bundle("wayland-tooltip", None))); area_grab_button.set_tooltip_text(Some(&get_bundle("wayland-tooltip", None)));
} }
// Disable follow mouse option
#[cfg(target_os = "windows")]
{
follow_mouse_switch.set_active(false);
follow_mouse_switch.set_sensitive(false);
}
// Entries // Entries
filename_entry.set_placeholder_text(Some(&get_bundle("file-name", None))); filename_entry.set_placeholder_text(Some(&get_bundle("file-name", None)));
@ -216,6 +221,9 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
video_switch.set_label(Some(&get_bundle("record-video", None))); video_switch.set_label(Some(&get_bundle("record-video", None)));
area_switch.set_tooltip_text(Some(&get_bundle("show-area-tooltip", None))); area_switch.set_tooltip_text(Some(&get_bundle("show-area-tooltip", None)));
audio_input_switch.set_tooltip_text(Some(&get_bundle("audio-input-tooltip", None))); audio_input_switch.set_tooltip_text(Some(&get_bundle("audio-input-tooltip", None)));
#[cfg(target_os = "windows")]
follow_mouse_switch.set_tooltip_text(Some(&get_bundle("windows-unsupported-tooltip", None)));
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
follow_mouse_switch.set_tooltip_text(Some(&get_bundle("follow-mouse-tooltip", None))); follow_mouse_switch.set_tooltip_text(Some(&get_bundle("follow-mouse-tooltip", None)));
hide_switch.set_tooltip_text(Some(&get_bundle("hide-tooltip", None))); hide_switch.set_tooltip_text(Some(&get_bundle("hide-tooltip", None)));
mouse_switch.set_tooltip_text(Some(&get_bundle("mouse-tooltip", None))); mouse_switch.set_tooltip_text(Some(&get_bundle("mouse-tooltip", None)));
@ -546,12 +554,12 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
}); });
// Buttons // Buttons
//let area_capture: Rc<RefCell<area_capture::AreaCapture>> = let area_capture: Rc<RefCell<area_capture::AreaCapture>> =
//Rc::new(RefCell::new(area_capture::AreaCapture::new()?)); Rc::new(RefCell::new(area_capture::AreaCapture::new()?));
area_grab_label.set_label(&get_bundle("select-area", None)); area_grab_label.set_label(&get_bundle("select-area", None));
let _area_chooser_window = area_chooser_window.clone(); let _area_chooser_window = area_chooser_window.clone();
//let mut _area_capture = area_capture.clone(); let mut _area_capture = area_capture.clone();
let _area_switch = area_switch.clone(); let _area_switch = area_switch.clone();
let _error_dialog = error_dialog.clone(); let _error_dialog = error_dialog.clone();
let _error_message = error_message.clone(); let _error_message = error_message.clone();
@ -574,23 +582,32 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
area_apply_label.set_label(&get_bundle("apply", None)); area_apply_label.set_label(&get_bundle("apply", None));
let _area_chooser_window = area_chooser_window.clone(); let _area_chooser_window = area_chooser_window.clone();
//let mut _area_capture = area_capture.clone(); let mut _area_capture = area_capture.clone();
let _error_dialog = error_dialog.clone(); let _error_dialog = error_dialog.clone();
let _error_message = error_message.clone(); let _error_message = error_message.clone();
area_set_button.connect_clicked(move |_| { area_set_button.connect_clicked(move |_| {
let text_buffer = TextBuffer::new(None); let text_buffer = TextBuffer::new(None);
/*if _area_capture #[cfg(target_os = "windows")]
if _area_capture
.borrow_mut()
.get_active_window().is_err() {
text_buffer.set_text("Failed to get area size value");
_error_message.set_buffer(Some(&text_buffer));
_error_dialog.show();
}
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
if _area_capture
.borrow_mut() .borrow_mut()
.get_window_by_name(_area_chooser_window.title().unwrap().as_str()).is_err() { .get_window_by_name(_area_chooser_window.title().unwrap().as_str()).is_err() {
text_buffer.set_text("Failed to get area size value"); text_buffer.set_text("Failed to get area size value");
_error_message.set_buffer(Some(&text_buffer)); _error_message.set_buffer(Some(&text_buffer));
_error_dialog.show(); _error_dialog.show();
}*/ }
_area_chooser_window.hide(); _area_chooser_window.hide();
}); });
let _area_chooser_window = area_chooser_window.clone(); let _area_chooser_window = area_chooser_window.clone();
//let mut _area_capture = area_capture.clone(); let mut _area_capture = area_capture.clone();
let _area_switch = area_switch.clone(); let _area_switch = area_switch.clone();
let _error_dialog = error_dialog.clone(); let _error_dialog = error_dialog.clone();
let _error_message = error_message.clone(); let _error_message = error_message.clone();
@ -607,15 +624,15 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
config_management::set("default", "mode", "screen"); config_management::set("default", "mode", "screen");
screen_grab_button_record_window.replace(false); screen_grab_button_record_window.replace(false);
_area_chooser_window.hide(); _area_chooser_window.hide();
/*if _area_capture.borrow_mut().reset().is_err() { if _area_capture.borrow_mut().reset().is_err() {
text_buffer.set_text("Failed to get reset area_capture value"); text_buffer.set_text("Failed to reset area_capture value");
_error_message.set_buffer(Some(&text_buffer)); _error_message.set_buffer(Some(&text_buffer));
_error_dialog.show(); _error_dialog.show();
}*/ }
}); });
let _area_chooser_window: Window = area_chooser_window.clone(); let _area_chooser_window: Window = area_chooser_window.clone();
//let mut _area_capture: Rc<RefCell<area_capture::AreaCapture>> = area_capture.clone(); let mut _area_capture: Rc<RefCell<area_capture::AreaCapture>> = area_capture.clone();
let _area_switch = area_switch.clone(); let _area_switch = area_switch.clone();
let _error_dialog = error_dialog.clone(); let _error_dialog = error_dialog.clone();
let _error_message = error_message.clone(); let _error_message = error_message.clone();
@ -631,21 +648,48 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
if is_wayland() { if is_wayland() {
window_grab_button_record_window.replace(true); window_grab_button_record_window.replace(true);
} else { } else {
select_window.show(); #[cfg(target_os = "windows")]
select_window.set_hide_on_close(true); {
/*if _area_capture.borrow_mut().get_area().is_err() { select_window_label.set_label(&get_bundle("click-window", None));
text_buffer.set_text("Failed to get window size value"); select_window.show();
_error_message.set_buffer(Some(&text_buffer));
_error_dialog.show(); let area_capture = _area_capture.clone();
}*/ let error_message = _error_message.clone();
} let error_dialog = error_dialog.clone();
let _select_window = select_window.clone();
glib::timeout_add_local(1000, move || {
let clicked = area_capture::check_input();
if clicked {
_select_window.hide();
if area_capture.borrow_mut().get_title().is_err() {
text_buffer.set_text("Failed to get window info");
error_message.set_buffer(Some(&text_buffer));
error_dialog.show();
}
return glib::source::Continue(false);
} else if !clicked {
_select_window.hide();
return glib::source::Continue(false);
}
glib::source::Continue(true)
});
}
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
{
if _area_capture.borrow_mut().get_area().is_err() {
text_buffer.set_text("Failed to get window info");
_error_message.set_buffer(Some(&text_buffer));
_error_dialog.show();
}
}}
}); });
let _delay_spin = delay_spin.clone(); let _delay_spin = delay_spin.clone();
//let bundle_msg = get_bundle("already-exist", None); //let bundle_msg = get_bundle("already-exist", None);
//let main_context = glib::MainContext::default(); //let main_context = glib::MainContext::default();
//let wayland_record = main_context.block_on(WaylandRecorder::new()); //let wayland_record = main_context.block_on(WaylandRecorder::new());
// Init record struc // Init record struct
/*let ffmpeg_record_interface: Rc<RefCell<Ffmpeg>> = Rc::new(RefCell::new(Ffmpeg { /*let ffmpeg_record_interface: Rc<RefCell<Ffmpeg>> = Rc::new(RefCell::new(Ffmpeg {
audio_input_id: String::new(), audio_input_id: String::new(),
audio_output_id: String::new(), audio_output_id: String::new(),