發表文章

目前顯示的是 1月, 2008的文章

lxpanel 以新的樣貌現身

圖片
經過幾天的撰寫,終於將一點成果 Commit 到 SVN 上了。lxpanel 從今天起,已經可以支援背景圖和文字顏色﹝目前文字顏色只對 dclock plugin 有作用﹞的設定,我也畫了一張圖﹝background.png﹞當預設背景,讓視覺效果增進了不少。 :P 這次 new feature 已知的問題,是 systray 還無法使用背景圖,雖然已經將 eggtraymanager 換成 GNOME-Panel 的 na-tray-manager,卻仍然解決不了這問題﹝真的花了很多的時間﹞。對此,我做了一些調整,讓 systray 的四周留白,使 systray 彷彿嵌入 panel 一般。不過這樣做是暫時的,只讓 systray 不會這麼突兀而已,這問題日後會再來慢慢解決。 修改過後的 lxpanel configurator 下一階段的工作,就是開始移植 fnetdaemon 和 fvolume 成 lxpanel plugin 了。 相信 LxDE 一定會越來越完整,勉勵自己繼續努力吧!

Frexhwd 0.1 終於發佈

半夜睡不著覺,煩悶湧上心頭,於是玩弄了一下 Blog 的版面設定,然後整理近兩個月來的垃圾。將去年底『 Frexhwd 嬌小的硬體偵側程式 』所提到的成果打包,並上傳到 SourceForge。其中包括了已轉換好的驅動程式對應表﹝NVIDIA New/Legacy *.xinf 和 Linux Kernel 2.6.23.9 pcimap﹞。 Frexhwd Project: https://sourceforge.net/projects/frexhwd/ 仔細看,其實 Source Code 並不多,比較重要的 Code 在之前文章也有貼出來過,反而比較花時間的是要將 NVIDIA New/Legacy Supported List 從網站上的 HTML 轉換成 *.xinf。 在實際使用狀況上,使用 Frexhwd 替代某些 LiveCD 上的 discover 或 Kudzu 後,運作很正常,而且經過些許調整後,還能夠讓系統自動選擇正確的 NVIDIA Driver/Library。

寒假迎春,事事愉快

好不容易期末考結束,開始放寒假了。預料這個迎春假期會過得很充實,除了繼續維護和開發 LXDE 之外,日前也在 IRC 上瘋狂的隨口決定趁休假實作一個玩具『OS Kernel』。 關心 LXDE 的朋友們最近應該都發現到了,在專案網站上出現了一行大紅色的『The project is NOT dead!』,我也是在前兩天才發現的。PCMan 張貼了一份聲明,內容說他有太多雜務﹝畢竟他是未來準醫生﹞,無法專心在程式的開發上,所以才會導致 LXDE 遲遲沒有 new release;而在今年度他更是沒有閒暇,所以將會暫時告別一段時間。 其實從去年底開始,在 IRC #Dot 就不時在討論誰要接手 PCMan 所維護的『PCManFM』,也有人熱心的暫代 PCMan 去嘗試維護 PCManFM 的問題,不過都因為時間問題,無法幫上太多的忙,導致一直沒有完整的定案。 現在放了寒假,我開始有多一點的時間,或許能幫忙維護 PCMan 所遺留下來的專案。當然 LXDE 就更不用說了,之前的『桌面改進計劃』將會繼續進行,如果可以,希望讓 LXDE 能夠盡快有一個 new release。最後也希望對桌面改進有興趣的人可以一同參與。 至於在寒假實作『Toy OS Kernel』這個意外的計劃,我可能會在感到煩躁的時候才開始進行,用來舒解一下情緒。目標是打造一個不嚴肅的 kernel。雖然已經不是第一次接觸 OS Design,不過過去只是簡單完成實作,實在是沒有更深入去探討 OS Design 的變化和美妙,因此將會趁著這次有多一些的研究。 讓我們盡情享受這美好的假期吧! Enjoy Vacation and Hacking!

Golden-Section Search 黃金比例搜尋法

依朋友們的要求,我實作了黃金比例搜尋法(Golden-Section Search) 的程式,用來尋找一個 f(x) 的最小值。這程式非常的簡短,是短短時間內寫出來的,所以並沒有考慮到效能、流程優化的部份,就像是 x 在某些狀況可以直接沿用到下次的 x1 或 x2,不需要將 x1、 x2 完全重新計算的這部份也是值得去探討的。 原始程式碼: #include <stdio.h> #include <math.h> #define F(x) ((pow(x,2)/10)-2*sin(x)) void main() { int i, n; double range_min = 0; double range_max = 4; double d, x1, x2; printf("Number of lines:"); scanf("%d", &n); printf("i xl f(xl) x2 f(x2) x1 f(x1) xu f(xu) d\n"); for (i=1;i<=n;i++) { d = 0.61803*(range_max - range_min); x1 = range_min + d; x2 = range_max - d; printf("%d %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f %6.4f\n", i, range_min, F(range_min), x2, F(x2), x1, F(x1), ra

實作 ALSA 主音量控制

OSS 已經成為歷史,今天的 ALSA 幾乎成為了所有 Linux 的音效驅動的標準規格。兩者相較之下,ALSA 新增了太多數不清的專業功能和特色,也難怪玩具般的 OSS 會敗陣下來。對研發人員來說,從 OSS 過渡到 ALSA 的困擾,就是聲音控制程式的 sourcecode 複雜度變高了。 以下是操弄 ALSA Library 的簡單範例: #include <stdio.h> #include <alsa/asoundlib.h> int main(void) { int unmute, chn; int al, ar; snd_mixer_t *mixer; snd_mixer_elem_t *master_element; snd_mixer_open(&mixer, 0); snd_mixer_attach(mixer, "default"); snd_mixer_selem_register(mixer, NULL, NULL); snd_mixer_load(mixer); /* 取得第一個 element,也就是 Master */ master_element = snd_mixer_first_elem(mixer); /* 設定音量的範圍 0 ~ 100 */ snd_mixer_selem_set_playback_volume_range(master_element, 0, 100); /* 取得 Master 是否靜音 */ snd_mixer_selem_get_playback_switch(master_element, 0, &unmute); if (unmute) printf("Master is Unmute.\n"); else printf("Master is Mute.\n"); /* 取得左右聲道的音量 */ snd_mixer_selem_get_playback_volume(master_element, SND_MIXER_SCHN_FRONT_LEFT, &al); snd_mixer_sele

[lxpanel] 重新設計的 netstatus 和 volume plugin

圖片
關於 Linux Desktop 的改良計劃如期進展中,現在打算從 LxDE 的 lxpanel 開始著手。在使用和觀察後,發現 lxpanel 在 plugin 的部分其實有些問題,其中一個就是所有 plugin 和 lxpanel 共用 process 所產生的後遺症:假如其中一個 plugin 出問題,將可能導致整個 panel crash。除此之外,原先 volume plugin 也是需要重新設計的,因為原本的控制是採用 OSS 的方式,與目前主流的 ALSA 不一樣,在某些晶片上甚至會當掉。 為了怕一次改太多改壞掉﹝雖然 jserv 叫我隨意破壞 XD﹞,在重新撰寫 plugin 的工作還沒完成之前,暫時將新寫的 plugin 獨立成單一程式,不會納入 lxpanel 中。目前新設計的 plugins 包括了 fnetdaemon 和 fvolume﹝暫時取的代號﹞,用來取代 lxpanel 原有的 netstatus 與 volume plugin,以下是 half screenshot: 為什麼說是 half screenshot ?因為這張圖有一半是合成的,除了 systray 上的圖示之外,黑色的 panel 是合成上去的﹝笑﹞。當然背景圖已經畫好﹝不然怎麼合成?﹞,就只差改寫 lxpanel 部份程式,拭目以待吧!

取得網路裝置(NETDEVICE)的系統訊息

之前提到正在開發的 Network Status Daemon ,其監控 netdevice 的部份已經完成,從 System Tray 上可以看到現在的網路傳送接收狀態、是否有插上網路線、IP位置等等。其中除了讀取/proc/net/dev 來取得封包流量,還有許多針對 netdevice 的 ioctl() 實作。 這是一個檢查網路裝置是否已經被 ifconfig bring up 的例子: #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> void main(void) { struct ifreq ifr; int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); bzero(&ifr, sizeof(ifr)); strcpy(ifr.ifr_name, "eth0"); ioctl(sockfd, SIOCGIFFLAGS , &ifr); /* ifr_flags 的各項旗標和說明: IFF_UP 裝置正在運作 IFF_BROADCAST 有效的廣播位址 IFF_DEBUG Debug 標誌 IFF_LOOPBACK 這是 Loopback 裝置 IFF_POINTOPOINT 這是點到點的網路裝置介面 IFF_RUNNING 資源已分配 IFF_NOARP 無arp協議,沒有設置第二層目的地址 IFF_PROMISC 介面為雜湊(promiscuous)模式 IFF_NOTRAILERS 避免使用 trailer IFF_ALLMULTI 接收所

使用 GtkStatusIcon 實作 System Tray

圖片
孤陋寡聞的我,一直都還在用 libegg EggTrayIcon 去撰寫 System Tray。由於過去寫的程式通常只是顯示一個 Icon 在 System Tray Bar 上,所以長久以來也沒有碰到什麼問題。直到這兩天在設計 Network Status 的 Display on System Tray時,才發現 EggTrayIcon 缺少一些重要的功能。查明後,才知道必須使用 libegg 的 EggStatusIcon 等其他 Functions 去實作那些功能。 得到答案本該是很開心的,但非常不幸的,同時也在 libegg 的 CVS 裡,得知了 libegg 已停止開發的消息﹝消息還是 2006 年的!﹞。文中說到了因為 Gtk-2.10 以後,規範了一個標準的 GtkStatusIcon Widget 去實作 System Tray,導致 libegg 便不再有存在的必要性,因此不再繼續維護下去。 關於 GtkStatusIcon 的詳細說明文件,可以在【 GNOME Documentation Libaray -- GTK+ Reference Manual 】找到,有興趣的人可以去參考參考。 就單純的 Hello World Program 來說,用 GtkStatusIcon Widget 去實作 System Tray 非常容易,下面是一個簡單的範例: #include <gtk/gtk.h> int main(int argc, char **argv) { GtkStatusIcon *tray_icon; gtk_init(&argc, &argv); tray_icon = gtk_status_icon_new(); gtk_status_icon_set_from_file(tray_icon, "/tmp/trayicon.png"); gtk_status_icon_set_tooltip(tray_icon, "Hello Tray Icon!!"); gtk_status_icon_set_visible(tray_icon, TRUE); gtk_main(); return 0; } 另外順便也展示一

本年度新的目標和展望

首先,讓我們開心迎接 2008 年的到來。個人本年度的目標和展望如下: 更進一步研究 Linux Kernel 的相關細節和技術 Hacking X11 及相關延伸規範設計 實作和閱讀更多 Operating System Kernel 實驗想法 充實更多 3D 及影像處理方面的技術 嚴苛的挑剔目前 Linux 桌面環境各種對於一般用戶在使用上的缺點,並擬訂計劃改進修正。 計劃性的惡搞 更少的睡眠,更多的 Hacking :P 今年度大致的目標就這樣了,一時也想不到太多。﹝其實是怕訂太多做不到﹞﹝笑﹞ 關於改進桌面環境的部份,將以使用上的感覺為第一優先考量,所以無論原程式技術或架構有多好,只要帶來一般使用者的不便,就當做是爛東西改造或計劃性重寫。﹝以我周遭的眾多電腦『天才』為試驗白老鼠XD﹞