/* fwindemo.c Copyright (C) 2004-2007 Codemist Ltd */ /* * This code is a very simple test and demonstration of the "FXTerminal.cpp" * Window-mode input local editing and history package that I have, and * in particular it illustrates how that code can be used. Note that if the * executable here is launched as just * fwindemo * it should create a window and run in it, but * fwindemo -w * should run in console-mode. * * * NB that when compiling on Windows my Makefile will create TWO executables * for this program. One will be called fwindemo.com and will be linked * with "susbsystem:console", the other will be fwindemo.exe and is set * up as "susbsystem:windows". If you just say "fwindemo" and the directory * with these in is on your path then fwindemo.com gets launched. If you * want to double-click you should do so on fwindemo.exe. You can launch * fwindemo[.com] from the command line and it will still launch and * run in a window (unless you give it the "-w" flag). Thos who feel the * need to understand why I do all this can do web searches about creating * programs that can run in either Windowes or Console mode... * * * Copyright (c) 2004 A C Norman, Codemist Ltd * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject * to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * */ /* Signature: 58846524 17-Mar-2008 */ /* * To the extent that (a) it is convenient and (b) that I have completed * development of this code, the behaviour of the Windowed interface in * FXTerminal.cpp and of the console mode one in termed.c are compatible. * The key-bindings are intended to be "emacs-like" so they support command * to move backwards and forwards by characters and words, to delete * characters or words, to adjust case and to scan up and down through a * history. More elaborate variants on this idea would permit the user to * re-assign key-bindings. I have not implemented that at all. Partly to * try to keep my code simple and partly because I feel customised key- * bindings are a source of terrible confusion. * * Because of my intended use for this code I have allocated some keys to * menu shortcuts that will not be relevant to other people but that are * useful to me. NOt all keys can and not all keys do work under both * FXTerminal and termed environments. I annotate this key-list with a * ($) for things not active under FXTerminal and with (!) for not active * or incomplete under termed. * * * * KEYBOARD HANDLING * * * Key-bindings that I hope to make work in both terminal and windowed mode, * on both Unix/Linux, Microsoft Windows and the Macintosh. * * Note that ALT can be achieved either by holding the ALT key at the * same time as the listed key, or by pressing ESC before the key. * * ALT takes priority over SHIFT, and Control takes priority over ALT so * that a character is only treated as having one attribute. If it has none * it just inserts itself. * * Where I put a "-" in this table it means that I do not define the meaning * of the keystroke. In the short term at least that will either cause the * keystroke to be ignored, inserted, or treated the same way as the * corresponding character without Control or ALT. In the longer term I may * assign behaviours to some of those keys. I also want to reserve the * possibility of making keys with both Control and ALT have yet different * effects. * *Key Control ALT * * @ Set Mark ($!) - (note this key is not * always detected!) * A To beginning - (also Home key) * B Back char Back word (also left arrow key) * C ^C interrupt Capitalise word * D Delete forward Delete word (also the Delete key) * Also ^D before any other input on a line sends EOF * E To end [Edit menu] (!) (also End key) * F Forward char Foward word (also right arrow key) * G ^G interrupt/cancel input (!) - <<also escape search mode>> * * H Delete back Del word back * I TAB [File menu] (!) (also TAB key) * J Newline - * K Kill line - * L Clear screen Lowercase word * M Newline [Module load menu] ($!) * N Next history Search history next (also down arrow key) * O Discard output (!?) [Font menu] (!) * * P Previous history Search history prev (also up arrow key) * Q Resume output (!?) - * R Redisplay [Break menu] (!) * S Pause output (!?) [Switch menu] (!) * T Transpose chars - * U Undo($!)escape srch Uppercase word * V Quoted insert ($!) - * W Del Word back Copy region ($!) * * X eXtended command ($!)Obey command ($!) * Y Yank (=Paste) (!) - * Z Stop execution (!?) - * [ =ESC: Meta prefix - * \ Quit - * ] - - * _ - Copy previous word * ^ Reinput (!) - * * * Arrow etc keys... * * -> forward char/word * <- backwards char/word * ^ history prev/search history prev * v history next/search history next * home start line/start buffer * end end line/end buffer * * * The items shown as menus behave as follows: * * ALT-E C cut (all !) * O copy * P paste * R reinput * A select all * L clear * D redraw * H home * E end * ALT-I R read (all !) * S save * L save selected text * P print * N print selected text * X exit * ALT-M &Module menu shortcut - load a module ($! not used here) * ALT-O F select new font (all !) * R reset to default font * W reset font and window to default * Alt-R C as ^C, interrupt current computation (all !) * D as ^O, discard pending output * G as ^G, interrupt & backtrace current computation * P as ^S, pause output * R as ^Q, resume output * X as ^X, stop current computation * ALT-S &Switch menu shortcut - flip a switch ($! not used here) * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <stdio.h> #include <string.h> #include "fwin.h" int fwin_main(int argc, char **argv) { char line[1000]; fwin_printf("Type lines. Type \"quit\" to exit\n"); fwin_ensure_screen(); for (;;) { int i = 0, c; while ((c = fwin_getchar()) != EOF && c != '\n') { if (i < sizeof(line)-10) line[i++] = c; } line[i] = 0; fwin_printf("Line was <%s>\n", line); if (c == EOF || strcmp(line, "quit") == 0) break; } fwin_printf("Done\n"); /* fwin_exit(0); */ return 0; } /* * The "fwin" package can be build free-standing, but if the symbol CSL * is defined it expects to be used with the CSL Lisp system from Codemist. * In that case it makes a call-back to a function as defined here. A * dummy version is included here in case you link with a version of fwin * that had been compiled with the CSL option enabled. This complication is * indeed an indication of bad partitioning of functionality but should not * have much effect on ordinary users! */ void review_switch_settings() { } /* * Similarly here... */ char *look_in_lisp_variable(char *s, int c) { return NULL; } /* end of fwindemo.c */