mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-03-31 13:25:09 +01:00
Make raw-mouse mode task-based instead of global.
This commit is contained in:
parent
5ac73893d2
commit
c97456cfb2
7 changed files with 156 additions and 28 deletions
src
Demo/Games
Doc
Kernel
|
@ -586,24 +586,31 @@ U0 MouseHandler()
|
|||
{
|
||||
Bool button;
|
||||
I64 x;
|
||||
while (TRUE)
|
||||
|
||||
while (MouseRawQueueFind(game_task))
|
||||
{
|
||||
button = mouse_hard.raw_bttns[0];
|
||||
x = mouse_hard.raw_data.x;
|
||||
if (button || x!=0)
|
||||
|
||||
if (button || x != 0)
|
||||
MouseRawReset; // Mark mouse data as consumed
|
||||
if (button)
|
||||
MessagePostWait(game_task,MESSAGE_KEY_DOWN_UP,CH_SPACE,0);
|
||||
if (x != 0) {
|
||||
man_é += (x/mouse_scale)/MICRO_STEPS;
|
||||
}
|
||||
MessagePostWait(game_task, MESSAGE_KEY_DOWN_UP, CH_SPACE, 0);
|
||||
if (x != 0)
|
||||
man_é += (x / mouse_scale) / MICRO_STEPS;
|
||||
|
||||
Sleep(10);
|
||||
}
|
||||
}
|
||||
mouse_task = NULL;
|
||||
}
|
||||
|
||||
U0 CastleFrankenstein()
|
||||
{
|
||||
I64 sc;
|
||||
Bool is_raw = TRUE;
|
||||
|
||||
MouseRaw(is_raw);
|
||||
mouse_task = Spawn(&MouseHandler, NULL, "MouseHandler");
|
||||
|
||||
MenuPush(
|
||||
"File {"
|
||||
|
@ -617,6 +624,9 @@ U0 CastleFrankenstein()
|
|||
" Left(,,SC_CURSOR_LEFT);"
|
||||
" Right(,,SC_CURSOR_RIGHT);"
|
||||
" Fire(,CH_SPACE);"
|
||||
" MouseMode(,'m');"
|
||||
" MouseScaleUp(,'+');"
|
||||
" MouseScaleDown(,'-');"
|
||||
"}"
|
||||
);
|
||||
|
||||
|
@ -642,18 +652,22 @@ U0 CastleFrankenstein()
|
|||
break;
|
||||
|
||||
case 'm':
|
||||
if (!mouse_task) {
|
||||
MouseRaw(TRUE);
|
||||
mouse_task=Spawn(&MouseHandler,NULL);
|
||||
}
|
||||
else {
|
||||
if (is_raw)
|
||||
{
|
||||
is_raw = FALSE;
|
||||
MouseRaw(is_raw);
|
||||
Kill(mouse_task);
|
||||
mouse_task=NULL;
|
||||
MouseRaw(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
is_raw = TRUE;
|
||||
MouseRaw(is_raw);
|
||||
mouse_task = Spawn(&MouseHandler, NULL, "MouseHandler");
|
||||
}
|
||||
break;
|
||||
|
||||
case '+':
|
||||
case '=':
|
||||
mouse_scale *= 0.9;
|
||||
break;
|
||||
|
||||
|
@ -706,10 +720,7 @@ fs_done:
|
|||
RegWrite("ZealOS/CastleFrankenstein", "F64 best_score=%5.4f;\n", best_score);
|
||||
}
|
||||
|
||||
MouseRaw(TRUE);
|
||||
mouse_task=Spawn(&MouseHandler,NULL);
|
||||
CastleFrankenstein;
|
||||
if (mouse_task) Kill(mouse_task);
|
||||
MouseRaw(FALSE);
|
||||
&
|
||||
|
||||
|
|
|
@ -1,9 +1,19 @@
|
|||
$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$
|
||||
* 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$
|
||||
* 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$
|
||||
* Raised version number to 2.02.
|
||||
|
|
|
@ -13,7 +13,7 @@ CTask *sys_winmgr_task,
|
|||
U8 *rev_bits_table; //Table with U8 bits reversed
|
||||
CDate local_time_offset;
|
||||
F64 *pow10_I64,
|
||||
sys_os_version = 2.02;
|
||||
sys_os_version = 2.03;
|
||||
|
||||
CAutoCompleteDictGlobals acd;
|
||||
CAutoCompleteGlobals ac;
|
||||
|
|
|
@ -211,6 +211,8 @@ U0 KMain()
|
|||
KbdInit;
|
||||
"Spawn(&MouseHardDriverInstall);\n\n";
|
||||
Spawn(&MouseHardDriverInstall);
|
||||
"Spawn(&MouseRawWatcher,, \"MouseRawWatcher\");\n";
|
||||
Spawn(&MouseRawWatcher,, "MouseRawWatcher");
|
||||
|
||||
"Load(\"Compiler\");\n";
|
||||
Cd("/Compiler");
|
||||
|
|
|
@ -3715,6 +3715,11 @@ public class CKbdStateGlobals
|
|||
};
|
||||
|
||||
#help_index "Mouse"
|
||||
class CMouseRawQueue:CQueue
|
||||
{
|
||||
CTask *task;
|
||||
};
|
||||
|
||||
public class CMouseHardStateGlobals
|
||||
{
|
||||
CD3I64 pos, //Position in pixels
|
||||
|
@ -3726,9 +3731,9 @@ public class CMouseHardStateGlobals
|
|||
install_attempts, //Private
|
||||
pkt_size; //Private
|
||||
CFifoU8 *fifo, *fifo2; //Private
|
||||
CQueue *raw_queue;
|
||||
Bool bttns[5],
|
||||
raw_bttns[5],
|
||||
raw_mode,
|
||||
has_wheel,
|
||||
has_ext_bttns,
|
||||
enabled,
|
||||
|
|
|
@ -503,8 +503,9 @@ extern I64 KbdMessagesQueue();
|
|||
public extern U0 KbdTypeMatic(U8 delay);
|
||||
extern Bool MouseHardDriverInstall();
|
||||
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);
|
||||
extern CMouseRawQueue *MouseRawQueueFind(CTask *task);
|
||||
public extern I64 PressAKey();
|
||||
public extern I64 CharScan();
|
||||
public extern Bool KeyScan(I64 *_ch=NULL, I64 *_scan_code=NULL, Bool echo=FALSE);
|
||||
|
|
|
@ -56,12 +56,99 @@ public U0 MouseRawReset()
|
|||
mouse_hard.raw_bttns[4] = FALSE;
|
||||
}
|
||||
|
||||
public Bool MouseRaw(Bool val)
|
||||
{ // Places mouse in "raw" mode, button presses will not go to windows manager when true
|
||||
Bool old_val = mouse_hard.raw_mode;
|
||||
CMouseRawQueue *MouseRawQueueFind(CTask *task)
|
||||
{
|
||||
CMouseRawQueue *entry = mouse_hard.raw_queue->next;
|
||||
|
||||
mouse_hard.raw_mode = val;
|
||||
mouse.show = !val;
|
||||
while (entry != mouse_hard.raw_queue)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -279,8 +366,14 @@ U0 MouseHardHandler()
|
|||
{
|
||||
I64 i, dx, dy, dz;
|
||||
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;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
|
@ -302,7 +395,7 @@ U0 MouseHardHandler()
|
|||
else
|
||||
dz = mouse_buf[3] & 7;
|
||||
|
||||
if (mouse_hard.raw_mode)
|
||||
if (is_raw_mode)
|
||||
{
|
||||
// buttons / position data need to by consumed by app
|
||||
// buttons stay down, positions keep accumulating until
|
||||
|
@ -315,6 +408,9 @@ U0 MouseHardHandler()
|
|||
mouse_hard.raw_data.x += dx;
|
||||
mouse_hard.raw_data.y += dy;
|
||||
mouse_hard.raw_data.z += dz;
|
||||
mouse.show = FALSE;
|
||||
mouse.lb = FALSE;
|
||||
mouse.rb = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -326,6 +422,7 @@ U0 MouseHardHandler()
|
|||
mouse_hard.prescale.x += dx;
|
||||
mouse_hard.prescale.y += dy;
|
||||
mouse_hard.prescale.z += dz;
|
||||
mouse.show = TRUE;
|
||||
MouseHardSetPost;
|
||||
}
|
||||
}
|
||||
|
@ -447,5 +544,7 @@ U0 KbdMouseInit()
|
|||
mouse_hard.prescale.z = 0 / mouse_hard.scale.z;
|
||||
mouse_hard.pos.x = sys_framebuffer_width >> 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));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue