在Linux的XWindows 中显示一个.gif图片(2)
to: yyy790601,太谢谢你啦,:) 那个帖子已经结帖了。
图片显示问题搞定拉,用vbox可以显示。
但是,图片太小只能居中显示,如何让图片拉伸从而充满整个屏幕呢??就像windows的桌面背景一样可以控制。
代码如下:
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *image;
GtkWidget *event_box;
//gy add
GtkWidget *vbox;
GdkPixbufAnimation *anim_pixbuf;
gtk_init (&argc, &argv);
anim_pixbuf = gdk_pixbuf_animation_new_from_file("bubu.gif", NULL);
image = gtk_image_new_from_animation(anim_pixbuf);
//gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_POPUP);
gtk_window_set_default_size(window,800,600);
event_box=gtk_event_box_new();
//gy add
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add(GTK_CONTAINER(window),vbox);
gtk_widget_set_events (vbox, GDK_BUTTON_PRESS_MASK);
g_signal_connect (G_OBJECT (vbox), "button_press_event",
G_CALLBACK (run), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 0);
//image = gtk_image_new_from_file ("bubu.gif");
//modified
gtk_container_add (GTK_CONTAINER (vbox), image);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
问题点数:100、回复次数:10Top
1 楼dlgy(小猪快跑)回复于 2005-11-02 09:41:40 得分 0
自己顶~Top
2 楼yyy790601(发呆的鱼)回复于 2005-11-02 12:47:51 得分 100
这两天我试了下,也没解决这个问题。不过还没使用调整对象。
而且如果把图片放大,效果肯定不好,推荐用一个800×600的图片算了,汗。。。。Top
3 楼dlgy(小猪快跑)回复于 2005-11-02 13:24:20 得分 0
哈哈,谢谢啦,我也这么想的,干脆换一个800×600的好了,不知道客户能不能同意,以后再说。
记得你上次提到“实际使用中,开个子进程运行这个屏幕锁定程序,另外一个进程如果检测到光驱插入正确,向这个子进程发送信号,此子进程在接收到指定信号后退出就行了。”
我用一个主程序可以吗,在main里面开辟一个子进程,调用一个函数(锁定显示器),我试着做了一下,可以显示出图片,但是如何得到信号后,再杀死它,然后返回主进程阿?现在的代码(main函数和显示图片函数)如下:
int main(int argc, char *argv[]){
int loop_time = 0;
char license_filename[BUFFER_SIZE] = "";
char license_text[BUFFER_SIZE] = "";
bool unlock_flag = false;
bool unlocked_flag = true;
//add by gy
pid_t pid_saved;
int sig = 100;
if( argc != 2 || argv[1][0] != '/' ){
printf("Usage: %s (absolute path)property_filename\n",argv[0]);
printf("For exaple: %s /etc/kbctld.conf\n",argv[0]);
exit(1);
}
daemon_init(argv[0], LOG_USER);
strcpy(PROPERTY_FILENAME,argv[1]);
if( keyboard_locked() ){
unlocked_flag = false;
syslog(LOG_INFO, "keyboard has been locked.......\n");
//display_pic(argc, argv);
//create a fork
////////////////////////////////
pid_t pid;
pid = fork();
if (!pid) {
//printf("this is child ");
display_pic(argc, argv);
}
/////////////////////////////
}
else{
syslog(LOG_INFO, "keyboard hasn't been locked.......\n");
}
while( true ){
loop_time = get_loop_time();
get_license_filename(license_filename);
get_license_text(license_text);
if( have_text(license_filename, license_text) ){
unlock_flag = true;
syslog(LOG_INFO, "Unlock_flag......\n");
}
if( unlock_flag && !unlocked_flag ){
unlock_keyboard();
unlocked_flag = true;
syslog(LOG_INFO, "Keyboard is unlocked......\n");
}
else if( !unlock_flag && unlocked_flag ){
lock_keyboard();
unlocked_flag = false;
syslog(LOG_INFO, "Keyboard is locked......\n");
//////////////////////////////
pid_t pid;
pid = fork();
if (!pid) {
display_pic(argc, argv);
}
////////////////////////////
}
unlock_flag = false;
sleep(loop_time);
}
return 0;
}
//display_pic()如下:
int display_pic(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *image;
GtkWidget *vbox;
GdkPixbufAnimation *anim_pixbuf;
char pic_name[BUFFER_SIZE] = "";
gtk_init (&argc, &argv);
get_property(PROPERTY_FILENAME,PROPERTY_KBLOCK_PIC_NAME, pic_name);
anim_pixbuf = gdk_pixbuf_animation_new_from_file(pic_name, NULL);
image = gtk_image_new_from_animation(anim_pixbuf);
window = gtk_window_new (GTK_WINDOW_POPUP);
gtk_window_set_default_size(window,800,600);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add(GTK_CONTAINER(window),vbox);
gtk_container_set_border_width (GTK_CONTAINER (window), 0);
gtk_container_add (GTK_CONTAINER (vbox), image);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
我试着 kill(pid_saved, sig) 和 signal(sig, thr_exit()); 一些信号函数和进程函数,但都无法实现这个功能,实在是做不出来了,可能是我对进程了解的太少了,但是现在学又有些来不及,经理让这周末就拿出来,能帮帮我吗?最好能给出代码,万分感谢!!!!
Top
4 楼yyy790601(发呆的鱼)回复于 2005-11-02 13:47:10 得分 0
在判断光驱正常运行后,父进程向子进程发送SIGCHLD信号就能杀死子进程了。
/*
*kill the child progress
*/
int killprocess(pid_t pid)
{
int ret;
if(pid < getppid())
return -1;
ret = kill(pid,SIGCHLD);
return ret;
}Top
5 楼dlgy(小猪快跑)回复于 2005-11-02 15:07:50 得分 0
int killprocess(pid_t pid)
{
int ret;
if(pid < getppid())
return -1;
ret = kill(pid,SIGCHLD);
return ret;
}
这个函数的参数int killprocess(pid_t pid), pid应该是主进程的吗?
我在:
while( true ){
loop_time = get_loop_time();
get_license_filename(license_filename);
get_license_text(license_text);
if( have_text(license_filename, license_text) ){
unlock_flag = true;
syslog(LOG_INFO, "Unlock_flag......\n");
}
if( unlock_flag && !unlocked_flag ){
unlock_keyboard();
unlocked_flag = true;
syslog(LOG_INFO, "Keyboard is unlocked......\n");
//////////////////调用killprocess/////////
killprocess(getpid());
////////////////////////
}
这么写不好用阿?Top
6 楼yyy790601(发呆的鱼)回复于 2005-11-02 19:26:13 得分 0
你把主进程杀了做什么,pid是子进程id,也就是显示图象的进程。Top
7 楼dlgy(小猪快跑)回复于 2005-11-02 19:27:50 得分 0
to : yyy790601, 谢谢你啦。搞定了!
把kill()的参数改成SIGKILL就可以拉。代码如下:
int main(int argc, char *argv[]){
int loop_time = 0;
char license_filename[BUFFER_SIZE] = "";
char license_text[BUFFER_SIZE] = "";
bool unlock_flag = false;
bool unlocked_flag = true;
//add by gy
pid_t pid_saved;
pid_t pid_main;
//int sig = 100;
pid_main = getpid();
if( argc != 2 || argv[1][0] != '/' ){
printf("Usage: %s (absolute path)property_filename\n",argv[0]);
printf("For exaple: %s /etc/kbctld.conf\n",argv[0]);
exit(1);
}
daemon_init(argv[0], LOG_USER);
strcpy(PROPERTY_FILENAME,argv[1]);
if( keyboard_locked() ){
unlocked_flag = false;
syslog(LOG_INFO, "keyboard has been locked.......\n");
//add by gy
//display_pic(argc, argv);
//create a fork
pid_t pid;
pid = fork();
//syslog(LOG_INFO, pid);
if (!pid) {
//printf("this is child ");
display_pic(argc, argv);
}
//if (pid==100) {
// _exit();
//}
//syslog(LOG_INFO, "access thr_exit1().........\n");
//signal(sig, thr_exit());
}
else{
syslog(LOG_INFO, "keyboard hasn't been locked.......\n");
//exit(0);
//syslog(LOG_INFO, "000000access thr_exit1().........\n");
//signal(sig, thr_exit());
}
while( true ){
loop_time = get_loop_time();
get_license_filename(license_filename);
get_license_text(license_text);
if( have_text(license_filename, license_text) ){
unlock_flag = true;
syslog(LOG_INFO, "Unlock_flag......\n");
}
if( unlock_flag && !unlocked_flag ){
unlock_keyboard();
unlocked_flag = true;
syslog(LOG_INFO, "Keyboard is unlocked:%d:%d......\n",pid_main, pid_saved);
killprocess(pid_saved);
//undo the pic
//int sig = 100;
//int ret_val = kill(pid_saved, sig);
syslog(LOG_INFO, "access kill().........\n");
//if (kill(pid_saved, sig) != 0) {
// syslog(LOG_INFO, "return signal error......\n");
// }
//syslog(LOG_INFO, "from kill().........\n");
}
else if( !unlock_flag && unlocked_flag ){
lock_keyboard();
unlocked_flag = false;
syslog(LOG_INFO, "Keyboard is locked......\n");
//add by gy
//display_pic(argc, argv);
pid_t pid;
pid = fork();
pid_saved = pid;
//syslog(LOG_INFO, pid);
// syslog(LOG_INFO, "111access thr_exit2().........\n");
// signal(sig, thr_exit());
if (!pid) {
//printf("this is child ");
display_pic(argc, argv);
}
//syslog(LOG_INFO, "access thr_exit2().........\n");
//signal(sig, thr_exit());
}
unlock_flag = false;
sleep(loop_time);
}
return 0;
}
int killprocess(pid_t pid)
{
syslog(LOG_INFO, "in killprocess()..........................\n");
int ret;
if(pid < getppid()){
syslog(LOG_INFO, "in killprocess():%d:%d..\n",pid,getppid());
return -1;
}
ret = kill(pid, SIGKILL);
return ret;
}
Top
8 楼yyy790601(发呆的鱼)回复于 2005-11-02 19:42:02 得分 0
恭喜了哦。解决问题挺快的,下午不能上网,也帮不了什么。
代码我也保存一下,说不定什么时候也用的着。Top
9 楼dlgy(小猪快跑)回复于 2005-11-02 19:55:05 得分 0
你把主进程杀了做什么,pid是子进程id,也就是显示图象的进程。
恩,我改过来了,嘿嘿。
谢谢你,yyy790601。我一直在搞java web开发,也是这周才接触linux c编程,这次多亏你的帮助,才能完成。
不介意的话加我的msn吧,dlgy352@hotmail.com 很高兴能和你成为朋友。Top
10 楼yyy790601(发呆的鱼)回复于 2005-11-02 20:06:32 得分 0
以前我也是想学java的,导师叫我学linux,就搞linux了。
msn不用,一般用qq,6163120。Top




