今天的 Tetralet 又在唧唧喳喳了



« 六月 2017 »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    






 

麻煩了!LilyTerm 與 GTK3 - GTK2 轉 GTK3 經驗談

Tetralet | 03 九月, 2011 22:18

隨著 GTK3 進入 Debian Wheezy,我想,無可避免的,LilyTerm 將要面臨一個超大的難關-移植到 GTK3 去!

雖然本人基本上只是個上不了檯面的超低手,但說到移植這種事我卻不是完全沒經驗:以前就有試過把 VB 的程式完全改寫成 C:反正開發者是我嘛,相同的內容只是換個語法重寫其實也差不多,所以我想 LilyTerm 的話只是由 GTK2 改成 GTK3 應該不算難事吧?

但事實上並沒有如此輕鬆。

據個人觀察,GTK3 和 GTK2 最大主要的不同就是把一堆物件的屬性及成員隱藏起來了。比如說,現在 GTK_TOGGLE_BUTTON 的 active 屬性不見了,我們現在得用 gtk_toggle_button_set_active()gtk_toggle_button_get_active() 來存取。而像 GTK_DIALOG 的 vbox 物件也無法直接存取了,請改用 gtk_dialog_get_content_area() 吧!

還有,按鍵值也由 GDK_a 改成 GDK_KEY_a 了。我們可以在把原始碼轉換成使用 GDK_KEY_a 後,再利用以下程式碼來保持向前相容

#if ! GTK_CHECK_VERSION(2,21,8)
#define GDK_KEY_a GDK_a
#endif

也許有些人不會認同,但個人還是會希望程式碼能儘量保有向前相容性。也就是說,如果可以,我希望使用較舊版本(如:Debian Lenny 或 Squeeze)的使用者還是能編譯/使用這些程式。我不希望把程式碼轉到 GTK3 後,就順手把 GTK2 的使用者拋棄了,個人並不認為這是什麼很好的做法。

唔,有點扯遠了,讓我們回歸正題吧!

而問題比較大的部份就是有些結構/函式庫/參數消失了。比如說,GtkFunction 消失了,但還好似乎可以用 GSourceFunc 直接替代;GTK_DIALOG_NO_SEPARATOR 這個常數也不見了,但似乎是 GTK3 預設就有套用這個參數所以沒必要了。還有 gtk_widget_hide_all() 也不見了,似乎只剩 gtk_widget_hide() 可用,但天曉得直接拿過來用不知會不會出什麼問題?還有 gdk_spawn_on_screen_with_pipes() 也消失了,但還好似乎有個 g_spawn_async_with_pipes() 可以試試看能不能拿來替代這個函數。而還有像是 gtk_quit_add() 或許也能用 g_atexit() 替代之類的,這類問題其實只要多多 Google 一下應該不難找到解決方案。

以上的更動是可以直接找到替代品的,這類程式碼改起來很快,但合不合用就很難說了,個人建議套用前不妨先看看原始碼 - 這可是 FOSS 最大的好處:我們擁有學習的自由。而比較麻煩的狀況就是程式碼得重寫,像 gtk_widget_set_colormap() 這個函數已不復存在,還好還有個 gtk_widget_set_visual() 這個替代品可用,不過那一段程式就非得重寫不可了。

而最糟的狀況就是:根本沒有接班人的函式庫。這時該怎麼辨?

而不幸的是,LilyTerm 也踢到這個鐵板了。原本每個 GtkWidget 都會有的 size_request 訊號在 GTK3 不見了,而 LilyTerm 可是完全依賴這個訊號來保持視窗大小的。如今這個訊號消失了,LilyTerm 因此有一大段程式碼必須改寫、甚至很可能找不到解決方案。好了,我該怎麼辨呢?
註:
眾所皆知的,GTK 的視窗大小是依據使用者的系統環境及設定、在計算內部元件大小後動態決定的。這樣可以讓程式不做作什麼特定的改寫就能同時適用於行動裝置或是大螢幕系統上卻又不會感到有什麼太突兀的地方。這對大部份程式而言真的是酷到不行的作法。

但這對 VTE Based、同時支援 geometry hints 的終端機程式而言卻是場大災難。

個人的觀察指出:若 GTK 視窗某個內部元件的大小改變了,(比如說輸入欄裡的文字改變了),它會傳個訊號給視窗:『我要改變大小了,快想點辨法!』 GTK 視窗於是會先試圖改變其它內部元件的大小來適應這個變化,若真的不行,最終才會改變視窗的大小。

但這若發生在支援 geometry hints 的終端機程式身上,因為它的 VTE 元件很可能會被設定成『可自由改變大小』,所以當其它元件的大小改變時,第一個受害的往往是 VTE 元件:它會被縮小以利於適應這個變化,結果原本應當保持恆定大小的 VTE 視窗大小(比如 80x24)就跑掉了,這當然不是我們想要看到的結果。

所有的 VTE Based 的終端機程式都有這個問題,基本上沒有完美的解決方案。Evilvte 就乾脆不支援 geometry hints,所以它的視窗只能變大、不能變小;而 Gnome Terminal EmulatorROXTerm 也遇到了相同的困擾

LilyTerm 對此算是其中問題最小的了,目前唯有當 LilyTerm 開了多個分頁,然後改變其中某個分頁裡的字型大小,接下來再把它切換到全螢幕,然後再切回來時視窗大小很可能會變掉 - 因為 LilyTerm 此時已無法決定應該由哪個分頁的字型大小來決定最終最正確的 geometry hints。這是 LilyTerm 在這方面唯一的問題,但我論這是非戰之罪,大概是沒有什麼解決方案的。

而 GTK 視窗『先試圖改變其它內部元件的大小』的過程中就會觸發上文所提及的 size_request 訊號。當 LilyTerm 無法攔截到這個訊號時,將會導致 Lilyterm 的『保持視窗大小』整個機制的崩壞。而據 Evilvte 的作者 caleb 表示,Gnome Terminal Emulator 在 GTK3 也遇到了類似的麻煩:它的視窗只是移來移去就會自行越變越小,目前也是無解狀態。

而目前唯一的方法就是再想想其它的 resize 機制。但考慮到 VTE Based 的程式那麼多,每一個在這方面都有問題,我能再想到第二個可行的機制嗎?說實在我完全沒信心。

當然,GTK 團隊拿掉 size_request 訊號或許是無奈之舉,我也不是 GTK 的開發者當然也是無權置喙。但如果可以的話,唔,我是希望 GTK 團隊能多多考慮一下向前相容的問題,或至少提個替代方案嘛~但目前我研究結果,似乎仍是無法可解。唉~

所以說,LilyTerm 的 GTK3 之旅可能要等一等... 並且很可能得等上很久、很久了... orz

迴響

configure-event

监视窗口状态的改变,一般不是都用 configure-event 吗?

The ::configure-event signal will be emitted when the size, position or stacking of the widget's window has changed.

[回應] bill gate @ 04/09/2011, 00:15

Re: 麻煩了!LilyTerm 與 GTK3 - GTK2 轉 GTK3 經驗談

也许可以通过 override gtk_widget_get_preferred_size () 来达到你的目的。

[回應] bill gate @ 04/09/2011, 00:40

Re: bill gate

感謝!我會試試看!

[回應] Tetralet @ 04/09/2011, 01:33

Re: bill gate

嗯... 我論應該是不行。

size_request 是 VTE 被改變大小會送出的訊號,
configure-event 則是 VTE 被改變大小才會送出的訊號,
所以 configure-event 應該是無法取代 size_request 的功能的!

[回應] Tetralet @ 06/09/2011, 17:29

Re: 麻煩了!LilyTerm 與 GTK3 - GTK2 轉 GTK3 經驗談

According to this http://developer.gnome.org/gtk3/3.1/ch25s02.html ,

As a consequence, the ::size-request signal and vfunc has been removed from GtkWidgetClass. The replacement for size_request() can take several levels of sophistication:

As a minimal replacement to keep current functionality, you can simply implement the GtkWidgetClass.get_preferred_width() and GtkWidgetClass.get_preferred_height() vfuncs by calling your existing size_request() function.

There are more details there. Don't know if that helps

[回應] bill gate @ 15/09/2011, 12:12

Re: 麻煩了!LilyTerm 與 GTK3 - GTK2 轉 GTK3 經驗談

There may be links to other websites; however MillionLooks takes no control or responsibility for the source.com without changing Air Jordan 4 the content of the article Air Jordan 1 (s) be sure to add link to the original post from the website. Coming off the bench, he was a slim.

[回應] Air Jordan 7 @ 16/09/2013, 15:57

authimage
驗證碼皆為英文大寫字母
僅輸入前4碼即可。後2碼是假的,欺敵用。
這是為了防制 Spam 而設計的。若造成您的不便還請見諒!
Accessible and Valid XHTML 1.0 Strict and CSS
Powered by LifeType - Design by BalearWeb