2013年2月8日 星期五

gtk中的錯誤訊息

在要執行的gtk程式前加上 G_MESSAGES_DEBUG=all 可以打開訊息,在終端機中可見

http://stackoverflow.com/questions/13790559/showing-gtk-debug-log-messages

這篇說的就是這件事

http://developer.gnome.org/glib/2.30/glib-Message-Logging.html

可用的函式與巨集列表

emacs中bookmark plus (bookmark+)的使用

http://www.emacswiki.org/BookmarkPlus

要把這一大篇看完,實在需要耐心…假設用elpa裝好了(實際上有問題,與org mode的情況類似,與elpa整合不好,還是另外抓下來放著吧…然後依 http://stackoverflow.com/questions/1217180/how-do-i-byte-compile-everything-in-my-emacs-d-directory 上的方法編譯整個目錄中的檔案),原則上按鍵組合與原先bookmark是相同的

新增bookmark


http://lists.gnu.org/archive/html/help-gnu-emacs/2011-01/msg00769.html

這篇解釋得很清楚,除了原有的bookmark按鍵 C-x r m,還可以用bookmark plus引入的新按鍵,如 C-x p c m (或C-x p m)

檢視bookmark list


http://www.emacswiki.org/BookmarkPlus#toc39

‘C-x p e’ or ‘C-x r l’ (command ‘bookmark-bmenu-list’)


編輯bookmark list


http://www.emacswiki.org/BookmarkPlus#toc23

與org mode整合--安裝org-bookmark.el


原則上可以,但是目前要先開了*Bookmark List*這個buffer以後, [[bookmark:...][...]] 這個形式的連結才會正確跳轉。 但是用這個功能來標注原始碼等純文字檔,實在是方便…不過我想org-bookmark.el裏面的bookmark-jump要改成bookmark-jump-other-window比較方便…

2013年2月7日 星期四

gtk中的事件處理--以evince為例

gtk的中文文件真的不多,而且很多己經過時,所以英文還是要練好一點…

在ev-view.c當中,宣告了 ev_view_button_press_event , 這個函數類似於在 win 平台上的 RAD 工具中的所謂“事件處理函式", 它會接收到一個型態為 GdkEventButton * 的參數,這裏面包含了事件的詳情。 此函數必需以某個方式讓事件處理迴圈知道, 程式中是以類別的virtual method table 中的 button_press_event 來存放。以Delphi/VCL的術語來說,widget就是VCL的control或window;在class的階層上,所有class都是由GObjectClass所衍生,類比於VCL的TObject,而所有視窗元件都是由GtkWidgetClass所衍生,類比於VCL的TWindow/TControl。

當事件發生時,捕捉這個事件並加以處理的途徑有兩個,分別是物件層級和類別層級。類別層級的處理由類別的(虛擬)函數進行,有效範圍是該類別的所有物件,若未進行override,則交由父類別處理,層層往上。 通常會去override這個函數的情況,一是對該類別的行為有一個統一要求,二是該類別只有一個實例(如主視窗),三是未來有可能會以該類別為父類別而衍生出新類別。其它的情況,處理事件時,物件層級優先於類別層級,適用於例如對話盒中的按鈕被按下後要有不同的行為,以override的方式則必需對各個按鈕寫出各自的類別,而改寫onclick函數(這名字是假設的);以event handler的方式則只需為不同的按鈕指定不同的onclick事件處理函數(這名字是假設的),比較簡單,gtk中是以g_signal_connect來指定。

不過物件層級的事件傳遞有自己的一條路徑,這是由 parent / child 所串起的一顆樹。與此相關的概念是建構/解構元件的從屬關係;通常視窗元件都是由主視窗所建,是一個 owner / component 的關係,只有記憶體管理的議題存在,沒有訊息的傳遞關係。VCL的設計是,放在可以拖放到視窗上的元件時,設立了TComponent類別來對應,處理一些warehousing的問題。

回到事件處理上,物件層級的處理,走完所有parent widgets都沒有辦法解決時,才會走parent classes這條,不過它的處理通常不會很針對不同的case,而是比較一般的通則。目前看到的情況也是如此,只有主視窗,雖然VCL中一貫使用物件層級處理,但是畢竟多了一層不必要的indirection,因此在gtk中似乎都傾向以類別層級來override VMT以進行事件處理。

於ubuntu 12.10上安裝okular

單純的 apt 無法安裝, 看來又要找ppa了

http://www.ubuntuupdates.org/ppa/kubuntu-ppa_backports?dist=quantal

依此網頁指示執行以下命令

sudo add-apt-repository ppa:kubuntu-ppa/backports 
sudo apt-get update
sudo apt-get install okular

這個ppa我覺得可以先不要移除,真要移除的話,一樣的作法

cd /etc/apt/sources.list.d/

sudo rm kubuntu-ppa-backports-quantal.list 

ubuntu上為emacs安裝cscope以進行code navigation

emacs中的elpa有atags (gnu global) 及 etags (ctags for emacs?)可用,不過似乎不如cscope強大

安裝


apt中納入了這兩個cscope套件,安裝一下

sudo apt-get install cscope cscope-el

然後在.emacs或任何等效的檔案中加入

(require 'xcscope)

啟動emacs,打開任一欲檢視的原始碼檔案,如 .c 檔,按下
C-c s I,程式問要從那個目錄建立索引,通常是設我們放置專案的最上層目錄,

如果是jhbuild抓來的檔案,那通常在 ~/code/evince/checkout/

操作說明


http://cscope.cvs.sourceforge.net/viewvc/cscope/cscope/contrib/xcscope/xcscope.el?revision=1.14&view=markup

它的 * Keybindings: 一節詳述了可用的操作

http://www.eefocus.com/fhq1989312/blog/12-04/247349_9c349.html

我是看了這頁才知有apt可裝

小結


這類的 code navigation 解決方案,在正確性上其實遠不如 MSVS 或是 eclipse,不過對於 gtk 這類純c 的專案,速度是很快的 

2013年2月6日 星期三

设置Ubuntu 默认软件打开方式

http://ubuntugenius.wordpress.com/2012/06/18/ubuntu-fix-add-program-to-list-of-applications-in-open-with-when-right-clicking-files-in-nautilus/

http://www.mypaomian.com/%E8%AE%BE%E7%BD%AEubuntu-%E9%BB%98%E8%AE%A4%E8%BD%AF%E4%BB%B6%E6%89%93%E5%BC%80%E6%96%B9%E5%BC%8F/

以單純的自行 make 新版的 evince 為例,就去改 /usr/share/applications/evince.desktop 這個檔案。

sudo gedit /usr/share/applications/evince.desktop

找到 Exec= 帶頭的那行,把路徑指到我們make出來的版本

ubuntu上開源文件檢視器evince的make手記

老實說,有點懷念configure->make->make install的美好老舊時光…

不過還是捲起袖子來吧…

https://live.gnome.org/Evince/GettingEvince

“Building Evince and Poppler from Git in 5 easy steps”

那是他講的,實際上如果像我一樣  你會在第四步就卡關

patch 1


jhbuild是他引入的一個想要整合build process的(又)另一個機制

理想歸理想,但是bleeding edge總是會有問題,這次問題出在poppler

參 http://markmail.org/thread/jd7b4jeskjjb7be6

似乎 http://poppler.freedesktop.org/ 都說.22是穩定版本了,看來還是只好人工介入一下

根據 http://developer.gnome.org/jhbuild/stable/config-reference.html.en 所言,在 jhbuildrc-evince 加入以下這行︰

branches['poppler'] = (None, 'poppler-0.22.0')

patch 2


Requested 'gtk+-3.0 >= 3.7.5' but version of GTK+ is 3.6.0

看來ubuntu 12.10內建版本不夠新啊…

http://www.ubuntuupdates.org/package/gnome_shell/quantal/main/base/libgtk-3-0

有人提供了套件,不過要加入到apt的repository中,在shell中依序執行以下命令

sudo add-apt-repository ppa:gnome3-team/gnome3

sudo add-apt-repository ppa:ricotz/testing

sudo apt-get update

sudo apt-get install libgtk-3-0

裝完記得刪掉這些ppa,不然軟體更新時會哇哇叫的…目前只有手動方法,到 /etc/apt/sources.list.d/ 找到對應的list檔並刪除之