Fortran · 3321 bytes Raw Blame History
1 module raw_mode_module
2 use iso_c_binding
3 implicit none
4 private
5
6 public :: enable_raw_mode, disable_raw_mode, input_available, read_char_timeout
7 public :: read_char_escape, input_available_count, get_terminal_size
8
9 ! C function interfaces
10 interface
11 function c_enable_raw_mode() bind(C, name="enable_raw_mode")
12 import :: c_int
13 integer(c_int) :: c_enable_raw_mode
14 end function c_enable_raw_mode
15
16 function c_disable_raw_mode() bind(C, name="disable_raw_mode")
17 import :: c_int
18 integer(c_int) :: c_disable_raw_mode
19 end function c_disable_raw_mode
20
21 function c_input_available() bind(C, name="input_available")
22 import :: c_int
23 integer(c_int) :: c_input_available
24 end function c_input_available
25
26 function c_input_available_count() bind(C, name="input_available_count")
27 import :: c_int
28 integer(c_int) :: c_input_available_count
29 end function c_input_available_count
30
31 function c_read_char_timeout() bind(C, name="read_char_timeout")
32 import :: c_int
33 integer(c_int) :: c_read_char_timeout
34 end function c_read_char_timeout
35
36 function c_read_char_escape() bind(C, name="read_char_escape")
37 import :: c_int
38 integer(c_int) :: c_read_char_escape
39 end function c_read_char_escape
40
41 subroutine c_get_terminal_size(rows, cols) bind(C, name="get_terminal_size")
42 import :: c_int
43 integer(c_int), intent(out) :: rows, cols
44 end subroutine c_get_terminal_size
45 end interface
46
47 contains
48
49 function enable_raw_mode() result(success)
50 logical :: success
51 integer(c_int) :: result
52
53 result = c_enable_raw_mode()
54 success = (result == 0)
55 end function enable_raw_mode
56
57 function disable_raw_mode() result(success)
58 logical :: success
59 integer(c_int) :: result
60
61 result = c_disable_raw_mode()
62 success = (result == 0)
63 end function disable_raw_mode
64
65 function input_available() result(available)
66 logical :: available
67 integer(c_int) :: result
68
69 result = c_input_available()
70 available = (result > 0)
71 end function input_available
72
73 function input_available_count() result(count)
74 integer :: count
75 integer(c_int) :: result
76
77 result = c_input_available_count()
78 count = result
79 end function input_available_count
80
81 function read_char_timeout() result(ch)
82 integer :: ch
83 integer(c_int) :: result
84
85 result = c_read_char_timeout()
86 ch = result
87 end function read_char_timeout
88
89 ! Fast read for escape sequences (5ms timeout instead of 50ms)
90 function read_char_escape() result(ch)
91 integer :: ch
92 integer(c_int) :: result
93
94 result = c_read_char_escape()
95 ch = result
96 end function read_char_escape
97
98 ! Get terminal size using ioctl (no escape sequences)
99 subroutine get_terminal_size(rows, cols)
100 integer, intent(out) :: rows, cols
101 integer(c_int) :: c_rows, c_cols
102
103 call c_get_terminal_size(c_rows, c_cols)
104 rows = c_rows
105 cols = c_cols
106 end subroutine get_terminal_size
107
108 end module raw_mode_module