different approach
This commit is contained in:
@@ -351,13 +351,38 @@ impl WindowManager {
|
||||
pub fn handle_message(&mut self, message: WindowManagerMessage) {
|
||||
let mut use_saved_buffer = false;
|
||||
let mut redraw_ids = None;
|
||||
let response: WindowMessageResponse = match message {
|
||||
WindowManagerMessage::KeyChar(key_char) => {
|
||||
let mut response: WindowMessageResponse = WindowMessageResponse::DoNothing;
|
||||
let mut message = message;
|
||||
if let WindowManagerMessage::Touch(x, y) = message {
|
||||
if x < 100 && y < 100 {
|
||||
//toggle onscreen keyboard if top left keyboard clicked
|
||||
if self.osk.is_some() {
|
||||
self.osk = None;
|
||||
} else {
|
||||
let osk = Box::new(OnscreenKeyboard::new());
|
||||
let ideal_dimensions = osk.ideal_dimensions(self.dimensions);
|
||||
self.add_window_like(osk, [175, self.dimensions[1] - TASKBAR_HEIGHT - 250], Some(ideal_dimensions));
|
||||
}
|
||||
response = WindowMessageResponse::JustRedraw
|
||||
} else {
|
||||
//see if in onscreen keyboard, if so send to it after offsetting coords
|
||||
if self.osk.is_some() {
|
||||
let osk = self.osk.as_mut().unwrap();
|
||||
if point_inside([x, y], osk.top_left, osk.dimensions) {
|
||||
let osk_resp = osk.window_like.handle_message(WindowMessage::Touch(x - osk.top_left[0], y - osk.top_left[1]));
|
||||
//change to a WindowManagerMessage::KeyChar
|
||||
if let WindowMessageResponse::Request(WindowManagerRequest::DoKeyChar(kc)) = osk_resp {
|
||||
message = WindowManagerMessage::KeyChar(kc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if let WindowManagerMessage::KeyChar(key_char) = message {
|
||||
//check if is special key (key releases are guaranteed to be special keys)
|
||||
//eg: ctrl, alt, command/windows, shift, or caps lock
|
||||
match key_char {
|
||||
KeyChar::Alt(c) => {
|
||||
let mut press_response = WindowMessageResponse::DoNothing;
|
||||
if !self.locked {
|
||||
//keyboard shortcut
|
||||
let shortcuts = HashMap::from([
|
||||
@@ -408,8 +433,8 @@ impl WindowManager {
|
||||
match shortcut {
|
||||
&ShortcutType::StartMenu => {
|
||||
//send to taskbar
|
||||
press_response = self.toggle_start_menu(false);
|
||||
if press_response != WindowMessageResponse::Request(WindowManagerRequest::CloseStartMenu) {
|
||||
response = self.toggle_start_menu(false);
|
||||
if response != WindowMessageResponse::Request(WindowManagerRequest::CloseStartMenu) {
|
||||
//only thing that needs to be redrawed is the start menu and taskbar
|
||||
let start_menu_id = self.id_count + 1;
|
||||
let taskbar_id = self.window_infos.iter().find(|w| w.window_like.subtype() == WindowLikeType::Taskbar).unwrap().id;
|
||||
@@ -461,7 +486,7 @@ impl WindowManager {
|
||||
}
|
||||
}
|
||||
if changed {
|
||||
press_response = WindowMessageResponse::JustRedraw;
|
||||
response = WindowMessageResponse::JustRedraw;
|
||||
//avoid drawing everything under the moving window, much more efficient
|
||||
use_saved_buffer = true;
|
||||
redraw_ids = Some(vec![self.focused_id]);
|
||||
@@ -482,7 +507,7 @@ impl WindowManager {
|
||||
self.focused_id = self.window_infos[indicator_index].id;
|
||||
self.window_infos[indicator_index].window_like.handle_message(WindowMessage::Shortcut(ShortcutType::SwitchWorkspace(self.current_workspace)));
|
||||
self.taskbar_update_windows();
|
||||
press_response = WindowMessageResponse::JustRedraw;
|
||||
response = WindowMessageResponse::JustRedraw;
|
||||
}
|
||||
},
|
||||
&ShortcutType::MoveWindowToWorkspace(workspace) => {
|
||||
@@ -491,7 +516,7 @@ impl WindowManager {
|
||||
if self.window_infos[focused_index].window_like.subtype() == WindowLikeType::Window {
|
||||
self.window_infos[focused_index].workspace = Workspace::Workspace(workspace);
|
||||
self.taskbar_update_windows();
|
||||
press_response = WindowMessageResponse::JustRedraw;
|
||||
response = WindowMessageResponse::JustRedraw;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -518,7 +543,7 @@ impl WindowManager {
|
||||
//elevate it to the top
|
||||
self.move_index_to_top(new_focus_index);
|
||||
self.taskbar_update_windows();
|
||||
press_response = WindowMessageResponse::JustRedraw;
|
||||
response = WindowMessageResponse::JustRedraw;
|
||||
break;
|
||||
} else if new_focus_index == current_index {
|
||||
break; //did a full loop, found no windows
|
||||
@@ -530,7 +555,7 @@ impl WindowManager {
|
||||
if self.window_infos[focused_index].window_like.subtype() == WindowLikeType::Window {
|
||||
self.window_infos.remove(focused_index);
|
||||
self.taskbar_update_windows();
|
||||
press_response = WindowMessageResponse::JustRedraw;
|
||||
response = WindowMessageResponse::JustRedraw;
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -539,7 +564,7 @@ impl WindowManager {
|
||||
let window_dimensions = &self.window_infos[focused_index].dimensions;
|
||||
self.window_infos[focused_index].top_left = [self.dimensions[0] / 2 - window_dimensions[0] / 2, self.dimensions[1] / 2 - window_dimensions[1] / 2];
|
||||
use_saved_buffer = true;
|
||||
press_response = WindowMessageResponse::JustRedraw;
|
||||
response = WindowMessageResponse::JustRedraw;
|
||||
}
|
||||
},
|
||||
&ShortcutType::FullscreenWindow => {
|
||||
@@ -558,7 +583,7 @@ impl WindowManager {
|
||||
new_dimensions = self.window_infos[focused_index].dimensions;
|
||||
}
|
||||
self.window_infos[focused_index].window_like.handle_message(WindowMessage::ChangeDimensions([new_dimensions[0], new_dimensions[1] - WINDOW_TOP_HEIGHT]));
|
||||
press_response = WindowMessageResponse::JustRedraw;
|
||||
response = WindowMessageResponse::JustRedraw;
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -572,7 +597,7 @@ impl WindowManager {
|
||||
let new_dimensions = [self.dimensions[0] / 2, self.dimensions[1] - INDICATOR_HEIGHT - TASKBAR_HEIGHT];
|
||||
self.window_infos[focused_index].dimensions = new_dimensions;
|
||||
self.window_infos[focused_index].window_like.handle_message(WindowMessage::ChangeDimensions([new_dimensions[0], new_dimensions[1] - WINDOW_TOP_HEIGHT]));
|
||||
press_response = WindowMessageResponse::JustRedraw;
|
||||
response = WindowMessageResponse::JustRedraw;
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -580,7 +605,7 @@ impl WindowManager {
|
||||
if let Some(focused_index) = self.get_focused_index() {
|
||||
let window_like = &self.window_infos[focused_index].window_like;
|
||||
if window_like.subtype() == WindowLikeType::Window {
|
||||
press_response = self.window_infos[focused_index].window_like.handle_message(WindowMessage::Shortcut(ShortcutType::ClipboardCopy));
|
||||
response = self.window_infos[focused_index].window_like.handle_message(WindowMessage::Shortcut(ShortcutType::ClipboardCopy));
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -588,20 +613,18 @@ impl WindowManager {
|
||||
if let Some(focused_index) = self.get_focused_index() {
|
||||
let window_like = &self.window_infos[focused_index].window_like;
|
||||
if window_like.subtype() == WindowLikeType::Window && self.clipboard.is_some() {
|
||||
press_response = self.window_infos[focused_index].window_like.handle_message(WindowMessage::Shortcut(ShortcutType::ClipboardPaste(self.clipboard.clone().unwrap())));
|
||||
response = self.window_infos[focused_index].window_like.handle_message(WindowMessage::Shortcut(ShortcutType::ClipboardPaste(self.clipboard.clone().unwrap())));
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
press_response
|
||||
},
|
||||
KeyChar::Press(c) | KeyChar::Ctrl(c) => {
|
||||
let mut press_response = WindowMessageResponse::DoNothing;
|
||||
//send to focused window
|
||||
if let Some(focused_index) = self.get_focused_index() {
|
||||
press_response = self.window_infos[focused_index].window_like.handle_message(if key_char == KeyChar::Press(c) {
|
||||
response = self.window_infos[focused_index].window_like.handle_message(if key_char == KeyChar::Press(c) {
|
||||
WindowMessage::KeyPress(KeyPress {
|
||||
key: c,
|
||||
})
|
||||
@@ -613,40 +636,13 @@ impl WindowManager {
|
||||
//at most, only the focused window needs to be redrawed
|
||||
redraw_ids = Some(vec![self.window_infos[focused_index].id]);
|
||||
//requests can result in window openings and closings, etc
|
||||
if press_response != WindowMessageResponse::JustRedraw {
|
||||
if response != WindowMessageResponse::JustRedraw {
|
||||
redraw_ids = None;
|
||||
}
|
||||
}
|
||||
press_response
|
||||
},
|
||||
}
|
||||
},
|
||||
WindowManagerMessage::Touch(x, y) => {
|
||||
if x < 100 && y < 100 {
|
||||
//toggle onscreen keyboard if top left keyboard clicked
|
||||
if self.osk.is_some() {
|
||||
self.osk = None;
|
||||
} else {
|
||||
let osk = Box::new(OnscreenKeyboard::new());
|
||||
let ideal_dimensions = osk.ideal_dimensions(self.dimensions);
|
||||
self.add_window_like(osk, [175, self.dimensions[1] - TASKBAR_HEIGHT - 250], Some(ideal_dimensions));
|
||||
}
|
||||
WindowMessageResponse::JustRedraw
|
||||
} else {
|
||||
//see if in onscreen keyboard, if so send to it after offsetting coords
|
||||
if self.osk.is_some() {
|
||||
let osk = self.osk.as_mut().unwrap();
|
||||
if point_inside([x, y], osk.top_left, osk.dimensions) {
|
||||
osk.window_like.handle_message(WindowMessage::Touch(x - osk.top_left[0], y - osk.top_left[1]))
|
||||
} else {
|
||||
WindowMessageResponse::DoNothing
|
||||
}
|
||||
} else {
|
||||
WindowMessageResponse::DoNothing
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
if response != WindowMessageResponse::DoNothing {
|
||||
match response {
|
||||
WindowMessageResponse::Request(request) => self.handle_request(request),
|
||||
@@ -715,9 +711,7 @@ impl WindowManager {
|
||||
WindowManagerRequest::ClipboardCopy(content) => {
|
||||
self.clipboard = Some(content);
|
||||
},
|
||||
WindowManagerRequest::DoKeyChar(kc) => {
|
||||
self.handle_message(WindowManagerMessage::KeyChar(kc));
|
||||
},
|
||||
WindowManagerRequest::DoKeyChar(_) => {},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user