天天看點

linux gtk IDE 程式設計(四)

昨天晚上和丫頭聊天(珠珠)

他說,假如以後我們吵架了怎麼辦呢?

我說吵架很正常阿,隻要你不提分手,我會珍惜這段感情的

可是假如一時沖動提了呢?

我說那就不要意識沖動嘛,要不你說分手我有不可能死纏爛打的。。。

那假如我們吵架了不說話了呢?你會主動和我說話不?

當然阿,女生耍耍小脾氣多正常的,我應該會主動的

那以後假如吵架生氣了,你隻要發個短信“丫頭”過來我就不生氣了~

呵呵,聽這還感覺還是很感動的,多好的女孩,呵呵,希望能一直和她走下去,更遠,再遠,搞的我昨天做了一晚上關于丫頭的夢,好久沒做夢了突然作一次還不習慣的,呵呵,不過夢的内容記不到了,可惜阿~

說完生活進入正題了哈

今天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>

#define MAIN_WINDOW_WIDTH 790

#define MAIN_WINDOW_HIGH  590

#define F_NAME 0

#define F_PATH 1

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);

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;

int main(int argc, char* argv[])

{

    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_init();

    gtk_main();

    return 0;

}

gint debug_function(GtkWidget* widget, GdkEvent* event, gpointer data)

{

    system("ls s 2>/home/flyli/program/hello_world/debug.info");

    return TRUE;

}

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;

}

gint file_open_ok(GtkWidget* widget, GdkEvent* envet, gpointer data)

{

    int read_file = 0;

    int len = 0;

    GtkTextIter end;

    char buf[1024] = {0};

    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;

}

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;

}

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};

    //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;

}

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;

}

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)

    {

        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;

}

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)

            {

                case 0xffc4:

                {

                    debug_compile(NULL,NULL,NULL);

                    return TRUE;

                    break;

                }

                default:break;

            }

            break;

        }

        default:

        {

            break;

        }

    }

    return FALSE;

}

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;

}

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);

}

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);

}

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);

}

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);

}

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);

}

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);

}

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);

}

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);

}

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;

}

一下是程式截圖,可以顯示編譯的錯誤資訊了,呵呵

linux gtk IDE 程式設計(四)

繼續閱讀