Ticket #2854: terminal_r30297.diff

File terminal_r30297.diff, 7.9 KB (added by oco, 15 years ago)

Patch that implement xterm mouse mode 9, 1000 and 1002

  • src/apps/terminal/TermParse.cpp

     
    10941094            // screen).
    10951095            // Not supported yet.
    10961096            break;
     1097        case 9:
     1098            // Set Mouse X and Y on button press.
     1099            fBuffer->ReportX10MouseEvent(true);
     1100            break;
    10971101        case 12:
    10981102            // Start Blinking Cursor.
    10991103            // Not supported yet.
     
    11071111            fBuffer->UseAlternateScreenBuffer(false);
    11081112            break;
    11091113        case 1000:
    1110             // TODO: Send Mouse X & Y on button press and release.
     1114            // Send Mouse X & Y on button press and release.
     1115            fBuffer->ReportNormalMouseEvent(true);
    11111116            break;
     1117        case 1002:
     1118            // Send Mouse X and Y on button press and release, and on motion
     1119            // when the mouse enter a new cell
     1120            fBuffer->ReportBtnMouseEvent(true);
     1121            break;
    11121122        case 1003:
    11131123            // Use All Motion Mouse Tracking
    11141124            fBuffer->ReportAnyMouseEvent(true);
     
    11551165            // Normal Video (Leaves Reverse Video, cf. there).
    11561166            // Not supported yet.
    11571167            break;
     1168        case 9:
     1169            // Disable Mouse X and Y on button press.
     1170            fBuffer->ReportX10MouseEvent(false);
     1171            break;
    11581172        case 12:
    11591173            // Stop Blinking Cursor.
    11601174            // Not supported yet.
     
    11681182            fBuffer->UseNormalScreenBuffer();
    11691183            break;
    11701184        case 1000:
    1171             // TODO: Don't send Mouse X & Y on button press and release.
     1185            // Don't send Mouse X & Y on button press and release.
     1186            fBuffer->ReportNormalMouseEvent(false);
    11721187            break;
     1188        case 1002:
     1189            // Don't send Mouse X and Y on button press and release, and on motion
     1190            // when the mouse enter a new cell
     1191            fBuffer->ReportBtnMouseEvent(false);
     1192            break;
    11731193        case 1003:
    11741194            // Disable All Motion Mouse Tracking.
    11751195            fBuffer->ReportAnyMouseEvent(false);
  • src/apps/terminal/TermView.cpp

     
    171171    fRows(ROWS_DEFAULT),
    172172    fEncoding(M_UTF8),
    173173    fScrBufSize(historySize),
     174    fReportX10MouseEvent(false),
     175    fReportNormalMouseEvent(false),
     176    fReportBtnMouseEvent(false),
    174177    fReportAnyMouseEvent(false)
    175178{
    176179    _InitObject(argc, argv);
     
    185188    fRows(rows),
    186189    fEncoding(M_UTF8),
    187190    fScrBufSize(historySize),
     191    fReportX10MouseEvent(false),
     192    fReportNormalMouseEvent(false),
     193    fReportBtnMouseEvent(false),
    188194    fReportAnyMouseEvent(false)
    189195{
    190196    _InitObject(argc, argv);
     
    210216    fRows(ROWS_DEFAULT),
    211217    fEncoding(M_UTF8),
    212218    fScrBufSize(1000),
     219    fReportX10MouseEvent(false),
     220    fReportNormalMouseEvent(false),
     221    fReportBtnMouseEvent(false),
    213222    fReportAnyMouseEvent(false)
    214223{
    215224    // We need this
     
    280289    fMouseTracking = false;
    281290    fIMflag = false;
    282291    fCheckMouseTracking = false;
     292    fPrevPos = TermPos(-1, - 1);
     293    fReportX10MouseEvent = false;
     294    fReportNormalMouseEvent = false;
     295    fReportBtnMouseEvent = false;
    283296    fReportAnyMouseEvent = false;
    284297
    285298    fTextBuffer = new(std::nothrow) TerminalBuffer;
     
    15211534                SetTitle(title);
    15221535            break;
    15231536        }
    1524         case MSG_REPORT_ANY_MOUSE_EVENT:
     1537        case MSG_REPORT_MOUSE_EVENT:
    15251538        {
     1539            bool reportX10MouseEvent;
     1540            if (msg->FindBool("reportX10MouseEvent", &reportX10MouseEvent) == B_OK)
     1541                fReportX10MouseEvent = reportX10MouseEvent;
     1542
     1543            bool reportNormalMouseEvent;
     1544            if (msg->FindBool("reportNormalMouseEvent", &reportNormalMouseEvent) == B_OK)
     1545                fReportNormalMouseEvent = reportNormalMouseEvent;
     1546
     1547            bool reportBtnMouseEvent;
     1548            if (msg->FindBool("reportBtnMouseEvent", &reportBtnMouseEvent) == B_OK)
     1549                fReportBtnMouseEvent = reportBtnMouseEvent;
     1550
    15261551            bool reportAnyMouseEvent;
    15271552            if (msg->FindBool("reportAnyMouseEvent", &reportAnyMouseEvent) == B_OK)
    15281553                fReportAnyMouseEvent = reportAnyMouseEvent;
     
    20772102
    20782103    fMouseButtons = buttons;
    20792104
    2080     if (fReportAnyMouseEvent) {
     2105    if (fReportAnyMouseEvent || fReportBtnMouseEvent || fReportNormalMouseEvent
     2106        || fReportX10MouseEvent) {
    20812107
    20822108        TermPos clickPos = _ConvertToTerminal(where);
    20832109        _SendMouseEvent(buttons, modifier, clickPos.x, clickPos.y, false);
     
    21692195void
    21702196TermView::MouseMoved(BPoint where, uint32 transit, const BMessage *message)
    21712197{
    2172     if (fReportAnyMouseEvent) {
     2198    if (fReportAnyMouseEvent || fReportBtnMouseEvent) {
    21732199        int32 modifier;
    21742200        Window()->CurrentMessage()->FindInt32("modifiers", &modifier);
    21752201
    21762202        TermPos clickPos = _ConvertToTerminal(where);
     2203       
     2204        if (fReportBtnMouseEvent) {
     2205            if (fPrevPos.x != clickPos.x || fPrevPos.y != clickPos.y) {
     2206                _SendMouseEvent(fMouseButtons, modifier, clickPos.x, clickPos.y, true);
     2207            }
     2208            fPrevPos = clickPos;
     2209            return;
     2210        }
    21772211        _SendMouseEvent(fMouseButtons, modifier, clickPos.x, clickPos.y, true);
    21782212        return;
    21792213    }
     
    22542288    int32 buttons;
    22552289    Window()->CurrentMessage()->FindInt32("buttons", &buttons);
    22562290
    2257     if (fReportAnyMouseEvent) {
     2291    if (fReportAnyMouseEvent || fReportBtnMouseEvent
     2292        || fReportNormalMouseEvent) {
     2293
    22582294        TermPos clickPos = _ConvertToTerminal(where);
    22592295        _SendMouseEvent(0, 0, clickPos.x, clickPos.y, false);
    22602296    } else {
  • src/apps/terminal/TerminalBuffer.h

     
    3535            void                UseAlternateScreenBuffer(bool clear);
    3636            void                UseNormalScreenBuffer();
    3737           
     38            void                ReportX10MouseEvent(bool reportX10MouseEvent);
     39            void                ReportNormalMouseEvent(bool reportNormalMouseEvent);
     40            void                ReportBtnMouseEvent(bool reportBtnMouseEvent);
    3841            void                ReportAnyMouseEvent(bool reportAnyMouseEvent);
    3942
    4043protected:
  • src/apps/terminal/TerminalBuffer.cpp

     
    7575
    7676
    7777void
     78TerminalBuffer::ReportX10MouseEvent(bool reportX10MouseEvent)
     79{
     80    if (fListenerValid) {
     81        BMessage message(MSG_REPORT_MOUSE_EVENT);
     82        message.AddBool("reportX10MouseEvent", reportX10MouseEvent);
     83        fListener.SendMessage(&message);
     84    }
     85}
     86
     87
     88void
     89TerminalBuffer::ReportNormalMouseEvent(bool reportNormalMouseEvent)
     90{
     91    if (fListenerValid) {
     92        BMessage message(MSG_REPORT_MOUSE_EVENT);
     93        message.AddBool("reportNormalMouseEvent", reportNormalMouseEvent);
     94        fListener.SendMessage(&message);
     95    }
     96}
     97
     98
     99void
     100TerminalBuffer::ReportBtnMouseEvent(bool reportBtnMouseEvent)
     101{
     102    if (fListenerValid) {
     103        BMessage message(MSG_REPORT_MOUSE_EVENT);
     104        message.AddBool("reportBtnMouseEvent", reportBtnMouseEvent);
     105        fListener.SendMessage(&message);
     106    }
     107}
     108
     109
     110void
    78111TerminalBuffer::ReportAnyMouseEvent(bool reportAnyMouseEvent)
    79112{
    80113    if (fListenerValid) {
    81         BMessage message(MSG_REPORT_ANY_MOUSE_EVENT);
     114        BMessage message(MSG_REPORT_MOUSE_EVENT);
    82115        message.AddBool("reportAnyMouseEvent", reportAnyMouseEvent);
    83116        fListener.SendMessage(&message);
    84117    }   
  • src/apps/terminal/TermView.h

     
    254254            int             fSelectGranularity;
    255255            BPoint          fLastClickPoint;
    256256           
     257            // mouse
     258            TermPos         fPrevPos;           
     259            bool            fReportX10MouseEvent;
     260            bool            fReportNormalMouseEvent;
     261            bool            fReportBtnMouseEvent;
    257262            bool            fReportAnyMouseEvent;
    258263
    259264            // Input Method parameter.
  • src/apps/terminal/TermConst.h

     
    9191const uint32 MSG_TERMINAL_BUFFER_CHANGED        = 'bufc';
    9292const uint32 MSG_SET_TERMNAL_TITLE              = 'sett';
    9393const uint32 MSG_QUIT_TERMNAL                   = 'qutt';
    94 const uint32 MSG_REPORT_ANY_MOUSE_EVENT         = 'mous';
     94const uint32 MSG_REPORT_MOUSE_EVENT             = 'mous';
    9595
    9696// Preference Read/Write Keys
    9797const char* const PREF_HALF_FONT_FAMILY = "Half Font Family";