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