Changeset 4110 for neercs


Ignore:
Timestamp:
Dec 8, 2009, 3:57:08 PM (10 years ago)
Author:
Jean-Yves Lamoureux
Message:
  • Improved X10 mouse emulation, mc now accepts its click. Added MOUSER command to client/server as 'Mouse Release' command.
Location:
neercs/trunk/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/ansi.c

    r4098 r4110  
    556556                    char *end;
    557557                    int Pm = strtol(arg, &end, 10);
    558                    
    559                     c = buffer[i + 3 + (end-arg)];
     558
     559                    c = buffer[i + 3 + (end - arg)];
    560560
    561561                    debug("ansi private mouse : command %c, arg %d", c, Pm);
     
    567567                            /* FIXME Handle different modes */
    568568                        case 9:
     569                            debug("mouse : X10 mode\n");
     570                            sc->report_mouse = MOUSE_X10;
     571                            break;
    569572                        case 1000:     /* Send Mouse X & Y on button press
    570573                                           and release.  */
     574                                debug("mouse : VT200 mode\n");
     575                            sc->report_mouse = MOUSE_VT200;
     576                            break;
    571577                        case 1001:     /* Use Hilite Mouse Tracking.  */
     578                                debug("mouse : VT200_HIGHLIGHT mode\n");
     579                            sc->report_mouse = MOUSE_VT200_HIGHLIGHT;
     580                            break;
    572581                        case 1002:     /* Use Cell Motion Mouse Tracking. */
     582                                debug("mouse : BTN mode\n");
     583                            sc->report_mouse = MOUSE_BTN_EVENT;
     584                            break;
    573585                        case 1003:     /* Use All Motion Mouse Tracking.  */
    574                             sc->report_mouse = 1;
     586                                debug("mouse : ANY mode\n");
     587                            sc->report_mouse = MOUSE_ANY_EVENT;
    575588                            break;
    576589                        default:
     
    590603                        case 1002:     /* Use Cell Motion Mouse Tracking. */
    591604                        case 1003:     /* Use All Motion Mouse Tracking.  */
    592                             sc->report_mouse = 0;
     605                            sc->report_mouse = MOUSE_NONE;
    593606                            debug("ansi private mouse : NOT reporting mouse");
    594607                            break;
     
    914927                if (((ch > ' ') && (ch <= '~'))
    915928                    &&
    916                     (sc->
    917                      conv_state.gn[sc->conv_state.ss ? sc->
    918                                    conv_state.gn[sc->conv_state.ss] : sc->
    919                                    conv_state.glr[0]] == '0'))
     929                    (sc->conv_state.
     930                     gn[sc->conv_state.ss ? sc->conv_state.
     931                        gn[sc->conv_state.ss] : sc->conv_state.glr[0]] == '0'))
    920932                {
    921933                    ch = dec_acs(ch);
  • neercs/trunk/src/client.c

    r4098 r4110  
    4949    screen_list->cv = caca_create_canvas(0, 0);
    5050    screen_list->dp = caca_create_display(screen_list->cv);
     51    screen_list->mouse_button = 0;
    5152
    5253    if (!screen_list->dp)
     
    9899        char buf[52];
    99100        int bytes;
     101        screen_list->mouse_button = caca_get_event_mouse_button(&ev);
    100102        bytes = snprintf(buf, sizeof(buf) - 1, "MOUSEP %10d %10d %10d",
    101103                         caca_get_mouse_x(screen_list->dp),
    102104                         caca_get_mouse_y(screen_list->dp),
    103                          caca_get_event_mouse_button(&ev));
     105                         screen_list->mouse_button);
    104106        buf[bytes] = '\0';
    105107        debug("Sending '%s', %d bytes\n", buf, strlen(buf));
     
    107109                     strlen(buf) + 1) <= 0;
    108110    }
     111    else if (t & CACA_EVENT_MOUSE_RELEASE)
     112    {
     113        char buf[52];
     114        int bytes;
     115        bytes = snprintf(buf, sizeof(buf) - 1, "MOUSER %10d %10d %10d",
     116                         caca_get_mouse_x(screen_list->dp),
     117                         caca_get_mouse_y(screen_list->dp),
     118                         screen_list->mouse_button);
     119        buf[bytes] = '\0';
     120        screen_list->mouse_button = 0;
     121        debug("Sending '%s', %d bytes\n", buf, strlen(buf));
     122        return write(screen_list->comm.socket[SOCK_SERVER], buf,
     123                     strlen(buf) + 1) <= 0;
     124    }
    109125    else if (t & CACA_EVENT_MOUSE_MOTION)
    110126    {
    111127        int x = caca_get_mouse_x(screen_list->dp);
    112128        int y = caca_get_mouse_y(screen_list->dp);
     129        int b = screen_list->mouse_button;
     130        debug("Mouse motion, button %d\n", b);
    113131        if (x != screen_list->old_x || y != screen_list->old_y)
    114132        {
    115133            screen_list->old_x = caca_get_mouse_x(screen_list->dp);
    116134            screen_list->old_y = caca_get_mouse_y(screen_list->dp);
    117 
     135           
    118136            char buf[52];
    119137            int bytes;
    120             bytes = snprintf(buf, sizeof(buf) - 1, "MOUSEM %10d %10d",
     138            bytes = snprintf(buf, sizeof(buf) - 1, "MOUSEM %10d %10d %10d",
    121139                             caca_get_mouse_x(screen_list->dp),
    122                              caca_get_mouse_y(screen_list->dp));
     140                             caca_get_mouse_y(screen_list->dp),
     141                             b>=0?b:0);
    123142            buf[bytes] = '\0';
    124143            debug("Sending '%s', %d bytes\n", buf, strlen(buf));
  • neercs/trunk/src/neercs.h

    r4098 r4110  
    3030
    3131    WM_MAX,
     32};
     33
     34enum mouse_report
     35{
     36        MOUSE_NONE,
     37    MOUSE_X10,
     38    MOUSE_VT200,
     39    MOUSE_VT200_HIGHLIGHT,
     40    MOUSE_BTN_EVENT,
     41    MOUSE_ANY_EVENT,
    3242};
    3343
     
    244254    int width, height;           /* caca window size */
    245255    int old_x, old_y;            /* Mouse */
     256    int mouse_button;
    246257    caca_canvas_t *cv;
    247258    caca_display_t *dp;
  • neercs/trunk/src/screens.c

    r4075 r4110  
    4444    s->h = h;
    4545    s->bell = 0;
    46     s->report_mouse = 0;
     46    s->report_mouse = MOUSE_NONE;
    4747
    4848    s->fd = create_pty_grab(pid, w, h, &s->pid);
     
    7474    s->visible = 1;
    7575    s->scroll = 0;
    76     s->report_mouse = 0;
     76    s->report_mouse = MOUSE_NONE;
    7777    s->fd = create_pty(command, w, h, &s->pid);
    7878
  • neercs/trunk/src/server.c

    r4099 r4110  
    121121        int x, y, i;
    122122
    123         getsockopt(screen_list->comm.socket[SOCK_CLIENT], SOL_SOCKET, SO_SNDBUF,
    124                    &bufsize, &optlen);
     123        getsockopt(screen_list->comm.socket[SOCK_CLIENT], SOL_SOCKET,
     124                   SO_SNDBUF, &bufsize, &optlen);
    125125        bufsize /= 2;
    126126        debug("bufsize=%d", bufsize);
     
    251251        else if (!strncmp("MOUSEP ", buf, 6))
    252252        {
    253             if (screen_list->screen[screen_list->pty]->report_mouse)
    254             {
    255                 int x = 1 + atoi(buf + 7) - screen_list->screen[screen_list->pty]->x;
    256                 int y = 1 + atoi(buf + 18) - screen_list->screen[screen_list->pty]->y;
    257                 int b = atoi(buf + 28);
    258                 sprintf(buf, "\x1b[M%c%c%c", '@'+(b-1), x+32, y+32);
     253            debug("Got mouse press '%s'\n", buf);
     254            int x, y, b;
     255            x = 1 + atoi(buf + 7) - screen_list->screen[screen_list->pty]->x;
     256            y = 1 + atoi(buf + 18) - screen_list->screen[screen_list->pty]->y;
     257            b = atoi(buf + 28);
     258
     259            switch (screen_list->screen[screen_list->pty]->report_mouse)
     260            {
     261            case MOUSE_VT200:
     262            case MOUSE_VT200_HIGHLIGHT:
     263            case MOUSE_BTN_EVENT:
     264            case MOUSE_ANY_EVENT:
     265                sprintf(buf, "\x1b[M%c%c%c", 32 + (b - 1), x + 32, y + 32);
     266                debug("mousea send ESC[M %d %d %d", (b - 1), x + 32, y + 32);
    259267                send_ansi_sequence(screen_list, buf);
    260             }
    261         }
     268                break;
     269            case MOUSE_X10:
     270                sprintf(buf, "\x1b[M%c%c%c", 32 + (b - 1), 32 + x, 32 + y);
     271                debug("mousex send ESC[M %d %d %d", 32 + (b - 1), 32 + x,
     272                      32 + y);
     273                send_ansi_sequence(screen_list, buf);
     274                break;
     275            case MOUSE_NONE:
     276                break;
     277
     278            }
     279        }
     280        else if (!strncmp("MOUSER ", buf, 6))
     281        {
     282            debug("Got mouse release '%s'\n", buf);
     283            int x, y, b;
     284            x = 1 + atoi(buf + 7) - screen_list->screen[screen_list->pty]->x;
     285            y = 1 + atoi(buf + 18) - screen_list->screen[screen_list->pty]->y;
     286            b = atoi(buf + 28);
     287
     288            switch (screen_list->screen[screen_list->pty]->report_mouse)
     289            {
     290            case MOUSE_VT200:
     291            case MOUSE_VT200_HIGHLIGHT:
     292            case MOUSE_BTN_EVENT:
     293            case MOUSE_ANY_EVENT:
     294                sprintf(buf, "\x1b[M%c%c%c", 32 + 3, x + 32, y + 32);
     295                send_ansi_sequence(screen_list, buf);
     296                break;
     297            case MOUSE_X10:
     298                sprintf(buf, "\x1b[M%c%c%c", 32 + 3, 32 + x, 32 + y);
     299                send_ansi_sequence(screen_list, buf);
     300                break;
     301            case MOUSE_NONE:
     302                break;
     303            }
     304        }
     305
    262306        else if (!strncmp("MOUSEM ", buf, 6))
    263307        {
    264             if (screen_list->screen[screen_list->pty]->report_mouse)
    265             {
    266                 int x = 1 + atoi(buf + 7) - screen_list->screen[screen_list->pty]->x;
    267                 int y = 1 + atoi(buf + 18) - screen_list->screen[screen_list->pty]->y;
    268                 sprintf(buf, "\x1b[M%c%c%c", '@', x+32, y+32);
     308            debug("Got mouse motion '%s'\n", buf);
     309            int x, y, b;
     310            x = 1 + atoi(buf + 7) - screen_list->screen[screen_list->pty]->x;
     311            y = 1 + atoi(buf + 18) - screen_list->screen[screen_list->pty]->y;
     312            b = atoi(buf + 28);
     313
     314            switch (screen_list->screen[screen_list->pty]->report_mouse)
     315            {
     316            case MOUSE_X10:    // X10 reports mouse clicks only
     317                if (b)
     318                {
     319                    sprintf(buf, "\x1b[M%c%c%c", 32 + (b - 1), x + 32, y + 32);
     320                    send_ansi_sequence(screen_list, buf);
     321                }
     322                break;
     323            case MOUSE_VT200:
     324            case MOUSE_VT200_HIGHLIGHT:
     325            case MOUSE_BTN_EVENT:
     326                if (b)
     327                {
     328                    sprintf(buf, "\x1b[M%c%c%c", 32 + (b - 1), x + 32, y + 32);
     329                    send_ansi_sequence(screen_list, buf);
     330                }
     331            case MOUSE_ANY_EVENT:
     332                sprintf(buf, "\x1b[M%c%c%c", 32 + (b - 1), x + 32, y + 32);
    269333                send_ansi_sequence(screen_list, buf);
     334                break;
     335            case MOUSE_NONE:
     336                break;
    270337            }
    271338        }
Note: See TracChangeset for help on using the changeset viewer.