November 18th, 2009 — 11:00pm
发个牢骚,五千万个干!昨天可是想破头了,今天起来翻翻文档就实现了。 代码相当的ugly,希望有高手赐教更方便的方法, 实现方法很简单就是通过curl访问读取到内存中, 然后调用gdk_pixbuf_new_from_stream, 最后通过gtk_image_new_from_pixbuf创建。
/* 功能:演示在GTK中如何读取网络中的图片创建image控件 编译:gcc -Wall -g `pkg-config –cflags –libs gtk+-2.0` pixbuf.c -o pixbuf 作者:SuPanYong@Gmail.com 主页:http://www.spy8888.com */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gtk/gtk.h> #include <curl/curl.h> #include <curl/types.h> #include <curl/easy.h> #include <gio/gio.h> struct MemoryStruct { char *memory; size_t size; }; /* 代码出处http://curl.haxx.se/libcurl/c/getinmemory.html */ static void *myrealloc(void *ptr, size_t size) { if(ptr) return realloc(ptr, size); else return malloc(size); } static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) { size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)data; mem->memory = myrealloc(mem->memory, mem->size + realsize + 1); if (mem->memory) { memcpy(&(mem->memory[mem->size]), ptr, realsize); mem->size += realsize; mem->memory[mem->size] = 0; } return realsize; } /*网络图片地址*/ gchar *url= “http://spy8888.com/wp-content/uploads/2009/11/gun-1255533971-stone-arshavin.jpg”;
int main(int argc, char **argv) { GtkWidget *window,*image; GdkPixbuf *pixbuf; GInputStream *input_stream; CURL *curl_handle; GError *gerror=NULL; struct MemoryStruct chunk; chunk.memory=NULL; chunk.size = 0; curl_global_init(CURL_GLOBAL_ALL); gtk_init (&argc, &argv); curl_handle = curl_easy_init(); curl_easy_setopt(curl_handle, CURLOPT_URL, url); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); /*访问并读取到内存*/ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, “libcurl-agent/1.0″); curl_easy_perform(curl_handle); curl_easy_cleanup(curl_handle); curl_global_cleanup(); /*从内存读取*/ input_stream = g_memory_input_stream_new_from_data(chunk.memory, chunk.size, NULL); /*创建pixbuf来自stream*/ pixbuf = gdk_pixbuf_new_from_stream(input_stream, NULL, &gerror); /*释放*/ g_input_stream_close(input_stream, NULL, NULL); g_object_unref(input_stream);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), “Pixbuf Image”); g_signal_connect (G_OBJECT (window), “destroy”, G_CALLBACK (gtk_main_quit), NULL); /*创建image来自pixbuf*/ image = gtk_image_new_from_pixbuf(pixbuf); gtk_container_add (GTK_CONTAINER (window), image); gtk_widget_show_all (window); gtk_main ();
return 0; }
Comment » | 技术
November 5th, 2009 — 3:26pm
2.cd别名实现快速进入目录
当进入一个非常长的目录之后想要返回到上几层需要连续使用很多次的../
# mkdir -p
/tmp/very/long/directory/structure/that/is/too/deep
# cd /tmp/very/long/directory/structure/that/is/too/deep
# pwd
/tmp/very/long/directory/structure/that/is/too/deep
# cd ../../../../
# pwd
/tmp/very/long/directory/structure
介绍4种别名规则有效实现快速返回上几级目录
方法1:使用“..n”
如下面的例子 ..4 是返回上4级目录 ..3 是返回上3级以此类推
alias ..=”cd ..”
alias ..2=”cd ../..”
alias ..3=”cd ../../..”
alias ..4=”cd ../../../..”
alias ..5=”cd ../../../../..”
# cd
/tmp/very/long/directory/structure/that/is/too/deep
# ..4
[注意: 使用 ..4 返回上4级目录]
# pwd
/tmp/very/long/directory/structure/
方法2:使用“.”
“…..”5个句号代表返回上4级目录,这个规则很容易记忆的,因为你输入“..”是代表返回
上一级的目录,所以以此类推就可以了。
alias ..=”cd ..”
alias …=”cd ../..”
alias ….=”cd ../../..”
alias …..=”cd ../../../..”
alias ……=”cd ../../../../..”
# cd /tmp/very/long/directory/structure/that/is/too/deep
# …..
[注意: 使用 ..... (五个句号) 返回上4级目录]
# pwd
/tmp/very/long/directory/structure/
方法3:使用cd和.的组合形式
如下实例cd…..(5个句号)代表返回上4级目录,以此类推
alias cd..=”cd ..”
alias cd…=”cd ../..”
alias cd….=”cd ../../..”
alias cd…..=”cd ../../../..”
alias cd……=”cd ../../../../..”
# cd /tmp/very/long/directory/structure/that/is/too/deep
# cd…..
[注意: 使用 cd..... 返回上4级目录]
# pwd
/tmp/very/long/directory/structure
方法4:使用cd和数字的组合形式
alias cd1=”cd ..”
alias cd2=”cd ../..”
alias cd3=”cd ../../..”
alias cd4=”cd ../../../..”
alias cd5=”cd ../../../../..”
原书下载 Free eBook: Linux 101 Hacks
Comment » | Linux101Hacks , 技术 , 翻译
November 2nd, 2009 — 3:42pm
1. cd的使用
使用CDPATH定义cd命令的启示目录
[spy8888@spy8888 ~]# pwd
/home/spy8888
[spy8888@spy8888 ~]# cd mail
-bash: cd: mail: 没有该文件或目录
[注意: 此时查找当前目录下的mail文件夹]
[spy8888@spy8888 ~]# export CDPATH=/etc
[spy8888@spy8888 ~]# cd mail
/etc/mail
[注意: 此时查找的是/etc目录下的mail文件夹]
[spy8888@spy8888 /etc/mail]# pwd
/etc/mail
若要永久改变目录变量,只需添加export CDPATH=/etc到
~/.bash_profile(若不存在创建即可)
如要创建多个目录变量,用:分割即可
export CDPATH=.:~:/etc:/var
原书下载 Free eBook: Linux 101 Hacks
Comment » | Linux101Hacks , 技术 , 翻译
August 22nd, 2009 — 10:38am
安装
sudo apt-get install wine
访问WineHQ查看是否有兼容版本
winehq.org
点击右上方的WineHQ
点击左侧边栏的Browse Apps
使用 Winetricks
sudo apt-get install cabextract
wget http://winezeug.googlecode.com/svn/trunk/winetricks
sh winetricks ie6
解释:
第一行是安装cabextract
之后是下载最新版本的winetricks
最后是通过winetricks下载ie6
Comment » | 翻译
August 21st, 2009 — 9:51pm
最近在看《Foundations of GTK+ Development 》,里面获取文本框内容的例子都是创建一个button然后通过“clicked“获得的,从用户使用角度来说太不方便了,一般习惯都是输入好内容,然后直接按回车键。查阅了下Devhelp,找到实现方法。主要就是activate 信号,代码如下。
01 #include <gtk/gtk.h>
02 static void destroy (GtkWidget * , gpointer );
03 static void g_pp (GtkWidget * entry );
04 int main (int argc , char * argv [])
05 {
06 GtkWidget * window , * label , * vbox ;
07 GtkWidget * entry ;
08
09 gtk_init (& argc , & argv );
10 window = gtk_window_new (GTK_WINDOW_TOPLEVEL );
11 gtk_window_set_title (GTK_WINDOW (window ), “ Get Entry text “ );
12 gtk_container_set_border_width (GTK_CONTAINER (window ), 10 );
13
14 g_signal_connect (G_OBJECT (window ), “ destroy ” ,
15 G_CALLBACK (destroy ), NULL );
16 entry = gtk_entry_new ();
17 label = gtk_label_new (” Input Data ” );
18
19 g_signal_connect (G_OBJECT (entry ), “ activate ” ,
20 G_CALLBACK (g_pp ), (gpointer )entry );
21 vbox = gtk_vbox_new (FALSE , 10 );
22
23 gtk_box_pack_start_defaults (GTK_BOX (vbox ), label );
24 gtk_box_pack_start_defaults (GTK_BOX (vbox ), entry );
25 gtk_container_add (GTK_CONTAINER (window ), vbox );
26 gtk_widget_show_all (window );
27
28 gtk_main ();
29 return 0 ;
30 }
31
32 static void destroy (GtkWidget * window ,
33 gpointer data )
34 {
35 gtk_main_quit ();
36 }
37
38 static void
39 g_pp (GtkWidget * entry )
40
41 {
42 gchar * yourtext ;
43 yourtext = gtk_entry_get_text (GTK_ENTRY (entry ));
44 printf ( “ You typed: \” % s\”\ n” , yourtext );
45 }
Comment » | 技术