Commit 279ad7c7b7969135e02ecd1577528b6e581c6436
1 parent
2bfb60d4
Exists in
master
and in
3 other branches
Fixing bug on cursor movement reported by user
Showing
4 changed files
with
98 additions
and
81 deletions
Show diff stats
lib3270.cbp
| ... | ... | @@ -161,9 +161,6 @@ |
| 161 | 161 | <Unit filename="src/lib3270/log.c"> |
| 162 | 162 | <Option compilerVar="CC" /> |
| 163 | 163 | </Unit> |
| 164 | - <Unit filename="src/lib3270/macros.c"> | |
| 165 | - <Option compilerVar="CC" /> | |
| 166 | - </Unit> | |
| 167 | 164 | <Unit filename="src/lib3270/mkactions/mkactions.c"> |
| 168 | 165 | <Option compilerVar="CC" /> |
| 169 | 166 | </Unit> | ... | ... |
src/lib3270/kybd.c
| ... | ... | @@ -42,6 +42,7 @@ struct ta; |
| 42 | 42 | |
| 43 | 43 | #include "private.h" |
| 44 | 44 | #include <lib3270/trace.h> |
| 45 | +#include <lib3270/selection.h> | |
| 45 | 46 | |
| 46 | 47 | #ifndef ANDROID |
| 47 | 48 | #include <stdlib.h> |
| ... | ... | @@ -1758,6 +1759,97 @@ LIB3270_EXPORT int lib3270_nextword(H3270 *hSession) |
| 1758 | 1759 | } |
| 1759 | 1760 | |
| 1760 | 1761 | /** |
| 1762 | + * @brief Move cursor. | |
| 1763 | + * | |
| 1764 | + * @param hSession Session handle. | |
| 1765 | + * @param dir Where to move. | |
| 1766 | + * @param sel Non zero if it's selecting. | |
| 1767 | + * | |
| 1768 | + */ | |
| 1769 | +LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, unsigned char sel) | |
| 1770 | +{ | |
| 1771 | + FAIL_IF_NOT_ONLINE(hSession); | |
| 1772 | + | |
| 1773 | + int cursor_addr = hSession->cursor_addr; | |
| 1774 | + int maxlen = hSession->cols * hSession->rows; | |
| 1775 | + | |
| 1776 | + switch(dir) | |
| 1777 | + { | |
| 1778 | + case LIB3270_DIR_UP: | |
| 1779 | + | |
| 1780 | + if(sel && cursor_addr <= hSession->cols) | |
| 1781 | + return errno = EINVAL; | |
| 1782 | + | |
| 1783 | + cursor_addr -= hSession->cols; | |
| 1784 | + break; | |
| 1785 | + | |
| 1786 | + case LIB3270_DIR_DOWN: | |
| 1787 | + | |
| 1788 | + if(sel && cursor_addr >= (hSession->cols * (hSession->rows-1))) | |
| 1789 | + return errno = EINVAL; | |
| 1790 | + | |
| 1791 | + cursor_addr += hSession->cols; | |
| 1792 | + break; | |
| 1793 | + | |
| 1794 | + case LIB3270_DIR_LEFT: | |
| 1795 | + | |
| 1796 | + if(sel && (cursor_addr % hSession->cols) < 1) | |
| 1797 | + return errno = EINVAL; | |
| 1798 | + | |
| 1799 | + cursor_addr--; | |
| 1800 | + break; | |
| 1801 | + | |
| 1802 | + case LIB3270_DIR_RIGHT: | |
| 1803 | + | |
| 1804 | + if(sel && (cursor_addr % hSession->cols) >= (hSession->cols-1)) | |
| 1805 | + return errno = EINVAL; | |
| 1806 | + | |
| 1807 | + cursor_addr++; | |
| 1808 | + break; | |
| 1809 | + | |
| 1810 | + case LIB3270_DIR_END: | |
| 1811 | + | |
| 1812 | + cursor_addr = lib3270_get_field_end(hSession,cursor_addr); | |
| 1813 | + if(cursor_addr == -1) | |
| 1814 | + return errno = EINVAL; | |
| 1815 | + break; | |
| 1816 | + | |
| 1817 | + default: | |
| 1818 | + errno = EINVAL; | |
| 1819 | + return -1; | |
| 1820 | + } | |
| 1821 | + | |
| 1822 | + if(sel) | |
| 1823 | + { | |
| 1824 | + lib3270_select_to(hSession,cursor_addr); | |
| 1825 | + } | |
| 1826 | + else | |
| 1827 | + { | |
| 1828 | + | |
| 1829 | + if(cursor_addr >= maxlen) | |
| 1830 | + { | |
| 1831 | + cursor_move(hSession,cursor_addr % maxlen); | |
| 1832 | + } | |
| 1833 | + else if(cursor_addr < 0) | |
| 1834 | + { | |
| 1835 | + cursor_move(hSession,cursor_addr + maxlen); | |
| 1836 | + } | |
| 1837 | + else | |
| 1838 | + { | |
| 1839 | + cursor_move(hSession,cursor_addr); | |
| 1840 | + } | |
| 1841 | + | |
| 1842 | + if(hSession->kybdlock && (KYBDLOCK_IS_OERR(hSession))) | |
| 1843 | + { | |
| 1844 | + status_reset(hSession); | |
| 1845 | + } | |
| 1846 | + | |
| 1847 | + } | |
| 1848 | + | |
| 1849 | + return 0; | |
| 1850 | +} | |
| 1851 | + | |
| 1852 | +/** | |
| 1761 | 1853 | * @brief Cursor up 1 position. |
| 1762 | 1854 | */ |
| 1763 | 1855 | LIB3270_EXPORT int lib3270_cursor_up(H3270 *hSession) |
| ... | ... | @@ -1766,6 +1858,7 @@ LIB3270_EXPORT int lib3270_cursor_up(H3270 *hSession) |
| 1766 | 1858 | |
| 1767 | 1859 | FAIL_IF_NOT_ONLINE(hSession); |
| 1768 | 1860 | |
| 1861 | + trace("kybdlock=%d OERR=%s",(int) hSession->kybdlock, (KYBDLOCK_IS_OERR(hSession) ? "yes" : "no")); | |
| 1769 | 1862 | if (hSession->kybdlock) |
| 1770 | 1863 | { |
| 1771 | 1864 | if (KYBDLOCK_IS_OERR(hSession)) |
| ... | ... | @@ -1776,16 +1869,17 @@ LIB3270_EXPORT int lib3270_cursor_up(H3270 *hSession) |
| 1776 | 1869 | else |
| 1777 | 1870 | { |
| 1778 | 1871 | ENQUEUE_ACTION(lib3270_cursor_up); |
| 1779 | -// enq_ta(Up_action, CN, CN); | |
| 1780 | 1872 | return 0; |
| 1781 | 1873 | } |
| 1782 | 1874 | } |
| 1875 | + | |
| 1783 | 1876 | #if defined(X3270_ANSI) /*[*/ |
| 1784 | 1877 | if (IN_ANSI) { |
| 1785 | 1878 | ansi_send_up(hSession); |
| 1786 | 1879 | return 0; |
| 1787 | 1880 | } |
| 1788 | 1881 | #endif /*]*/ |
| 1882 | + | |
| 1789 | 1883 | baddr = hSession->cursor_addr - hSession->cols; |
| 1790 | 1884 | if (baddr < 0) |
| 1791 | 1885 | baddr = (hSession->cursor_addr + (hSession->rows * hSession->cols)) - hSession->cols; | ... | ... |
src/lib3270/screen.c
| ... | ... | @@ -568,14 +568,17 @@ void status_reset(H3270 *session) |
| 568 | 568 | |
| 569 | 569 | if (session->kybdlock & KL_ENTER_INHIBIT) |
| 570 | 570 | { |
| 571 | + trace("%s",__FUNCTION__); | |
| 571 | 572 | status_changed(session,LIB3270_MESSAGE_INHIBIT); |
| 572 | 573 | } |
| 573 | 574 | else if (session->kybdlock & KL_DEFERRED_UNLOCK) |
| 574 | 575 | { |
| 576 | + trace("%s",__FUNCTION__); | |
| 575 | 577 | status_changed(session,LIB3270_MESSAGE_X); |
| 576 | 578 | } |
| 577 | 579 | else |
| 578 | 580 | { |
| 581 | + trace("%s",__FUNCTION__); | |
| 579 | 582 | mcursor_set(session,LIB3270_POINTER_UNLOCKED); |
| 580 | 583 | status_changed(session,LIB3270_MESSAGE_NONE); |
| 581 | 584 | } | ... | ... |
src/lib3270/selection.c
| ... | ... | @@ -908,80 +908,3 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir |
| 908 | 908 | return 0; |
| 909 | 909 | } |
| 910 | 910 | |
| 911 | -LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, unsigned char sel) | |
| 912 | -{ | |
| 913 | - int cursor_addr = hSession->cursor_addr; | |
| 914 | - int maxlen = hSession->cols * hSession->rows; | |
| 915 | - | |
| 916 | - if(!lib3270_connected(hSession)) | |
| 917 | - { | |
| 918 | - errno = ENOTCONN; | |
| 919 | - return -1; | |
| 920 | - } | |
| 921 | - | |
| 922 | - switch(dir) | |
| 923 | - { | |
| 924 | - case LIB3270_DIR_UP: | |
| 925 | - | |
| 926 | - if(sel && cursor_addr <= hSession->cols) | |
| 927 | - return errno = EINVAL; | |
| 928 | - | |
| 929 | - cursor_addr -= hSession->cols; | |
| 930 | - break; | |
| 931 | - | |
| 932 | - case LIB3270_DIR_DOWN: | |
| 933 | - | |
| 934 | - if(sel && cursor_addr >= (hSession->cols * (hSession->rows-1))) | |
| 935 | - return errno = EINVAL; | |
| 936 | - | |
| 937 | - cursor_addr += hSession->cols; | |
| 938 | - break; | |
| 939 | - | |
| 940 | - case LIB3270_DIR_LEFT: | |
| 941 | - | |
| 942 | - if(sel && (cursor_addr % hSession->cols) < 1) | |
| 943 | - return errno = EINVAL; | |
| 944 | - | |
| 945 | - cursor_addr--; | |
| 946 | - break; | |
| 947 | - | |
| 948 | - case LIB3270_DIR_RIGHT: | |
| 949 | - | |
| 950 | - if(sel && (cursor_addr % hSession->cols) >= (hSession->cols-1)) | |
| 951 | - return errno = EINVAL; | |
| 952 | - | |
| 953 | - cursor_addr++; | |
| 954 | - break; | |
| 955 | - | |
| 956 | - case LIB3270_DIR_END: | |
| 957 | - | |
| 958 | - cursor_addr = lib3270_get_field_end(hSession,cursor_addr); | |
| 959 | - if(cursor_addr == -1) | |
| 960 | - return errno = EINVAL; | |
| 961 | - break; | |
| 962 | - | |
| 963 | - default: | |
| 964 | - errno = EINVAL; | |
| 965 | - return -1; | |
| 966 | - } | |
| 967 | - | |
| 968 | - if(sel) | |
| 969 | - { | |
| 970 | - lib3270_select_to(hSession,cursor_addr); | |
| 971 | - } | |
| 972 | - else if(cursor_addr >= maxlen) | |
| 973 | - { | |
| 974 | - cursor_move(hSession,cursor_addr % maxlen); | |
| 975 | - } | |
| 976 | - else if(cursor_addr < 0) | |
| 977 | - { | |
| 978 | - cursor_move(hSession,cursor_addr + maxlen); | |
| 979 | - } | |
| 980 | - else | |
| 981 | - { | |
| 982 | - cursor_move(hSession,cursor_addr); | |
| 983 | - } | |
| 984 | - | |
| 985 | - return 0; | |
| 986 | -} | |
| 987 | - | ... | ... |