outputs: Remove ui manager
This commit is contained in:
@ -40,6 +40,5 @@ mod style;
|
||||
mod submission;
|
||||
pub mod tests;
|
||||
pub mod util;
|
||||
mod ui_manager;
|
||||
mod vkeyboard;
|
||||
mod xdg;
|
||||
|
||||
@ -118,26 +118,6 @@ pub mod c {
|
||||
/// Wrapping Outputs is required for calling its methods from C
|
||||
type COutputs = Wrapped<Outputs>;
|
||||
|
||||
/// A stable reference to an output.
|
||||
#[derive(Clone)]
|
||||
#[repr(C)]
|
||||
pub struct OutputHandle {
|
||||
wl_output: WlOutput,
|
||||
outputs: COutputs,
|
||||
}
|
||||
|
||||
impl OutputHandle {
|
||||
// Cannot return an Output reference
|
||||
// because COutputs is too deeply wrapped
|
||||
pub fn get_state(&self) -> Option<OutputState> {
|
||||
let outputs = self.outputs.clone_ref();
|
||||
let outputs = outputs.borrow();
|
||||
outputs
|
||||
.find_output(self.wl_output.clone())
|
||||
.map(|o| o.current.clone())
|
||||
}
|
||||
}
|
||||
|
||||
// Defined in Rust
|
||||
|
||||
// Callbacks from the output listener follow
|
||||
@ -303,17 +283,6 @@ pub mod c {
|
||||
.unwrap_or(WlOutput::null())
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C"
|
||||
fn squeek_outputs_get_current(raw_collection: COutputs) -> OutputHandle {
|
||||
let collection = raw_collection.clone_ref();
|
||||
let collection = collection.borrow();
|
||||
OutputHandle {
|
||||
wl_output: collection.outputs[0].0.output.clone(),
|
||||
outputs: raw_collection.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: handle unregistration
|
||||
}
|
||||
|
||||
@ -437,14 +406,6 @@ impl Outputs {
|
||||
}
|
||||
}
|
||||
|
||||
fn find_output(&self, wl_output: c::WlOutput) -> Option<&Output> {
|
||||
self.outputs
|
||||
.iter()
|
||||
.find_map(|(o, _global)|
|
||||
if o.output == wl_output { Some(o) } else { None }
|
||||
)
|
||||
}
|
||||
|
||||
fn find_output_mut(&mut self, wl_output: c::WlOutput)
|
||||
-> Option<&mut Output>
|
||||
{
|
||||
|
||||
@ -42,7 +42,6 @@ struct _ServerContextService {
|
||||
/// Needed for instantiating the widget
|
||||
struct submission *submission; // unowned
|
||||
struct squeek_layout_state *layout;
|
||||
struct ui_manager *manager; // unowned
|
||||
struct squeek_state_manager *state_manager; // shared reference
|
||||
|
||||
PhoshLayerSurface *window;
|
||||
@ -315,13 +314,12 @@ init (ServerContextService *self) {
|
||||
}
|
||||
|
||||
ServerContextService *
|
||||
server_context_service_new (EekboardContextService *self, struct submission *submission, struct squeek_layout_state *layout, struct ui_manager *uiman, struct squeek_state_manager *state_manager)
|
||||
server_context_service_new (EekboardContextService *self, struct submission *submission, struct squeek_layout_state *layout, struct squeek_state_manager *state_manager)
|
||||
{
|
||||
ServerContextService *ui = g_object_new (SERVER_TYPE_CONTEXT_SERVICE, NULL);
|
||||
ui->submission = submission;
|
||||
ui->state = self;
|
||||
ui->layout = layout;
|
||||
ui->manager = uiman;
|
||||
ui->state_manager = state_manager;
|
||||
init(ui);
|
||||
return ui;
|
||||
|
||||
@ -20,7 +20,6 @@
|
||||
|
||||
#include "src/layout.h"
|
||||
#include "src/submission.h"
|
||||
#include "ui_manager.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@ -29,7 +28,7 @@ G_BEGIN_DECLS
|
||||
/** Manages the lifecycle of the window displaying layouts. */
|
||||
G_DECLARE_FINAL_TYPE (ServerContextService, server_context_service, SERVER, CONTEXT_SERVICE, GObject)
|
||||
|
||||
ServerContextService *server_context_service_new(EekboardContextService *self, struct submission *submission, struct squeek_layout_state *layout, struct ui_manager *uiman, struct squeek_state_manager *state_manager);
|
||||
ServerContextService *server_context_service_new(EekboardContextService *self, struct submission *submission, struct squeek_layout_state *layout, struct squeek_state_manager *state_manager);
|
||||
enum squeek_arrangement_kind server_context_service_get_layout_type(ServerContextService *);
|
||||
G_END_DECLS
|
||||
#endif /* SERVER_CONTEXT_SERVICE_H */
|
||||
|
||||
@ -33,7 +33,6 @@
|
||||
#include "outputs.h"
|
||||
#include "submission.h"
|
||||
#include "server-context-service.h"
|
||||
#include "ui_manager.h"
|
||||
#include "wayland.h"
|
||||
|
||||
#include <gdk/gdkwayland.h>
|
||||
@ -56,8 +55,6 @@ struct squeekboard {
|
||||
ServerContextService *ui_context; // mess, includes the entire UI
|
||||
/// Currently wanted layout. TODO: merge into state::Application
|
||||
struct squeek_layout_state layout_choice;
|
||||
/// UI shape tracker/chooser. TODO: merge into state::Application
|
||||
struct ui_manager *ui_manager;
|
||||
};
|
||||
|
||||
|
||||
@ -400,8 +397,6 @@ main (int argc, char **argv)
|
||||
// Also initializes wayland
|
||||
struct rsobjects rsobjects = squeek_init();
|
||||
|
||||
instance.ui_manager = squeek_uiman_new();
|
||||
|
||||
instance.settings_context = eekboard_context_service_new(&instance.layout_choice);
|
||||
|
||||
// set up dbus
|
||||
@ -446,7 +441,6 @@ main (int argc, char **argv)
|
||||
instance.settings_context,
|
||||
rsobjects.submission,
|
||||
&instance.layout_choice,
|
||||
instance.ui_manager,
|
||||
rsobjects.state_manager);
|
||||
if (!ui_context) {
|
||||
g_error("Could not initialize GUI");
|
||||
|
||||
@ -5,7 +5,6 @@
|
||||
#include "virtual-keyboard-unstable-v1-client-protocol.h"
|
||||
#include "eek/eek-types.h"
|
||||
#include "main.h"
|
||||
#include "src/ui_manager.h"
|
||||
|
||||
struct squeek_layout;
|
||||
|
||||
|
||||
@ -1,19 +0,0 @@
|
||||
#ifndef UI_MANAGER__
|
||||
#define UI_MANAGER__
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "eek/eek-types.h"
|
||||
#include "outputs.h"
|
||||
#include "main.h"
|
||||
|
||||
struct ui_manager;
|
||||
|
||||
struct ui_manager *squeek_uiman_new(void);
|
||||
void squeek_uiman_set_output(struct ui_manager *uiman, struct squeek_output_handle output);
|
||||
uint32_t squeek_uiman_get_perceptual_height(struct ui_manager *uiman);
|
||||
|
||||
struct vis_manager;
|
||||
|
||||
struct vis_manager *squeek_visman_new(struct squeek_state_manager *state_manager);
|
||||
#endif
|
||||
@ -1,82 +0,0 @@
|
||||
/* Copyright (C) 2020, 2021 Purism SPC
|
||||
* SPDX-License-Identifier: GPL-3.0+
|
||||
*/
|
||||
|
||||
/*! Centrally manages the shape of the UI widgets, and the choice of layout.
|
||||
*
|
||||
* Coordinates this based on information collated from all possible sources.
|
||||
*/
|
||||
|
||||
use std::cmp::min;
|
||||
use ::outputs::c::OutputHandle;
|
||||
|
||||
|
||||
pub mod c {
|
||||
use super::*;
|
||||
use ::util::c::Wrapped;
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C"
|
||||
fn squeek_uiman_new() -> Wrapped<Manager> {
|
||||
Wrapped::new(Manager { output: None })
|
||||
}
|
||||
|
||||
/// Used to size the layer surface containing all the OSK widgets.
|
||||
#[no_mangle]
|
||||
pub extern "C"
|
||||
fn squeek_uiman_get_perceptual_height(
|
||||
uiman: Wrapped<Manager>,
|
||||
) -> u32 {
|
||||
let uiman = uiman.clone_ref();
|
||||
let uiman = uiman.borrow();
|
||||
// TODO: what to do when there's no output?
|
||||
uiman.get_perceptual_height().unwrap_or(0)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C"
|
||||
fn squeek_uiman_set_output(
|
||||
uiman: Wrapped<Manager>,
|
||||
output: OutputHandle,
|
||||
) {
|
||||
let uiman = uiman.clone_ref();
|
||||
let mut uiman = uiman.borrow_mut();
|
||||
uiman.output = Some(output);
|
||||
}
|
||||
}
|
||||
|
||||
/// Stores current state of all things influencing what the UI should look like.
|
||||
pub struct Manager {
|
||||
/// Shared output handle, current state updated whenever it's needed.
|
||||
// TODO: Stop assuming that the output never changes.
|
||||
// (There's no way for the output manager to update the ui manager.)
|
||||
// FIXME: Turn into an OutputState and apply relevant connections elsewhere.
|
||||
// Otherwise testability and predictablity is low.
|
||||
output: Option<OutputHandle>,
|
||||
//// Pixel size of the surface. Needs explicit updating.
|
||||
//surface_size: Option<Size>,
|
||||
}
|
||||
|
||||
impl Manager {
|
||||
fn get_perceptual_height(&self) -> Option<u32> {
|
||||
let output_info = (&self.output).as_ref()
|
||||
.and_then(|o| o.get_state())
|
||||
.map(|os| (os.scale as u32, os.get_pixel_size()));
|
||||
match output_info {
|
||||
Some((scale, Some(px_size))) => Some({
|
||||
let height = if (px_size.width < 720) & (px_size.width > 0) {
|
||||
px_size.width * 7 / 12 // to match 360×210
|
||||
} else if px_size.width < 1080 {
|
||||
360 + (1080 - px_size.width) * 60 / 360 // smooth transition
|
||||
} else {
|
||||
360
|
||||
};
|
||||
|
||||
// Don't exceed half the display size
|
||||
min(height, px_size.height / 2) / scale
|
||||
}),
|
||||
Some((scale, None)) => Some(360 / scale),
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user