Webkit自带谷歌浏览器实例分析(3)

    技术2022-05-19  32

    第二节我们几个重要函数的实现涉及到的回调函数都没有过多的解释,是因为我想单独的拿出来品味,慢慢享用。/*这是上边用到的几个全局变量*/

    static GtkWidget* main_window;

    static GtkWidget* uri_entry;

    static GtkStatusbar* main_statusbar;

    static WebKitWebView* web_view;  /*这里就是指的我们平常看到的浏览器(标题+页面)视图*/

    static gchar* main_title;

    static gdouble load_progress;

    static guint status_context_id;

     

    /*注意了,,,,,,回调函数开始啦……*/

    static void

    activate_uri_entry_cb (GtkWidget* entry, gpointer data)

    {/*往地址栏里边输入地址时候触发事件发出*/

        const gchar* uri = gtk_entry_get_text (GTK_ENTRY (entry));

        g_assert (uri); /*这里是个断言,就像c语言中的一样*/

        webkit_web_view_load_uri (web_view, uri);/*如果uri没错,加载*/

    }

    static void

    update_title (GtkWindow* window)/*这个不是回调函数,,,因为它没cb(*^__^*) */

    {

        /*新建一个GString对象,并用main_title初始化*/

        GString* string = g_string_new (main_title);

        /* g_string_append 往string里边追加字符串*/

        g_string_append (string, " - WebKit Launcher");

        /*加载进度小于100%的话,在整个window标题栏以数字形式打印进度。如果难以理解可以看看上边的图*/

        if (load_progress < 100)

            /*下面的函数有点像sprintf()*/

            g_string_append_printf (string, " (%f%%)", load_progress);

        gchar* title = g_string_free (string, FALSE);/*为FALSE的时候,并不删除string的所指向的实际数据,而是把它返回给title 。如果为true,则也将内存中的数据一并释放,就无法显示在window上了,不过我感觉这里比较赘余*/

     

        gtk_window_set_title (window, title);

        g_free (title);

    }

     

    /*Hover英文是徘徊的意思,,,而这里就是说链接(link)在状态栏里边徘徊来徘徊去的意思,看一下运行实例,是不是很有意思O(∩_∩)O~*/

    static void

    link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data)

    {

    /*gtk_statusbar_pop() 删除在栈中给定上下文标识符的最上面的一条消息因为要显示新的link了,所以要删除旧的。*/

       gtk_statusbar_pop (main_statusbar, status_context_id);

     

       /*如果link存在,则把它加入到状态栏的栈中,同时status_context_id 是标示在不通状态下的显示内容的id*/

        if (link)

            gtk_statusbar_push (main_statusbar, status_context_id, link);

    }

     

    static void

    title_change_cb (WebKitWebView* web_view, WebKitWebFrame* web_frame, const gchar* title, gpointer data)

    {

        if (main_title)

            g_free (main_title);

        main_title = g_strdup (title);/*得到title的一个副本,不用时候会被释放*/

        update_title (GTK_WINDOW (main_window));/*调用函数,改变窗口标题*/

    }

     

     

     

    static void   /* notify::load-status 信号产生时候调用*/

    notify_load_status_cb (WebKitWebView* web_view, GParamSpec* pspec, gpointer data)

    {

        /*如果浏览器显示状态时正在加载提交的话,得到uri并放入entry框*/

    if (webkit_web_view_get_load_status (web_view) == WEBKIT_LOAD_COMMITTED) {

            WebKitWebFrame* frame = webkit_web_view_get_main_frame (web_view);

            const gchar* uri = webkit_web_frame_get_uri (frame);

            if (uri)

                gtk_entry_set_text (GTK_ENTRY (uri_entry), uri);

        }

    }

     

    static void  /* notify::progress 这些信号貌似都是自定义的信号*/

    notify_progress_cb (WebKitWebView* web_view, GParamSpec* pspec, gpointer data)

    {

        load_progress = webkit_web_view_get_progress (web_view) * 100;

        update_title (GTK_WINDOW (main_window));

    }

     

    static void     /*销毁信号产生时被调用*/

    destroy_cb (GtkWidget* widget, gpointer data)

    {

        gtk_main_quit ();

    }

     

    static void  /*直接调用webkit的后退函数实现*/

    go_back_cb (GtkWidget* widget, gpointer data)

    {

        webkit_web_view_go_back (web_view);

    }

     

    static void  /*直接调用webkit的前进函数实现*/

    go_forward_cb (GtkWidget* widget, gpointer data)

    {

        webkit_web_view_go_forward (web_view);

    }

     

    关于这里边的自定义的几个信号,是webkit自定义的信号,我们直接用就是就不说那么多了,走远了,好了,差不多这个简单的浏览器分析就完成了


    最新回复(0)