Mercurial > dwindows
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); |