/** * Reports a fatal error that cannot be handled in Java. * Must be called from a KNI method * */ void handleFatalError(void) { KNI_StartHandles(1); KNI_DeclareHandle(throwableObj); KNI_GetParameterAsObject(1, throwableObj); /* IMPL NOTE: Figure out what throwable class this is and log the error? */ REPORT_CRIT1(LC_CORE, "handleFatalError: uncaught exception in " "isolate %d event processing thread", getCurrentIsolateId()); KNI_EndHandles(); if (getCurrentIsolateId() == midpGetAmsIsolateId()) { /* AMS isolate or SVM mode, terminate VM */ midp_exitVM(-1); } else { MidpEvent event; /* Application isolate, notify the AMS isolate. */ MIDP_EVENT_INITIALIZE(event); event.type = FATAL_ERROR_NOTIFICATION; event.intParam1 = getCurrentIsolateId(); /* Send the shutdown event. */ StoreMIDPEventInVmThread(event, midpGetAmsIsolateId()); } KNI_ReturnVoid(); }
/** Reset the MIDlet proxy list for the next run of the VM. */ void midpMIDletProxyListReset() { #if ENABLE_MULTIPLE_DISPLAYS int sizeInBytes = maxDisplays * sizeof(int); gForegroundDisplayIds = midpMalloc(sizeInBytes); memset(gForegroundDisplayIds, 0, sizeInBytes); #else gForegroundDisplayId = -1; #endif // ENABLE_MULTIPLE_DISPLAYS gForegroundIsolateId = midpGetAmsIsolateId(); }
KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinData_finalize) { #if ENABLE_MULTIPLE_ISOLATES if ((JVM_CurrentIsolateID() == midpGetAmsIsolateId()) && (skinProperties >= 0)) { SNI_DeleteReference(skinProperties); skinProperties = -1; } #endif KNI_ReturnVoid(); }
/** * Get the current isolate id from VM in case of MVM mode. * For SVM, simply return 0 as an isolate ID. * * @return isolated : Isolate ID * */ int getCurrentIsolateId() { int amsIsolateId = midpGetAmsIsolateId(); /* * midpGetAmsIsolateId() returns 0 when VM is not running at all. It * also returns 0 when VM is running but it is in SVM mode. * * When VM is running in MVM mode, midpGetAmsIsolateId() returns * isolateID of an AMS isolate */ #if ENABLE_MULTIPLE_ISOLATES return ((amsIsolateId == 0)? 0:JVM_CurrentIsolateId()); #else return amsIsolateId; #endif /* ENABLE_MULTIPLE_ISOLATES */ }
KNIEXPORT KNI_RETURNTYPE_BOOLEAN KNIDECL(com_sun_midp_chameleon_skins_resources_SkinResourcesImpl_ifLoadAllResources0) { #if ENABLE_MULTIPLE_ISOLATES /* * There is no need to load all images for non AMS * isolates, they are to be loaded later on demand */ if (JVM_CurrentIsolateID() == midpGetAmsIsolateId()) { KNI_ReturnBoolean(KNI_TRUE); } else { KNI_ReturnBoolean(KNI_FALSE); } #else KNI_ReturnBoolean(KNI_FALSE); #endif }
/** * Handles window messages sent to the main window. */ LRESULT CALLBACK winceapp_wndproc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { PAINTSTRUCT ps; HDC hdc; int cmd; DWORD err; static int ignoreCancelMode = 0; switch (msg) { case WM_CREATE: { SHMENUBARINFO mbi; /* Create the menu bar with two simple soft buttons */ ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = hwnd; mbi.nToolBarId = ID_MENU_SIMPLE; mbi.hInstRes = instanceMain; if (SHCreateMenuBar(&mbi) == FALSE) { /* Couldn't create the menu bar. Fail creation of the window. */ return -1; } else { hwndMenuBarSimple = mbi.hwndMB; /* In order to make the Back button work properly, * it's necessary to override it and then call the * appropriate SH API */ SendMessage(mbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TBACK, MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY)); } /* Create the menu bar with a popup menu. This is used if * the current MIDP screen has more than 2 Commands. */ ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = hwnd; mbi.nToolBarId = ID_MENU_POPUP; mbi.hInstRes = instanceMain; if (SHCreateMenuBar(&mbi) == FALSE) { /* Couldn't create the menu bar. Fail creation of the window. */ return -1; } else { hwndMenuBarPopup = mbi.hwndMB; /* Get a handle to the popup menu, which will host the * Commands of the current MIDP screen. */ TBBUTTONINFO tbbi = {0}; tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_LPARAM; if (!SendMessage(hwndMenuBarPopup, TB_GETBUTTONINFO, IDM_SOFTBTN_0, (LPARAM)&tbbi)) { err = GetLastError(); } hmenuPopup = (HMENU)tbbi.lParam; /* In order to make the Back button work properly, * it's necessary to override it and then call the * appropriate SH API */ SendMessage(mbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TBACK, MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY)); } hwndMenuBar = hwndMenuBarSimple; ShowWindow(hwndMenuBarSimple, SW_SHOW); ShowWindow(hwndMenuBarPopup, SW_HIDE); } return 0; case WM_HOTKEY: /* If back key is overriden, back button messages are sent in * a WM_HOTKEY to the menu bar with the id VK_TBACK in the * LPARAM. */ if (HIWORD(lp) == VK_TBACK && (LOWORD(lp) & MOD_KEYUP)) { if (editBoxShown) { SendMessage(hwndTextActive, WM_CHAR, VK_BACK, 0); } else { #if ENABLE_MULTIPLE_ISOLATES if (gForegroundIsolateId == midpGetAmsIsolateId()) { SHNavigateBack(); } else { pMidpEventResult->type = SELECT_FOREGROUND_EVENT; pSignalResult->waitingFor = AMS_SIGNAL; } #else SHNavigateBack(); #endif } } return 1; case WM_SETTINGCHANGE: { updateVisibleDesktop(); updateEditorForRotation(); lastWmSettingChangeTick = GetTickCount(); /* Handle Virtual Keyboard change */ RECT virtualKeyboardRect = {0, 0}; HWND hWndInputPanel = FindWindow(TEXT("SipWndClass"), NULL); if (hWndInputPanel != NULL) { if (IsWindowVisible(hWndInputPanel)) { GetWindowRect(hWndInputPanel, &virtualKeyboardRect); } } virtualKeyboardHeight = virtualKeyboardRect.bottom - virtualKeyboardRect.top; } return DefWindowProc(hwnd, msg, wp, lp); case WM_TIMER: if (wp == EVENT_TIMER_ID+1) { KillTimer(hwndMain, EVENT_TIMER_ID+1); process_skipped_refresh(); } return 0; case WM_COMMAND: switch ((cmd = GET_WM_COMMAND_ID(wp, lp))) { case IDOK: #if ENABLE_MULTIPLE_ISOLATES /* On PocketPC devices that don't have a lot of hardware * buttons, this is a good way for implementing * the 'task switch' event - click on the OK button on * the window title */ if (gForegroundIsolateId == midpGetAmsIsolateId()) { SetForegroundWindow(GetDesktopWindow()); /* SHNavigateBack(); */ } else { pMidpEventResult->type = SELECT_FOREGROUND_EVENT; pSignalResult->waitingFor = AMS_SIGNAL; } #else /* IMPL_NOTE: we ask the user if the current Midlet should be * terminated. */ SendMessage(hwnd, WM_CLOSE, 0, 0); #endif /* for some reason windows has already sent us a CANCELMODE message * before we come to here. Let's re-enable painting. */ if (!midpPaintAllowed) { enablePaint(); } return 0; case IDM_SOFTBTN_0: case IDM_SOFTBTN_1: pMidpEventResult->type = MIDP_KEY_EVENT; pMidpEventResult->CHR = (cmd==IDM_SOFTBTN_0) ? KEYMAP_KEY_SOFT1:KEYMAP_KEY_SOFT2; pMidpEventResult->ACTION = KEYMAP_STATE_RELEASED; pSignalResult->waitingFor = UI_SIGNAL; pMidpEventResult->DISPLAY = gForegroundDisplayId; sendMidpKeyEvent(pMidpEventResult, sizeof(*pMidpEventResult)); /* for some reason windows will send us a CANCELMODE message * afterwards */ ignoreCancelMode ++; return 0; default: /* IMPL_NOTE The events from the menu are not transfer up to * java without displaying and addition menu. * Only a MIDP_COMMAND_EVENT should be used. Disabling this feature for now. */ if (cmd >= ID_DYNAMIC_MENU) { pMidpEventResult->type = MIDP_KEY_EVENT; pMidpEventResult->CHR = ((cmd - ID_DYNAMIC_MENU)==IDM_SOFTBTN_0) ? KEYMAP_KEY_SOFT1:KEYMAP_KEY_SOFT2; pMidpEventResult->ACTION = KEYMAP_STATE_RELEASED; pSignalResult->waitingFor = UI_SIGNAL; pMidpEventResult->DISPLAY = gForegroundDisplayId; sendMidpKeyEvent(pMidpEventResult, sizeof(*pMidpEventResult)); /* This command comes from a menu item dynamically * created in the native method */ /* Disabled SoftButtonLayer.setNativePopupMenu() pMidpEventResult->type = MIDP_COMMAND_EVENT; pMidpEventResult->COMMAND = (cmd - ID_DYNAMIC_MENU); pSignalResult->waitingFor = UI_SIGNAL; pMidpEventResult->DISPLAY = gForegroundDisplayId; sendMidpKeyEvent(pMidpEventResult, sizeof(*pMidpEventResult)); */ /* for some reason windows will send us a CANCELMODE message * afterwards */ ignoreCancelMode ++; return 0; } else { return DefWindowProc(hwnd, msg, wp, lp); } } break; case WM_ACTIVATE: if (LOWORD(wp)) { /* active */ enablePaint(); if (editBoxShown) { SetFocus(hwndTextActive); } } else { /* inactive */ #if ENABLE_MULTIPLE_ISOLATES pMidpEventResult->type = SELECT_FOREGROUND_EVENT; pSignalResult->waitingFor = AMS_SIGNAL; #endif disablePaint(); } return DefWindowProc(hwnd, msg, wp, lp); case WM_EXITMENULOOP: enablePaint(); return DefWindowProc(hwnd, msg, wp, lp); case WM_CANCELMODE: if (!ignoreCancelMode) { disablePaint(); } else { ignoreCancelMode --; } /* We have to do this, or else windows is unhappy. */ return DefWindowProc(hwnd, msg, wp, lp); case WM_PAINT: hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); enablePaint(); if (editBoxShown) { SetFocus(hwndTextActive); } return 0; case WM_CLOSE: return DefWindowProc(hwnd, msg, wp, lp); case WM_DESTROY: PostQuitMessage(0); exit(0); return 0; case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_LBUTTONUP: { lastUserInputTick = GetTickCount(); POINT pen_position ={LOWORD(lp), HIWORD(lp)}; if (msg == WM_MOUSEMOVE) { pMidpEventResult->ACTION = KEYMAP_STATE_DRAGGED; } else if (msg == WM_LBUTTONUP) { pMidpEventResult->ACTION = KEYMAP_STATE_RELEASED; } else { pMidpEventResult->ACTION = KEYMAP_STATE_PRESSED; } pMidpEventResult->type = MIDP_PEN_EVENT; pMidpEventResult->X_POS = pen_position.x; pMidpEventResult->Y_POS = pen_position.y; pSignalResult->waitingFor = UI_SIGNAL; pMidpEventResult->DISPLAY = gForegroundDisplayId; sendMidpKeyEvent(pMidpEventResult, sizeof(*pMidpEventResult)); } return 0; case WM_KEYDOWN: /* fall through */ case WM_KEYUP: return process_key(hwnd, msg, wp, lp); default: return DefWindowProc(hwnd, msg, wp, lp); } return DefWindowProc(hwnd, msg, wp, lp); }