add oversampler

This commit is contained in:
2024-05-24 13:28:31 +02:00
parent e4a4a661a0
commit 989dba5a6b
484 changed files with 313937 additions and 0 deletions

View File

@@ -0,0 +1,252 @@
/* Cockos SWELL (Simple/Small Win32 Emulation Layer for Linux/OSX)
Copyright (C) 2006 and later, Cockos, Inc.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#import "swellappmain.h"
#include "swell.h"
#include "swell-internal.h"
HMENU SWELL_app_stocksysmenu; // exposed to app, simply the contents of the default system menu (as defined in the nib)
static bool IsMultiLineEditControl(NSView *cv, id fs)
{
if (fs && [fs isKindOfClass:[NSTextView class]])
{
NSTextView *v = (NSTextView *)fs;
if ([v isEditable])
{
NSView *a=[v superview];
while (a && a != cv)
{
if ([a isKindOfClass:[NSTextField class]]) return false;
a = [a superview];
}
return true;
}
}
return false;
}
@implementation SWELLApplication
- (void)sendEvent:(NSEvent *)anEvent
{
NSEventType etype = [anEvent type];
if (etype == NSKeyUp)
{
// toss keyup if next keydown is the same key
NSEvent *nextDown = [self nextEventMatchingMask:NSKeyDownMask untilDate:[NSDate dateWithTimeIntervalSinceNow:0.003] inMode:NSDefaultRunLoopMode dequeue:FALSE];
if (nextDown && [nextDown keyCode] == [anEvent keyCode]) return;
}
else if (etype == NSKeyDown)
{
NSEvent *nextDown = [self nextEventMatchingMask:NSKeyDownMask untilDate:[NSDate dateWithTimeIntervalSinceNow:0.003] inMode:NSDefaultRunLoopMode dequeue:FALSE];
if (nextDown && [nextDown keyCode] == [anEvent keyCode])
{
#if 0
// no need to check timestamps -- if a queued key is there, just ignore this one(prevent a backlog)
static double sc=0.0;
if (sc == 0.0)
{
struct mach_timebase_info inf={0,};
mach_timebase_info(&inf);
if (inf.numer && inf.denom) sc = inf.numer / (inf.denom * 1000.0 * 1000.0 * 1000.0);
}
if (sc != 0.0 && [anEvent timestamp] < (double) mach_absolute_time() * sc - 0.05)
#endif
return;
}
}
NSWindow *modalWindow = [NSApp modalWindow];
NSWindow *focwnd=[anEvent window];
NSView *dest_view=NULL; // only valid when key message
if (etype==NSKeyDown||etype==NSKeyUp)
{
const UINT msgtype = etype==NSKeyDown ? WM_KEYDOWN : WM_KEYUP;
int flag,code=SWELL_MacKeyToWindowsKey(anEvent,&flag);
if (focwnd)
{
if (flag&(FCONTROL|FALT))
{
NSWindow *f = focwnd;
// handle carbon windows, sending all cmd/alt modified keys to their parent NSView (to be handled later)
// perhaps it'd be good to have a flag on these to see if they want it .. i.e. SWELL_SetCarbonHostView_WantKeyFlgs()..
while (f)
{
if ((dest_view=(NSView *)[f delegate]) && [dest_view respondsToSelector:@selector(swellIsCarbonHostingView)] && [(SWELL_hwndCarbonHost*)dest_view swellIsCarbonHostingView])
{
focwnd = [dest_view window];
break;
}
dest_view=0;
f=[f parentWindow];
}
}
if (!dest_view) // get default dest_view, and validate it as a NSView
{
if ((dest_view=(NSView *)[focwnd firstResponder]) && ![dest_view isKindOfClass:[NSView class]]) dest_view=NULL;
}
}
if (!modalWindow && (!focwnd || dest_view))
{
MSG msg={(HWND)dest_view,msgtype,(WPARAM)code,(LPARAM)flag}; // LPARAM is treated differently (giving modifier flags/FVIRTKEY etc) in sWELL's WM_KEYDOWN than in windows, deal with it
if (SWELLAppMain(SWELLAPP_PROCESSMESSAGE,(INT_PTR)&msg,(INT_PTR)anEvent)>0) return;
}
}
// default window handling:
if (etype == NSKeyDown && focwnd && dest_view)
{
NSView *cv = [focwnd contentView];
if (cv && [cv respondsToSelector:@selector(onSwellMessage:p1:p2:)]) //only work for swell windows
{
int flag,code=SWELL_MacKeyToWindowsKey(anEvent,&flag);
int cmdid=0;
// todo: other keys (such as shift+insert?)
if (((flag&~FVIRTKEY)==FCONTROL && (code=='V'||code=='C' ||code=='X')) && [dest_view isKindOfClass:[NSText class]])
{
if (code=='V') [(NSText *)dest_view paste:(id)cv];
else if (code=='C') [(NSText *)dest_view copy:(id)cv];
else if (code=='X') [(NSText *)dest_view cut:(id)cv];
return;
}
if ((!(flag&~(FVIRTKEY|FSHIFT)) && code == VK_ESCAPE) ||
((flag&~FVIRTKEY)==FCONTROL && code=='W'))
{
if (code == 'W') cmdid= IDCANCEL; // cmd+w always idcancel's
else if (!dest_view || ![dest_view isKindOfClass:[NSTextView class]]) cmdid=IDCANCEL; // not text view, idcancel
else if (!(flag&FSHIFT) && !IsMultiLineEditControl(cv,dest_view)) cmdid=IDCANCEL; // if singleline edit and shift not set, idcancel
if (!cmdid)
{
SetFocus((HWND)cv);
return;
}
}
else if (!(flag&0xff&~FVIRTKEY) && code == VK_RETURN)
{
// get default button command id, if any, if enabled
if (!IsMultiLineEditControl(cv,dest_view))
{
cmdid = SWELL_GetDefaultButtonID((HWND)cv,true);
if (!cmdid) // no action, set focus to parent
{
SetFocus((HWND)cv);
return;
}
}
}
if (cmdid)
{
SendMessage((HWND)cv,WM_COMMAND,cmdid,0);
return;
}
} // is swell CV
} // key down
[super sendEvent:anEvent];
}
@end
@implementation SWELLAppController
- (void)awakeFromNib
{
SWELL_EnsureMultithreadedCocoa();
[NSApp setDelegate:(id) self];
SWELL_POSTMESSAGE_INIT
HMENU stockMenu=(HMENU)[NSApp mainMenu];
if (stockMenu)
{
HMENU nf = GetSubMenu(stockMenu,0);
if (nf) SWELL_app_stocksysmenu = SWELL_DuplicateMenu(nf);
}
SWELLAppMain(SWELLAPP_ONLOAD,0,0);
}
-(IBAction)onSysMenuCommand:(id)sender
{
INT_PTR a = (INT_PTR) [(NSMenuItem *)sender tag];
if (a) SWELLAppMain(SWELLAPP_ONCOMMAND,a,(INT_PTR)sender);
}
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
{
char buf[4096];
buf[0]=0;
SWELL_CFStringToCString(filename,buf,sizeof(buf));
return buf[0] && SWELLAppMain(SWELLAPP_OPENFILE,(INT_PTR)buf,0)>0;
}
- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication
{
return SWELLAppMain(SWELLAPP_NEWFILE,0,0)>0;
}
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
return SWELLAppMain(SWELLAPP_SHOULDOPENNEWFILE,0,0)>0;
}
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
SWELLAppMain(SWELLAPP_LOADED,0,0);
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
return SWELLAppMain(SWELLAPP_SHOULDDESTROY,0,0) > 0 ? NSTerminateLater : NSTerminateNow;
}
- (void)applicationWillTerminate:(NSNotification *)notification
{
SWELLAppMain(SWELLAPP_DESTROY,0,0);
}
- (void)applicationDidBecomeActive:(NSNotification *)aNotification
{
if (!SWELLAppMain(SWELLAPP_ACTIVATE,TRUE,0))
SWELL_BroadcastMessage(WM_ACTIVATEAPP,TRUE,0);
}
- (void)applicationDidResignActive:(NSNotification *)aNotification
{
if (!SWELLAppMain(SWELLAPP_ACTIVATE,FALSE,0))
SWELL_BroadcastMessage(WM_ACTIVATEAPP,FALSE,0);
}
SWELL_APPAPI_DELEGATE_IMPL
SWELL_POSTMESSAGE_DELEGATE_IMPL
@end