1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

remapping or ignoring all unspecified keys

Discussion in 'C, C++, C#' started by thelibertarian, Apr 25, 2013.

  1. thelibertarian

    thelibertarian Newbie

    Joined:
    Mar 13, 2013
    Messages:
    9
    Likes Received:
    0
    Occupation:
    INDEPENDENT CONTRACTS
    Location:
    DENVER
    Home Page:
    I have a schell script that runs from commandline and executes as an init script at reboot.
    I want the user to be "stuck" in this script (which is a sudo graphical menu).
    So basically my issue here is that all one needs to do is hit cntrl-c or alt-f2 through alt-f6 or esc... any of these key bindings will somehow leave the menu script.
    So basically my idea, is to ignore all the key bindings except... arrow up; arrow down; arrow left; arrow right; space bar; enter.

    the name of the program i am using is "Dialog". Yes the one from 1994.
    the name of the file i believe (hopefully) can solve my problem if edited properly, is... /ur/include/dlg_keys.h
    Below is the output from a cat of said file.

    Please somebody help me ;) ;) ;)
    Thanks in Advance

    Code:
    /*
     *  $Id: dlg_keys.h,v 1.29 2011/10/04 23:50:56 tom Exp $
     *
     *  dlg_keys.h -- runtime binding support for dialog
     *
     *  Copyright 2005-2010,2011 Thomas E.  Dickey
     *
     *  This program is free software; you can redistribute it and/or modify
     *  it under the terms of the GNU Lesser General Public License, version 2.1
     *  as published by the Free Software Foundation.
     *
     *  This program is distributed in the hope that it will be useful, but
     *  WITHOUT ANY WARRANTY; without even the implied warranty of
     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     *  Lesser General Public License for more details.
     *
     *  You should have received a copy of the GNU Lesser General Public
     *  License along with this program; if not, write to
     *    Free Software Foundation, Inc.
     *    51 Franklin St., Fifth Floor
     *    Boston, MA 02110, USA.
     */
    
    #ifndef DLG_KEYS_H_included
    #define DLG_KEYS_H_included 1
    /* *INDENT-OFF* */
    
    #include <dialog.h>
    
    #ifdef DLG_USE_WIDE_CURSES
    #include <wctype.h>
    #define dlg_toupper(ch) towupper((wint_t)ch)
    #define dlg_isupper(ch) iswupper((wint_t)ch)
    #else
    #define dlg_toupper(ch) toupper(ch)
    #define dlg_isupper(ch) (isalpha(ch) && isupper(ch))
    #endif
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    typedef struct {
        int is_function_key;
        int    curses_key;
        int dialog_key;
    } DLG_KEYS_BINDING;
    
    #define DLG_KEYS_DATA(dialog, curses)  { (curses) >= KEY_MIN, curses, dialog }
    
    #define END_KEYS_BINDING { -1, 0, 0 }
    
    /*
     * Define dialog's internal function-keys past the range used by curses.
     */
    typedef enum {
        DLGK_MIN = KEY_MAX + 1,
        /* predefined buttons */
        DLGK_OK,
        DLGK_CANCEL,
        DLGK_EXTRA,
        DLGK_HELP,
        DLGK_ESC,
        /* moving from screen to screen (pages) */
        DLGK_PAGE_FIRST,
        DLGK_PAGE_LAST,
        DLGK_PAGE_NEXT,
        DLGK_PAGE_PREV,
        /* moving within a list */
        DLGK_ITEM_FIRST,
        DLGK_ITEM_LAST,
        DLGK_ITEM_NEXT,
        DLGK_ITEM_PREV,
        /* moving from field to field (or buttons) */
        DLGK_FIELD_FIRST,
        DLGK_FIELD_LAST,
        DLGK_FIELD_NEXT,
        DLGK_FIELD_PREV,
        /* moving from form-field to form-field (or buttons) */
        DLGK_FORM_FIRST,
        DLGK_FORM_LAST,
        DLGK_FORM_NEXT,
        DLGK_FORM_PREV,
        /* moving within a grid */
        DLGK_GRID_UP,
        DLGK_GRID_DOWN,
        DLGK_GRID_LEFT,
        DLGK_GRID_RIGHT,
        /* delete */
        DLGK_DELETE_LEFT,
        DLGK_DELETE_RIGHT,
        DLGK_DELETE_ALL,
        /* special */
        DLGK_ENTER,
        DLGK_BEGIN,
        DLGK_FINAL,
        DLGK_SELECT,
        DLGK_HELPFILE,
        DLGK_TRACE
    } DLG_KEYS_ENUM;
    
    #define is_DLGK_MOUSE(code)    ((code) >= M_EVENT)
    #define DLGK_MOUSE(code)    ((code) + M_EVENT)
    
    #define HELPKEY_BINDINGS \
        DLG_KEYS_DATA( DLGK_HELPFILE,       CHR_HELP ), \
        DLG_KEYS_DATA( DLGK_HELPFILE,       KEY_F(1) ), \
        DLG_KEYS_DATA( DLGK_HELPFILE,       KEY_HELP )
    
    #define ENTERKEY_BINDINGS \
        DLG_KEYS_DATA( DLGK_ENTER,       '\n' ), \
        DLG_KEYS_DATA( DLGK_ENTER,       '\r' ), \
        DLG_KEYS_DATA( DLGK_ENTER,       KEY_ENTER )
    
    /* ^U == 21 */
    #define INPUTSTR_BINDINGS \
        DLG_KEYS_DATA( DLGK_BEGIN,       KEY_HOME ), \
        DLG_KEYS_DATA( DLGK_DELETE_ALL,    CHR_KILL ), \
        DLG_KEYS_DATA( DLGK_DELETE_LEFT,   CHR_BACKSPACE ), \
        DLG_KEYS_DATA( DLGK_DELETE_LEFT,   KEY_BACKSPACE ), \
        DLG_KEYS_DATA( DLGK_DELETE_RIGHT,  CHR_DELETE ), \
        DLG_KEYS_DATA( DLGK_DELETE_RIGHT,  KEY_DC ), \
        DLG_KEYS_DATA( DLGK_FINAL,       KEY_END ), \
        DLG_KEYS_DATA( DLGK_GRID_LEFT,       KEY_LEFT ), \
        DLG_KEYS_DATA( DLGK_GRID_RIGHT,       KEY_RIGHT )
    
    #define SCROLLKEY_BINDINGS \
        DLG_KEYS_DATA( DLGK_GRID_DOWN,    'J' ), \
        DLG_KEYS_DATA( DLGK_GRID_DOWN,    'j' ), \
        DLG_KEYS_DATA( DLGK_GRID_DOWN,    KEY_DOWN ), \
        DLG_KEYS_DATA( DLGK_GRID_UP,    'K' ), \
        DLG_KEYS_DATA( DLGK_GRID_UP,    'k' ), \
        DLG_KEYS_DATA( DLGK_GRID_UP,    KEY_UP ), \
        DLG_KEYS_DATA( DLGK_PAGE_FIRST,    'g' ), \
        DLG_KEYS_DATA( DLGK_PAGE_FIRST,    KEY_HOME ), \
        DLG_KEYS_DATA( DLGK_PAGE_LAST,    'G' ), \
        DLG_KEYS_DATA( DLGK_PAGE_LAST,    KEY_END ), \
        DLG_KEYS_DATA( DLGK_PAGE_NEXT,    'F' ), \
        DLG_KEYS_DATA( DLGK_PAGE_NEXT,    'f' ), \
        DLG_KEYS_DATA( DLGK_PAGE_NEXT,    KEY_NPAGE ), \
        DLG_KEYS_DATA( DLGK_PAGE_PREV,    'B' ), \
        DLG_KEYS_DATA( DLGK_PAGE_PREV,    'b' ), \
        DLG_KEYS_DATA( DLGK_PAGE_PREV,    KEY_PPAGE )
    
    extern int dlg_lookup_key(WINDOW * /*win*/, int /*curses_key*/, int * /*dialog_key*/);
    extern int dlg_result_key(int /*dialog_key*/, int /*fkey*/, int * /*resultp*/);
    extern void dlg_register_buttons(WINDOW * /*win*/, const char * /*name*/, const char ** /*buttons*/);
    extern void dlg_register_window(WINDOW * /*win*/, const char * /*name*/, DLG_KEYS_BINDING * /*binding*/);
    extern void dlg_unregister_window(WINDOW * /*win*/);
    
    #ifdef DLG_HAVE_RC_FILE
    extern int dlg_parse_bindkey(char * /*params*/);
    extern void dlg_dump_keys(FILE * /*fp*/);
    extern void dlg_dump_window_keys(FILE * /*fp*/, WINDOW * /*win*/);
    #endif
    
    #ifdef __cplusplus
    }
    #endif
    /* *INDENT-ON* */
    
    #endif /* DLG_KEYS_H_included */
     
  2. s0ap

    s0ap Executive VIP Jr. VIP Premium Member

    Joined:
    Sep 23, 2008
    Messages:
    230
    Likes Received:
    810
    Occupation:
    :] guess
    Location:
    Congo/DRC
    You need to write signal handlers for the signals you want to intercept and override (SIGINT, SIGTERM, etc). This will catch most common methods of aborting execution but the kernel does not support the interception of the SIGKILL and SIGSTOP signals though so the process can still be pkilled or killed through top.
     
    • Thanks Thanks x 1