Tag: linux


[GTK编程]如何读取网络中的图片创建image控件

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 » | 技术

[翻译]Linux命令行技巧2

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, 技术, 翻译

[翻译]Linux命令行技巧1

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, 技术, 翻译

[翻译]如何在Linux系统中使用windows软件

August 22nd, 2009 — 10:38am

安装

sudo apt-get install wine

访问WineHQ查看是否有兼容版本

  1. winehq.org
  2. 点击右上方的WineHQ
  3. 点击左侧边栏的Browse Apps

使用 Winetricks

sudo apt-get install cabextract
wget http://winezeug.googlecode.com/svn/trunk/winetricks
sh winetricks ie6

解释:

第一行是安装cabextract
之后是下载最新版本的winetricks
最后是通过winetricks下载ie6

Comment » | 翻译

[gtk+2.0]通过回车信号获取文本框输入的内容

August 21st, 2009 — 9:51pm

最近在看《Foundations of GTK+ Development》,里面获取文本框内容的例子都是创建一个button然后通过“clicked“获得的,从用户使用角度来说太不方便了,一般习惯都是输入好内容,然后直接按回车键。查阅了下Devhelp,找到实现方法。主要就是activate信号,代码如下。

C语言: Codee#6176
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 » | 技术

Back to top