linux gtk IDE 程序设计(四)

来源:互联网 发布:扬州大学网络教学平台 编辑:程序博客网 时间:2024/06/05 03:09
昨天晚上和丫头聊天(珠珠)
他说,假如以后我们吵架了怎么办呢?
我说吵架很正常阿,只要你不提分手,我会珍惜这段感情的
可是假如一时冲动提了呢?
我说那就不要意识冲动嘛,要不你说分手我有不可能死缠烂打的。。。
那假如我们吵架了不说话了呢?你会主动和我说话不?
当然阿,女生耍耍小脾气多正常的,我应该会主动的
那以后假如吵架生气了,你只要发个短信“丫头”过来我就不生气了~

呵呵,听这还感觉还是很感动的,多好的女孩,呵呵,希望能一直和她走下去,更远,再远,搞的我昨天做了一晚上关于丫头的梦,好久没做梦了突然作一次还不习惯的,呵呵,不过梦的内容记不到了,可惜阿~

说完生活进入正题了哈
今天gtk IDE的编写有有了新进展,可以编译单一文件了,呵呵,不过那个连结还么作。。。
在信进展中遇到了个以解决的问题,不过我还是把解决方法拿来和大家分享一下哈
是关于system的使用的
感觉并不是所有终端能执行的语句方到了system中就能执行的,尤其是重定向
比如
程序中的system(“ls”)
可以正常执行
system(“ls > out.txt”)也可以正常执行
但是对错误重定向就有点问题了

system(“ls asdf 2&> out.txt”)
system(“ls asdf 2 &> out.txt”)
system(“ls asdf &> out.txt”)
都不能重定向成功,而在终端下都是可以执行的
但是
system(“ls asdf 2> out.txt”)
system(“ls asdf > out.txt 2>&1”)
就可以

一下是这阶段的源代码
对代码的模块有进行了改变,感觉清晰了一些,但是还是单文件编译,因为我还不会些makefile,不过会多文件编译了,但是直接代码里多文件编译是在是麻烦,所以暂时没有使用
#include <gtk/gtk.h>
#include <fcntl.h>
#include <stdio.h>
#include  <string.h>
#include <malloc.h>
#include <unistd.h>
/*=============================*/
/*definition space             */
/*=============================*/
#define MAIN_WINDOW_WIDTH 790
#define MAIN_WINDOW_HIGH  590

#define F_NAME 0
#define F_PATH 1
/*=============================*/
/*the place of fuction declear */
/*=============================*/
void main_window_init(void);
void show_init(void);
void interface_init(void);
void interface_set(void);
void menu_init(void);
void view_init(void);
void debug_view_init(void);
void view_state_label_init(void);
gint delete_event(GtkWidget* widget, GdkEvent* event, gpointer data);
gint file_open(GtkWidget* widget, GdkEvent* event, gpointer data);
gint file_open_ok(GtkWidget* widget, GdkEvent* event, gpointer data);
gint file_save(GtkWidget* widget, GdkEvent* event, gpointer data);
gint file_save_ok(GtkWidget* widget, GdkEvent* event, gpointer data);
gint debug_compile(GtkWidget* widget, GdkEvent* event, gpointer data);
gint debug_function(GtkWidget* widget, GdkEvent* event, gpointer data);
gint view_key_press(GtkWidget* widget, GdkEvent* event, gpointer data);
gint main_window_key_press(GtkWidget* widget, GdkEvent* event, gpointer data);
char* f_get_string_name(char* string,char type);
/*==============================*/
/*global symbol declear         */
/*==============================*/
GtkWidget* main_window;
GtkWidget* window;
GtkWidget* main_menu_bar;
GtkWidget* file;
GtkWidget* table;

GtkWidget* view;
GtkWidget* view_scroll;

GtkWidget* debug_view;
GtkWidget* debug_view_scroll;
GtkWidget* main_menu_box;
GtkWidget* project_box;
GtkWidget* debug_box;
GtkWidget* view_box;
GtkWidget* view_state_label;
GtkWidget* view_state_label_box;
GtkWidget* debug_view_box;
GtkWidget* default_box;
GtkWidget* menu_items;
GtkWidget* tmp1;
GtkWidget* tmp2;
GtkWidget* tmp3;
GtkWidget* tmp4;
const char *file_name = NULL;
GtkTextBuffer* code = NULL;
GtkTextBuffer* debug_view_buffer = NULL;
/*********************************/
/* the access of program         */
/*********************************/
int main(int argc, char* argv[])
{
    /*init*/
    gtk_init(&argc,&argv);
    main_window_init();
    interface_init();
    view_init();
    view_state_label_init();
    debug_view_init();
    menu_init();
    tmp1 = gtk_button_new_with_label("project_space");
    tmp2 = gtk_button_new_with_label("debug_space");
    tmp3 = gtk_button_new_with_label("default_space");
    tmp4 = gtk_button_new_with_label("view_space");
    interface_set();
    g_signal_connect(G_OBJECT(tmp3),"clicked",G_CALLBACK(debug_function),NULL);
    /*show*/
    show_init();
    gtk_main();
    return 0;
}
gint debug_function(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    /*char buffer[128];
    int nread;
    nread = read(0, buffer, 128);
    if(nread == -1)write(2, "A read error has occurred/n", 26);
    if ((write(1,buffer,nread)) != nread)write(2, "A write error has occurred/n",27);*/
    system("ls s 2>/home/flyli/program/hello_world/debug.info");
    return TRUE;
}
/************************************************/
/*answer the file_open of the main_menu's signal*/
/************************************************/
gint file_open(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    file = gtk_file_selection_new("open file");
    g_signal_connect(GTK_FILE_SELECTION(file)->ok_button,"clicked",G_CALLBACK(file_open_ok),file);
    gtk_widget_show(file);
    g_printf("file_open/n");
    return TRUE;
}
/*************************************************************/
/*answer the file_open's ok_clicked of the main_menu's signal*/
/*************************************************************/
gint file_open_ok(GtkWidget* widget, GdkEvent* envet, gpointer data)
{
    int read_file = 0;
    int len = 0;
    GtkTextIter end;
    char buf[1024] = {0};
    /*clear the code buffer*/
    gtk_text_buffer_set_text(code, "NULL",0);
    file_name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file));
    read_file = open(file_name, O_RDONLY);
    while((len = read(read_file, buf, sizeof(buf)))>0)
    {
        gtk_text_buffer_get_end_iter (code, &end);
        gtk_text_buffer_insert(code, &end, buf, len);
    }
    close(read_file);
    g_printf("%s open/n",file_name);
    gtk_widget_destroy(file);
    return TRUE;
}
/************************************************/
/*answer the file_save of the main_menu's signal*/
/************************************************/
gint file_save(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    FILE* fp = NULL;
    int write_file = 0;
    int len = 0;
    GtkTextIter start;
    GtkTextIter end;
    gchar* buf = NULL;
    char cmd[10000] = {0};
    if(file_name != NULL)
    {
        sprintf(cmd,"rm %s",file_name);
        system(cmd);
        close(write_file);
        fp= fopen(file_name, "w");
        gtk_text_buffer_get_start_iter (code, &start);
        gtk_text_buffer_get_end_iter (code, &end);
        buf = gtk_text_buffer_get_text(code, &start, &end,FALSE);
        g_print("%d",strlen(buf));
        fwrite(buf, strlen(buf), 1, fp);
        fclose(fp);
    }
    else
    {
        file = gtk_file_selection_new("open file");
        g_signal_connect(GTK_FILE_SELECTION(file)->ok_button,"clicked",G_CALLBACK(file_save_ok),file);
        gtk_widget_show(file);
    }
    g_printf("file_save/n");
    return TRUE;
}
/*************************************************************/
/*answer the save_open's ok_clicked of the main_menu's signal*/
/*************************************************************/
gint file_save_ok(GtkWidget* widget, GdkEvent* envet, gpointer data)
{
    FILE* fp = NULL;
    int write_file = 0;
    int len = 0;
    GtkTextIter start;
    GtkTextIter end;
    char* buf = NULL;
    char cmd[1000] = {0};
    /*clear the code buffer*/
    //gtk_text_buffer_set_text(code, "NULL",0);
    file_name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file));
    write_file = open(file_name, O_WRONLY);
    sprintf(cmd,"rm %s",file_name);
    if(write_file != -1)
    {
        system(cmd);
    }
    close(write_file);
    fp= fopen(file_name, "w");
    gtk_text_buffer_get_start_iter (code, &start);
    gtk_text_buffer_get_end_iter (code, &end);
    buf = gtk_text_buffer_get_text(code, &start, &end,FALSE);
   
    fwrite(buf, strlen(buf), 1, fp);
    fclose(fp);
    g_printf("%s save/n",file_name);
    gtk_widget_destroy(file);
    return TRUE;
}
/****************************************************/
/*answer the debug_compile of the main_menu's signal*/
/****************************************************/
gint debug_compile(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    int i = 0;
    char cmd[1000] = {0};
    char* compile_file_name = NULL;
    char* compile_file_path = NULL;
    int debug_file = 0;
    char system_rnt_read[1000] = {0};
    char debug_file_name[1000] = {0};
    GtkTextIter end;
    g_print("Compile1/n");
    if(file_name != NULL)
    {
        compile_file_name = f_get_string_name((char*)file_name,F_NAME);    
        compile_file_path = f_get_string_name((char*)file_name,F_PATH);    
        sprintf(cmd,"gcc -c %s -o %s.o `pkg-config --cflags --libs gtk+-2.0` > %s/debug.info 2>&1", file_name, compile_file_name, compile_file_path);
        system(cmd);
        sprintf(debug_file_name,"%s/debug.info",compile_file_path);
        free(compile_file_name);
        free(compile_file_path);
    }
    g_print("debug_file_name:%s/n",debug_file_name);
    debug_file = open(debug_file_name,O_RDONLY);
    read(debug_file, system_rnt_read,  sizeof(system_rnt_read));
    gtk_text_buffer_set_text(debug_view_buffer,NULL,0);
    gtk_text_buffer_get_end_iter(debug_view_buffer, &end);
    gtk_text_buffer_insert(debug_view_buffer, &end, system_rnt_read, strlen(system_rnt_read));
    g_print("system_rnt_read:%s/n", system_rnt_read);
    return TRUE;
}
/**********************************************/
/*anser the signal of key_press of main window*/
/**********************************************/
gint main_window_key_press(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    guint key = 0;
    key = event->key.keyval;
    g_print("state:%x/n", event->key.state);
    g_print("val:%x/n", event->key.keyval);   
    switch(event->key.state)
    {
        /*ctrl*/
        case 4:
        {
            switch(event->key.keyval)
            {
                case 'f':
                {
                    file_open(NULL,NULL,NULL);
                    return TRUE;
                    break;
                }
                case 's':
                {
                    file_save(NULL,NULL,NULL);
                    return TRUE;
                    break;
                }
                default:break;
            }
            break;
        }
    }
    return FALSE;
}
/***************************************/
/*anser the signal of key_press of view*/
/***************************************/
gint view_key_press(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    guint key = 0;
    key = event->key.keyval;
    g_print("state:%x/n", event->key.state);
    g_print("val:%x/n", event->key.keyval);   
    switch(event->key.state)
    {
        case 0:
        {
            char cmd[1000] = "123";
            switch(event->key.keyval)
            {
                /*F7*/
                case 0xffc4:
                {
                    debug_compile(NULL,NULL,NULL);
                    return TRUE;
                    break;
                }
                default:break;
            }
            break;
        }
        default:
        {
            break;
        }
    }
    return FALSE;
}
/*=================================*/
/*a common function to answer the  */
/*window_main                      */
/*=================================*/
gint delete_event(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    if(data == "main_window")
    {
      g_print("main_window send quit!/n");
    }
    //system("ls");
    gtk_main_quit();
    //gtk_widget_destroy(widget);
    return TRUE;
}
/***************************/
/*  init the main window   */
/***************************/
void main_window_init(void)
{
    main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(main_window),"flyli");
    gtk_window_set_default_size(GTK_WINDOW(main_window),MAIN_WINDOW_WIDTH,MAIN_WINDOW_HIGH);
    gtk_widget_show(main_window);
    g_signal_connect (G_OBJECT (main_window), "delete_event", G_CALLBACK (delete_event), "main_window");
    g_signal_connect (G_OBJECT (main_window), "key_press_event",G_CALLBACK(main_window_key_press),NULL);
}
/**********************************/
/*init the menu of the main window*/
/**********************************/
void menu_init(void)
{
    GtkWidget* main_menu;
   
    GtkWidget* main_file_item;
    main_menu_bar = gtk_menu_bar_new();

    //file
    main_menu = gtk_menu_new();
    main_file_item = gtk_menu_item_new_with_label("File");
    gtk_widget_show(main_file_item);

    menu_items = gtk_menu_item_new_with_label("Open(Ctrl_f)");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
    gtk_widget_show (menu_items);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
    g_signal_connect (G_OBJECT (menu_items), "activate", G_CALLBACK (file_open), "main_file_item");

    menu_items = gtk_menu_item_new_with_label("Save(Ctrl_f)");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
    gtk_widget_show (menu_items);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
    g_signal_connect (G_OBJECT (menu_items), "activate", G_CALLBACK (file_save), "main_file_item");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu_bar),main_file_item);

    //debug
    main_menu = gtk_menu_new();
    main_file_item = gtk_menu_item_new_with_label("Debug");
    gtk_widget_show(main_file_item);

    menu_items = gtk_menu_item_new_with_label("Compile");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
    gtk_widget_show (menu_items);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
    g_signal_connect (G_OBJECT (menu_items), "activate", G_CALLBACK (debug_compile), "main_file_item");
   
   
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu_bar),main_file_item);

    gtk_widget_show(main_menu_bar);
}

/*************************************/
/* init the layout of the main window*/
/*************************************/
void interface_init(void)
{
    table = gtk_table_new(100, 100 , TRUE);
    gtk_container_add(GTK_CONTAINER(main_window), table);

    main_menu_box = gtk_hbox_new(FALSE,0);
    project_box = gtk_hbox_new(FALSE,0);
    debug_box = gtk_hbox_new(FALSE,0);
    default_box = gtk_hbox_new(FALSE,0);
    view_box = gtk_hbox_new(FALSE,0);
    debug_view_box = gtk_vbox_new(FALSE,0);
    view_state_label_box = gtk_vbox_new(FALSE,0);
    gtk_widget_show(table);
    gtk_widget_show(main_menu_box);
    gtk_widget_show(project_box);
    gtk_widget_show(debug_box);
    gtk_widget_show(view_box);
    gtk_widget_show(default_box);
    gtk_widget_show(view_state_label_box);
}
/***********************************/
/*set the layout of the main window*/
/***********************************/
void interface_set(void)
{
    gtk_table_attach_defaults(GTK_TABLE(table), main_menu_box, 0,100, 0, 5);
    gtk_table_attach_defaults(GTK_TABLE(table), project_box, 0,15, 5, 84);
    gtk_table_attach_defaults(GTK_TABLE(table), debug_box  , 1,99, 87, 99);
    gtk_table_attach_defaults(GTK_TABLE(table), view_state_label, 1,99,84,87);
    gtk_table_attach_defaults(GTK_TABLE(table), default_box, 85,100,5,84);
    gtk_table_attach_defaults(GTK_TABLE(table), view_box  , 15,85,6,84);

   
    gtk_box_pack_start(GTK_BOX(project_box), tmp1, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(default_box), tmp3, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(main_menu_box),main_menu_bar,TRUE, TRUE, 0);
}
/***********************/
/* init  show          */
/***********************/
void show_init(void)
{
    gtk_widget_show(tmp1);
    gtk_widget_show(tmp2);
    gtk_widget_show(tmp3);
    gtk_widget_show(tmp4);
    gtk_widget_show(view);
   
    gtk_widget_show(debug_view);
    gtk_widget_show(debug_view_scroll);
   
}
/****************/
/*code view init*/
/****************/
void view_init(void)
{
    view = gtk_text_view_new();
    code = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
    view_scroll = gtk_scrolled_window_new(NULL,NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view_scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    //gtk_container_add (GTK_CONTAINER (view_box), view_scroll);
    gtk_container_add (GTK_CONTAINER (view_box), view_scroll);
    gtk_container_add (GTK_CONTAINER (view_scroll), view);
    g_signal_connect(G_OBJECT(view), "key_press_event", G_CALLBACK(view_key_press), NULL);
    gtk_widget_show(view_scroll);
    gtk_widget_show(view);
   
}
/*****************/
/*debug view init*/
/*****************/
void debug_view_init(void)
{
    debug_view = gtk_text_view_new();
    debug_view_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(debug_view));
    debug_view_scroll = gtk_scrolled_window_new(NULL,NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(debug_view_scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    gtk_container_add (GTK_CONTAINER (debug_box), debug_view_scroll);
    gtk_container_add (GTK_CONTAINER (debug_view_scroll), debug_view);
    gtk_widget_show(debug_view_scroll);
    gtk_widget_show(debug_view);
}
/******************/
/*state label init*/
/******************/
void view_state_label_init(void)
{
    view_state_label = gtk_label_new("label");
    //gtk_label_set_text(GTK_LABEL(view_state_label),"lable");
    //gtk_container_add(GTK_CONTAINER(view_state_label_box),view_state_label);
    gtk_widget_show(view_state_label);
}
/************************************/
/*get the string name without suffix*/
/*remarks:                          */
/*must free the pointer of return   */
/************************************/
char* f_get_string_name(char* string,char type)
{
    char* string_rnt = NULL;
    char* string_from = NULL;
    char tmp = 0;
    unsigned int i = 0;
    string_from = string;
    if(type == 0)
    {
        for(i = 0; i < strlen(string_from); i++)
        {
            if(*(string_from+i) == '.')
            {
                string_rnt = calloc(i+1,1);
                memcpy(string_rnt, string, i);
                return string_rnt;
                break;
            }
        }
    }
    else if(type == 1)
    {
        for(i = strlen(string_from); i != 0; i--)
        {
            if(*(string_from+i) == '/')
            {
                string_rnt = calloc(i+1,1);
                memcpy(string_rnt, string, i);
                return string_rnt;
                break;
            }
        }       
    }
    g_printf("%s/n",string_rnt);
    return NULL;
}
一下是程序截图,可以显示编译的错误信息了,呵呵