Changeset 4048 for neercs


Ignore:
Timestamp:
Nov 26, 2009, 6:20:33 PM (10 years ago)
Author:
Jean-Yves Lamoureux
Message:
  • Created widgets.[c,h] and an unfinished (but working) input box
  • Python interpreter now uses generic input box code
Location:
neercs/trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/XCode/XCode.xcodeproj/project.pbxproj

    r4047 r4048  
    1919                E6BC2F7E10BD8C9100CED875 /* py_module.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = py_module.c; path = ../src/python/py_module.c; sourceTree = SOURCE_ROOT; };
    2020                E6BC2F7F10BD8C9100CED875 /* py_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = py_module.h; path = ../src/python/py_module.h; sourceTree = SOURCE_ROOT; };
     21                E6BC2FBF10BEE46A00CED875 /* widgets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = widgets.h; path = ../src/widgets.h; sourceTree = SOURCE_ROOT; };
     22                E6BC2FC010BEE46A00CED875 /* widgets.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = widgets.c; path = ../src/widgets.c; sourceTree = SOURCE_ROOT; };
    2123                E6DB671810B19E2200B6F924 /* attach.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = attach.c; path = ../src/attach.c; sourceTree = SOURCE_ROOT; };
    2224                E6DB671910B19E2200B6F924 /* configuration.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = configuration.c; path = ../src/configuration.c; sourceTree = SOURCE_ROOT; };
     
    9496                                E6DB672510B19E2200B6F924 /* neercsrc */,
    9597                                E6DB671F10B19E2200B6F924 /* Makefile.am */,
     98                                E6BC2FBF10BEE46A00CED875 /* widgets.h */,
     99                                E6BC2FC010BEE46A00CED875 /* widgets.c */,
    96100                        );
    97101                        name = src;
  • neercs/trunk/src/Makefile.am

    r4040 r4048  
    55                 term.c grab.c effects.c wm.c screensaver.c attach.c \
    66                 configuration.c mytrace.c mytrace.h input.c lock.c server.c \
    7                  client.c screen_list.c help.c python/interpreter.c python/py_module.c         
     7                 client.c screen_list.c help.c python/interpreter.c python/py_module.c \
     8                 widgets.c         
    89neercs_CFLAGS = @CACA_CFLAGS@ @PYTHON3_CFLAGS@
    910neercs_LDADD = @CACA_LIBS@ @UTIL_LIBS@ @PAM_LIBS@ @PYTHON3_LIBS@
  • neercs/trunk/src/input.c

    r4036 r4048  
    182182    case 'e':
    183183    case 0x05:
    184            
    185184        screen_list->python_command = 1;
    186         screen_list->interpreter_props.x = 0;
    187         screen_list->interpreter_props.y = 0;
    188185        break;
    189186#endif
  • neercs/trunk/src/neercs.h

    r4046 r4048  
    1919#include <stdint.h>
    2020#include <caca.h>
     21
     22#include "widgets.h"
    2123
    2224enum wm_types
     
    149151{
    150152    /* Input box */
    151         int x, y;
    152     int size;
    153     char *command;
    154     char *output_err;
    155     char *output_res;
     153        struct input_box *box;
    156154};
    157155
  • neercs/trunk/src/python/interpreter.c

    r4046 r4048  
    3838#include "py_module.h"
    3939
    40 static void add_char(struct screen_list *sl, unsigned int c);
    41 static void del_char(struct screen_list *sl);
    4240static int python_execute(struct screen_list *sl);
    43  char *getStringFromPyObject(PyObject * p);
     41char *getStringFromPyObject(PyObject * p);
    4442static char *getPythonError(void);
    4543
    46 static void add_char(struct screen_list *sl, unsigned int c)
    47 {
    48     /* FIXME handle return values */
    49     if (!sl->interpreter_props.command)
    50     {
    51         sl->interpreter_props.size = 1;
    52         sl->interpreter_props.x = 0;
    53         sl->interpreter_props.command = (char *)malloc(2);
    54         sl->interpreter_props.command[0] = 0;
    55     }
    56     else
    57     {
    58         sl->interpreter_props.command =
    59             (char *)realloc(sl->interpreter_props.command,
    60                             sl->interpreter_props.size + 1);
    61     }
    62     memmove(&sl->interpreter_props.command[sl->interpreter_props.x + 1],
    63             &sl->interpreter_props.command[sl->interpreter_props.x],
    64             (sl->interpreter_props.size - sl->interpreter_props.x));
    65 
    66     sl->interpreter_props.command[sl->interpreter_props.x] = c;
    67     sl->interpreter_props.x++;
    68     sl->interpreter_props.size++;
    69 }
    70 
    71 static void del_char(struct screen_list *sl)
    72 {
    73     if (sl->interpreter_props.x < 1)
    74         return;
    75     if (sl->interpreter_props.size > 1)
    76         sl->interpreter_props.size--;
    77     else
    78         return;
    79 
    80     memcpy(&sl->interpreter_props.command[sl->interpreter_props.x - 1],
    81            &sl->interpreter_props.command[sl->interpreter_props.x],
    82            sl->interpreter_props.size - sl->interpreter_props.x);
    83 
    84     sl->interpreter_props.command =
    85         (char *)realloc(sl->interpreter_props.command,
    86                         sl->interpreter_props.size);
    87 
    88     if (sl->interpreter_props.x)
    89         sl->interpreter_props.x--;
    90     sl->interpreter_props.command[sl->interpreter_props.size - 1] = 0;
    91 }
    9244
    9345
    9446int python_command_handle_key(struct screen_list *screen_list, unsigned int c)
    9547{
    96     if (c == CACA_KEY_ESCAPE)
     48
     49    int ret = widget_ibox_handle_key(screen_list->interpreter_props.box, c);
     50
     51    if (ret == INPUT_BOX_ESC)
    9752    {
    98         if (screen_list->interpreter_props.command)
    99         {
    100             free(screen_list->interpreter_props.command);
    101             screen_list->interpreter_props.command = NULL;
    102         }
     53        widget_ibox_destroy(screen_list->interpreter_props.box);
     54        screen_list->interpreter_props.box = NULL;
    10355        screen_list->python_command = 0;
    104         screen_list->changed = 1;
    105         return 1;
    10656    }
    107     else if (c == CACA_KEY_LEFT)
    108     {
    109         if (screen_list->interpreter_props.x)
    110             screen_list->interpreter_props.x--;
    111     }
    112     else if (c == CACA_KEY_RIGHT)
    113     {
    114         if (screen_list->interpreter_props.x <
    115             screen_list->interpreter_props.size - 1)
    116             screen_list->interpreter_props.x++;
    117     }
    118     else if (c == CACA_KEY_RETURN)
     57    else if (ret == INPUT_BOX_RET)
    11958    {
    12059        python_execute(screen_list);
    12160    }
    122     else
    123     {
    124         if (c >= ' ' && c < 127)
    125             add_char(screen_list, c);
    126         else if (c == 8)
    127         {
    128             del_char(screen_list);
    129         }
    130         screen_list->changed = 1;
    131         return 0;
    132     }
     61    screen_list->changed = 1;
     62
    13363    return 0;
    13464}
     
    13666void draw_python_command(struct screen_list *screen_list)
    13767{
    138     int w = 65, h = 6;
    139     int x = (caca_get_canvas_width(screen_list->cv) - w) / 2;
    140     int y = (caca_get_canvas_height(screen_list->cv) - h) / 2;
     68    if (!screen_list->interpreter_props.box)
     69        screen_list->interpreter_props.box =
     70            widget_ibox_init(screen_list->cv, 65, 6);
    14171
    142     caca_set_color_ansi(screen_list->cv, CACA_BLUE, CACA_BLUE);
    143     caca_fill_box(screen_list->cv, x, y, w, h, '#');
    144     caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_BLUE);
    145     caca_draw_cp437_box(screen_list->cv, x, y, w, h);
    146     caca_printf(screen_list->cv, x, y, "Execute command");
    147 
    148     caca_printf(screen_list->cv, x + 2, y + 2,
    149                 "[___________________________________________________________]");
    150 
    151     if (screen_list->interpreter_props.command)
    152     {
    153         caca_printf(screen_list->cv, x + 3, y + 2,
    154                     "%s", screen_list->interpreter_props.command);
    155         caca_gotoxy(screen_list->cv,
    156                     x + 3 + screen_list->interpreter_props.x, y + 2);
    157     }
    158     else
    159     {
    160         caca_gotoxy(screen_list->cv, x + 3, y + 2);
    161     }
    162 
    163     if (screen_list->interpreter_props.output_err)
    164     {
    165         caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLUE);
    166         caca_printf(screen_list->cv, x + 2, y + 4,
    167                     screen_list->interpreter_props.output_err);
    168     }
    169     if (screen_list->interpreter_props.output_res)
    170     {
    171         caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, CACA_BLUE);
    172         caca_printf(screen_list->cv, x + 2, y + 4,
    173                     screen_list->interpreter_props.output_res);
    174     }
     72    widget_ibox_draw(screen_list->interpreter_props.box);
    17573}
    17674
     
    17876int python_init(struct screen_list *sl)
    17977{
    180     sl->interpreter_props.output_err = NULL;
    181     sl->interpreter_props.output_res = NULL;
    18278    Py_Initialize();
    183    
    18479    initNeercsModule(sl);
    185    
     80
    18681    return 0;
    18782}
     
    18984int python_close(struct screen_list *sl)
    19085{
    191     if (sl->interpreter_props.output_err)
    192         free(sl->interpreter_props.output_err);
    193     if (sl->interpreter_props.output_res)
    194         free(sl->interpreter_props.output_res);
    195     sl->interpreter_props.output_err = NULL;
    196     sl->interpreter_props.output_res = NULL;
     86    widget_ibox_destroy(sl->interpreter_props.box);
     87    sl->interpreter_props.box = NULL;
     88
    19789    Py_Finalize();
    19890    return 0;
     
    20294static int python_execute(struct screen_list *sl)
    20395{
    204     if (!sl->interpreter_props.command || sl->interpreter_props.size < 1)
     96    char *command = widget_ibox_get_text(sl->interpreter_props.box);
     97    if (!command || strlen(command) < 1)
    20598        return -1;
    20699    int err = 0;
    207100
    208     debug("py Executing '%s'\n", sl->interpreter_props.command);
     101    debug("py Executing '%s'\n", command);
    209102
    210     if (sl->interpreter_props.output_err)
    211     {
    212         free(sl->interpreter_props.output_err);
    213         sl->interpreter_props.output_err = NULL;
    214     }
    215     if (sl->interpreter_props.output_res)
    216     {
    217         free(sl->interpreter_props.output_res);
    218         sl->interpreter_props.output_res = NULL;
    219     }
    220    
     103
    221104    PyObject *pModule, *pName, *pFunc;
    222105
     
    225108    if (!pName)
    226109    {
    227         sl->interpreter_props.output_err = getPythonError();
     110        widget_ibox_set_error(sl->interpreter_props.box, getPythonError());
    228111        err = 1;
    229112        debug("py Error 1\n");
    230113        goto end;
    231114    }
    232    
     115
    233116    pModule = PyImport_Import(pName);
    234117    Py_DECREF(pName);
     
    236119    if (pModule != NULL)
    237120    {
    238         PyObject * dictionary = PyModule_GetDict(pModule);
    239        
     121        PyObject *dictionary = PyModule_GetDict(pModule);
     122
    240123        getExportedValues(dictionary);
    241        
    242                 PyObject *o = PyRun_String(sl->interpreter_props.command, Py_single_input, dictionary, NULL);
    243         if(!o)
     124
     125        PyObject *o =
     126            PyRun_String(command, Py_single_input,
     127                         dictionary, NULL);
     128        if (!o)
    244129        {
    245                 sl->interpreter_props.output_err = getPythonError();   
     130            widget_ibox_set_error(sl->interpreter_props.box, getPythonError());
    246131            err = 1;
    247132        }
     
    249134        {
    250135            setExportedValues(dictionary);
    251            
    252             sl->interpreter_props.output_res = getStringFromPyObject(o);
     136
     137            widget_ibox_set_msg(sl->interpreter_props.box, getStringFromPyObject(o));
    253138            err = 1;
    254139        }
    255                 goto end;
    256            
     140        goto end;
     141
    257142    }
    258143    else
    259144    {
    260         sl->interpreter_props.output_err = getPythonError();
     145        widget_ibox_set_error(sl->interpreter_props.box, getPythonError());
    261146        err = 1;
    262         debug("py: %s\n", sl->interpreter_props.output_err);
    263147        goto end;
    264148    }
    265149
    266150  end:
    267    
     151
    268152    Py_XDECREF(pFunc);
    269153    Py_DECREF(pModule);
    270    
     154
    271155    if (!err)
    272156    {
    273         free(sl->interpreter_props.command);
    274         sl->interpreter_props.command = NULL;
    275         sl->interpreter_props.size = 0;
    276         sl->interpreter_props.x = 0;
     157        widget_ibox_destroy(sl->interpreter_props.box);
    277158        sl->python_command = 0;
    278159    }
     
    293174
    294175    int r = asprintf(&err, "%s", evalue);
    295         (void)r;
     176    (void)r;
    296177    return err;
    297178}
    298179
    299  char *getStringFromPyObject(PyObject * p)
     180char *getStringFromPyObject(PyObject * p)
    300181{
    301182    PyObject *str = PyObject_Repr(p);
    302183    char *err = PyBytes_AS_STRING(PyUnicode_AsEncodedString(str, "utf-8",
    303184                                                            "Error ~"));
    304    
     185
    305186    char *ret = strdup(err);
    306187    return ret;
  • neercs/trunk/src/screen_list.c

    r4033 r4048  
    9898   
    9999    screen_list->python_command = 0;
    100     screen_list->interpreter_props.x = 0;
    101     screen_list->interpreter_props.y = 0;
    102     screen_list->interpreter_props.command = NULL;
    103     screen_list->interpreter_props.size = 0;
     100    screen_list->interpreter_props.box = NULL;
    104101   
    105102    screen_list->recurrent_list = NULL;
Note: See TracChangeset for help on using the changeset viewer.