📄 gtk_pbar.c
字号:
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>//malloc
#define BUFSIZE 1024
#define SRC "scmj.zip.s"
char DES[16];
#include <gtk/gtk.h>
#include <string.h>//strcat
#define BUFSIZE 1024
int tmp = 0;//copy后新建文件的名字自增参数
void clean(gpointer data)//释放指针,并退出gtk
{
free(data);
gtk_main_quit();
}
typedef struct _tr_data //callback函数传递的指针结构,不想用全局变量^_^
{
GtkWidget *b;
GtkWidget *pbar;
GtkWidget *q;
int ip;
int op;
int count;
int total;
}tran_data;
int die (char *str)//文件读写失败
{
printf("%s\n",str);
return 1;
}
int idle_fuc(gpointer data)//循环
{
tran_data *td = (tran_data *)(data);
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(td->pbar),(float)td->count/td->total);
char tmp[16];
sprintf(tmp,"%.2f",(float)td->count*100/(float)td->total);
strcat(tmp,"%");
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(td->pbar),tmp);
int size;
char *c = malloc(BUFSIZE);
size = read(td->ip,c,BUFSIZE);
if(!size)
{
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(td->pbar),"Done!");
gtk_widget_set_sensitive(td->b,TRUE);
gtk_widget_set_sensitive(td->q,TRUE);
free(c);
return FALSE;
}
write(td->op,c,size);
td->count+=size;
return TRUE;
}
void button_clicked(gpointer data)//每次button clicked 的时候进行新的一次copy
{
tmp++;//change destination file name
tran_data *td = (tran_data *)data;
td->count = 0;
struct stat *buf;
buf = malloc(sizeof(struct stat));
lstat(SRC,buf);
td->total = buf->st_size;
free(buf);
sprintf(DES,"%d",tmp);
strcat(DES,".zip");
td->ip = open(SRC,O_RDONLY);
td->op = open(DES,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
if(td->ip == -1)
die("Open input File Faild");
if(td->op == -1)
die("Open Output File Faild");
gtk_widget_set_sensitive(td->b,FALSE);//保证在copy的过程中两个按钮不能作其它事情,直到copy完成
gtk_widget_set_sensitive(td->q,FALSE);
td->count = 0;
g_idle_add(idle_fuc,td);//gtk 循环处理调用
}
int main(int argc,char *argv[])//主程序
{
gtk_init (&argc,&argv);
GtkWidget *w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(w);
GtkWidget *box = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(w),box);
gtk_widget_show(box);
GtkWidget *b = gtk_button_new_from_stock("gtk-execute");
gtk_box_pack_start(GTK_BOX(box),b,FALSE,FALSE,0);
gtk_widget_show(b);
GtkWidget *pbar = gtk_progress_bar_new();
gtk_box_pack_start(GTK_BOX(box),pbar,FALSE,FALSE,0);
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar),"Click button to start copy");
GtkWidget *q = gtk_button_new_from_stock("gtk-quit");
gtk_box_pack_start(GTK_BOX(box),q,FALSE,FALSE,0);
gtk_widget_show(q);
tran_data *td = malloc(sizeof(tran_data));//初始化结构的一些成员,便于在callback函数中传递
td->b = b;
td->pbar = pbar;
td->q = q;
g_signal_connect_swapped(b,"clicked",G_CALLBACK(button_clicked),td);
g_signal_connect_swapped(w,"delete_event",G_CALLBACK(clean),td);
g_signal_connect_swapped(q,"clicked",G_CALLBACK(clean),td);
gtk_widget_show(pbar);
gtk_main();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -