Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Enumerations | Functions | Variables
sk_app Namespace Reference

Classes

class  Application
 
class  CommandSet
 
struct  Message
 
struct  SkiaAndroidApp
 
class  Window
 
class  Window_android
 
class  Window_ios
 
class  Window_mac
 
class  Window_unix
 
class  Window_win
 

Enumerations

enum  MessageType {
  kUndefined , kSurfaceCreated , kSurfaceChanged , kSurfaceDestroyed ,
  kDestroyApp , kContentInvalidated , kKeyPressed , kTouched ,
  kUIStateChanged
}
 

Functions

static void config_resource_mgr (JNIEnv *env, jobject assetManager)
 
static const std::unordered_map< int, skui::KeyANDROID_TO_WINDOW_KEYMAP ({ {AKEYCODE_SOFT_LEFT, skui::Key::kLeft }, {AKEYCODE_SOFT_RIGHT, skui::Key::kRight} })
 
static const std::unordered_map< int, skui::InputStateANDROID_TO_WINDOW_STATEMAP ({ {AMOTION_EVENT_ACTION_DOWN, skui::InputState::kDown }, {AMOTION_EVENT_ACTION_POINTER_DOWN, skui::InputState::kDown }, {AMOTION_EVENT_ACTION_UP, skui::InputState::kUp }, {AMOTION_EVENT_ACTION_POINTER_UP, skui::InputState::kUp }, {AMOTION_EVENT_ACTION_MOVE, skui::InputState::kMove }, {AMOTION_EVENT_ACTION_CANCEL, skui::InputState::kUp }, })
 
JNIEXPORT jlong JNICALL Java_org_skia_viewer_ViewerApplication_createNativeApp (JNIEnv *env, jobject application, jobject assetManager)
 
JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerApplication_destroyNativeApp (JNIEnv *env, jobject application, jlong handle)
 
JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onSurfaceCreated (JNIEnv *env, jobject activity, jlong handle, jobject surface)
 
JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onSurfaceChanged (JNIEnv *env, jobject activity, jlong handle, jobject surface)
 
JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onSurfaceDestroyed (JNIEnv *env, jobject activity, jlong handle)
 
JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onKeyPressed (JNIEnv *env, jobject activity, jlong handle, jint keycode)
 
JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onTouched (JNIEnv *env, jobject activity, jlong handle, jint owner, jint state, jfloat x, jfloat y)
 
JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onUIStateChanged (JNIEnv *env, jobject activity, jlong handle, jstring stateName, jstring stateValue)
 
static skui::Key get_key (KeySym keysym)
 
static skui::ModifierKey get_modifiers (const XEvent &event)
 
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 
static skui::Key get_key (WPARAM vk)
 
static skui::ModifierKey get_modifiers (UINT message, WPARAM wParam, LPARAM lParam)
 

Variables

static const int LOOPER_ID_MESSAGEPIPE = 1
 
const long kEventMask
 
static int gWindowX = CW_USEDEFAULT
 
static int gWindowY = 0
 
static int gWindowWidth = CW_USEDEFAULT
 
static int gWindowHeight = 0
 

Enumeration Type Documentation

◆ MessageType

Enumerator
kUndefined 
kSurfaceCreated 
kSurfaceChanged 
kSurfaceDestroyed 
kDestroyApp 
kContentInvalidated 
kKeyPressed 
kTouched 
kUIStateChanged 

Definition at line 22 of file surface_glue_android.h.

Function Documentation

◆ ANDROID_TO_WINDOW_KEYMAP()

static const std::unordered_map< int, skui::Key > sk_app::ANDROID_TO_WINDOW_KEYMAP ( { {AKEYCODE_SOFT_LEFT, skui::Key::kLeft }, {AKEYCODE_SOFT_RIGHT, skui::Key::kRight} }  )
static

◆ ANDROID_TO_WINDOW_STATEMAP()

static const std::unordered_map< int, skui::InputState > sk_app::ANDROID_TO_WINDOW_STATEMAP ( { {AMOTION_EVENT_ACTION_DOWN, skui::InputState::kDown }, {AMOTION_EVENT_ACTION_POINTER_DOWN, skui::InputState::kDown }, {AMOTION_EVENT_ACTION_UP, skui::InputState::kUp }, {AMOTION_EVENT_ACTION_POINTER_UP, skui::InputState::kUp }, {AMOTION_EVENT_ACTION_MOVE, skui::InputState::kMove }, {AMOTION_EVENT_ACTION_CANCEL, skui::InputState::kUp }, }  )
static

◆ config_resource_mgr()

static void sk_app::config_resource_mgr ( JNIEnv *  env,
jobject  assetManager 
)
static

Definition at line 33 of file surface_glue_android.cpp.

33 {
34 static AAssetManager* gAAssetManager = nullptr;
35 SkASSERT(assetManager);
36 gAAssetManager = AAssetManager_fromJava(env, assetManager);
37 SkASSERT(gAAssetManager);
38 gResourceFactory = [](const char* resource) -> sk_sp<SkData> {
39 if (!gAAssetManager) {
40 return nullptr;
41 }
42 SkString path = SkStringPrintf("resources/%s", resource);
43 AAsset* asset = AAssetManager_open(gAAssetManager, path.c_str(), AASSET_MODE_STREAMING);
44 if (!asset) {
45 return nullptr;
46 }
47 size_t size = SkToSizeT(AAsset_getLength(asset));
49 (void)AAsset_read(asset, data->writable_data(), size);
50 AAsset_close(asset);
51 return data;
52 };
53}
sk_sp< SkData >(* gResourceFactory)(const char *)
Definition Resources.cpp:21
#define SkASSERT(cond)
Definition SkAssert.h:116
SK_API SkString static SkString SkStringPrintf()
Definition SkString.h:287
constexpr size_t SkToSizeT(S x)
Definition SkTo.h:31
static sk_sp< SkData > MakeUninitialized(size_t length)
Definition SkData.cpp:116
Definition __init__.py:1
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switches.h:41
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition switches.h:259

◆ get_key() [1/2]

static skui::Key sk_app::get_key ( KeySym  keysym)
static

Definition at line 190 of file Window_unix.cpp.

190 {
191 static const struct {
192 KeySym fXK;
193 skui::Key fKey;
194 } gPair[] = {
195 { XK_BackSpace, skui::Key::kBack },
196 { XK_Clear, skui::Key::kBack },
197 { XK_Return, skui::Key::kOK },
198 { XK_Up, skui::Key::kUp },
199 { XK_Down, skui::Key::kDown },
200 { XK_Left, skui::Key::kLeft },
201 { XK_Right, skui::Key::kRight },
202 { XK_Tab, skui::Key::kTab },
203 { XK_Page_Up, skui::Key::kPageUp },
204 { XK_Page_Down, skui::Key::kPageDown },
205 { XK_Home, skui::Key::kHome },
206 { XK_End, skui::Key::kEnd },
207 { XK_Delete, skui::Key::kDelete },
208 { XK_Escape, skui::Key::kEscape },
209 { XK_Shift_L, skui::Key::kShift },
210 { XK_Shift_R, skui::Key::kShift },
211 { XK_Control_L, skui::Key::kCtrl },
212 { XK_Control_R, skui::Key::kCtrl },
213 { XK_Alt_L, skui::Key::kOption },
214 { XK_Alt_R, skui::Key::kOption },
215 { 'a', skui::Key::kA },
216 { 'c', skui::Key::kC },
217 { 'v', skui::Key::kV },
218 { 'x', skui::Key::kX },
219 { 'y', skui::Key::kY },
220 { 'z', skui::Key::kZ },
221 };
222 for (size_t i = 0; i < std::size(gPair); i++) {
223 if (gPair[i].fXK == keysym) {
224 return gPair[i].fKey;
225 }
226 }
227 return skui::Key::kNONE;
228}
Key
Definition Key.h:6

◆ get_key() [2/2]

static skui::Key sk_app::get_key ( WPARAM  vk)
static

Definition at line 124 of file Window_win.cpp.

124 {
125 static const struct {
126 WPARAM fVK;
127 skui::Key fKey;
128 } gPair[] = {
129 { VK_BACK, skui::Key::kBack },
130 { VK_CLEAR, skui::Key::kBack },
131 { VK_RETURN, skui::Key::kOK },
132 { VK_UP, skui::Key::kUp },
133 { VK_DOWN, skui::Key::kDown },
134 { VK_LEFT, skui::Key::kLeft },
135 { VK_RIGHT, skui::Key::kRight },
136 { VK_TAB, skui::Key::kTab },
137 { VK_PRIOR, skui::Key::kPageUp },
138 { VK_NEXT, skui::Key::kPageDown },
139 { VK_HOME, skui::Key::kHome },
140 { VK_END, skui::Key::kEnd },
141 { VK_DELETE, skui::Key::kDelete },
142 { VK_ESCAPE, skui::Key::kEscape },
143 { VK_SHIFT, skui::Key::kShift },
144 { VK_CONTROL, skui::Key::kCtrl },
145 { VK_MENU, skui::Key::kOption },
146 { 'A', skui::Key::kA },
147 { 'C', skui::Key::kC },
148 { 'V', skui::Key::kV },
149 { 'X', skui::Key::kX },
150 { 'Y', skui::Key::kY },
151 { 'Z', skui::Key::kZ },
152 };
153 for (size_t i = 0; i < std::size(gPair); i++) {
154 if (gPair[i].fVK == vk) {
155 return gPair[i].fKey;
156 }
157 }
158 return skui::Key::kNONE;
159}
UINT_PTR WPARAM

◆ get_modifiers() [1/2]

static skui::ModifierKey sk_app::get_modifiers ( const XEvent &  event)
static

Definition at line 230 of file Window_unix.cpp.

230 {
231 static const struct {
232 unsigned fXMask;
233 skui::ModifierKey fSkMask;
234 } gModifiers[] = {
235 { ShiftMask, skui::ModifierKey::kShift },
236 { ControlMask, skui::ModifierKey::kControl },
237 { Mod1Mask, skui::ModifierKey::kOption },
238 };
239
241 for (size_t i = 0; i < std::size(gModifiers); ++i) {
242 if (event.xkey.state & gModifiers[i].fXMask) {
243 modifiers |= gModifiers[i].fSkMask;
244 }
245 }
246 return modifiers;
247}
FlKeyEvent * event
ModifierKey
Definition ModifierKey.h:9
GdkModifierType state

◆ get_modifiers() [2/2]

static skui::ModifierKey sk_app::get_modifiers ( UINT  message,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 161 of file Window_win.cpp.

161 {
163
164 switch (message) {
165 case WM_UNICHAR:
166 case WM_CHAR:
167 if (0 == (lParam & (1 << 30))) {
169 }
170 if (lParam & (1 << 29)) {
171 modifiers |= skui::ModifierKey::kOption;
172 }
173 break;
174
175 case WM_KEYDOWN:
176 case WM_SYSKEYDOWN:
177 if (0 == (lParam & (1 << 30))) {
179 }
180 if (lParam & (1 << 29)) {
181 modifiers |= skui::ModifierKey::kOption;
182 }
183 break;
184
185 case WM_KEYUP:
186 case WM_SYSKEYUP:
187 if (lParam & (1 << 29)) {
188 modifiers |= skui::ModifierKey::kOption;
189 }
190 break;
191
192 case WM_LBUTTONDOWN:
193 case WM_LBUTTONUP:
194 case WM_MOUSEMOVE:
195 case WM_MOUSEWHEEL:
196 if (wParam & MK_CONTROL) {
197 modifiers |= skui::ModifierKey::kControl;
198 }
199 if (wParam & MK_SHIFT) {
200 modifiers |= skui::ModifierKey::kShift;
201 }
202 break;
203 }
204
205 return modifiers;
206}
Win32Message message

◆ Java_org_skia_viewer_ViewerActivity_onKeyPressed()

JNIEXPORT void JNICALL sk_app::Java_org_skia_viewer_ViewerActivity_onKeyPressed ( JNIEnv *  env,
jobject  activity,
jlong  handle,
jint  keycode 
)

Definition at line 269 of file surface_glue_android.cpp.

272 {
273 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
274 Message message(kKeyPressed);
275 message.fKeycode = keycode;
276 skiaAndroidApp->postMessage(message);
277}

◆ Java_org_skia_viewer_ViewerActivity_onSurfaceChanged()

JNIEXPORT void JNICALL sk_app::Java_org_skia_viewer_ViewerActivity_onSurfaceChanged ( JNIEnv *  env,
jobject  activity,
jlong  handle,
jobject  surface 
)

Definition at line 255 of file surface_glue_android.cpp.

256 {
257 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
258 Message message(kSurfaceChanged);
259 message.fNativeWindow = ANativeWindow_fromSurface(env, surface);
260 skiaAndroidApp->postMessage(message);
261}
VkSurfaceKHR surface
Definition main.cc:49

◆ Java_org_skia_viewer_ViewerActivity_onSurfaceCreated()

JNIEXPORT void JNICALL sk_app::Java_org_skia_viewer_ViewerActivity_onSurfaceCreated ( JNIEnv *  env,
jobject  activity,
jlong  handle,
jobject  surface 
)

Definition at line 247 of file surface_glue_android.cpp.

248 {
249 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
250 Message message(kSurfaceCreated);
251 message.fNativeWindow = ANativeWindow_fromSurface(env, surface);
252 skiaAndroidApp->postMessage(message);
253}

◆ Java_org_skia_viewer_ViewerActivity_onSurfaceDestroyed()

JNIEXPORT void JNICALL sk_app::Java_org_skia_viewer_ViewerActivity_onSurfaceDestroyed ( JNIEnv *  env,
jobject  activity,
jlong  handle 
)

Definition at line 263 of file surface_glue_android.cpp.

264 {
265 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
266 skiaAndroidApp->postMessage(Message(kSurfaceDestroyed));
267}

◆ Java_org_skia_viewer_ViewerActivity_onTouched()

JNIEXPORT void JNICALL sk_app::Java_org_skia_viewer_ViewerActivity_onTouched ( JNIEnv *  env,
jobject  activity,
jlong  handle,
jint  owner,
jint  state,
jfloat  x,
jfloat  y 
)

Definition at line 279 of file surface_glue_android.cpp.

280 {
281 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
282 Message message(kTouched);
283 message.fTouchOwner = owner;
284 message.fTouchState = state;
285 message.fTouchX = x;
286 message.fTouchY = y;
287 skiaAndroidApp->postMessage(message);
288}
AtkStateType state
double y
double x

◆ Java_org_skia_viewer_ViewerActivity_onUIStateChanged()

JNIEXPORT void JNICALL sk_app::Java_org_skia_viewer_ViewerActivity_onUIStateChanged ( JNIEnv *  env,
jobject  activity,
jlong  handle,
jstring  stateName,
jstring  stateValue 
)

Definition at line 290 of file surface_glue_android.cpp.

291 {
292 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
293 Message message(kUIStateChanged);
294 const char* nameChars = env->GetStringUTFChars(stateName, nullptr);
295 const char* valueChars = env->GetStringUTFChars(stateValue, nullptr);
296 message.stateName = new SkString(nameChars);
297 message.stateValue = new SkString(valueChars);
298 skiaAndroidApp->postMessage(message);
299 env->ReleaseStringUTFChars(stateName, nameChars);
300 env->ReleaseStringUTFChars(stateValue, valueChars);
301}

◆ Java_org_skia_viewer_ViewerApplication_createNativeApp()

JNIEXPORT jlong JNICALL sk_app::Java_org_skia_viewer_ViewerApplication_createNativeApp ( JNIEnv *  env,
jobject  application,
jobject  assetManager 
)

Definition at line 233 of file surface_glue_android.cpp.

235 {
236 config_resource_mgr(env, assetManager);
237 SkiaAndroidApp* skiaAndroidApp = new SkiaAndroidApp(env, application);
238 return (jlong)((size_t)skiaAndroidApp);
239}
static void config_resource_mgr(JNIEnv *env, jobject assetManager)

◆ Java_org_skia_viewer_ViewerApplication_destroyNativeApp()

JNIEXPORT void JNICALL sk_app::Java_org_skia_viewer_ViewerApplication_destroyNativeApp ( JNIEnv *  env,
jobject  application,
jlong  handle 
)

Definition at line 241 of file surface_glue_android.cpp.

242 {
243 auto skiaAndroidApp = (SkiaAndroidApp*)handle;
244 skiaAndroidApp->postMessage(Message(kDestroyApp));
245}

◆ WndProc()

LRESULT CALLBACK sk_app::WndProc ( HWND  hWnd,
UINT  message,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 208 of file Window_win.cpp.

209{
210 PAINTSTRUCT ps;
211
212 Window_win* window = (Window_win*) GetWindowLongPtr(hWnd, GWLP_USERDATA);
213
214 bool eventHandled = false;
215
216 switch (message) {
217 case WM_PAINT:
218 BeginPaint(hWnd, &ps);
219 window->onPaint();
220 EndPaint(hWnd, &ps);
221 eventHandled = true;
222 break;
223
224 case WM_CLOSE:
225 PostQuitMessage(0);
226 eventHandled = true;
227 break;
228
229 case WM_ACTIVATE:
230 // disable/enable rendering here, depending on wParam != WA_INACTIVE
231 break;
232
233 case WM_SIZE:
234 window->onResize(LOWORD(lParam), HIWORD(lParam));
235 eventHandled = true;
236 break;
237
238 case WM_UNICHAR:
239 eventHandled = window->onChar((SkUnichar)wParam,
240 get_modifiers(message, wParam, lParam));
241 break;
242
243 case WM_CHAR: {
244 const uint16_t* cPtr = reinterpret_cast<uint16_t*>(&wParam);
245 SkUnichar c = SkUTF::NextUTF16(&cPtr, cPtr + 2);
246 eventHandled = window->onChar(c, get_modifiers(message, wParam, lParam));
247 } break;
248
249 case WM_KEYDOWN:
250 case WM_SYSKEYDOWN:
251 eventHandled = window->onKey(get_key(wParam), skui::InputState::kDown,
252 get_modifiers(message, wParam, lParam));
253 break;
254
255 case WM_KEYUP:
256 case WM_SYSKEYUP:
257 eventHandled = window->onKey(get_key(wParam), skui::InputState::kUp,
258 get_modifiers(message, wParam, lParam));
259 break;
260
261 case WM_LBUTTONDOWN:
262 case WM_LBUTTONUP: {
263 int xPos = GET_X_LPARAM(lParam);
264 int yPos = GET_Y_LPARAM(lParam);
265
266 //if (!gIsFullscreen)
267 //{
268 // RECT rc = { 0, 0, 640, 480 };
269 // AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
270 // xPos -= rc.left;
271 // yPos -= rc.top;
272 //}
273
274 skui::InputState istate = ((wParam & MK_LBUTTON) != 0) ? skui::InputState::kDown
276
277 eventHandled = window->onMouse(xPos, yPos, istate,
278 get_modifiers(message, wParam, lParam));
279 } break;
280
281 case WM_MOUSEMOVE: {
282 int xPos = GET_X_LPARAM(lParam);
283 int yPos = GET_Y_LPARAM(lParam);
284
285 //if (!gIsFullscreen)
286 //{
287 // RECT rc = { 0, 0, 640, 480 };
288 // AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
289 // xPos -= rc.left;
290 // yPos -= rc.top;
291 //}
292
293 eventHandled = window->onMouse(xPos, yPos, skui::InputState::kMove,
294 get_modifiers(message, wParam, lParam));
295 } break;
296
297 case WM_MOUSEWHEEL: {
298 int xPos = GET_X_LPARAM(lParam);
299 int yPos = GET_Y_LPARAM(lParam);
300 eventHandled = window->onMouseWheel(GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f,
301 xPos,
302 yPos,
303 get_modifiers(message, wParam, lParam));
304 } break;
305
306 case WM_TOUCH: {
307 uint16_t numInputs = LOWORD(wParam);
308 std::unique_ptr<TOUCHINPUT[]> inputs(new TOUCHINPUT[numInputs]);
309 if (GetTouchInputInfo((HTOUCHINPUT)lParam, numInputs, inputs.get(),
310 sizeof(TOUCHINPUT))) {
311 POINT topLeft = {0, 0};
312 ClientToScreen(hWnd, &topLeft);
313 for (uint16_t i = 0; i < numInputs; ++i) {
314 TOUCHINPUT ti = inputs[i];
316 if (ti.dwFlags & TOUCHEVENTF_DOWN) {
318 } else if (ti.dwFlags & TOUCHEVENTF_MOVE) {
320 } else if (ti.dwFlags & TOUCHEVENTF_UP) {
322 } else {
323 continue;
324 }
325 // TOUCHINPUT coordinates are in 100ths of pixels
326 // Adjust for that, and make them window relative
327 LONG tx = (ti.x / 100) - topLeft.x;
328 LONG ty = (ti.y / 100) - topLeft.y;
329 eventHandled = window->onTouch(ti.dwID, state, tx, ty) || eventHandled;
330 }
331 }
332 } break;
333
334 default:
335 return DefWindowProc(hWnd, message, wParam, lParam);
336 }
337
338 return eventHandled ? 0 : 1;
339}
int32_t SkUnichar
Definition SkTypes.h:175
static skui::ModifierKey get_modifiers(const NSEvent *event)
static skui::Key get_key(unsigned short vk)
GLFWwindow * window
Definition main.cc:45
SK_SPI SkUnichar NextUTF16(const uint16_t **ptr, const uint16_t *end)
Definition SkUTF.cpp:159
InputState
Definition InputState.h:6
long LONG

Variable Documentation

◆ gWindowHeight

int sk_app::gWindowHeight = 0
static

Definition at line 28 of file Window_win.cpp.

◆ gWindowWidth

int sk_app::gWindowWidth = CW_USEDEFAULT
static

Definition at line 27 of file Window_win.cpp.

◆ gWindowX

int sk_app::gWindowX = CW_USEDEFAULT
static

Definition at line 25 of file Window_win.cpp.

◆ gWindowY

int sk_app::gWindowY = 0
static

Definition at line 26 of file Window_win.cpp.

◆ kEventMask

const long sk_app::kEventMask
Initial value:
= ExposureMask | StructureNotifyMask |
KeyPressMask | KeyReleaseMask |
PointerMotionMask | ButtonPressMask | ButtonReleaseMask

Definition at line 40 of file Window_unix.cpp.

◆ LOOPER_ID_MESSAGEPIPE

const int sk_app::LOOPER_ID_MESSAGEPIPE = 1
static

Definition at line 55 of file surface_glue_android.cpp.