功能:讀取/儲存.ans檔案設定文字前景背景色設定文字閃爍複製/貼上ansi文字這個editor是基於CTermData與CTelnetCon製作的,存放文字與顏色資訊的作法是沿用原本的設計存在m_Screen與CharAttr中。
當開啟ansi editor時,一樣是會new一個CTelnetCon出來,只是差在使用者的input會由editor來處理,而非發raw string給伺服器
在 2014年4月7日 下午10:27,Roy Lu <roymer...@gmail.com> 寫道:
> Hi, 我把editor的實作移到一個新的class CEditor中了,所以從目前的commit重新製作了一個patch,
> 也只包含了必要的修改,原本那個雜七雜八的patch就請忽略他吧。
hi Roy,
Good Job!
在沒有任何連線的狀態下,在 pcmanx 畫面按下 "blink" checkbox,會導致 SegFault,以下是 gdb 顯示的 backtrace:
Program received signal SIGSEGV, Segmentation fault.
CMainFrame::SetBlink (togglebutton=0x8cf4b0, _this=0x7ba780) at
mainframe.cpp:1943
1943 if( _this->GetCurCon()->m_isAnsiEditor == false){
另外,請考慮以下程式碼修改:
(1) coding style 的不一致,還有 ansi editor 的說明不夠簡單扼要
+/**
+ * @brief ????ansi editor?????
+ */
+void CTermView::UpdateEditor(){
+ //m_Caret.Hide(); //trying to fix caret problem.
+
(2) UpdateEditor() 是否有不需要每次都全部清除畫面的解決方案?
+ m_pTermData->m_CaretPos.x = 0;
+ m_pTermData->m_CaretPos.y = 0;
+
+ //clear screen.
+ m_pTermData->ClearScreen(2);
+ m_pTermData->EditorActions("LoadEditorText");
+
+ //reset caret position
+ m_pTermData->m_CaretPos.x = x;
+ m_pTermData->m_CaretPos.y = y;
(3) 不妨先合併一部分 editor 程式碼,有問題的 blink 拆成另一個 patch,日後解決再整合?
+ // Ansi Editor widget: blink check box. Now it's disabled temporary.
+ m_chkBlink = gtk_check_button_new_with_label("blink");
+ // disable blink button because blink attr still has some problems
+ //gtk_widget_set_sensitive(m_chkBlink, false);
(4) 請將自己的名字標注於程式碼
--- /dev/null
+++ b/src/view/editor.cpp
@@ -0,0 +1,821 @@
+/**
+ * Copyright (c) 2005 PCMan <pcma...@gmail.com>
(5) 可否考慮更明確的命名?Send() 令人混淆
+/**
+ * @brief Deal with user input. Store the text in TermData.
+ */
+int CEditor::Send( void* buf, int length )
+{
(6) 可否改用 enum + switch 改寫嗎?
+void CEditor::EditorActions(string ins, string arg)
+{
+ if(ins == "InitAnsiEditor"){
+ InitAnsiEditor();
+ }
+
+ if(ins == "MoveUp"){
+ MoveUp();
+ }
+
+ if(ins == "MoveDown"){
+ MoveDown();
+ }
(7) 有需要揭露這麼多 public function 嗎?
+class CEditor: public CTelnetCon
+{
+public:
+ CEditor(CTermView* pView, CSite& SiteInfo);
+ ~CEditor();
...
+ void MoveUp();
+ void MoveDown();
+ void MoveLeft();
Thanks,
-jserv
(3) 不妨先合併一部分 editor 程式碼,有問題的 blink 拆成另一個 patch,日後解決再整合?
+ // Ansi Editor widget: blink check box. Now it's disabled temporary.
+ m_chkBlink = gtk_check_button_new_with_label("blink");
+ // disable blink button because blink attr still has some problems
+ //gtk_widget_set_sensitive(m_chkBlink, false);
(4) 請將自己的名字標注於程式碼
--- /dev/null
+++ b/src/view/editor.cpp
@@ -0,0 +1,821 @@
+/**
+ * Copyright (c) 2005 PCMan <pcma...@gmail.com>
將editor.cpp & editor.h 作者改成Roy Lu(5) 可否考慮更明確的命名?Send() 令人混淆
+/**
+ * @brief Deal with user input. Store the text in TermData.
+ */
+int CEditor::Send( void* buf, int length )
+{
Thanks,
-jservThanks,var
在 2014年5月15日 下午10:55,ChihChiang Chuang <chuangch...@gmail.com> 寫道:
> +++ b/src/core/termdata.h
> @@ -292,7 +292,11 @@ public:
> void AllocScreenBuf( int RowCount, unsigned short RowsPerPage, unsigned short ColsPerPage );
> virtual void OnLineModified( int row );
>
> + static void read_line_with_color( int row, int col1, int col2, void* data );
>
> + // AnsiEditor methods. This methods will be overridden by CEditor.
> + virtual void EditorActions(string ins, string arg = ""){ }
> + virtual void ApplyAnsiColor(int bright, int blink, int fg, int bg){ }
這兩個 method 破壞了 TermData 的資料封裝和模組化。可否提出改善機制?
比較理想的方式是透過 set/get 來存取內部狀態。
> @@ -759,6 +759,17 @@ void CTermView::OnLButtonDown(GdkEventButton* evt)
>
> m_pTermData->m_Sel->NewStart( y, x, left,
> (evt->state & (GDK_SHIFT_MASK|GDK_MOD1_MASK|GDK_CONTROL_MASK)) );
> +
> + if(m_pTermData->m_isAnsiEditor){
> + //set caret to current position
> + m_pTermData->m_CaretPos.x = x;
> + m_pTermData->m_CaretPos.y = y;
為何不採用註冊 callback 的方式來實做呼叫 ANSI editor 呢?
Thanks,
-jserv
Hi jserv:
想請教一下這樣的設計是否妥當:
On Thursday, May 15, 2014 11:55:32 PM UTC+8, jserv wrote:在 2014年5月15日 下午10:55,ChihChiang Chuang <chuangch...@gmail.com> 寫道:
> +++ b/src/core/termdata.h
> @@ -292,7 +292,11 @@ public:
> void AllocScreenBuf( int RowCount, unsigned short RowsPerPage, unsigned short ColsPerPage );
> virtual void OnLineModified( int row );
>
> + static void read_line_with_color( int row, int col1, int col2, void* data );
>
> + // AnsiEditor methods. This methods will be overridden by CEditor.
> + virtual void EditorActions(string ins, string arg = ""){ }
> + virtual void ApplyAnsiColor(int bright, int blink, int fg, int bg){ }
這兩個 method 破壞了 TermData 的資料封裝和模組化。可否提出改善機制?
比較理想的方式是透過 set/get 來存取內部狀態。目前的做法是: CEditor 繼承 CTelnetCon, CTelnetCon又繼承至CTermData.然而, 相對於CTelnetCon有實作自己的view (CTelnetView) 去繼承CTermView, CEditor並未實作自己的View, 而是附加操作於CTelnetView, 於是便破壞了模組結構.在不破壞CTermData結構的情況下, 又需要能夠直接從CTermData的結構出發而能夠存取到CEditor的相關資料, 我想這是上述兩個virtual method存在的原因.我目前想到的解法是拿掉這兩個virtual method, 但相對的CTermData裡面新增SetAnsiEditor / GetAnsiEditor這兩個method, 然後用指標是否為null的方式來判斷他是否為AnsiEditor, 這樣的話就可以把這兩個virtual method都拿掉.這樣的構想請問符合保存CTermData資料封裝和維持原先模組化的目標嗎?
Sincerely,
-jserv