|
| 1 | +/// D wrapper for ncurses via ImportC |
| 2 | +/// Re-exports ImportC declarations with original ncurses names |
| 3 | +module btdu.ui.ncurses; |
| 4 | + |
| 5 | +// Import the C shim - all ncurses declarations become available |
| 6 | +public import btdu_ncurses_importc; |
| 7 | + |
| 8 | +// Re-export wchar_t type for compatibility with existing D code |
| 9 | +public import core.stdc.stddef : wchar_t; |
| 10 | + |
| 11 | +// Attributes - alias internal names to standard ncurses names |
| 12 | +alias A_NORMAL = _NC_A_NORMAL; |
| 13 | +alias A_STANDOUT = _NC_A_STANDOUT; |
| 14 | +alias A_UNDERLINE = _NC_A_UNDERLINE; |
| 15 | +alias A_REVERSE = _NC_A_REVERSE; |
| 16 | +alias A_BLINK = _NC_A_BLINK; |
| 17 | +alias A_DIM = _NC_A_DIM; |
| 18 | +alias A_BOLD = _NC_A_BOLD; |
| 19 | +alias A_ALTCHARSET = _NC_A_ALTCHARSET; |
| 20 | +alias A_INVIS = _NC_A_INVIS; |
| 21 | +alias A_PROTECT = _NC_A_PROTECT; |
| 22 | +alias A_HORIZONTAL = _NC_A_HORIZONTAL; |
| 23 | +alias A_LEFT = _NC_A_LEFT; |
| 24 | +alias A_LOW = _NC_A_LOW; |
| 25 | +alias A_RIGHT = _NC_A_RIGHT; |
| 26 | +alias A_TOP = _NC_A_TOP; |
| 27 | +alias A_VERTICAL = _NC_A_VERTICAL; |
| 28 | +alias A_ITALIC = _NC_A_ITALIC; |
| 29 | + |
| 30 | +// Return codes |
| 31 | +alias OK = _NC_OK; |
| 32 | +alias ERR = _NC_ERR; |
| 33 | + |
| 34 | +// Configuration |
| 35 | +alias CCHARW_MAX = _NC_CCHARW_MAX; |
| 36 | + |
| 37 | +// KEY_F as a CTFE function (matches ncurses KEY_F(n) macro calling convention) |
| 38 | +int KEY_F(int n) pure nothrow @nogc @safe |
| 39 | +{ |
| 40 | + return _NC_KEY_F0 + n; |
| 41 | +} |
| 42 | + |
| 43 | +// Basic navigation keys |
| 44 | +alias KEY_DOWN = _NC_KEY_DOWN; |
| 45 | +alias KEY_UP = _NC_KEY_UP; |
| 46 | +alias KEY_LEFT = _NC_KEY_LEFT; |
| 47 | +alias KEY_RIGHT = _NC_KEY_RIGHT; |
| 48 | +alias KEY_HOME = _NC_KEY_HOME; |
| 49 | +alias KEY_BACKSPACE = _NC_KEY_BACKSPACE; |
| 50 | +alias KEY_DL = _NC_KEY_DL; |
| 51 | +alias KEY_IL = _NC_KEY_IL; |
| 52 | +alias KEY_DC = _NC_KEY_DC; |
| 53 | +alias KEY_IC = _NC_KEY_IC; |
| 54 | +alias KEY_EIC = _NC_KEY_EIC; |
| 55 | +alias KEY_CLEAR = _NC_KEY_CLEAR; |
| 56 | +alias KEY_EOS = _NC_KEY_EOS; |
| 57 | +alias KEY_EOL = _NC_KEY_EOL; |
| 58 | +alias KEY_SF = _NC_KEY_SF; |
| 59 | +alias KEY_SR = _NC_KEY_SR; |
| 60 | +alias KEY_NPAGE = _NC_KEY_NPAGE; |
| 61 | +alias KEY_PPAGE = _NC_KEY_PPAGE; |
| 62 | +alias KEY_STAB = _NC_KEY_STAB; |
| 63 | +alias KEY_CTAB = _NC_KEY_CTAB; |
| 64 | +alias KEY_CATAB = _NC_KEY_CATAB; |
| 65 | +alias KEY_ENTER = _NC_KEY_ENTER; |
| 66 | +alias KEY_PRINT = _NC_KEY_PRINT; |
| 67 | +alias KEY_LL = _NC_KEY_LL; |
| 68 | +alias KEY_A1 = _NC_KEY_A1; |
| 69 | +alias KEY_A3 = _NC_KEY_A3; |
| 70 | +alias KEY_B2 = _NC_KEY_B2; |
| 71 | +alias KEY_C1 = _NC_KEY_C1; |
| 72 | +alias KEY_C3 = _NC_KEY_C3; |
| 73 | +alias KEY_BTAB = _NC_KEY_BTAB; |
| 74 | +alias KEY_BEG = _NC_KEY_BEG; |
| 75 | +alias KEY_CANCEL = _NC_KEY_CANCEL; |
| 76 | +alias KEY_CLOSE = _NC_KEY_CLOSE; |
| 77 | +alias KEY_COMMAND = _NC_KEY_COMMAND; |
| 78 | +alias KEY_COPY = _NC_KEY_COPY; |
| 79 | +alias KEY_CREATE = _NC_KEY_CREATE; |
| 80 | +alias KEY_END = _NC_KEY_END; |
| 81 | +alias KEY_EXIT = _NC_KEY_EXIT; |
| 82 | +alias KEY_FIND = _NC_KEY_FIND; |
| 83 | +alias KEY_HELP = _NC_KEY_HELP; |
| 84 | +alias KEY_MARK = _NC_KEY_MARK; |
| 85 | +alias KEY_MESSAGE = _NC_KEY_MESSAGE; |
| 86 | +alias KEY_MOVE = _NC_KEY_MOVE; |
| 87 | +alias KEY_NEXT = _NC_KEY_NEXT; |
| 88 | +alias KEY_OPEN = _NC_KEY_OPEN; |
| 89 | +alias KEY_OPTIONS = _NC_KEY_OPTIONS; |
| 90 | +alias KEY_PREVIOUS = _NC_KEY_PREVIOUS; |
| 91 | +alias KEY_REDO = _NC_KEY_REDO; |
| 92 | +alias KEY_REFERENCE = _NC_KEY_REFERENCE; |
| 93 | +alias KEY_REFRESH = _NC_KEY_REFRESH; |
| 94 | +alias KEY_REPLACE = _NC_KEY_REPLACE; |
| 95 | +alias KEY_RESTART = _NC_KEY_RESTART; |
| 96 | +alias KEY_RESUME = _NC_KEY_RESUME; |
| 97 | +alias KEY_SAVE = _NC_KEY_SAVE; |
| 98 | +alias KEY_SUSPEND = _NC_KEY_SUSPEND; |
| 99 | +alias KEY_UNDO = _NC_KEY_UNDO; |
| 100 | +alias KEY_MOUSE = _NC_KEY_MOUSE; |
| 101 | + |
| 102 | +// Shifted keys |
| 103 | +alias KEY_SBEG = _NC_KEY_SBEG; |
| 104 | +alias KEY_SCANCEL = _NC_KEY_SCANCEL; |
| 105 | +alias KEY_SCOMMAND = _NC_KEY_SCOMMAND; |
| 106 | +alias KEY_SCOPY = _NC_KEY_SCOPY; |
| 107 | +alias KEY_SCREATE = _NC_KEY_SCREATE; |
| 108 | +alias KEY_SDC = _NC_KEY_SDC; |
| 109 | +alias KEY_SDL = _NC_KEY_SDL; |
| 110 | +alias KEY_SELECT = _NC_KEY_SELECT; |
| 111 | +alias KEY_SEND = _NC_KEY_SEND; |
| 112 | +alias KEY_SEOL = _NC_KEY_SEOL; |
| 113 | +alias KEY_SEXIT = _NC_KEY_SEXIT; |
| 114 | +alias KEY_SFIND = _NC_KEY_SFIND; |
| 115 | +alias KEY_SHELP = _NC_KEY_SHELP; |
| 116 | +alias KEY_SHOME = _NC_KEY_SHOME; |
| 117 | +alias KEY_SIC = _NC_KEY_SIC; |
| 118 | +alias KEY_SLEFT = _NC_KEY_SLEFT; |
| 119 | +alias KEY_SMESSAGE = _NC_KEY_SMESSAGE; |
| 120 | +alias KEY_SMOVE = _NC_KEY_SMOVE; |
| 121 | +alias KEY_SNEXT = _NC_KEY_SNEXT; |
| 122 | +alias KEY_SOPTIONS = _NC_KEY_SOPTIONS; |
| 123 | +alias KEY_SPREVIOUS = _NC_KEY_SPREVIOUS; |
| 124 | +alias KEY_SPRINT = _NC_KEY_SPRINT; |
| 125 | +alias KEY_SREDO = _NC_KEY_SREDO; |
| 126 | +alias KEY_SREPLACE = _NC_KEY_SREPLACE; |
| 127 | +alias KEY_SRIGHT = _NC_KEY_SRIGHT; |
| 128 | +alias KEY_SRSUME = _NC_KEY_SRSUME; |
| 129 | +alias KEY_SSAVE = _NC_KEY_SSAVE; |
| 130 | +alias KEY_SSUSPEND = _NC_KEY_SSUSPEND; |
| 131 | +alias KEY_SUNDO = _NC_KEY_SUNDO; |
| 132 | + |
| 133 | +// Function key aliases for convenience |
| 134 | +alias KEY_F0 = _NC_KEY_F0; |
| 135 | +alias KEY_F1 = _NC_KEY_F1; |
| 136 | +alias KEY_F2 = _NC_KEY_F2; |
| 137 | +alias KEY_F3 = _NC_KEY_F3; |
| 138 | +alias KEY_F4 = _NC_KEY_F4; |
| 139 | +alias KEY_F5 = _NC_KEY_F5; |
| 140 | +alias KEY_F6 = _NC_KEY_F6; |
| 141 | +alias KEY_F7 = _NC_KEY_F7; |
| 142 | +alias KEY_F8 = _NC_KEY_F8; |
| 143 | +alias KEY_F9 = _NC_KEY_F9; |
| 144 | +alias KEY_F10 = _NC_KEY_F10; |
| 145 | +alias KEY_F11 = _NC_KEY_F11; |
| 146 | +alias KEY_F12 = _NC_KEY_F12; |
| 147 | + |
| 148 | +// NCURSES_PAIRS_T is a macro that expands to 'short' |
| 149 | +alias NCURSES_PAIRS_T = short; |
| 150 | + |
| 151 | +// ============================================================================ |
| 152 | +// Wrapper functions for type compatibility |
| 153 | +// ImportC uses raw C types; these wrappers adapt to D's type system |
| 154 | +// ============================================================================ |
| 155 | + |
| 156 | +import core.sys.posix.stdio : FILE; |
| 157 | + |
| 158 | +// Wrapper for newterm - handles FILE* type difference |
| 159 | +// D's std.stdio.File.getFP() returns shared(_IO_FILE)* but ncurses wants _IO_FILE* |
| 160 | +SCREEN* newterm(const(char)* term, FILE* outfd, FILE* infd) @trusted |
| 161 | +{ |
| 162 | + return btdu_ncurses_importc.newterm(term, |
| 163 | + cast(btdu_ncurses_importc._IO_FILE*) outfd, |
| 164 | + cast(btdu_ncurses_importc._IO_FILE*) infd); |
| 165 | +} |
| 166 | + |
| 167 | +// Wrapper for setcchar - handles wchar_t type difference |
| 168 | +// D's wchar_t is dchar (4 bytes), but ImportC sees platform-specific wchar_t |
| 169 | +// (int on x86_64 glibc, unsigned int on aarch64) |
| 170 | +int setcchar(cchar_t* wcval, const(wchar_t)* wch, uint attrs, short color_pair, const(void)* opts) @trusted |
| 171 | +{ |
| 172 | + // Cast to ImportC's wchar_t type to handle platform differences |
| 173 | + return btdu_ncurses_importc.setcchar(wcval, |
| 174 | + cast(const(btdu_ncurses_importc.wchar_t)*) wch, |
| 175 | + attrs, color_pair, opts); |
| 176 | +} |
0 commit comments