Mercurial > dwindows
comparison android/dw.cpp @ 2571:e34b627b2491
Android: Functional version of the event threading changes... this improves stability...
Since only the draw/expose callbacks are run on the UI thread... we no longer have to
hack the main UI loop which I suspect was causing the instability. Only issue is it
causes issues with the drawing color due to the events happening on different threads.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 20 May 2021 23:33:12 +0000 |
parents | 4427af56eebe |
children | bbe693293be5 |
comparison
equal
deleted
inserted
replaced
2570:2c2941e01b67 | 2571:e34b627b2491 |
---|---|
39 /* Define this to enable threading for events... | 39 /* Define this to enable threading for events... |
40 * most Android events don't handle return values, so | 40 * most Android events don't handle return values, so |
41 * we can launch a new thread to handle the event. | 41 * we can launch a new thread to handle the event. |
42 * #define _DW_EVENT_THREADING | 42 * #define _DW_EVENT_THREADING |
43 */ | 43 */ |
44 #define _DW_EVENT_THREADING | |
44 #define DW_CLASS_NAME "org/dbsoft/dwindows/DWindows" | 45 #define DW_CLASS_NAME "org/dbsoft/dwindows/DWindows" |
45 | 46 |
46 /* Dynamic Windows internal variables */ | 47 /* Dynamic Windows internal variables */ |
47 static char _dw_app_id[_DW_APP_ID_SIZE+1]= {0}; | 48 static char _dw_app_id[_DW_APP_ID_SIZE+1]= {0}; |
48 static char _dw_app_name[_DW_APP_ID_SIZE+1]= {0}; | 49 static char _dw_app_name[_DW_APP_ID_SIZE+1]= {0}; |
253 { 17, DW_SIGNAL_COLUMN_CLICK }, | 254 { 17, DW_SIGNAL_COLUMN_CLICK }, |
254 { 18, DW_SIGNAL_HTML_RESULT }, | 255 { 18, DW_SIGNAL_HTML_RESULT }, |
255 { 19, DW_SIGNAL_HTML_CHANGED } | 256 { 19, DW_SIGNAL_HTML_CHANGED } |
256 }; | 257 }; |
257 | 258 |
259 #define _DW_EVENT_PARAM_SIZE 10 | |
258 | 260 |
259 int _dw_event_handler2(void **params) | 261 int _dw_event_handler2(void **params) |
260 { | 262 { |
261 SignalHandler *handler = (SignalHandler *)params[9]; | 263 SignalHandler *handler = (SignalHandler *)params[9]; |
262 int message = DW_POINTER_TO_INT(params[8]); | 264 int message = DW_POINTER_TO_INT(params[8]); |
265 int retval = -1; | |
263 | 266 |
264 if(handler) | 267 if(handler) |
265 { | 268 { |
266 switch(message) | 269 switch(message) |
267 { | 270 { |
270 { | 273 { |
271 int (*timerfunc)(void *) = (int (* API)(void *))handler->signalfunction; | 274 int (*timerfunc)(void *) = (int (* API)(void *))handler->signalfunction; |
272 | 275 |
273 if(!timerfunc(handler->data)) | 276 if(!timerfunc(handler->data)) |
274 dw_timer_disconnect(handler->id); | 277 dw_timer_disconnect(handler->id); |
275 return 0; | 278 retval = 0; |
279 break; | |
276 } | 280 } |
277 /* Configure/Resize event */ | 281 /* Configure/Resize event */ |
278 case 1: | 282 case 1: |
279 { | 283 { |
280 int (*sizefunc)(HWND, int, int, void *) = (int (* API)(HWND, int, int, void *))handler->signalfunction; | 284 int (*sizefunc)(HWND, int, int, void *) = (int (* API)(HWND, int, int, void *))handler->signalfunction; |
281 int width = DW_POINTER_TO_INT(params[3]); | 285 int width = DW_POINTER_TO_INT(params[3]); |
282 int height = DW_POINTER_TO_INT(params[4]); | 286 int height = DW_POINTER_TO_INT(params[4]); |
283 | 287 |
284 if(width > 0 && height > 0) | 288 if(width > 0 && height > 0) |
285 { | 289 retval = sizefunc(handler->window, width, height, handler->data); |
286 return sizefunc(handler->window, width, height, handler->data); | 290 else |
287 } | 291 retval = 0; |
288 return 0; | 292 break; |
289 } | 293 } |
290 case 2: | 294 case 2: |
291 { | 295 { |
292 int (*keypressfunc)(HWND, char, int, int, void *, char *) = (int (* API)(HWND, char, int, int, void *, char *))handler->signalfunction; | 296 int (*keypressfunc)(HWND, char, int, int, void *, char *) = (int (* API)(HWND, char, int, int, void *, char *))handler->signalfunction; |
293 char *utf8 = (char *)params[1], ch = utf8 ? utf8[0] : '\0'; | 297 char *utf8 = (char *)params[1], ch = utf8 ? utf8[0] : '\0'; |
294 int vk = 0, special = 0; | 298 int vk = 0, special = 0; |
295 | 299 |
296 return keypressfunc(handler->window, ch, (int)vk, special, handler->data, utf8); | 300 retval = keypressfunc(handler->window, ch, (int)vk, special, handler->data, utf8); |
301 break; | |
297 } | 302 } |
298 /* Button press and release event */ | 303 /* Button press and release event */ |
299 case 3: | 304 case 3: |
300 case 4: | 305 case 4: |
301 { | 306 { |
302 int (* API buttonfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction; | 307 int (* API buttonfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction; |
303 int button = 1; | 308 int button = 1; |
304 | 309 |
305 return buttonfunc(handler->window, DW_POINTER_TO_INT(params[3]), DW_POINTER_TO_INT(params[4]), button, handler->data); | 310 retval = buttonfunc(handler->window, DW_POINTER_TO_INT(params[3]), DW_POINTER_TO_INT(params[4]), button, handler->data); |
311 break; | |
306 } | 312 } |
307 /* Motion notify event */ | 313 /* Motion notify event */ |
308 case 5: | 314 case 5: |
309 { | 315 { |
310 int (* API motionfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction; | 316 int (* API motionfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction; |
311 | 317 |
312 return motionfunc(handler->window, DW_POINTER_TO_INT(params[3]), DW_POINTER_TO_INT(params[4]), DW_POINTER_TO_INT(params[5]), handler->data); | 318 retval = motionfunc(handler->window, DW_POINTER_TO_INT(params[3]), DW_POINTER_TO_INT(params[4]), DW_POINTER_TO_INT(params[5]), handler->data); |
319 break; | |
313 } | 320 } |
314 /* Window close event */ | 321 /* Window close event */ |
315 case 6: | 322 case 6: |
316 { | 323 { |
317 int (* API closefunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction; | 324 int (* API closefunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction; |
318 return closefunc(handler->window, handler->data); | 325 retval = closefunc(handler->window, handler->data); |
326 break; | |
319 } | 327 } |
320 /* Window expose/draw event */ | 328 /* Window expose/draw event */ |
321 case 7: | 329 case 7: |
322 { | 330 { |
323 DWExpose exp; | 331 DWExpose exp; |
325 | 333 |
326 exp.x = DW_POINTER_TO_INT(params[3]); | 334 exp.x = DW_POINTER_TO_INT(params[3]); |
327 exp.y = DW_POINTER_TO_INT(params[4]); | 335 exp.y = DW_POINTER_TO_INT(params[4]); |
328 exp.width = DW_POINTER_TO_INT(params[5]); | 336 exp.width = DW_POINTER_TO_INT(params[5]); |
329 exp.height = DW_POINTER_TO_INT(params[6]); | 337 exp.height = DW_POINTER_TO_INT(params[6]); |
330 int result = exposefunc(handler->window, &exp, handler->data); | 338 retval = exposefunc(handler->window, &exp, handler->data); |
331 return result; | 339 /* Return here so we don't free params since we |
340 * are always handling expose/draw on the UI thread. | |
341 */ | |
342 return retval; | |
332 } | 343 } |
333 /* Clicked event for buttons and menu items */ | 344 /* Clicked event for buttons and menu items */ |
334 case 8: | 345 case 8: |
335 { | 346 { |
336 int (* API clickfunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction; | 347 int (* API clickfunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction; |
337 | 348 |
338 return clickfunc(handler->window, handler->data); | 349 retval = clickfunc(handler->window, handler->data); |
350 break; | |
339 } | 351 } |
340 /* Container class selection event */ | 352 /* Container class selection event */ |
341 case 9: | 353 case 9: |
342 { | 354 { |
343 int (*containerselectfunc)(HWND, char *, void *, void *) =(int (* API)(HWND, char *, void *, void *)) handler->signalfunction; | 355 int (*containerselectfunc)(HWND, char *, void *, void *) =(int (* API)(HWND, char *, void *, void *)) handler->signalfunction; |
344 | 356 |
345 return containerselectfunc(handler->window, (char *)params[1], handler->data, params[7]); | 357 retval = containerselectfunc(handler->window, (char *)params[1], handler->data, params[7]); |
358 break; | |
346 } | 359 } |
347 /* Container context menu event */ | 360 /* Container context menu event */ |
348 case 10: | 361 case 10: |
349 { | 362 { |
350 int (* API containercontextfunc)(HWND, char *, int, int, void *, void *) = (int (* API)(HWND, char *, int, int, void *, void *))handler->signalfunction; | 363 int (* API containercontextfunc)(HWND, char *, int, int, void *, void *) = (int (* API)(HWND, char *, int, int, void *, void *))handler->signalfunction; |
351 char *text = (char *)params[1]; | 364 char *text = (char *)params[1]; |
352 void *user = params[7]; | 365 void *user = params[7]; |
353 int x = DW_POINTER_TO_INT(params[3]); | 366 int x = DW_POINTER_TO_INT(params[3]); |
354 int y = DW_POINTER_TO_INT(params[4]); | 367 int y = DW_POINTER_TO_INT(params[4]); |
355 | 368 |
356 return containercontextfunc(handler->window, text, x, y, handler->data, user); | 369 retval = containercontextfunc(handler->window, text, x, y, handler->data, user); |
370 break; | |
357 } | 371 } |
358 /* Generic selection changed event for several classes */ | 372 /* Generic selection changed event for several classes */ |
359 case 11: | 373 case 11: |
360 case 14: | 374 case 14: |
361 { | 375 { |
362 int (* API valuechangedfunc)(HWND, int, void *) = (int (* API)(HWND, int, void *))handler->signalfunction; | 376 int (* API valuechangedfunc)(HWND, int, void *) = (int (* API)(HWND, int, void *))handler->signalfunction; |
363 int selected = DW_POINTER_TO_INT(params[3]); | 377 int selected = DW_POINTER_TO_INT(params[3]); |
364 | 378 |
365 return valuechangedfunc(handler->window, selected, handler->data); | 379 retval = valuechangedfunc(handler->window, selected, handler->data); |
380 break; | |
366 } | 381 } |
367 /* Tree class selection event */ | 382 /* Tree class selection event */ |
368 case 12: | 383 case 12: |
369 { | 384 { |
370 int (* API treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = (int (* API)(HWND, HTREEITEM, char *, void *, void *))handler->signalfunction; | 385 int (* API treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = (int (* API)(HWND, HTREEITEM, char *, void *, void *))handler->signalfunction; |
371 char *text = (char *)params[1]; | 386 char *text = (char *)params[1]; |
372 void *user = params[7]; | 387 void *user = params[7]; |
373 | 388 |
374 return treeselectfunc(handler->window, params[0], text, handler->data, user); | 389 retval = treeselectfunc(handler->window, params[0], text, handler->data, user); |
390 break; | |
375 } | 391 } |
376 /* Set Focus event */ | 392 /* Set Focus event */ |
377 case 13: | 393 case 13: |
378 { | 394 { |
379 int (* API setfocusfunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction; | 395 int (* API setfocusfunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction; |
380 | 396 |
381 return setfocusfunc(handler->window, handler->data); | 397 retval = setfocusfunc(handler->window, handler->data); |
398 break; | |
382 } | 399 } |
383 /* Notebook page change event */ | 400 /* Notebook page change event */ |
384 case 15: | 401 case 15: |
385 { | 402 { |
386 int (* API switchpagefunc)(HWND, unsigned long, void *) = (int (* API)(HWND, unsigned long, void *))handler->signalfunction; | 403 int (* API switchpagefunc)(HWND, unsigned long, void *) = (int (* API)(HWND, unsigned long, void *))handler->signalfunction; |
387 unsigned long pageID = DW_POINTER_TO_INT(params[3]); | 404 unsigned long pageID = DW_POINTER_TO_INT(params[3]); |
388 | 405 |
389 return switchpagefunc(handler->window, pageID, handler->data); | 406 retval = switchpagefunc(handler->window, pageID, handler->data); |
407 break; | |
390 } | 408 } |
391 /* Tree expand event */ | 409 /* Tree expand event */ |
392 case 16: | 410 case 16: |
393 { | 411 { |
394 int (* API treeexpandfunc)(HWND, HTREEITEM, void *) = (int (* API)(HWND, HTREEITEM, void *))handler->signalfunction; | 412 int (* API treeexpandfunc)(HWND, HTREEITEM, void *) = (int (* API)(HWND, HTREEITEM, void *))handler->signalfunction; |
395 | 413 |
396 return treeexpandfunc(handler->window, (HTREEITEM)params[0], handler->data); | 414 retval = treeexpandfunc(handler->window, (HTREEITEM)params[0], handler->data); |
415 break; | |
397 } | 416 } |
398 /* Column click event */ | 417 /* Column click event */ |
399 case 17: | 418 case 17: |
400 { | 419 { |
401 int (* API clickcolumnfunc)(HWND, int, void *) = (int (* API)(HWND, int, void *))handler->signalfunction; | 420 int (* API clickcolumnfunc)(HWND, int, void *) = (int (* API)(HWND, int, void *))handler->signalfunction; |
402 int column_num = DW_POINTER_TO_INT(params[3]); | 421 int column_num = DW_POINTER_TO_INT(params[3]); |
403 | 422 |
404 return clickcolumnfunc(handler->window, column_num, handler->data); | 423 retval = clickcolumnfunc(handler->window, column_num, handler->data); |
424 break; | |
405 } | 425 } |
406 /* HTML result event */ | 426 /* HTML result event */ |
407 case 18: | 427 case 18: |
408 { | 428 { |
409 int (* API htmlresultfunc)(HWND, int, char *, void *, void *) = (int (* API)(HWND, int, char *, void *, void *))handler->signalfunction; | 429 int (* API htmlresultfunc)(HWND, int, char *, void *, void *) = (int (* API)(HWND, int, char *, void *, void *))handler->signalfunction; |
410 char *result = (char *)params[1]; | 430 char *result = (char *)params[1]; |
411 | 431 |
412 return htmlresultfunc(handler->window, result ? DW_ERROR_NONE : DW_ERROR_UNKNOWN, result, params[7], handler->data); | 432 retval = htmlresultfunc(handler->window, result ? DW_ERROR_NONE : DW_ERROR_UNKNOWN, result, params[7], handler->data); |
433 break; | |
413 } | 434 } |
414 /* HTML changed event */ | 435 /* HTML changed event */ |
415 case 19: | 436 case 19: |
416 { | 437 { |
417 int (* API htmlchangedfunc)(HWND, int, char *, void *) = (int (* API)(HWND, int, char *, void *))handler->signalfunction; | 438 int (* API htmlchangedfunc)(HWND, int, char *, void *) = (int (* API)(HWND, int, char *, void *))handler->signalfunction; |
418 char *uri = (char *)params[1]; | 439 char *uri = (char *)params[1]; |
419 | 440 |
420 return htmlchangedfunc(handler->window, DW_POINTER_TO_INT(params[3]), uri, handler->data); | 441 retval = htmlchangedfunc(handler->window, DW_POINTER_TO_INT(params[3]), uri, handler->data); |
442 break; | |
421 } | 443 } |
422 } | 444 } |
423 } | 445 } |
424 return -1; | 446 #ifdef _DW_EVENT_THREADING |
447 /* Free the memory we allocated for this tread */ | |
448 if(params[1]) | |
449 free(params[1]); | |
450 if(params[2]) | |
451 free(params[2]); | |
452 free(params); | |
453 #endif | |
454 return retval; | |
425 } | 455 } |
426 | 456 |
427 int _dw_event_handler(jobject object, void **params) { | 457 int _dw_event_handler(jobject object, void **params) { |
428 SignalHandler *handler = _dw_get_handler(object, DW_POINTER_TO_INT(params[8])); | 458 SignalHandler *handler = _dw_get_handler(object, DW_POINTER_TO_INT(params[8])); |
429 | 459 |
432 params[9] = (void *)handler; | 462 params[9] = (void *)handler; |
433 | 463 |
434 #ifdef _DW_EVENT_THREADING | 464 #ifdef _DW_EVENT_THREADING |
435 /* We can't launch a thread for draw events it won't work */ | 465 /* We can't launch a thread for draw events it won't work */ |
436 if(DW_POINTER_TO_INT(params[8]) != 7) | 466 if(DW_POINTER_TO_INT(params[8]) != 7) |
437 dw_thread_new((void *)_dw_event_handler2, (void *)params, 0); | 467 { |
468 /* Make a copy of the params so it isn't allocated from the stack */ | |
469 void *newparams = calloc(_DW_EVENT_PARAM_SIZE, sizeof(void *)); | |
470 | |
471 memcpy(newparams, params, _DW_EVENT_PARAM_SIZE * sizeof(void *)); | |
472 dw_thread_new((void *) _dw_event_handler2, newparams, 0); | |
473 } | |
438 else | 474 else |
439 #endif | 475 #endif |
440 return _dw_event_handler2(params); | 476 return _dw_event_handler2(params); |
441 | 477 |
442 } | 478 } |
448 */ | 484 */ |
449 JNIEXPORT jint JNICALL | 485 JNIEXPORT jint JNICALL |
450 Java_org_dbsoft_dwindows_DWindows_eventHandler(JNIEnv* env, jobject obj, jobject obj1, jobject obj2, | 486 Java_org_dbsoft_dwindows_DWindows_eventHandler(JNIEnv* env, jobject obj, jobject obj1, jobject obj2, |
451 jint message, jstring str1, jstring str2, | 487 jint message, jstring str1, jstring str2, |
452 jint inta, jint intb, jint intc, jint intd) { | 488 jint inta, jint intb, jint intc, jint intd) { |
489 #ifdef _DW_EVENT_THREADING | |
490 char *utf81 = str1 ? strdup(env->GetStringUTFChars(str1, nullptr)) : nullptr; | |
491 char *utf82 = str2 ? strdup(env->GetStringUTFChars(str2, nullptr)) : nullptr; | |
492 #else | |
453 const char *utf81 = str1 ? env->GetStringUTFChars(str1, nullptr) : nullptr; | 493 const char *utf81 = str1 ? env->GetStringUTFChars(str1, nullptr) : nullptr; |
454 const char *utf82 = str2 ? env->GetStringUTFChars(str2, nullptr) : nullptr; | 494 const char *utf82 = str2 ? env->GetStringUTFChars(str2, nullptr) : nullptr; |
455 void *params[10] = { (void *)obj2, (void *)utf81, (void *)utf82, | 495 #endif |
456 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), | 496 void *params[_DW_EVENT_PARAM_SIZE] = { (void *)obj2, (void *)utf81, (void *)utf82, |
457 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, | 497 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), |
458 DW_INT_TO_POINTER(message), nullptr }; | 498 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, |
499 DW_INT_TO_POINTER(message), nullptr }; | |
459 | 500 |
460 return _dw_event_handler(obj1, params); | 501 return _dw_event_handler(obj1, params); |
461 } | 502 } |
462 | 503 |
463 /* A more simple method for quicker calls */ | 504 /* A more simple method for quicker calls */ |
464 JNIEXPORT void JNICALL | 505 JNIEXPORT void JNICALL |
465 Java_org_dbsoft_dwindows_DWindows_eventHandlerSimple(JNIEnv* env, jobject obj, jobject obj1, jint message) { | 506 Java_org_dbsoft_dwindows_DWindows_eventHandlerSimple(JNIEnv* env, jobject obj, jobject obj1, jint message) { |
466 void *params[10] = { nullptr }; | 507 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr }; |
467 | 508 |
468 params[8] = DW_INT_TO_POINTER(message); | 509 params[8] = DW_INT_TO_POINTER(message); |
469 _dw_event_handler(obj1, params); | 510 _dw_event_handler(obj1, params); |
470 } | 511 } |
471 | 512 |
472 /* Handler for notebook page changes */ | 513 /* Handler for notebook page changes */ |
473 JNIEXPORT void JNICALL | 514 JNIEXPORT void JNICALL |
474 Java_org_dbsoft_dwindows_DWindows_eventHandlerNotebook(JNIEnv* env, jobject obj, jobject obj1, jint message, jlong pageID) { | 515 Java_org_dbsoft_dwindows_DWindows_eventHandlerNotebook(JNIEnv* env, jobject obj, jobject obj1, jint message, jlong pageID) { |
475 void *params[10] = { nullptr }; | 516 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr }; |
476 | 517 |
477 params[8] = DW_INT_TO_POINTER(message); | 518 params[8] = DW_INT_TO_POINTER(message); |
478 _dw_event_handler(obj1, params); | 519 _dw_event_handler(obj1, params); |
479 } | 520 } |
480 | 521 |
481 /* Handlers for HTML events */ | 522 /* Handlers for HTML events */ |
482 JNIEXPORT void JNICALL | 523 JNIEXPORT void JNICALL |
483 Java_org_dbsoft_dwindows_DWindows_eventHandlerHTMLResult(JNIEnv* env, jobject obj, jobject obj1, | 524 Java_org_dbsoft_dwindows_DWindows_eventHandlerHTMLResult(JNIEnv* env, jobject obj, jobject obj1, |
484 jint message, jstring htmlResult, jlong data) { | 525 jint message, jstring htmlResult, jlong data) { |
526 #ifdef _DW_EVENT_THREADING | |
527 char *result = strdup(env->GetStringUTFChars(htmlResult, nullptr)); | |
528 #else | |
485 const char *result = env->GetStringUTFChars(htmlResult, nullptr); | 529 const char *result = env->GetStringUTFChars(htmlResult, nullptr); |
486 void *params[10] = { nullptr, DW_POINTER(result), nullptr, nullptr, nullptr, nullptr, nullptr, | 530 #endif |
487 DW_INT_TO_POINTER(data), DW_INT_TO_POINTER(message), nullptr }; | 531 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, DW_POINTER(result), nullptr, nullptr, nullptr, nullptr, nullptr, |
532 DW_INT_TO_POINTER(data), DW_INT_TO_POINTER(message), nullptr }; | |
488 | 533 |
489 _dw_event_handler(obj1, params); | 534 _dw_event_handler(obj1, params); |
490 } | 535 } |
491 | 536 |
492 JNIEXPORT void JNICALL | 537 JNIEXPORT void JNICALL |
493 Java_org_dbsoft_dwindows_DWWebViewClient_eventHandlerHTMLChanged(JNIEnv* env, jobject obj, jobject obj1, | 538 Java_org_dbsoft_dwindows_DWWebViewClient_eventHandlerHTMLChanged(JNIEnv* env, jobject obj, jobject obj1, |
494 jint message, jstring URI, jint status) { | 539 jint message, jstring URI, jint status) { |
540 #ifdef _DW_EVENT_THREADING | |
541 char *uri = strdup(env->GetStringUTFChars(URI, nullptr)); | |
542 #else | |
495 const char *uri = env->GetStringUTFChars(URI, nullptr); | 543 const char *uri = env->GetStringUTFChars(URI, nullptr); |
496 void *params[10] = { nullptr, DW_POINTER(uri), nullptr, DW_INT_TO_POINTER(status), nullptr, nullptr, | 544 #endif |
497 nullptr, nullptr, DW_INT_TO_POINTER(message), nullptr }; | 545 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, DW_POINTER(uri), nullptr, DW_INT_TO_POINTER(status), |
546 nullptr, nullptr, nullptr, nullptr, DW_INT_TO_POINTER(message), nullptr }; | |
498 | 547 |
499 _dw_event_handler(obj1, params); | 548 _dw_event_handler(obj1, params); |
500 } | 549 } |
501 | 550 |
502 JNIEXPORT void JNICALL | 551 JNIEXPORT void JNICALL |
503 Java_org_dbsoft_dwindows_DWindows_eventHandlerInt(JNIEnv* env, jobject obj, jobject obj1, jint message, | 552 Java_org_dbsoft_dwindows_DWindows_eventHandlerInt(JNIEnv* env, jobject obj, jobject obj1, jint message, |
504 jint inta, jint intb, jint intc, jint intd) { | 553 jint inta, jint intb, jint intc, jint intd) { |
505 void *params[10] = { nullptr, nullptr, nullptr, | 554 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, nullptr, nullptr, |
506 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), | 555 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), |
507 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, | 556 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, |
508 DW_INT_TO_POINTER(message), nullptr }; | 557 DW_INT_TO_POINTER(message), nullptr }; |
509 | 558 |
510 _dw_event_handler(obj1, params); | 559 _dw_event_handler(obj1, params); |
511 } | 560 } |
512 | 561 |
513 JNIEXPORT void JNICALL | 562 JNIEXPORT void JNICALL |
514 Java_org_dbsoft_dwindows_DWComboBox_eventHandlerInt(JNIEnv* env, jobject obj, jint message, | 563 Java_org_dbsoft_dwindows_DWComboBox_eventHandlerInt(JNIEnv* env, jobject obj, jint message, |
515 jint inta, jint intb, jint intc, jint intd) { | 564 jint inta, jint intb, jint intc, jint intd) { |
516 void *params[10] = { nullptr, nullptr, nullptr, | 565 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, nullptr, nullptr, |
517 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), | 566 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), |
518 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, | 567 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, |
519 DW_INT_TO_POINTER(message), nullptr }; | 568 DW_INT_TO_POINTER(message), nullptr }; |
520 | 569 |
521 _dw_event_handler(obj, params); | 570 _dw_event_handler(obj, params); |
522 } | 571 } |
523 | 572 |
524 JNIEXPORT void JNICALL | 573 JNIEXPORT void JNICALL |
525 Java_org_dbsoft_dwindows_DWSpinButton_eventHandlerInt(JNIEnv* env, jobject obj, jint message, | 574 Java_org_dbsoft_dwindows_DWSpinButton_eventHandlerInt(JNIEnv* env, jobject obj, jint message, |
526 jint inta, jint intb, jint intc, jint intd) { | 575 jint inta, jint intb, jint intc, jint intd) { |
527 void *params[10] = { nullptr, nullptr, nullptr, | 576 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, nullptr, nullptr, |
528 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), | 577 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), |
529 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, | 578 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, |
530 DW_INT_TO_POINTER(message), nullptr }; | 579 DW_INT_TO_POINTER(message), nullptr }; |
531 | 580 |
532 _dw_event_handler(obj, params); | 581 _dw_event_handler(obj, params); |
533 } | 582 } |
534 | 583 |
535 JNIEXPORT void JNICALL | 584 JNIEXPORT void JNICALL |
536 Java_org_dbsoft_dwindows_DWListBox_eventHandlerInt(JNIEnv* env, jobject obj, jint message, | 585 Java_org_dbsoft_dwindows_DWListBox_eventHandlerInt(JNIEnv* env, jobject obj, jint message, |
537 jint inta, jint intb, jint intc, jint intd) { | 586 jint inta, jint intb, jint intc, jint intd) { |
538 void *params[10] = { nullptr, nullptr, nullptr, | 587 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, nullptr, nullptr, |
539 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), | 588 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), |
540 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, | 589 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, |
541 DW_INT_TO_POINTER(message), nullptr }; | 590 DW_INT_TO_POINTER(message), nullptr }; |
542 | 591 |
543 _dw_event_handler(obj, params); | 592 _dw_event_handler(obj, params); |
544 } | 593 } |
545 | 594 |
546 JNIEXPORT void JNICALL | 595 JNIEXPORT void JNICALL |
547 Java_org_dbsoft_dwindows_DWRender_eventHandlerInt(JNIEnv* env, jobject obj, jint message, | 596 Java_org_dbsoft_dwindows_DWRender_eventHandlerInt(JNIEnv* env, jobject obj, jint message, |
548 jint inta, jint intb, jint intc, jint intd) { | 597 jint inta, jint intb, jint intc, jint intd) { |
549 void *params[10] = { nullptr, nullptr, nullptr, | 598 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, nullptr, nullptr, |
550 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), | 599 DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb), |
551 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, | 600 DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr, |
552 DW_INT_TO_POINTER(message), nullptr }; | 601 DW_INT_TO_POINTER(message), nullptr }; |
553 | 602 |
554 _dw_event_handler(obj, params); | 603 _dw_event_handler(obj, params); |
555 } | 604 } |
556 | 605 |
557 JNIEXPORT void JNICALL | 606 JNIEXPORT void JNICALL |
558 Java_org_dbsoft_dwindows_DWindows_eventHandlerContainer(JNIEnv* env, jobject obj, jobject obj1, | 607 Java_org_dbsoft_dwindows_DWindows_eventHandlerContainer(JNIEnv* env, jobject obj, jobject obj1, |
559 jint message, jstring jtitle, jint x, jint y, jlong data) { | 608 jint message, jstring jtitle, jint x, jint y, jlong data) { |
609 #ifdef _DW_EVENT_THREADING | |
610 char *title = jtitle ? strdup(env->GetStringUTFChars(jtitle, nullptr)) : nullptr; | |
611 #else | |
560 const char *title = jtitle ? env->GetStringUTFChars(jtitle, nullptr) : nullptr; | 612 const char *title = jtitle ? env->GetStringUTFChars(jtitle, nullptr) : nullptr; |
561 void *params[10] = { nullptr, (void *)title, nullptr, | 613 #endif |
562 DW_INT_TO_POINTER(x), DW_INT_TO_POINTER(y), | 614 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, DW_POINTER(title), nullptr, DW_INT_TO_POINTER(x), DW_INT_TO_POINTER(y), |
563 nullptr, nullptr, (void *)data, DW_INT_TO_POINTER(message), nullptr }; | 615 nullptr, nullptr, (void *)data, DW_INT_TO_POINTER(message), nullptr }; |
564 | 616 |
565 _dw_event_handler(obj1, params); | 617 _dw_event_handler(obj1, params); |
566 } | 618 } |
567 | 619 |
568 /* Handler for Timer events */ | 620 /* Handler for Timer events */ |
575 } | 627 } |
576 | 628 |
577 /* A more simple method for quicker calls */ | 629 /* A more simple method for quicker calls */ |
578 JNIEXPORT void JNICALL | 630 JNIEXPORT void JNICALL |
579 Java_org_dbsoft_dwindows_DWMenu_eventHandlerSimple(JNIEnv* env, jobject obj, jobject obj1, jint message) { | 631 Java_org_dbsoft_dwindows_DWMenu_eventHandlerSimple(JNIEnv* env, jobject obj, jobject obj1, jint message) { |
580 void *params[10] = { nullptr }; | 632 void *params[_DW_EVENT_PARAM_SIZE] = { nullptr }; |
581 | 633 |
582 params[8] = DW_INT_TO_POINTER(message); | 634 params[8] = DW_INT_TO_POINTER(message); |
583 _dw_event_handler(obj1, params); | 635 _dw_event_handler(obj1, params); |
584 } | 636 } |
585 | 637 |