// hit regions void KPR_canvasRenderingContext2D_addHitRegion(xsMachine *the) { FskCanvas2dContext ctx = xsGetHostData(xsThis); const char *id = NULL, *control = NULL; FskConstCanvas2dPath path = NULL; xsVars(1); xsEnterSandbox(); /* Enter sandbox to access the properties of an object */ xsFindString(xsArg(0), xsID("id"), &id); xsFindString(xsArg(0), xsID("control"), &control); if (xsHasOwn(xsArg(0), xsID("path"))) path = xsGetHostData(xsGet(xsArg(0), xsID("path"))); //xsFindString(xsArg(0), xsID("parentID"), &parentID); //xsFindString(xsArg(0), xsID("cursor"), &cursor); //xsFindString(xsArg(0), xsID("fillRule"), &fillRuleStr); //xsFindString(xsArg(0), xsID("label"), &label); //xsFindString(xsArg(0), xsID("role"), &label); xsLeaveSandbox(); (void)FskCanvas2dAddHitRegion(ctx, path, id, control); }
void KPR_serializeURI(xsMachine *the) { KprURLPartsRecord parts; xsStringValue target; FskMemSet(&parts, 0, sizeof(KprURLPartsRecord)); xsEnterSandbox(); if (xsFindString(xsArg(0), xsID_scheme, &parts.scheme)) parts.schemeLength = FskStrLen(parts.scheme); if (xsFindString(xsArg(0), xsID_authority, &parts.authority)) parts.authorityLength = FskStrLen(parts.authority); if (xsFindString(xsArg(0), xsID_path, &parts.path)) parts.pathLength = FskStrLen(parts.path); if (xsFindString(xsArg(0), xsID_query, &parts.query)) parts.queryLength = FskStrLen(parts.query); if (xsFindString(xsArg(0), xsID_fragment, &parts.fragment)) parts.fragmentLength = FskStrLen(parts.fragment); xsLeaveSandbox(); xsThrowIfFskErr(KprURLJoin(&parts, &target)); xsResult = xsString(target); FskMemPtrDispose(target); }
void KPR_system_alert(xsMachine* the) { int argc = xsToInteger(xsArgc); MSGBOXPARAMSW params; xsStringValue string; xsIntegerValue result; xsVars(1); params.cbSize = sizeof(params); params.hwndOwner = NULL; params.hInstance = FskMainGetHInstance(); params.lpszText = NULL; params.lpszCaption = xsStringToWideString("Kinoma Code"); params.dwStyle = MB_ICONSTOP; params.dwContextHelpId = 0; params.lpfnMsgBoxCallback = NULL; params.dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); if ((argc > 0) && xsTest(xsArg(0))) { if (xsFindString(xsArg(0), xsID_type, &string)) { if (!FskStrCompare(string, "about")) params.dwStyle = MB_ICONINFORMATION; else if (!FskStrCompare(string, "stop")) params.dwStyle = MB_ICONSTOP; else if (!FskStrCompare(string, "note")) params.dwStyle = MB_ICONEXCLAMATION; } if (xsFindResult(xsArg(0), xsID_prompt)) { xsVar(0) = xsResult; } if (xsFindResult(xsArg(0), xsID_info)) { xsVar(0) = xsCall1(xsVar(0), xsID("concat"), xsString("\n\n")); xsVar(0) = xsCall1(xsVar(0), xsID("concat"), xsResult); } params.lpszText = xsStringToWideString(xsToString(xsVar(0))); if (xsFindResult(xsArg(0), xsID_buttons)) { if (xsIsInstanceOf(xsResult, xsArrayPrototype)) { xsIntegerValue c = xsToInteger(xsGet(xsResult, xsID_length)); if (c == 3) params.dwStyle |= MB_YESNOCANCEL; else if (c == 2) params.dwStyle |= MB_OKCANCEL; else params.dwStyle |= MB_OK; } } } result = MessageBoxIndirectW(¶ms); if (params.lpszText) CoTaskMemFree((LPVOID *)params.lpszText); if (params.lpszCaption) CoTaskMemFree((LPVOID *)params.lpszCaption); if ((argc > 1) && xsTest(xsArg(1))) (void)xsCallFunction1(xsArg(1), xsNull, ((result == IDYES) || (result == IDOK)) ? xsTrue : (result == IDNO) ? xsFalse : xsUndefined); }
void KPR_shell_execute(xsMachine* the) { xsStringValue application = NULL; xsStringValue command = NULL; xsStringValue directory = NULL; xsStringValue environment = NULL; xsStringValue string; xsIntegerValue length; KprShellExec exec = NULL; STARTUPINFO si; SECURITY_ATTRIBUTES sa; xsVars(5); xsTry { application = getenv("COMSPEC"); if (!application) xsThrowIfFskErr(kFskErrOperationFailed); string = xsToString(xsArg(0)); length = FskStrLen(string) + 1; xsThrowIfFskErr(FskMemPtrNew(3 + length, &command)); memcpy(command, "/c ", 3); memcpy(command + 3, string, length); if (xsFindString(xsArg(1), xsID_directory, &string)) { length = FskStrLen(string) + 1; xsThrowIfFskErr(FskMemPtrNew(length, &directory)); memcpy(directory, string, length); } if (xsFindResult(xsArg(1), xsID_environment)) { xsIntegerValue total = 0, length; xsVar(1) = xsEnumerate(xsResult); for (;;) { xsVar(2) = xsCall0(xsVar(1), xsID("next")); xsVar(3) = xsGet(xsVar(2), xsID("done")); if (xsTest(xsVar(3))) break; xsVar(3) = xsGet(xsVar(2), xsID("value")); xsVar(4) = xsGetAt(xsResult, xsVar(3)); total += FskStrLen(xsToString(xsVar(3))); total++; total += FskStrLen(xsToString(xsVar(4))); total++; } total++; xsThrowIfFskErr(FskMemPtrNew(total, &environment)); total = 0; xsVar(1) = xsEnumerate(xsResult); for (;;) { xsVar(2) = xsCall0(xsVar(1), xsID("next")); xsVar(3) = xsGet(xsVar(2), xsID("done")); if (xsTest(xsVar(3))) break; xsVar(3) = xsGet(xsVar(2), xsID("value")); xsVar(4) = xsGetAt(xsResult, xsVar(3)); string = xsToString(xsVar(3)); length = FskStrLen(string); memcpy(environment + total, string, length); total += length; environment[total++] = '='; string = xsToString(xsVar(4)); length = FskStrLen(string); memcpy(environment + total, string, length); total += length; environment[total++] = 0; } environment[total++] = 0; } xsThrowIfFskErr(FskMemPtrNewClear(sizeof(KprShellExecRecord), &exec)); xsVar(0) = xsNewHostObject(KPR_shell_execute_destructor); exec->the = the; exec->slot = xsVar(0); xsSetHostData(xsVar(0), exec); xsResult = xsNewHostFunction(KPR_shell_execute_cancel, 0); xsNewHostProperty(xsVar(0), xsID_cancel, xsResult, xsDefault, xsDontDelete | xsDontEnum | xsDontSet); if (xsFindResult(xsArg(1), xsID_callback)) { xsNewHostProperty(xsVar(0), xsID_callback, xsResult, xsDefault, xsDontDelete | xsDontEnum | xsDontSet); } else { xsNewHostProperty(xsVar(0), xsID_callback, xsNull, xsDefault, xsDontDelete | xsDontEnum | xsDontSet); } if (xsFindResult(xsArg(1), xsID_stderr)) { xsNewHostProperty(xsVar(0), xsID_stderr, xsResult, xsDefault, xsDontDelete | xsDontEnum | xsDontSet); } else { xsNewHostProperty(xsVar(0), xsID_stderr, xsNull, xsDefault, xsDontDelete | xsDontEnum | xsDontSet); } if (xsFindResult(xsArg(1), xsID_stdout)) { xsNewHostProperty(xsVar(0), xsID_stdout, xsResult, xsDefault, xsDontDelete | xsDontEnum | xsDontSet); } else { xsNewHostProperty(xsVar(0), xsID_stdout, xsNull, xsDefault, xsDontDelete | xsDontEnum | xsDontSet); } sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; if (!CreatePipe(&(exec->hReadPipe), &(exec->hWritePipe), &sa, 0)) xsThrowIfFskErr(kFskErrOperationFailed); if (!SetHandleInformation(exec->hReadPipe, HANDLE_FLAG_INHERIT, 0)) xsThrowIfFskErr(kFskErrOperationFailed); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(STARTUPINFO); si.hStdError = exec->hWritePipe; si.hStdOutput = exec->hWritePipe; si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); si.dwFlags = STARTF_USESTDHANDLES; if (!CreateProcess(application, command, NULL, NULL, TRUE, CREATE_NO_WINDOW, environment, directory, &si, &(exec->pi))) xsThrowIfFskErr(kFskErrOperationFailed); xsRemember(exec->slot); exec->usage++; FskThreadPostCallback(KprHTTPGetThread(), (FskThreadCallback)KPR_shell_execute_async, exec, NULL, NULL, NULL); FskMemPtrDispose(environment); FskMemPtrDispose(directory); FskMemPtrDispose(command); } xsCatch { if (exec) { if (exec->pi.hProcess) CloseHandle(exec->pi.hProcess); if (exec->pi.hThread) CloseHandle(exec->pi.hThread); if (exec->hWritePipe) CloseHandle(exec->hWritePipe); if (exec->hReadPipe) CloseHandle(exec->hReadPipe); FskMemPtrDispose(exec); } FskMemPtrDispose(environment); FskMemPtrDispose(directory); FskMemPtrDispose(command); xsThrow(xsException); } }
void KPR_system_openDirectory(xsMachine* the) { HRESULT hr; xsIntegerValue argc = xsToInteger(xsArgc); IFileOpenDialog *pFileOpen = NULL; IShellItem *pItem = NULL; xsStringValue string; PWSTR wideString = NULL; xsIntegerValue urlLength; xsStringValue url = NULL; hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_IFileOpenDialog, (LPVOID *)&pFileOpen); if (!SUCCEEDED(hr)) goto bail; if ((argc > 0) && xsTest(xsArg(0))) { if (xsFindString(xsArg(0), xsID_prompt, &string)) { wideString = xsStringToWideString(string); hr = pFileOpen->SetTitle(wideString); if (!SUCCEEDED(hr)) goto bail; CoTaskMemFree(wideString); wideString = NULL; } if (xsFindString(xsArg(0), xsID_message, &string)) { wideString = xsStringToWideString(string); hr = pFileOpen->SetTitle(wideString); if (!SUCCEEDED(hr)) goto bail; CoTaskMemFree(wideString); wideString = NULL; } if (xsFindString(xsArg(0), xsID_url, &string)) { wideString = xsStringToWideString(string); hr = SHCreateItemFromParsingName(wideString, NULL, IID_IShellItem, (LPVOID *)&pItem); if (!SUCCEEDED(hr)) goto bail; CoTaskMemFree(wideString); wideString = NULL; hr = pFileOpen->SetFolder(pItem); if (!SUCCEEDED(hr)) goto bail; pItem->Release(); pItem = NULL; } } hr = pFileOpen->SetOptions(FOS_PICKFOLDERS); if (!SUCCEEDED(hr)) goto bail; hr = pFileOpen->Show(GetForegroundWindow()); if (!SUCCEEDED(hr)) goto bail; hr = pFileOpen->GetResult(&pItem); if (!SUCCEEDED(hr)) goto bail; hr = pItem->GetDisplayName(SIGDN_URL, &wideString); if (!SUCCEEDED(hr)) goto bail; urlLength = WideCharToMultiByte(CP_UTF8, 0, wideString, -1, NULL, 0, NULL, NULL); FskMemPtrNew(urlLength + 1, &url); WideCharToMultiByte(CP_UTF8, 0, wideString, -1, url, urlLength, NULL, NULL); url[urlLength - 1] = '/'; url[urlLength] = 0; (void)xsCallFunction1(xsArg(1), xsNull, xsString(url)); bail: FskMemPtrDispose(url); if (wideString) CoTaskMemFree(wideString); if (pItem) pItem->Release(); if (pFileOpen) pFileOpen->Release(); }