Skip to content

Commit

Permalink
add mpv keybinds
Browse files Browse the repository at this point in the history
  • Loading branch information
tsukinaha committed Sep 2, 2024
1 parent 615a5bb commit f14c6e8
Show file tree
Hide file tree
Showing 11 changed files with 117 additions and 50 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/target
/i18n
/.idea
5 changes: 0 additions & 5 deletions .idea/.gitignore

This file was deleted.

8 changes: 0 additions & 8 deletions .idea/modules.xml

This file was deleted.

11 changes: 0 additions & 11 deletions .idea/tsukimi.iml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

21 changes: 8 additions & 13 deletions resources/ui/mpvpage.ui
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,16 @@
<interface>
<template parent="AdwNavigationPage" class="MPVPage">
<property name="title" translatable="yes">Tsukimi</property>
<child>
<object class="GtkEventControllerMotion">
<signal name="motion" handler="on_motion" swapped="yes" />
<signal name="leave" handler="on_leave" swapped="yes" />
<signal name="enter" handler="on_enter" swapped="yes" />
</object>
</child>
<child>
<object class="AdwToolbarView">
<child>
<object class="GtkEventControllerMotion">
<signal name="motion" handler="on_motion" swapped="yes" />
<signal name="leave" handler="on_leave" swapped="yes" />
<signal name="enter" handler="on_enter" swapped="yes" />
</object>
</child>
<child>
<object class="GtkEventControllerKey">
<signal name="key-pressed" handler="key_pressed_cb" swapped="yes"/>
<signal name="key-released" handler="key_released_cb" swapped="yes"/>
</object>
</child>

<property name="content">
<object class="GtkOverlay">
<child>
Expand Down
6 changes: 6 additions & 0 deletions resources/ui/window.ui
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@
<property name="width-request">500</property>
<property name="height-request">300</property>
<property name="icon-name">tsukimi</property>
<child>
<object class="GtkEventControllerKey">
<signal name="key-pressed" handler="key_pressed_cb" swapped="yes"/>
<signal name="key-released" handler="key_released_cb" swapped="yes"/>
</object>
</child>
<child>
<object class="AdwBreakpoint">
<condition>max-width: 800sp</condition>
Expand Down
8 changes: 8 additions & 0 deletions src/ui/mpv/mpvglarea.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,14 @@ impl MPVGLArea {
self.imp().mpv.set_sid(value)
}

pub fn press_key(&self, key: u32, state: gtk::gdk::ModifierType) {
self.imp().mpv.press_key(key, state)
}

pub fn release_key(&self, key: u32, state: gtk::gdk::ModifierType) {
self.imp().mpv.release_key(key, state)
}

pub fn set_speed(&self, value: f64) {
self.imp().mpv.set_speed(value)
}
Expand Down
11 changes: 4 additions & 7 deletions src/ui/mpv/page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -619,15 +619,12 @@ impl MPVPage {
video.pause(!video.paused());
}

#[template_callback]
fn key_pressed_cb(&self, key: u32) -> bool {
println!("key pressed: {}", key);
false
pub fn key_pressed_cb(&self, key: u32, state: gtk::gdk::ModifierType) {
self.imp().video.press_key(key, state)
}

#[template_callback]
fn key_released_cb(&self, key: u32) {
println!("key released: {}", key);
pub fn key_released_cb(&self, key: u32, state: gtk::gdk::ModifierType) {
self.imp().video.release_key(key, state)
}

pub fn set_popover(&self) {
Expand Down
70 changes: 70 additions & 0 deletions src/ui/mpv/tsukimi_mpv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,14 @@ impl TsukimiMPV {
self.set_property("sid", sid.to_string());
}

pub fn press_key(&self, key: u32, state: gtk::gdk::ModifierType) {
self.command("keyup", &[&get_full_keystr(key, state)]);
}

pub fn release_key(&self, key: u32, state: gtk::gdk::ModifierType) {
self.command("keydown", &[&get_full_keystr(key, state)]);
}

pub fn stop(&self) {
self.command("stop", &[]);
}
Expand Down Expand Up @@ -394,3 +402,65 @@ fn node_to_tracks(node: MpvNode) -> MpvTracks {
sub_tracks,
}
}

fn get_full_keystr(key: u32, state: gtk::gdk::ModifierType) -> String {
let modstr = get_modstr(state);
let keystr = keyval_to_keystr(key);
format!("{}{}", modstr, keystr)
}

fn get_modstr(state: gtk::gdk::ModifierType) -> String {
struct ModMap {
mask: gtk::gdk::ModifierType,
str: &'static str,
}

let mod_map = [
ModMap { mask: gtk::gdk::ModifierType::SHIFT_MASK, str: "Shift+" },
ModMap { mask: gtk::gdk::ModifierType::CONTROL_MASK, str: "Ctrl+" },
ModMap { mask: gtk::gdk::ModifierType::ALT_MASK, str: "Alt+" },
ModMap { mask: gtk::gdk::ModifierType::SUPER_MASK, str: "Meta+" },
];

let mut result = String::new();

for mod_item in &mod_map {
if state.contains(mod_item.mask) {
result.push_str(mod_item.str);
}
}

result
}

use gtk::glib::translate::FromGlib;

fn keyval_to_keystr(keyval: u32) -> String {
let key = unsafe { gtk::gdk::Key::from_glib(keyval) };
const KEYSTRING_MAP: &[(&str, &str)] = &[];

let mut key_utf8 = [0u8; 7]; // 6 bytes for utf8 output, 1 for null terminator
let mut result = String::new();

if let Some(unicode_char) = char::from_u32(keyval) {
let utf8_str = unicode_char.encode_utf8(&mut key_utf8);
result = utf8_str.to_string();
}

if result.is_empty() {
if let Some(key_name) = key.name() {
result = key_name.to_string();
}
}

if result.is_empty() {
for &(key, key_str) in KEYSTRING_MAP {
if key_str.eq_ignore_ascii_case(&result) {
result = key.to_string();
break;
}
}
}

result
}
20 changes: 20 additions & 0 deletions src/ui/widgets/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -718,4 +718,24 @@ impl Window {
page.set_tag(Some("Server Panel"));
self.push_page(&page);
}

fn is_on_mpv_stack(&self) -> bool {
self.imp().stack.visible_child_name() == Some("clapper".into())
}

#[template_callback]
fn key_pressed_cb(&self, key: u32, _code: u32, state: gtk::gdk::ModifierType) -> bool {
if self.is_on_mpv_stack() {
self.imp().clappernav.key_pressed_cb(key, state);
return true
}
false
}

#[template_callback]
fn key_released_cb(&self, key: u32, _code: u32, state: gtk::gdk::ModifierType) {
if self.is_on_mpv_stack() {
self.imp().clappernav.key_released_cb(key, state);
}
}
}

0 comments on commit f14c6e8

Please sign in to comment.