comparison os2/dw.c @ 1756:873960d28f01

Override the MLM/EM_CUT/COPY/PASTE messages on OS/2 so they can be Unicode enabled.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 17 Jun 2012 05:06:11 +0000
parents 9f7fc4fca5a6
children 7b049aaca615
comparison
equal deleted inserted replaced
1755:9f7fc4fca5a6 1756:873960d28f01
2358 #define ENTRY_COPY 60902 2358 #define ENTRY_COPY 60902
2359 #define ENTRY_PASTE 60903 2359 #define ENTRY_PASTE 60903
2360 #define ENTRY_UNDO 60904 2360 #define ENTRY_UNDO 60904
2361 #define ENTRY_SALL 60905 2361 #define ENTRY_SALL 60905
2362 2362
2363 /* Internal function to handle Unicode enabled MLE cut, copy and paste */
2364 void _MleCopyPaste(HWND hWnd, int command)
2365 {
2366 /* MLE insertion points (for querying selection) */
2367 IPT ipt1, ipt2;
2368
2369 /* Get the selected text */
2370 ipt1 = (IPT)WinSendMsg(hWnd, MLM_QUERYSEL, MPFROMSHORT(MLFQS_MINSEL), 0);
2371 ipt2 = (IPT)WinSendMsg(hWnd, MLM_QUERYSEL, MPFROMSHORT(MLFQS_MAXSEL), 0);
2372
2373 /* Get the selection and put on clipboard for copy and cut */
2374 if(command != ENTRY_PASTE)
2375 {
2376 char *text = (char *)malloc((ULONG)WinSendMsg(hWnd, MLM_QUERYFORMATTEXTLENGTH, MPFROMLONG(ipt1), MPFROMLONG(ipt2 - ipt1)) + 1);
2377 ULONG ulCopied = (ULONG)WinSendMsg(hWnd, MLM_QUERYSELTEXT, MPFROMP(text), 0);
2378
2379 dw_clipboard_set_text(text, ulCopied);
2380 free(text);
2381 }
2382 /* Clear selection for cut and paste */
2383 if(command != ENTRY_COPY)
2384 WinSendMsg(hWnd, MLM_CLEAR, 0, 0);
2385 if(command == ENTRY_PASTE)
2386 {
2387 char *text = dw_clipboard_get_text();
2388
2389 if(text)
2390 {
2391 WinSendMsg(hWnd, MLM_INSERT, MPFROMP(text), 0);
2392 dw_free(text);
2393 }
2394 }
2395 }
2396
2397 /* Internal function to handle Unicode enabled Entryfield cut, copy and paste */
2398 void _EntryCopyPaste(HWND handle, int command)
2399 {
2400 /* Get the selected text */
2401 char *text = dw_window_get_text(handle);
2402 ULONG sel = (ULONG)WinSendMsg(handle, EM_QUERYSEL, 0, 0);
2403 SHORT pos1 = SHORT1FROMMP(sel), pos2 = SHORT2FROMMP(sel);
2404
2405 /* Get the selection and put on clipboard for copy and cut */
2406 if(text)
2407 {
2408 if(command != ENTRY_PASTE)
2409 {
2410 if(pos2 > pos1)
2411 {
2412 text[pos2] = 0;
2413
2414 dw_clipboard_set_text(&text[pos1], pos2 - pos1);
2415 }
2416 }
2417 free(text);
2418 }
2419 /* Clear selection for cut and paste */
2420 if(command != ENTRY_COPY)
2421 WinSendMsg(handle, EM_CLEAR, 0, 0);
2422 text = dw_window_get_text(handle);
2423 if(command == ENTRY_PASTE)
2424 {
2425 char *pastetext = dw_clipboard_get_text();
2426
2427 if(pastetext)
2428 {
2429 _combine_text(handle, pos1, text, pastetext);
2430 /* Free temporary memory */
2431 dw_free(pastetext);
2432 }
2433 }
2434 if(text)
2435 free(text);
2436 }
2437
2363 /* Originally just intended for entryfields, it now serves as a generic 2438 /* Originally just intended for entryfields, it now serves as a generic
2364 * procedure for handling TAB presses to change input focus on controls. 2439 * procedure for handling TAB presses to change input focus on controls.
2365 */ 2440 */
2366 MRESULT EXPENTRY _entryproc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) 2441 MRESULT EXPENTRY _entryproc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2367 { 2442 {
2383 strncmp(tmpbuf, "#10", 4)==0 || /* MLE */ 2458 strncmp(tmpbuf, "#10", 4)==0 || /* MLE */
2384 strncmp(tmpbuf, "#32", 4)==0) /* Spinbutton */ 2459 strncmp(tmpbuf, "#32", 4)==0) /* Spinbutton */
2385 { 2460 {
2386 switch(msg) 2461 switch(msg)
2387 { 2462 {
2463 #ifdef UNICODE
2464 case MLM_PASTE:
2465 _MleCopyPaste(hWnd, ENTRY_PASTE);
2466 return (MRESULT)TRUE;
2467 case MLM_CUT:
2468 _MleCopyPaste(hWnd, ENTRY_CUT);
2469 return (MRESULT)TRUE;
2470 case MLM_COPY:
2471 _MleCopyPaste(hWnd, ENTRY_COPY);
2472 return (MRESULT)TRUE;
2473 case EM_PASTE:
2474 _EntryCopyPaste(hWnd, ENTRY_PASTE);
2475 return (MRESULT)TRUE;
2476 case EM_CUT:
2477 _EntryCopyPaste(hWnd, ENTRY_CUT);
2478 return (MRESULT)TRUE;
2479 case EM_COPY:
2480 _EntryCopyPaste(hWnd, ENTRY_COPY);
2481 return (MRESULT)TRUE;
2482 #endif
2388 case WM_CONTEXTMENU: 2483 case WM_CONTEXTMENU:
2389 { 2484 {
2390 HMENUI hwndMenu = dw_menu_new(0L); 2485 HMENUI hwndMenu = dw_menu_new(0L);
2391 long x, y; 2486 long x, y;
2392 2487
2416 /* MLE */ 2511 /* MLE */
2417 if(strncmp(tmpbuf, "#10", 4)==0) 2512 if(strncmp(tmpbuf, "#10", 4)==0)
2418 { 2513 {
2419 switch(command) 2514 switch(command)
2420 { 2515 {
2421 #ifdef UNICODE
2422 case ENTRY_CUT:
2423 case ENTRY_COPY:
2424 case ENTRY_PASTE:
2425 {
2426 /* MLE insertion points (for querying selection) */
2427 IPT ipt1, ipt2;
2428
2429 /* Get the selected text */
2430 ipt1 = (IPT)WinSendMsg(hWnd, MLM_QUERYSEL, MPFROMSHORT(MLFQS_MINSEL), 0);
2431 ipt2 = (IPT)WinSendMsg(hWnd, MLM_QUERYSEL, MPFROMSHORT(MLFQS_MAXSEL), 0);
2432
2433 /* Get the selection and put on clipboard for copy and cut */
2434 if(command != ENTRY_PASTE)
2435 {
2436 char *text = (char *)malloc((ULONG)WinSendMsg(hWnd, MLM_QUERYFORMATTEXTLENGTH, MPFROMLONG(ipt1), MPFROMLONG(ipt2 - ipt1)) + 1);
2437 ULONG ulCopied = (ULONG)WinSendMsg(hWnd, MLM_QUERYSELTEXT, MPFROMP(text), 0);
2438
2439 dw_clipboard_set_text(text, ulCopied);
2440 free(text);
2441 }
2442 /* Clear selection for cut and paste */
2443 if(command != ENTRY_COPY)
2444 WinSendMsg(hWnd, MLM_CLEAR, 0, 0);
2445 if(command == ENTRY_PASTE)
2446 {
2447 char *text = dw_clipboard_get_text();
2448
2449 if(text)
2450 {
2451 WinSendMsg(hWnd, MLM_INSERT, MPFROMP(text), 0);
2452 dw_free(text);
2453 }
2454 }
2455 }
2456 return (MRESULT)0;
2457 #else
2458 case ENTRY_CUT: 2516 case ENTRY_CUT:
2459 return WinSendMsg(hWnd, MLM_CUT, 0, 0); 2517 return WinSendMsg(hWnd, MLM_CUT, 0, 0);
2460 case ENTRY_COPY: 2518 case ENTRY_COPY:
2461 return WinSendMsg(hWnd, MLM_COPY, 0, 0); 2519 return WinSendMsg(hWnd, MLM_COPY, 0, 0);
2462 case ENTRY_PASTE: 2520 case ENTRY_PASTE:
2463 return WinSendMsg(hWnd, MLM_PASTE, 0, 0); 2521 return WinSendMsg(hWnd, MLM_PASTE, 0, 0);
2464 #endif
2465 case ENTRY_UNDO: 2522 case ENTRY_UNDO:
2466 return WinSendMsg(hWnd, MLM_UNDO, 0, 0); 2523 return WinSendMsg(hWnd, MLM_UNDO, 0, 0);
2467 case ENTRY_SALL: 2524 case ENTRY_SALL:
2468 { 2525 {
2469 ULONG len = (ULONG)WinSendMsg(hWnd, MLM_QUERYTEXTLENGTH, 0, 0); 2526 ULONG len = (ULONG)WinSendMsg(hWnd, MLM_QUERYTEXTLENGTH, 0, 0);
2481 2538
2482 if(handle) 2539 if(handle)
2483 { 2540 {
2484 switch(command) 2541 switch(command)
2485 { 2542 {
2486 #ifdef UNICODE
2487 case ENTRY_CUT:
2488 case ENTRY_COPY:
2489 case ENTRY_PASTE:
2490 {
2491 /* Get the selected text */
2492 char *text = dw_window_get_text(handle);
2493 ULONG sel = (ULONG)WinSendMsg(handle, EM_QUERYSEL, 0, 0);
2494 SHORT pos1 = SHORT1FROMMP(sel), pos2 = SHORT2FROMMP(sel);
2495
2496 /* Get the selection and put on clipboard for copy and cut */
2497 if(text)
2498 {
2499 if(command != ENTRY_PASTE)
2500 {
2501 if(pos2 > pos1)
2502 {
2503 text[pos2] = 0;
2504
2505 dw_clipboard_set_text(&text[pos1], pos2 - pos1);
2506 }
2507 }
2508 free(text);
2509 }
2510 /* Clear selection for cut and paste */
2511 if(command != ENTRY_COPY)
2512 WinSendMsg(handle, EM_CLEAR, 0, 0);
2513 text = dw_window_get_text(handle);
2514 if(command == ENTRY_PASTE)
2515 {
2516 char *pastetext = dw_clipboard_get_text();
2517
2518 if(pastetext)
2519 {
2520 _combine_text(handle, pos1, text, pastetext);
2521 /* Free temporary memory */
2522 dw_free(pastetext);
2523 }
2524 }
2525 if(text)
2526 free(text);
2527 }
2528 return (MRESULT)0;
2529 #else
2530 case ENTRY_CUT: 2543 case ENTRY_CUT:
2531 return WinSendMsg(handle, EM_CUT, 0, 0); 2544 return WinSendMsg(handle, EM_CUT, 0, 0);
2532 case ENTRY_COPY: 2545 case ENTRY_COPY:
2533 return WinSendMsg(handle, EM_COPY, 0, 0); 2546 return WinSendMsg(handle, EM_COPY, 0, 0);
2534 case ENTRY_PASTE: 2547 case ENTRY_PASTE:
2535 return WinSendMsg(handle, EM_PASTE, 0, 0); 2548 return WinSendMsg(handle, EM_PASTE, 0, 0);
2536 #endif
2537 case ENTRY_SALL: 2549 case ENTRY_SALL:
2538 { 2550 {
2539 LONG len = WinQueryWindowTextLength(hWnd); 2551 LONG len = WinQueryWindowTextLength(hWnd);
2540 return WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT(0, (SHORT)len), 0); 2552 return WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT(0, (SHORT)len), 0);
2541 } 2553 }
2625 } 2637 }
2626 } 2638 }
2627 } 2639 }
2628 free(utf8); 2640 free(utf8);
2629 } 2641 }
2642 return (MRESULT)TRUE;
2630 } 2643 }
2631 #endif 2644 #endif
2632 break; 2645 break;
2633 case WM_SIZE: 2646 case WM_SIZE:
2634 { 2647 {
2669 if(_wndproc(hWnd, msg, mp1, mp2)) 2682 if(_wndproc(hWnd, msg, mp1, mp2))
2670 return MPFROMSHORT(FALSE); 2683 return MPFROMSHORT(FALSE);
2671 break; 2684 break;
2672 case WM_CONTEXTMENU: 2685 case WM_CONTEXTMENU:
2673 case WM_COMMAND: 2686 case WM_COMMAND:
2687 case EM_PASTE:
2688 case EM_CUT:
2689 case EM_COPY:
2674 return _entryproc(hWnd, msg, mp1, mp2); 2690 return _entryproc(hWnd, msg, mp1, mp2);
2675 case WM_SETFOCUS: 2691 case WM_SETFOCUS:
2676 _run_event(hWnd, msg, mp1, mp2); 2692 _run_event(hWnd, msg, mp1, mp2);
2677 break; 2693 break;
2678 case WM_CHAR: 2694 case WM_CHAR:
2725 if(_wndproc(hWnd, msg, mp1, mp2)) 2741 if(_wndproc(hWnd, msg, mp1, mp2))
2726 return MPFROMSHORT(FALSE); 2742 return MPFROMSHORT(FALSE);
2727 break; 2743 break;
2728 case WM_CONTEXTMENU: 2744 case WM_CONTEXTMENU:
2729 case WM_COMMAND: 2745 case WM_COMMAND:
2746 case EM_PASTE:
2747 case EM_CUT:
2748 case EM_COPY:
2730 return _entryproc(hWnd, msg, mp1, mp2); 2749 return _entryproc(hWnd, msg, mp1, mp2);
2731 } 2750 }
2732 2751
2733 if(oldproc) 2752 if(oldproc)
2734 return oldproc(hWnd, msg, mp1, mp2); 2753 return oldproc(hWnd, msg, mp1, mp2);