コンソール AP での色
以前に NAS に SSH 接続した環境で,文字色などの変更 をやった.
確か DOS 時代に少し使った記憶があるが,コンソール AP で使ってみたいと思い調べてのメモ.
先ず,コマンドプロンプトでの動作から.
echo ^G
‘^G’ の入力は,「Ctrl」+「G」.
「Enter」すると,ブザー(BEL)が鳴る.
今度は,次の様なバイナリデータのファイルを用意しての表示.
それを type で表示する(Linux 環境などでは cat ).
echo を使っての ‘ESC [‘ 入力がわからなかったが,いろいろ試すと「Ctrl」+「[」で入った.
echo ^[[103m
echo ^[[30m
最初わからなかったが,Linux 環境などでは
echo -e “\x1b[103m”
BEL の所に書いてあった.
以前試した時もそうだったと思うが,コマンドプロンプトでそのまま実行してもうまく機能しない.
またその頃はまだメインの開発機は Win7 だったこともありそれ以上は試していなかった.
一度ファイルにリダイレクトして type すると意図した動作になる.
「Windows ESC CSI」で検索すると次の所が見つかる.
コンソールの仮想ターミナル シーケンス
ここを見ると ::SetConsoleMode で ENABLE_VIRTUAL_TERMINAL_PROCESSING を指定するとある.
それで次の様なコードで試すとうまくいった.
#ifdef _WIN32
#ifdef ENABLE_PROCESSED_OUTPUT
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#endif
#endif
#endif
// ...
{
// ...
can_CSI = true ;
#ifdef _WIN32
BOOL can_ESC = FALSE ;
#ifdef ENABLE_PROCESSED_OUTPUT
HANDLE hout = ::GetStdHandle(STD_OUTPUT_HANDLE) ;
DWORD mode = 0 ;
::GetConsoleMode(hout,&mode) ;
mode|= ENABLE_VIRTUAL_TERMINAL_PROCESSING ;
can_ESC = ::SetConsoleMode(hout, mode) ;
#endif
can_CSI = (can_ESC == TRUE) ;
#endif
if (change_bg) {
if (can_CSI) {
std::terr << _T("\x1b[107m") ;
std::terr << _T("\x1b[30m") ;
std::terr << _T("\x1b[0J") ;
// std::terr << _T("\x1b[;H") ;
}
}
// ...
}
CSI.hxx
ちょっとうまくない部分もある?が,何とか.
python だと
from ctypes import windll , wintypes , byref
kernel = windll.kernel32
hout = kernel.GetStdHandle(-11)
mode = wintypes.DWORD()
kernel.GetConsoleMode(hout,byref(mode))
mode.value |= 4
kernel.SetConsoleMode(hout,mode)
print ('\033[96m')
参考にさせてもらったところ.
第3章5 エスケープシーケンスで文字の色、背景の色を変更
2023/03/24
次の様に利用できる.
#include <iostream>
#include "CSI.hxx"
#include "tstring.hxx"
int _tmain (int argc,TCHAR* argv[])
{
CSI csi ;
{
tstring buf ;
buf.resize(1000) ;
std::terr << _T("wait...") ;
std::tin.getline(&buf[0],std::streamsize(buf.size())) ;
}
return 0 ;
}
CCmdUI::SetText
以前,VC 11 以降で メニューのテキストがうまく更新できない 現象があった.
この時,オーナードローを使っている所は解決した(個人的なコードのバグだった).
が,普通のサブメニューの方はうまくないままとなっていて,それを今回改めて調べてみた.
デバッガで追いかけると,CcmdUI::SetText は呼ばれている.
MFC のコードを見ると,ModifyMenu と SetMenuItemInfo の違いがある.
サブメニューの場合にうまくないのかと思い,単体テスト用のコードを書いてみたが,再現できない.
void CM_textView::OnUpdateMenuItem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CString now = CTime::GetCurrentTime().Format(_T("%H:%M:%S")) ;
pCmdUI->SetText(now) ;
}
void CM_textView::OnMenuItem(UINT nID)
{
// TODO: Add your command handler code here
}
何か他の条件があるみたい.
CMenu::TrackPopupMenu で表示するメニューではうまく更新されている.
メニューバーの項目としてコマンドを割り当て,そこから TrackPopupMenu を呼出すことで対応.
DSM 7 と WordPress , Joomla!
2021/07 に Synology NAS の DSM を更新 .
WordPress は動作しているが Joomla! はうまくないまま.
今日 Maria DB と WordPress ,Joomla! の更新版があったので更新した.
前回と同様 でうまく開かない.
WordPress のインストールされたところをみると .htaccess が存在しない.
以前バックアップしたものをコピー.
これで WordPress はうまく動作する様になった.
Joomla! の方は相変わらず.
2022/02
Joomla! は …/joomla/index.php/… の形式であれば問題ない.
そのため,直接参照している所に index.php/ を付加することで対応した.