3 Commits

Author SHA1 Message Date
5d2d407659 chore: update CHANGELOG.md 2025-04-18 06:59:55 +00:00
795e889bd0 fix: better keyboard
* Scale the font as necessary
* Fix CHUNITHM order
* Fix num-unlocked numpad
2025-04-18 06:55:59 +00:00
7071f19877 fix: don't switch primary, for real 2025-04-17 18:43:27 +00:00
5 changed files with 90 additions and 20 deletions

View File

@ -1,3 +1,9 @@
## 0.10.1
- Fixed the order of cells in the CHUNITHM keyboard
- Fixed numpad bindings with numlock disabled
- Disabled primary monitor cleanup when "don't switch primary monitor" is enabled
## 0.10.0 ## 0.10.0
- Added a global progress bar - Added a global progress bar

View File

@ -6,14 +6,14 @@ use tauri::{AppHandle, Listener};
#[derive(Clone)] #[derive(Clone)]
pub struct DisplayInfo { pub struct DisplayInfo {
pub primary: String, pub primary: Option<String>,
pub set: Option<DisplaySet>, pub set: Option<DisplaySet>,
} }
impl Default for DisplayInfo { impl Default for DisplayInfo {
fn default() -> Self { fn default() -> Self {
DisplayInfo { DisplayInfo {
primary: "default".to_owned(), primary: None,
set: query_displays().ok(), set: query_displays().ok(),
} }
} }
@ -60,7 +60,7 @@ impl Display {
.ok_or_else(|| anyhow!("Unable to query display settings"))?; .ok_or_else(|| anyhow!("Unable to query display settings"))?;
let res = DisplayInfo { let res = DisplayInfo {
primary: primary.name().to_owned(), primary: if self.dont_switch_primary { None } else { Some(primary.name().to_owned()) },
set: Some(display_set.clone()), set: Some(display_set.clone()),
}; };
@ -132,12 +132,14 @@ impl Display {
let display_set = info.set.as_ref() let display_set = info.set.as_ref()
.ok_or_else(|| anyhow!("Unable to clean up displays: no display set"))?; .ok_or_else(|| anyhow!("Unable to clean up displays: no display set"))?;
if let Some(info_primary) = &info.primary {
let primary = display_set let primary = display_set
.displays() .displays()
.find(|display| display.name() == info.primary) .find(|display| display.name() == info_primary)
.ok_or_else(|| anyhow!("Display {} not found", info.primary))?; .ok_or_else(|| anyhow!("Display {} not found", info_primary))?;
primary.set_primary()?; primary.set_primary()?;
}
display_set.apply()?; display_set.apply()?;
displayz::refresh()?; displayz::refresh()?;

View File

@ -1,7 +1,7 @@
{ {
"$schema": "https://schema.tauri.app/config/2", "$schema": "https://schema.tauri.app/config/2",
"productName": "STARTLINER", "productName": "STARTLINER",
"version": "0.10.0", "version": "0.10.1",
"identifier": "zip.patafour.startliner", "identifier": "zip.patafour.startliner",
"build": { "build": {
"beforeDevCommand": "bun run dev", "beforeDevCommand": "bun run dev",

View File

@ -15,9 +15,51 @@ const handleKey = (
) => { ) => {
event.preventDefault(); event.preventDefault();
const keycode = toKeycode(event.code); let keycode = toKeycode(event.code);
if (keycode !== null && button !== undefined) { if (keycode !== null && button !== undefined) {
const data = prf.current!.data.keyboard!.data as any; const data = prf.current!.data.keyboard!.data as any;
if (event.getModifierState('NumLock') === false) {
switch (event.code) {
case 'NumpadDecimal':
keycode = toKeycode('Delete');
break;
case 'Numpad0':
keycode = toKeycode('Insert');
break;
case 'Numpad1':
keycode = toKeycode('End');
break;
case 'Numpad2':
keycode = toKeycode('ArrowDown');
break;
case 'Numpad3':
keycode = toKeycode('PageDown');
break;
case 'Numpad4':
keycode = toKeycode('ArrowLeft');
break;
case 'Numpad5':
keycode = toKeycode('Clear');
break;
case 'Numpad6':
keycode = toKeycode('ArrowRight');
break;
case 'Numpad7':
keycode = toKeycode('Home');
break;
case 'Numpad8':
keycode = toKeycode('ArrowUp');
break;
case 'Numpad9':
keycode = toKeycode('PageUp');
break;
default:
break;
}
}
if (index !== undefined) { if (index !== undefined) {
data[button][index] = keycode; data[button][index] = keycode;
} else { } else {
@ -75,7 +117,7 @@ const handleMouse = (
} }
}; };
const getKey = (key: keyof OngekiButtons, index?: number) => const getKey = (key: keyof OngekiButtons, index?: number): any =>
computed(() => { computed(() => {
const data = prf.current!.data.keyboard?.data as any; const data = prf.current!.data.keyboard?.data as any;
const keycode = const keycode =
@ -93,6 +135,7 @@ const KEY_MAP: { [key: number]: string } = {
6: 'M5', 6: 'M5',
8: 'Backspace', 8: 'Backspace',
9: 'Tab', 9: 'Tab',
12: 'Clear',
13: 'Enter', 13: 'Enter',
19: 'Pause', 19: 'Pause',
20: 'CapsLock', 20: 'CapsLock',
@ -204,28 +247,45 @@ const toKeycode = (key: string): number | null => {
return res ? parseInt(res) : null; return res ? parseInt(res) : null;
}; };
defineProps({ const props = defineProps({
small: Boolean, small: Boolean,
verySmall: Boolean,
tall: Boolean, tall: Boolean,
tooltip: String, tooltip: String,
button: String, button: String,
color: String, color: String,
index: Number, index: Number,
}); });
const modelValue = computed(() => {
return getKey(props.button as keyof OngekiButtons, props.index).value;
});
const fontSize = computed(() => {
if (!props.small) {
return '1rem';
}
const len = modelValue.value.length;
if (len < 5) {
return '1rem';
}
if (len < 7) {
return '0.75rem';
}
return '0.5rem';
});
</script> </script>
<template> <template>
<InputText <InputText
:style="{ :style="{
width: small ? '3em' : '5em', width: small ? '2.8rem' : '5rem',
height: small ? '3em' : tall ? '10em' : '5em', height: small ? '2.8rem' : tall ? '10rem' : '5rem',
fontSize: small ? '0.9em' : '1em', fontSize,
backgroundColor: color, backgroundColor: color,
}" }"
unstyled unstyled
class="text-center buttoninputtext" class="text-center buttoninputtext"
v-tooltip="tooltip" v-tooltip="tooltip ? `${tooltip}: ${modelValue}` : undefined"
@contextmenu.prevent="() => {}" @contextmenu.prevent="() => {}"
@keydown="(ev: KeyboardEvent) => handleKey(button, ev, index)" @keydown="(ev: KeyboardEvent) => handleKey(button, ev, index)"
@mousedown=" @mousedown="
@ -233,7 +293,7 @@ defineProps({
handleMouse(button as keyof OngekiButtons, ev, index) handleMouse(button as keyof OngekiButtons, ev, index)
" "
@focusout="() => (hasClickedM1Once = false)" @focusout="() => (hasClickedM1Once = false)"
:model-value="getKey(button as keyof OngekiButtons, index) as any" :model-value="modelValue"
/> />
</template> </template>
@ -241,5 +301,7 @@ defineProps({
.buttoninputtext { .buttoninputtext {
border-radius: 6px; border-radius: 6px;
border: 1px solid rgba(200, 200, 200, 0.3); border: 1px solid rgba(200, 200, 200, 0.3);
overflow: scroll !important;
text-align: center !important;
} }
</style> </style>

View File

@ -124,7 +124,7 @@ const prf = usePrfStore();
<div <div
v-for="idx in Array(16) v-for="idx in Array(16)
.fill(0) .fill(0)
.map((_, i) => 16 - i)" .map((_, i) => 32 - 2 * i - 1)"
> >
<KeyboardKey <KeyboardKey
button="cell" button="cell"
@ -142,7 +142,7 @@ const prf = usePrfStore();
<div <div
v-for="idx in Array(16) v-for="idx in Array(16)
.fill(0) .fill(0)
.map((_, i) => 32 - i)" .map((_, i) => 32 - 2 * i)"
> >
<KeyboardKey <KeyboardKey
button="cell" button="cell"