app launcher res & orientation functionality
This commit is contained in:
@@ -53,7 +53,9 @@ enum Task {
|
|||||||
|
|
||||||
struct LaunchParams<'a, T> {
|
struct LaunchParams<'a, T> {
|
||||||
application: &'a DesktopEntry,
|
application: &'a DesktopEntry,
|
||||||
run_mode: CompositorMode,
|
compositor_mode: CompositorMode,
|
||||||
|
res_mode: ResMode,
|
||||||
|
orientation_mode: OrientationMode,
|
||||||
globals: &'a WguiGlobals,
|
globals: &'a WguiGlobals,
|
||||||
frontend_tasks: &'a FrontendTasks,
|
frontend_tasks: &'a FrontendTasks,
|
||||||
interface: &'a mut BoxDashInterface<T>,
|
interface: &'a mut BoxDashInterface<T>,
|
||||||
@@ -265,7 +267,9 @@ impl View {
|
|||||||
application: &self.entry,
|
application: &self.entry,
|
||||||
frontend_tasks: &self.frontend_tasks,
|
frontend_tasks: &self.frontend_tasks,
|
||||||
globals: &self.globals,
|
globals: &self.globals,
|
||||||
run_mode: self.compositor_mode.clone(),
|
compositor_mode: self.compositor_mode,
|
||||||
|
res_mode: self.res_mode,
|
||||||
|
orientation_mode: self.orientation_mode,
|
||||||
interface,
|
interface,
|
||||||
data,
|
data,
|
||||||
on_launched: &self.on_launched,
|
on_launched: &self.on_launched,
|
||||||
@@ -289,7 +293,7 @@ impl View {
|
|||||||
fn launch<T>(params: LaunchParams<T>) -> anyhow::Result<()> {
|
fn launch<T>(params: LaunchParams<T>) -> anyhow::Result<()> {
|
||||||
let mut env = Vec::<String>::new();
|
let mut env = Vec::<String>::new();
|
||||||
|
|
||||||
if params.run_mode == CompositorMode::Native {
|
if params.compositor_mode == CompositorMode::Native {
|
||||||
// This list could be larger, feel free to expand it
|
// This list could be larger, feel free to expand it
|
||||||
env.push("QT_QPA_PLATFORM=wayland".into());
|
env.push("QT_QPA_PLATFORM=wayland".into());
|
||||||
env.push("GDK_BACKEND=wayland".into());
|
env.push("GDK_BACKEND=wayland".into());
|
||||||
@@ -298,12 +302,12 @@ impl View {
|
|||||||
env.push("ELECTRON_OZONE_PLATFORM_HINT=wayland".into());
|
env.push("ELECTRON_OZONE_PLATFORM_HINT=wayland".into());
|
||||||
}
|
}
|
||||||
|
|
||||||
let args = match params.run_mode {
|
let args = match params.compositor_mode {
|
||||||
CompositorMode::Cage => format!("-- {} {}", params.application.exec_path, params.application.exec_args),
|
CompositorMode::Cage => format!("-- {} {}", params.application.exec_path, params.application.exec_args),
|
||||||
CompositorMode::Native => params.application.exec_args.to_string(),
|
CompositorMode::Native => params.application.exec_args.to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let exec = match params.run_mode {
|
let exec = match params.compositor_mode {
|
||||||
CompositorMode::Cage => "cage".to_string(),
|
CompositorMode::Cage => "cage".to_string(),
|
||||||
CompositorMode::Native => params.application.exec_path.to_string(),
|
CompositorMode::Native => params.application.exec_path.to_string(),
|
||||||
};
|
};
|
||||||
@@ -311,6 +315,8 @@ impl View {
|
|||||||
let mut userdata = HashMap::new();
|
let mut userdata = HashMap::new();
|
||||||
userdata.insert("desktop-entry".to_string(), serde_json::to_string(params.application)?);
|
userdata.insert("desktop-entry".to_string(), serde_json::to_string(params.application)?);
|
||||||
|
|
||||||
|
let resolution = Self::calculate_resolution(params.res_mode, params.orientation_mode);
|
||||||
|
|
||||||
params.interface.process_launch(
|
params.interface.process_launch(
|
||||||
params.data,
|
params.data,
|
||||||
WvrProcessLaunchParams {
|
WvrProcessLaunchParams {
|
||||||
@@ -318,6 +324,7 @@ impl View {
|
|||||||
exec,
|
exec,
|
||||||
name: params.application.app_name.to_string(),
|
name: params.application.app_name.to_string(),
|
||||||
args,
|
args,
|
||||||
|
resolution,
|
||||||
userdata,
|
userdata,
|
||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
@@ -333,4 +340,28 @@ impl View {
|
|||||||
// we're done!
|
// we're done!
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn calculate_resolution(res_mode: ResMode, orientation_mode: OrientationMode) -> [u32; 2] {
|
||||||
|
let total_pixels = match res_mode {
|
||||||
|
ResMode::Res1440 => 2560 * 1440,
|
||||||
|
ResMode::Res1080 => 1920 * 1080,
|
||||||
|
ResMode::Res720 => 1280 * 720,
|
||||||
|
ResMode::Res480 => 854 * 480,
|
||||||
|
};
|
||||||
|
|
||||||
|
let (ratio_w, ratio_h) = match orientation_mode {
|
||||||
|
OrientationMode::Wide => (16, 9),
|
||||||
|
OrientationMode::SemiWide => (3, 2),
|
||||||
|
OrientationMode::Square => (1, 1),
|
||||||
|
OrientationMode::SemiTall => (2, 3),
|
||||||
|
OrientationMode::Tall => (9, 16),
|
||||||
|
};
|
||||||
|
|
||||||
|
let k = ((total_pixels as f64) / (ratio_w * ratio_h) as f64).sqrt();
|
||||||
|
|
||||||
|
let width = (ratio_w as f64 * k).round() as u64;
|
||||||
|
let height = (ratio_h as f64 * k).round() as u64;
|
||||||
|
|
||||||
|
[width as u32, height as u32]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ pub struct WvrProcessLaunchParams {
|
|||||||
pub exec: String,
|
pub exec: String,
|
||||||
pub env: Vec<String>,
|
pub env: Vec<String>,
|
||||||
pub args: String,
|
pub args: String,
|
||||||
|
pub resolution: [u32; 2],
|
||||||
pub userdata: HashMap<String, String>,
|
pub userdata: HashMap<String, String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,13 +36,13 @@ use xkbcommon::xkb;
|
|||||||
use crate::{
|
use crate::{
|
||||||
backend::{
|
backend::{
|
||||||
task::{OverlayTask, TaskType},
|
task::{OverlayTask, TaskType},
|
||||||
wayvr::{image_importer::ImageImporter, window::Window},
|
wayvr::{image_importer::ImageImporter, process::{Process, WayVRProcess}, window::Window},
|
||||||
},
|
},
|
||||||
graphics::WGfxExtras,
|
graphics::WGfxExtras,
|
||||||
ipc::{event_queue::SyncEventQueue, ipc_server, signal::WayVRSignal},
|
ipc::{event_queue::SyncEventQueue, ipc_server, signal::WayVRSignal},
|
||||||
overlays::wayvr::create_wl_window_overlay,
|
overlays::wayvr::create_wl_window_overlay,
|
||||||
state::AppState,
|
state::AppState,
|
||||||
subsystem::hid::{MODS_TO_KEYS, WheelDelta},
|
subsystem::hid::{WheelDelta, MODS_TO_KEYS},
|
||||||
windowing::{OverlayID, OverlaySelector},
|
windowing::{OverlayID, OverlaySelector},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -146,8 +146,8 @@ impl WvrServerState {
|
|||||||
let data_device = DataDeviceState::new::<Application>(&dh);
|
let data_device = DataDeviceState::new::<Application>(&dh);
|
||||||
let mut seat = seat_state.new_wl_seat(&dh, "wayvr");
|
let mut seat = seat_state.new_wl_seat(&dh, "wayvr");
|
||||||
|
|
||||||
let dummy_width = 1920;
|
let dummy_width = 2560;
|
||||||
let dummy_height = 1080;
|
let dummy_height = 1440;
|
||||||
let dummy_milli_hz = 60000; /* refresh rate in millihertz */
|
let dummy_milli_hz = 60000; /* refresh rate in millihertz */
|
||||||
|
|
||||||
let output = Output::new(
|
let output = Output::new(
|
||||||
@@ -302,9 +302,14 @@ impl WvrServerState {
|
|||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let [size_x, size_y] = match wvr_server.processes.get(&process_handle) {
|
||||||
|
Some(Process::Managed(p)) => p.resolution,
|
||||||
|
_ => [1920, 1080],
|
||||||
|
};
|
||||||
|
|
||||||
let window_handle = wvr_server
|
let window_handle = wvr_server
|
||||||
.wm
|
.wm
|
||||||
.create_window(toplevel.clone(), process_handle);
|
.create_window(toplevel.clone(), process_handle, size_x, size_y);
|
||||||
|
|
||||||
let title: Arc<str> = with_states(toplevel.wl_surface(), |states| {
|
let title: Arc<str> = with_states(toplevel.wl_surface(), |states| {
|
||||||
states
|
states
|
||||||
@@ -474,6 +479,7 @@ impl WvrServerState {
|
|||||||
exec_path: &str,
|
exec_path: &str,
|
||||||
args: &[&str],
|
args: &[&str],
|
||||||
env: &[(&str, &str)],
|
env: &[(&str, &str)],
|
||||||
|
resolution: [u32; 2],
|
||||||
working_dir: Option<&str>,
|
working_dir: Option<&str>,
|
||||||
userdata: HashMap<String, String>,
|
userdata: HashMap<String, String>,
|
||||||
) -> anyhow::Result<process::ProcessHandle> {
|
) -> anyhow::Result<process::ProcessHandle> {
|
||||||
@@ -505,6 +511,7 @@ impl WvrServerState {
|
|||||||
.iter()
|
.iter()
|
||||||
.map(|(a, b)| (String::from(*a), String::from(*b)))
|
.map(|(a, b)| (String::from(*a), String::from(*b)))
|
||||||
.collect(),
|
.collect(),
|
||||||
|
resolution,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
self.signals.send(WayVRSignal::BroadcastStateChanged(
|
self.signals.send(WayVRSignal::BroadcastStateChanged(
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ pub struct WayVRProcess {
|
|||||||
pub args: Vec<String>,
|
pub args: Vec<String>,
|
||||||
pub env: Vec<(String, String)>,
|
pub env: Vec<(String, String)>,
|
||||||
pub working_dir: Option<String>,
|
pub working_dir: Option<String>,
|
||||||
|
pub resolution: [u32; 2],
|
||||||
|
|
||||||
pub userdata: HashMap<String, String>,
|
pub userdata: HashMap<String, String>,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -166,8 +166,12 @@ impl WindowManager {
|
|||||||
&mut self,
|
&mut self,
|
||||||
toplevel: Rc<ToplevelSurface>,
|
toplevel: Rc<ToplevelSurface>,
|
||||||
process: process::ProcessHandle,
|
process: process::ProcessHandle,
|
||||||
|
size_x: u32,
|
||||||
|
size_y: u32,
|
||||||
) -> WindowHandle {
|
) -> WindowHandle {
|
||||||
self.windows.add(Window::new(toplevel, process))
|
let mut window = Window::new(toplevel, process);
|
||||||
|
window.set_size(size_x, size_y);
|
||||||
|
self.windows.add(window)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_window(&mut self, window_handle: WindowHandle) {
|
pub fn remove_window(&mut self, window_handle: WindowHandle) {
|
||||||
|
|||||||
@@ -242,6 +242,7 @@ impl Connection {
|
|||||||
&packet_params.exec,
|
&packet_params.exec,
|
||||||
&args_vec,
|
&args_vec,
|
||||||
&env_vec,
|
&env_vec,
|
||||||
|
packet_params.resolution,
|
||||||
None,
|
None,
|
||||||
packet_params.userdata,
|
packet_params.userdata,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -369,7 +369,14 @@ impl DashInterface<AppState> for DashInterfaceLive {
|
|||||||
let env_vec = gen_env_vec(¶ms.env);
|
let env_vec = gen_env_vec(¶ms.env);
|
||||||
|
|
||||||
wvr_server
|
wvr_server
|
||||||
.spawn_process(¶ms.exec, &args_vec, &env_vec, None, params.userdata)
|
.spawn_process(
|
||||||
|
¶ms.exec,
|
||||||
|
&args_vec,
|
||||||
|
&env_vec,
|
||||||
|
params.resolution,
|
||||||
|
None,
|
||||||
|
params.userdata,
|
||||||
|
)
|
||||||
.map(|x| x.as_packet())
|
.map(|x| x.as_packet())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user