網路城邦
上一篇 回創作列表 下一篇   字體:
使用 GTK v3.24 與 C Language 來設計「寫臺語白話字」的小 App
2024/05/31 11:27:14瀏覽437|回應0|推薦11

筆者從昨天 (2024 年 5 月 30 日) 到今天早上,花了一天多的時間把這可以寫臺語白話字的小 App 的最初版本寫完,就叫它為 GTK siá Tâi-gí, version 0.1 版。

< 設計概念 >

使用「連續 的 alt + vowel_key」來循環選取聲調符號,依序為左撇、右撇、屋頂符號、中音平調、高音束聲、以及碗狀符號;

臺語的母音有六個:a, e, i, o, u, o͘ ;

alt+a

alt+e

alt+i

alt+o

alt+u

alt+period  ( 選取 o͘  )

alt+n   (選取上標 n)


這個 version 0.1 已經幫筆者省掉許多輸入上的麻煩,未來就看需要漸次演化來修改程式。


< 開發工具 >

MSYS2

msys64 (mingw64 on Windows 10)

gcc (C compiler)

gdb (debugger)

vim (Yes, 筆者還在使用 vi,I love it! 雖然使用 GTK v3.24 所開發的 Geany v2.0 也很棒, 還有非常知名的 eclipse -- 功能強大功能眾多但卻顯得笨重,所以筆者還是最常使用 vim 與 xterm) 

GTK v3.24

使用了哪些 widgets 與 objects: gtk_scroll_window, gtk_text_view, gtk_text_buffer, gtk_text_iter, gtk_button, gtk_frame, gtk_box (horizontal; vertical); 


GTK 設計得很不錯,但說明文件很少 (實際上是太少),比較大的版次之間還有因為 API 汰舊而必須修改程式寫法的問題 (還真是麻煩),筆者為了摸清楚許多 API 如何使用,還得親自去 trace 五位開發者所寫的 source code、以及在網路上搜尋其他 GTK 開發者的經驗分享,這實在是有點累人!





上述的那三個 gtk_button 的功能還沒有做,但設計概念已經大致確定,大意是透過 selection,將沒有聲調的字串轉為有聲調的字串,例如:

鍵入 jit-thau,之後選取 jit-thau (mark it), 按下 Get button,將 selection 抓到 buffer,並顯示在 Get button 的 label 上,確定抓對字串後按下 Convert,此時透過 Hash 去映射對應的「聲調字串」,這對應有可能是一對多(這個一對多與 Hash 的 Collision 不相關,而是指臺語的相同拼字發音,有時會有多種聲調而具有不同的意義;Hash Collision:多對一,指不同的 key value 映射到同一個 bucket),因此同樣採用 Looping 的設計,重複按下 Convert button 可以跳到下一個對應的「聲調字串」(顯示在 Convert button 的 label 上),確定後再按下 Confirm,再回 gtk_text_buffer 把字串換掉,亦即最後結果為:


jit-thau ---> 
ji̍t-thâu

i 轉為 i̍  (i + combining vertical line above)

a 轉為 â (Latin small letter A with circumflex)


在使用操作上而言,get-convert-confirm 的設計還是有點不方便,長遠來看,類似輸入法的詞語辨識代換,會是更好的設計。



筆者沒有使用 Geany v1.X,有一個主要的原因:

   It does not perform "detab" job.

什麼是 "detab" job? 這是筆者自己發明與使用的術語,英文裡沒有 detab 這個單字,它的意思是將程式碼中的 tab 代換成相對應的空白或跳到相對應的地方開始做顯示。

早期的 v1.X  Geany 都沒有執行 "detab" 的工作,這讓筆者原本在 vim 透過 tab 所對齊的程式碼,拿到 Geany IDE 顯示時,tab 全部都歪掉、全部都沒有對齊,這實在是有點惱人。

"detab" 不會不好做!不知道 Geany v1.X 為何都不做?

根據 Geany 2.0 顯示的畫面做推斷,它的程式碼有偵測 tab character,並
透過特殊的箭頭符號來顯示有幾個 tab,但它在做 detab 時算錯位置!根據目視結果,Geany 2.0 有可能是使用 4 的倍數來做為 tab 的 default position。

筆者在 Geany 2.0 的 Preferences ---> Editor ---> Indentation 下,的確有找到 tab width 的定義值是 4,將它調整為 8 並完成設定,再察看 Source Window 的顯示,detab 結果仍是錯的!


Tab 的 default position 都是 8 的倍數,遇到 tab character 時,將目前的 column 數值加上 7 (如果不是 8 的倍數時強迫它進位;這裡的「進位」是指以八進制為基準的「進位」),之後再把 bit 0、bit 1、以及 bit 2 濾掉就好,亦即將權重為 1、2、4 的 bit 濾掉,此時之值就是下個接續顯示的 column position。

"Geany 2.0" versus "vim", check out the lines from 39 through 41. 











今天是 2024 年 6 月 12 日,接續之前 Geany 2.0 的話題,筆者試了 gedit v3.20.1 與 emacs (GUI version) on MSYS2, gedit 與 emacs 對於 tab 的 detab 都做對了!只是較為可惜的是,gedit 看不懂 UTF-8 character (不支援 UTF-8),除此之外,gedit version 3.20.1 所使用的 GTK v2.X,算是非常舊的版本,因為 GTK 目前已經來到 v4.X。


EMACS (GUI version) on MSYS2 還蠻好用的,在這裡要留意的是,MSYS2 有 text mode EMACS 與 GUI version EMACS,在 /usr/bin 底下的那一個 emacs 是 text mode version,/mingw64/bin 底下的 runemacs 才是 GUI version。讀者若發現 /mingw64/bin 底下沒有 runemacs 執行檔,可以透過 pacman 去下載做安裝,指令如下:

     pacman -S mingw-w64-x86_64-emacs


"gedit v3.20.1" versus "emacs (GUI version) on MSYS2", check out the lines from 43 through 45. 





( 創作其他 )
推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=chungchia&aid=180671009