📄 wyterminal.cpp
字号:
/* Copyright is licensed under GNU LGPL. by I.J.Wang 2003*/#define WYLIB_SOURCE#include "wyterminal.h"#include "wy__cfunc.h"#include "wy__cfunc_tty.h" // for wyc_tcdrain(..)#include <cstring> // for std::strlen#include <unistd.h>#include <new> // for new#include <typeinfo>const char WyTerminal::class_name[]="WyTerminal";int wyc_ttyname(int fd,char* buf, size_t blen){ return( ::ttyname_r(fd,buf,blen) );};WyTerminal::WyTerminal()try : WyChrFile(){}catch(const WyChrFile::Reply& e) { WY_THROW( Reply(e) );}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyTerminal::WyTerminal(WyFileHandle fh)try : WyChrFile(fh){ if(fh.is_default()==false) { if(wyc_isatty(this->wy_fd())!=1) { WY_THROW( Reply(Wym_EBADF) ); } }}catch(const Reply&) { throw;}catch(const WyChrFile::Reply& e) { WY_THROW( Reply(e) );}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyTerminal::WyTerminal(const WySysFile& termf)try : WyChrFile(termf){ if(termf.is_default()==false) { if(wyc_isatty(this->wy_fd())!=1) { WY_THROW( Reply(Wym_EBADF) ); } }}catch(const Reply&) { throw;}catch(const WyChrFile::Reply& e) { WY_THROW( Reply(e) );}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyTerminal::WyTerminal(const char* pname,int f)try : WyChrFile(pname,f){ if(wyc_isatty(this->wy_fd())!=1) { WY_THROW( Reply(Wym_EBADF) ); }}catch(const Reply&) { throw;}catch(const WyChrFile::Reply& e) { WY_THROW( Reply(e) );}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyTerminal::WyTerminal(const WyStr& pname,int f)try : WyChrFile(pname,f){ if(wyc_isatty(this->wy_fd())!=1) { WY_THROW( Reply(Wym_EBADF) ); }}catch(const Reply&) { throw;}catch(const WyChrFile::Reply& e) { WY_THROW( Reply(e) );}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyTerminal::WyTerminal(const WyTerminal& termf)try : WyChrFile(termf){}catch(const WyChrFile::Reply& e) { WY_THROW( Reply(e) );}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyTerminal::WyTerminal(WyTerminal& termf, Wy::ByMove_t) WY__TSPC() : WyChrFile(termf,Wy::ByMove){};WyRet WyTerminal::reset(WyFileHandle fh){ if(fh.is_default()==false) { if(wyc_isatty(fh.fd())!=1) { WY_RETURN(Wym_EBADF); } } const WyRet r( WyChrFile::reset(fh) ); if(r!=Ok) { WY_RETURN(r); } return(Ok);};WyRet WyTerminal::reset(const WySysFile& termf) { if(termf.is_default()==false) { if(wyc_isatty(termf.wy_fd())!=1) { WY_RETURN(Wym_EBADF); } } const WyRet r(WyChrFile::reset(termf)); if(r!=Ok) { WY_RETURN(r); } return(Ok);};WyRet WyTerminal::reset(const WyStr& pname,int f) try { // Note: There is no _alloc(const WyStr&,f)', but that's the same thing // WyTerminal tmp(pname,f); WyRet r( this->reset(tmp) ); if(r!=Ok) { WY_RETURN(r); } return(Ok);}catch(const Reply& e) { WY_RETURN(e);}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyRet WyTerminal::reset(const char* pname,int f) try { // Note: There is no _alloc(const WyStr&,f)', but that's the same thing // WyTerminal tmp(pname,f); WyRet r( this->reset(tmp) ); if(r!=Ok) { WY_RETURN(r); } return(Ok);}catch(const Reply& e) { WY_RETURN(e);}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyTerminal* WyTerminal::_alloc(WyRet& r) consttry { if(WY__EQU_TYPEID(*this,WyTerminal)==false) { r=Wym_ENOSYS; WY_HERE(r); // _alloc not overridden return(NULL); } WyTerminal* p=new(std::nothrow) WyTerminal(); if(p==NULL) { r=Wym_ENOMEM; WY_HERE(r); } else { r=Ok; } return(p);}catch(const Reply& e) { r=e; WY_HERE(r); return(NULL);}catch(const WyRet& e) { WY_NDEBUG_MSG(e); WY_THROW( WyRet(e) );};WyRet WyTerminal::drain(void) { const WyRet r( WyChrFile::_tcdrain() ); if(r!=Ok) { WY_RETURN(r); } return(Ok);};WyRet WyTerminal::sendbreak(int duration) { if(::tcsendbreak(WyChrFile::wy_fd(),duration)!=0) { WY_RETURN(errno); } return(Ok);};WyRet WyTerminal::flush(int qsel) { if(::tcflush(WyChrFile::wy_fd(), qsel)!=0) { WY_RETURN(errno); } return(Ok);};WyRet WyTerminal::flow(int duration) { if(::tcflow(WyChrFile::wy_fd(),duration)!=0) { WY_RETURN(errno); } return(Ok);};WyRet WyTerminal::getattr(WyTermios& tio) const { if(::tcgetattr(WyChrFile::wy_fd(),tio.wy_tio_ptr())!=0) { WY_RETURN(errno); } return(Ok);};WyRet WyTerminal::setattr(const WyTermios& tio, int option) { if(::tcsetattr(WyChrFile::wy_fd(),option,tio.wy_tio_ptr())!=0) { WY_RETURN(errno); } return(Ok);};WyRet WyTerminal::devname(WyStr& pathname) const { const size_t PathMax=PATH_MAX; // not sure this is right WyStr buf; WyRet r( buf._reserve(PathMax) ); if(r!=Ok) { WY_RETURN(r); } const int v=wyc_ttyname(this->wy_fd(),&buf[0],PathMax); if(v!=0) { WY_RETURN(WyReply(v)); } buf._setsize(std::strlen(buf.data())); buf.swap(pathname); return(Ok);};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -