2013年6月6日 星期四
Use command to send mail with Gmail
# sudo apt-get install mutt
// setup configure
# sudo gvim /etc/Muttrc
set from = "yourmailaccount@gmail.com"
set realname = "yourname"
set imap_user = "yourmailaccount@gmail.com"
set imap_pass = "yourmailpassword"
set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed ="+[Gmail]/Drafts"
set header_cache =~/.mutt/cache/headers
set message_cachedir =~/.mutt/cache/bodies
set certificate_file =~/.mutt/certificates
set smtp_url = "smtp://yourmailaccount@smtp.gmail.com:587/"
set smtp_pass = "yourmailpassword"
set move = no
set imap_keepalive = 900
//create cache folder
mkdir -r .mutt/
mkdir -r .mutt/cache/
Synergy in Ubuntu
# sudo apt-get install quicksynergy
// setup configure
# gvim .quicksynergy/synergy.conf
section: screens
terry-desktop:
TWTPEN1107043:
end
section: links
terry-desktop:
left = TWTPEN1107043
TWTPEN1107043:
right = terry-desktop
end
// run command
# /usr/bin/synergys -f --config .quicksynergy/synergy.conf
2011年7月25日 星期一
Ubuntu auto mount SMB folder
First you have to install smbfs:
sudo apt-get install smbfs
Then create a folder inside of the /media directory to mount the share on:
sudo mkdir /media/Storage
then you can run the following command to mount a share manually:
sudo mount -t smbfs //fileserver/Storage /media/Storage -o uid=USER,gid=users
Note: Change USER to your linux username. The uid=USER,gid=users is important because if you dont use that, only root will have access to write files to the mounted share.
Or you can edit the mount list in /etc/fstab to have the drive mount on boot
sudo gedit /etc/fstab
And add this line to the bottom of the fstab file, but change //fileserver/Storage to the path to your share on your server.
//fileserver/Storage /media/Storage smbfs credentials=/.smbcredentials,uid=USER,gid=users 0 0
In the above line change USER to your user account in both spots. Before this will work you also have to create the .smbcredentials file in the above users home directory.
sudo gedit ~/.smbcredentials
Add the following information to the file, but change Guest to your SMB username and add your SMB password.
username=Guest
password=
If you have a permission problem , you can add "noperm" .
Now you got it.
2010年11月18日 星期四
「轉貼來源-http://xy0811.spaces.live.com/default.aspx」xserver
對XServer的理解
1. XServer/XClient通過X協議交互, 而X協議就是一套基於socket的通信
2. XServer啟動時初始化socket, 並進入Select循環,
等socket連接(多個連接時形成client隊列), 鍵鼠等
3. XClient啟動時連接該socket, 與XServer建立起一個通道,
然後任何圖形相關的操作都通過XServer實現
4. 好處在於: 多個XClient同時運行時, 在XServer之上可做互斥, 共享, 疊加等
linux的一個瀏覽器是這樣實現的:
1. XServer: 圖形顯示, 根據XClient的控制顯示(見nano-X)
2. Xlib: 對XServer提供功能的封裝, 供XClient調用,
底層通過socket和XServer交互(見xcblib)
3. WindowManager: 控制各應用窗口之間關係
4. gtk庫: 控件, 及消息處理
5. 瀏覽器程序
2010年11月17日 星期三
「轉貼來源-http://xy0811.spaces.live.com/default.aspx」Linux的X窗口系統結構說明
一、說明
以X Server為中心,簡要地分為四層,如圖所示
二、X方式與Framebuffer方式的差異
1. X方式
1) 什麼是X
我們常說的X Window,X,X11(指X協議的11版本)一般指X協議,或指是基於X協議的X服務端程序(X Server)
2) X Server與X Client
a) X協議指X Server及X Client組成的c/s架構,及其通訊協議的實現
b) X Server有主事件循環,由它來處理用戶輸入、顯示及與X Client通訊
c) X Client即X桌面上運行的普通應用程序
應用程序如果想顯示數據,需要利用X Lib庫建立X窗口(X Client),它通過X協議與X Server通訊,讓X Server完成顯示;X Server會把接到鍵盤鼠標事件,傳給焦點所在的X Client處理
2. Framebuffer方式
Framebuffer方式相對簡單,它由內核直接支持,通常用於嵌入式系統。應用程序可以得到屏幕顯示區域的指針,然後對其寫數據來進行顯示,其中窗口的概念不強,它自身不帶窗口管理,需要應用軟件自己管理窗口。比如qtopia基本於framebuffer顯示時,qtopia自身實現了窗口管理功能
3. 應用程序的顯示方式
很多應用程序同時支持X和Framebuffer兩種模式顯示,如gtk,qt等,以下我們只討論它基本於X實現的部分
三、分層
1. 應用層(Application)
指X Window上運行所有帶圖形界面的應用程序,每個窗口都是一個X Client
1) X Lib app
直接使用X函數的應用程序,這種程序一般界面簡單,比較底層,比如很多窗口管理器直接寫在這層
2) Gtk app
gtk又分為gtk和gdk兩層,
gtk為控件及主循環的實現
gdk相對底層,控制底層繪圖部分,它支持framebuffer、X11、DirectFb等
應用程序可調用gtk函數,也可直接調用gdk函數
gtk常和cairo一起實現二維特效
3) Qt app
Qt也通過調用X Lib實現圖形界面
Qt的優勢在於它是C++實現的,使用起來程序結構更好,也有較成熟的嵌入式版本
4) SDL app
SDL也通過調用X Lib實現圖形界面
SDL更底層,代碼少,沒有控件,但做特殊效果很好用
2. 窗口管理器層(Window manager簡稱wm)
Window manager是特殊的X Client,也通過X Lib庫與X Server交互,與一般應用不同的是:它負責控制各個窗口的動作,及操作主窗口
WM的功能分為管理(manager)和工具(tools),
1) Manager
負責各個窗口的建立銷毀/顯示隱藏/最大最小化/移動縮放,管理窗口隊列,設置焦點窗口,窗口切換效果等
2) Tools
實現桌面工具條,桌面菜單等基本界面及小工具
3) 具體實現
實現通常有兩種方式:一種是manager和tools在一個程序中實現,一種是分開兩個程序實現,使用時可以隨意組合
a) qvwm, blackbox等較早期的wm,都是manager和tools在一個程序中實現的
b) xfce、metacity等是分開的,例如:xfce包含tools和manager,但不在一個程序中實現,它的manager是xfwm,我們可在使用xfce時把xfwm替成metacity(metacity是一個manager,不帶tools)
3. X服務器層(X Server)
主循環控制顯示,讀取設備數據,與X Client通訊,事件循環,並把事件送給焦點窗口
1) 普通X Server
功能完整的X Server,代碼量大,支持全,常見的如XFree86,Xorg等
2) Tiny X Server
一般用於嵌入式系統,資源佔用小,代碼少,功能及邏輯相對簡單,如KDrive(Xvesa/Xchips/Xfbdev/Xi810……)
4. 系統底層(System)
1) Kernel
與硬件交互,獲得輸入設備的數據,向顯示設備輸出
2) Dev
文件系統中的設備文件,程序通過對它的讀寫和操作與kernel交互,控制硬件
3) 中間層
在程序和Dev層之間,有時還需要庫或程序處理設備數據,比如觸摸屏就使用libts去除噪點,過濾出更有效的數據
「轉貼來源-http://xy0811.spaces.live.com/default.aspx」Gtk透明窗口全攻略
如圖所示,左邊是普通的ubuntu桌面,右邊是我建立的三個gtk特殊窗口,其中包含了:異形窗口(上),透明窗體(中),不同區域不同透明度的窗口(下)。基本包括了各種特殊窗口的需求,而複雜程度和依賴工具又各有不同,下面是實現的代碼及說明
1. 環境說明
ubuntu 8.04系統,安裝glib-dev和cairo包
2. 異形窗口
a) 原理
異形窗口利用蒙板(mask)實現,蒙板的數據從圖片獲得,每一點只有透明和不透明兩種狀態,不透明區域顯示該窗口的背景,透明區域顯示其後桌面或其它應用
b) 效果
可實現異形窗口,但不支持半透明,所以弧形邊緣看起來不夠平滑。
c) 依賴
gtk的基本功能,一般gtk都可以支持
#include
int main(int argc, char *argv[])
{
GtkWidget *window = NULL;
GdkPixbuf *pixbuf = NULL;
GdkBitmap *bitmap = NULL;
GdkPixmap *pixmap = NULL;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(GTK_WINDOW(window), FALSE); // 設置無邊框
gtk_widget_set_app_paintable(window, TRUE);
gtk_widget_realize(window);
pixbuf = gdk_pixbuf_new_from_file("demo1.png", NULL); // gdk函數讀取png文件
gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &bitmap, 128); // alpha小於128認為透明
gtk_widget_shape_combine_mask(window, bitmap, 0, 0); // 設置透明蒙板
gdk_window_set_back_pixmap(window->window, pixmap, FALSE); // 設置窗口背景
g_object_unref(pixbuf);
g_object_unref(bitmap);
g_object_unref(pixmap);
gtk_widget_show_all(window);
gtk_main();
return TRUE;
}
3. 透明窗體
a) 原理
使用函數gtk_window_set_opacity設置整個窗體的透明度
b) 效果
窗體各處透明度相同
c) 依賴
gtk_window_set_opacity函數只能在gtk-2.12以上版本中使用
#include
int main(int argc, char *argv[])
{
GtkWidget *window = NULL;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_opacity(GTK_WINDOW(window), 0.7); // 設置透明度函數
gtk_widget_show_all(window);
gtk_main();
return TRUE;
}
4. 不同區域不同透明度的窗口
a) 原理
利用cairo庫與gtk相結合,在曝光函數中用cairo向窗口區域繪圖,每一點可以設置不同的透明度,但相對複雜,依賴更多的庫
b) 效果
可設置窗口各個點不同的透明度,過度平滑,效果最好
c) 依賴
gtk及相應版本的cairo
#include
cairo_surface_t *image = NULL;
static gboolean on_window_expose_event(GtkWidget * widget, // 曝光事件
GdkEventExpose * event, gpointer data)
{
cairo_t *cr;
cr = gdk_cairo_create(widget->window);
cairo_set_source_surface(cr, image, 0, 0);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); // 重要
cairo_paint(cr); // 繪圖
cairo_destroy(cr);
return FALSE;
}
gint main(gint argc, gchar ** argv)
{
GtkWidget *window;
GdkScreen *screen;
GdkColormap *colormap;
gtk_init(&argc, &argv);
image = cairo_image_surface_create_from_png("demo3.png"); // cairo函數讀取png文件
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(GTK_WINDOW(window), FALSE); // 設置無邊框
gtk_widget_set_app_paintable(window, TRUE);
gtk_window_resize(GTK_WINDOW(window), 250, 250);
g_signal_connect(G_OBJECT(window), "expose-event",
G_CALLBACK(on_window_expose_event), NULL);
screen = gtk_widget_get_screen(window); // 重要
colormap = gdk_screen_get_rgba_colormap(screen);
gtk_widget_set_colormap(window, colormap);
gtk_widget_show_all(window);
gtk_main();
return TRUE;
}
5. 參考
http://cid-f8aecd2a067a6b17.skydrive.live.com/browse.aspx/.Public?uc=1&isFromRichUpload=1
示例代碼為gtk_demo.tgz
「轉貼來源-http://xy0811.spaces.live.com/default.aspx」使用gdk_text_draw顯示中英文混合字體
一、 說明
我們可以很容易把控件上的字體設成中文,但在gdk層上直接顯示文字,並具按要求字體顯示,相比就比較困難,以下是我測試通過的簡化的例程,僅供說明中文字體的顯示問題。
二、 例程
1. 代碼
#include
#include
#include
gboolean draw_text(gpointer data)
{
GtkWidget *drawing_area = (GtkWidget *) data; // 顯示文字的畫布
GdkFont *font = gdk_fontset_load
("-adobe-helvetica-medium-r-normal--36-*-*-*-*-*-iso8859-1, misc-simsun-medium-r-normal--36-*-*-*-*-*-gb18030.2000-0");
// 設定英文字體用adobe, 中文用宋體(simsun),宋體是我從xp中複製過去使用的,ubuntu自帶中文字體見/usr/share/fonts/X11/misc/fonts.dir中帶gb的行
char str[128] = "test 雙色球"; // 顯示的文字,因為系統設定為zh_CN.UTF8,所以沒有做轉換,如果設成了zh_CN.GB2312的話,可以用gtk_local_to_utf8()轉成UTF8,才能識別;utf8為一個漢字佔三字節,可以通過取字串的長度判定是何種編碼方式
gdk_draw_rectangle(drawing_area->window,
drawing_area->style->white_gc, TRUE, 0, 0, 200, 200); // 畫矩形填背景
gdk_draw_text(drawing_area->window, font, drawing_area->style->black_gc,
10, 36, str, strlen(str)); // 顯示文字,注意坐標指字的左下角位置
return TRUE;
}
int main(int argc, char *argv[])
{
GtkWidget *window1;
gtk_set_locale();
gtk_init(&argc, &argv);
window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window1);
gtk_timeout_add(110, (GtkFunction) draw_text, window1); // 設置時間回調
gtk_main();
return 0;
}
2. 編譯
all:
gcc main.c -o main `pkg-config --cflags --libs gtk+-2.0`
3. 執行結果


