Make raw-mouse mode task-based instead of global.

This commit is contained in:
GutPuncher 2023-03-22 22:38:17 -04:00
parent 5ac73893d2
commit c97456cfb2
No known key found for this signature in database
GPG key ID: 38CE0A7B6841D1C7
7 changed files with 156 additions and 28 deletions

View file

@ -586,24 +586,31 @@ U0 MouseHandler()
{ {
Bool button; Bool button;
I64 x; I64 x;
while (TRUE)
while (MouseRawQueueFind(game_task))
{ {
button = mouse_hard.raw_bttns[0]; button = mouse_hard.raw_bttns[0];
x = mouse_hard.raw_data.x; x = mouse_hard.raw_data.x;
if (button || x!=0)
if (button || x != 0)
MouseRawReset; // Mark mouse data as consumed MouseRawReset; // Mark mouse data as consumed
if (button) if (button)
MessagePostWait(game_task,MESSAGE_KEY_DOWN_UP,CH_SPACE,0); MessagePostWait(game_task, MESSAGE_KEY_DOWN_UP, CH_SPACE, 0);
if (x != 0) { if (x != 0)
man_é += (x/mouse_scale)/MICRO_STEPS; man_é += (x / mouse_scale) / MICRO_STEPS;
}
Sleep(10); Sleep(10);
} }
mouse_task = NULL;
} }
U0 CastleFrankenstein() U0 CastleFrankenstein()
{ {
I64 sc; I64 sc;
Bool is_raw = TRUE;
MouseRaw(is_raw);
mouse_task = Spawn(&MouseHandler, NULL, "MouseHandler");
MenuPush( MenuPush(
"File {" "File {"
@ -617,6 +624,9 @@ U0 CastleFrankenstein()
" Left(,,SC_CURSOR_LEFT);" " Left(,,SC_CURSOR_LEFT);"
" Right(,,SC_CURSOR_RIGHT);" " Right(,,SC_CURSOR_RIGHT);"
" Fire(,CH_SPACE);" " Fire(,CH_SPACE);"
" MouseMode(,'m');"
" MouseScaleUp(,'+');"
" MouseScaleDown(,'-');"
"}" "}"
); );
@ -642,18 +652,22 @@ U0 CastleFrankenstein()
break; break;
case 'm': case 'm':
if (!mouse_task) { if (is_raw)
MouseRaw(TRUE); {
mouse_task=Spawn(&MouseHandler,NULL); is_raw = FALSE;
} MouseRaw(is_raw);
else {
Kill(mouse_task); Kill(mouse_task);
mouse_task=NULL; }
MouseRaw(FALSE); else
{
is_raw = TRUE;
MouseRaw(is_raw);
mouse_task = Spawn(&MouseHandler, NULL, "MouseHandler");
} }
break; break;
case '+': case '+':
case '=':
mouse_scale *= 0.9; mouse_scale *= 0.9;
break; break;
@ -706,10 +720,7 @@ fs_done:
RegWrite("ZealOS/CastleFrankenstein", "F64 best_score=%5.4f;\n", best_score); RegWrite("ZealOS/CastleFrankenstein", "F64 best_score=%5.4f;\n", best_score);
} }
MouseRaw(TRUE);
mouse_task=Spawn(&MouseHandler,NULL);
CastleFrankenstein; CastleFrankenstein;
if (mouse_task) Kill(mouse_task);
MouseRaw(FALSE); MouseRaw(FALSE);
& &
   

View file

@ -1,9 +1,19 @@
$WW,1$$FG,5$$TX+CX,"ChangeLog"$$FG$ $WW,1$$FG,5$$TX+CX,"ChangeLog"$$FG$
$IV,1$----03/22/23 22:27:05----$IV,0$
* Raised version number to 2.03.
* Created $LK+PU,"CMouseRawQueue",A="MN:CMouseRawQueue"$ to track tasks in raw-mouse mode, placed in $LK+PU,"CMouseHardStateGlobals mouse_hard.raw_queue",A="FF:::/Kernel/KernelA.HH,*raw_queue"$.
* Created $LK+PU,"MouseRawQueueFind",A="MN:MouseRawQueueFind"$ to check whether a given task is in raw-mouse mode, externed in $LK+PU,"KernelC.HH",A="FF:::/Kernel/KernelC.HH,MouseRawQueueFind("$.
* Created $LK+PU,"MouseRawWatcher",A="MN:MouseRawWatcher"$ and $LK+PU,"MouseRawWatcherInner",A="MN:MouseRawWatcherInner"$ to watch for killed tasks and remove them from raw_queue, spawned in $LK+PU,"KMain",A="FF:::/Kernel/KMain.ZC,&MouseRawWatcher:2"$.
* Added task parameter to $LK+PU,"MouseRaw",A="MN:MouseRaw"$, changed behaviour from a global toggle to a task-based queue of $LK+PU,"CMouseRawQueue",A="MN:CMouseRawQueue"$ entries.
* Changed $LK+PU,"MouseHardHandler",A="MN:MouseHardHandler"$ to use $LK+PU,"MouseRawQueueFind",A="MN:MouseRawQueueFind"$ with $LK+PU,"sys_focus_task",A="MN:sys_focus_task"$ to determine if currently in raw-mode or not, added $LK+PU,"clearing mouse.show, mouse.lb, mouse.rb",A="FF:::/Kernel/SerialDev/Mouse.ZC,mouse.lb = FALSE"$ to fix bug where clicking to refocus a mouse-raw application would register a repeated click on unfocus.
* Added raw_queue init to $LK+PU,"KbdMouseInit",A="FF:::/Kernel/SerialDev/Mouse.ZC,QueueInit(mouse_hard.raw_queue);"$.
* Changed $LK+PU,"CastleFrankenstein MouseHandler",A="FF:::/Demo/Games/CastleFrankenstein.ZC,MouseHandler"$ while loop condition to use $LK+PU,"MouseRawQueueFind",A="MN:MouseRawQueueFind"$ with game_task as parameter, added raw-mouse keybind descriptions to game's $LK+PU,"MenuPush",A="FF:::/Demo/Games/CastleFrankenstein.ZC,MouseMode"$.
$IV,1$----03/17/23 17:44:24----$IV,0$ $IV,1$----03/17/23 17:44:24----$IV,0$
* Rewrote $LK+PU,"MiniGrLib",A="FI:::/Demo/Lectures/MiniGrLib.ZC"$, replaced old VGA-specific code to work with 32-bit framebuffer. * Rewrote $LK+PU,"MiniGrLib",A="FI:::/Demo/Lectures/MiniGrLib.ZC"$, replaced old VGA-specific code to work with 32-bit framebuffer.
$IV,1$----03/14/23 03:23:46----$IV,0$ $IV,1$----03/14/23 03:23:46----$IV,0$
* Created %o Bool $LK+PU,"StrPrint",A="FF:::/Kernel/StrPrint.ZC,'o':"$ format code, updated $LK+PU,"Print.DD",A="FI:::/Doc/Print.DD"$ with new %o code and previously undocumented format codes. * Created %o Bool $LK+PU,"StrPrint",A="FF:::/Kernel/StrPrint.ZC,'o'"$ format code, updated $LK+PU,"Print.DD",A="FI:::/Doc/Print.DD"$ with new %o code and previously undocumented format codes.
$IV,1$----03/13/23 18:06:09----$IV,0$ $IV,1$----03/13/23 18:06:09----$IV,0$
* Raised version number to 2.02. * Raised version number to 2.02.

View file

@ -13,7 +13,7 @@ CTask *sys_winmgr_task,
U8 *rev_bits_table; //Table with U8 bits reversed U8 *rev_bits_table; //Table with U8 bits reversed
CDate local_time_offset; CDate local_time_offset;
F64 *pow10_I64, F64 *pow10_I64,
sys_os_version = 2.02; sys_os_version = 2.03;
CAutoCompleteDictGlobals acd; CAutoCompleteDictGlobals acd;
CAutoCompleteGlobals ac; CAutoCompleteGlobals ac;

View file

@ -211,6 +211,8 @@ U0 KMain()
KbdInit; KbdInit;
"Spawn(&MouseHardDriverInstall);\n\n"; "Spawn(&MouseHardDriverInstall);\n\n";
Spawn(&MouseHardDriverInstall); Spawn(&MouseHardDriverInstall);
"Spawn(&MouseRawWatcher,, \"MouseRawWatcher\");\n";
Spawn(&MouseRawWatcher,, "MouseRawWatcher");
"Load(\"Compiler\");\n"; "Load(\"Compiler\");\n";
Cd("/Compiler"); Cd("/Compiler");

View file

@ -3715,6 +3715,11 @@ public class CKbdStateGlobals
}; };
#help_index "Mouse" #help_index "Mouse"
class CMouseRawQueue:CQueue
{
CTask *task;
};
public class CMouseHardStateGlobals public class CMouseHardStateGlobals
{ {
CD3I64 pos, //Position in pixels CD3I64 pos, //Position in pixels
@ -3726,9 +3731,9 @@ public class CMouseHardStateGlobals
install_attempts, //Private install_attempts, //Private
pkt_size; //Private pkt_size; //Private
CFifoU8 *fifo, *fifo2; //Private CFifoU8 *fifo, *fifo2; //Private
CQueue *raw_queue;
Bool bttns[5], Bool bttns[5],
raw_bttns[5], raw_bttns[5],
raw_mode,
has_wheel, has_wheel,
has_ext_bttns, has_ext_bttns,
enabled, enabled,

View file

@ -503,8 +503,9 @@ extern I64 KbdMessagesQueue();
public extern U0 KbdTypeMatic(U8 delay); public extern U0 KbdTypeMatic(U8 delay);
extern Bool MouseHardDriverInstall(); extern Bool MouseHardDriverInstall();
public extern Bool MouseHardEnable(Bool val=TRUE); public extern Bool MouseHardEnable(Bool val=TRUE);
public extern Bool MouseRaw(Bool val); public extern Bool MouseRaw(Bool val, CTask *task=NULL);
public extern U0 MouseRawReset(Bool val=TRUE); public extern U0 MouseRawReset(Bool val=TRUE);
extern CMouseRawQueue *MouseRawQueueFind(CTask *task);
public extern I64 PressAKey(); public extern I64 PressAKey();
public extern I64 CharScan(); public extern I64 CharScan();
public extern Bool KeyScan(I64 *_ch=NULL, I64 *_scan_code=NULL, Bool echo=FALSE); public extern Bool KeyScan(I64 *_ch=NULL, I64 *_scan_code=NULL, Bool echo=FALSE);

View file

@ -56,12 +56,99 @@ public U0 MouseRawReset()
mouse_hard.raw_bttns[4] = FALSE; mouse_hard.raw_bttns[4] = FALSE;
} }
public Bool MouseRaw(Bool val) CMouseRawQueue *MouseRawQueueFind(CTask *task)
{ // Places mouse in "raw" mode, button presses will not go to windows manager when true {
Bool old_val = mouse_hard.raw_mode; CMouseRawQueue *entry = mouse_hard.raw_queue->next;
mouse_hard.raw_mode = val; while (entry != mouse_hard.raw_queue)
mouse.show = !val; {
if (entry->task == task)
return entry;
entry = entry->next;
}
return NULL;
}
U0 MouseRawWatcherInner(CTask *task, CMouseRawQueue *entry, Bool *_found)
{
CTask *task2;
if (task == entry->task)
*_found = TRUE;
task2 = task->next_child_task;
while (!*_found && task2 != (&task->next_child_task)(U8 *) - offset(CTask.next_sibling_task))
{
MouseRawWatcherInner(task2, entry, _found);
task2 = task2->next_sibling_task;
}
}
U0 MouseRawWatcher()
{
CMouseRawQueue *entry, *next_entry;
I64 i;
CCPU *c;
Bool found;
while (TRUE)
{
entry = mouse_hard.raw_queue->next;
while (entry != mouse_hard.raw_queue)
{
found = FALSE;
next_entry = entry->next;
PUSHFD
CLI
for (i = 0; i < mp_count; i++)
{
c = &cpu_structs[i];
MouseRawWatcherInner(c->executive_task, entry, &found);
}
POPFD
if (!found)
{
QueueRemove(entry);
Free(entry);
}
entry = next_entry;
}
Sleep(1000);
}
}
public Bool MouseRaw(Bool val, CTask *task=NULL)
{ // Places mouse in "raw" mode, button presses will not go to windows manager when true
CMouseRawQueue *entry;
Bool old_val;
if (!task)
task = Fs;
if (val)
{
old_val = TRUE;
if (!MouseRawQueueFind(task))
{
entry = CAlloc(sizeof(CMouseRawQueue));
entry->task = task;
QueueInsertRev(entry, mouse_hard.raw_queue);
old_val = FALSE;
}
}
else
{
old_val = FALSE;
if (entry = MouseRawQueueFind(task))
{
QueueRemove(entry);
Free(entry);
old_val = TRUE;
}
}
return old_val; return old_val;
} }
@ -279,8 +366,14 @@ U0 MouseHardHandler()
{ {
I64 i, dx, dy, dz; I64 i, dx, dy, dz;
U8 mouse_buf[4]; U8 mouse_buf[4];
Bool is_raw_mode;
if (!mouse_hard.raw_mode) if (mouse_hard.raw_queue->next == mouse_hard.raw_queue)
is_raw_mode = FALSE; // queue check branch skips func call stack push/pop, small speedup
else
is_raw_mode = MouseRawQueueFind(sys_focus_task);
if (!is_raw_mode)
MouseHardSetPre; MouseHardSetPre;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
@ -302,7 +395,7 @@ U0 MouseHardHandler()
else else
dz = mouse_buf[3] & 7; dz = mouse_buf[3] & 7;
if (mouse_hard.raw_mode) if (is_raw_mode)
{ {
// buttons / position data need to by consumed by app // buttons / position data need to by consumed by app
// buttons stay down, positions keep accumulating until // buttons stay down, positions keep accumulating until
@ -315,6 +408,9 @@ U0 MouseHardHandler()
mouse_hard.raw_data.x += dx; mouse_hard.raw_data.x += dx;
mouse_hard.raw_data.y += dy; mouse_hard.raw_data.y += dy;
mouse_hard.raw_data.z += dz; mouse_hard.raw_data.z += dz;
mouse.show = FALSE;
mouse.lb = FALSE;
mouse.rb = FALSE;
} }
else else
{ {
@ -326,6 +422,7 @@ U0 MouseHardHandler()
mouse_hard.prescale.x += dx; mouse_hard.prescale.x += dx;
mouse_hard.prescale.y += dy; mouse_hard.prescale.y += dy;
mouse_hard.prescale.z += dz; mouse_hard.prescale.z += dz;
mouse.show = TRUE;
MouseHardSetPost; MouseHardSetPost;
} }
} }
@ -447,5 +544,7 @@ U0 KbdMouseInit()
mouse_hard.prescale.z = 0 / mouse_hard.scale.z; mouse_hard.prescale.z = 0 / mouse_hard.scale.z;
mouse_hard.pos.x = sys_framebuffer_width >> 1; mouse_hard.pos.x = sys_framebuffer_width >> 1;
mouse_hard.pos.y = sys_framebuffer_height >> 1; mouse_hard.pos.y = sys_framebuffer_height >> 1;
mouse_hard.raw_queue = CAlloc(sizeof(CQueue)); // head of CMouseRawQueue queue
QueueInit(mouse_hard.raw_queue);
MemCopy(&mouse_hard_last, &mouse_hard, sizeof(CMouseHardStateGlobals)); MemCopy(&mouse_hard_last, &mouse_hard, sizeof(CMouseHardStateGlobals));
} }