size_t Driver::EditLineInputReaderCallback ( void *baton, SBInputReader *reader, InputReaderAction notification, const char *bytes, size_t bytes_len ) { Driver *driver = (Driver *)baton; switch (notification) { case eInputReaderActivate: break; case eInputReaderReactivate: driver->ReadyForCommand(); break; case eInputReaderDeactivate: break; case eInputReaderAsynchronousOutputWritten: if (driver->m_io_channel_ap.get() != NULL) driver->m_io_channel_ap->RefreshPrompt(); break; case eInputReaderInterrupt: if (driver->m_io_channel_ap.get() != NULL) { SBProcess process = driver->GetDebugger().GetSelectedTarget().GetProcess(); if (!driver->m_io_channel_ap->EditLineHasCharacters() && process.IsValid() && process.GetState() == lldb::eStateRunning) { process.Stop(); } else { driver->m_io_channel_ap->OutWrite ("^C\n", 3, NO_ASYNC); // I wish I could erase the entire input line, but there's no public API for that. driver->m_io_channel_ap->EraseCharsBeforeCursor(); driver->m_io_channel_ap->RefreshPrompt(); } } break; case eInputReaderEndOfFile: if (driver->m_io_channel_ap.get() != NULL) { driver->m_io_channel_ap->OutWrite ("^D\n", 3, NO_ASYNC); driver->m_io_channel_ap->RefreshPrompt (); } #ifdef __unix__ write (driver->m_editline_pty.GetMasterFileDescriptor(), "quit\n", 5); #endif break; case eInputReaderGotToken: #ifdef __unix__ write (driver->m_editline_pty.GetMasterFileDescriptor(), bytes, bytes_len); #endif break; case eInputReaderDone: break; } return bytes_len; }