Ci-dessous, les différences entre deux révisions de la page.
— |
gtklauncher [2023/07/18 23:11] (Version actuelle) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== main.c ====== | ||
+ | <code c> | ||
+ | /* | ||
+ | * Copyright (C) 2006, 2007 Apple Inc. | ||
+ | * Copyright (C) 2007 Alp Toker < | ||
+ | * | ||
+ | * Redistribution and use in source and binary forms, with or without | ||
+ | * modification, | ||
+ | * are met: | ||
+ | * 1. Redistributions of source code must retain the above copyright | ||
+ | | ||
+ | * 2. Redistributions in binary form must reproduce the above copyright | ||
+ | | ||
+ | | ||
+ | * | ||
+ | * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' | ||
+ | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
+ | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
+ | * PURPOSE ARE DISCLAIMED. | ||
+ | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||
+ | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
+ | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||
+ | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | ||
+ | * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
+ | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
+ | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
+ | * | ||
+ | * Modification pour la démo: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | static gint windowCount = 0; | ||
+ | |||
+ | static GtkWidget* createWindow(WebKitWebView** outWebView); | ||
+ | |||
+ | static void activateUriEntryCb(GtkWidget* entry, gpointer data) | ||
+ | { | ||
+ | WebKitWebView *webView = g_object_get_data(G_OBJECT(entry), | ||
+ | const gchar* uri = gtk_entry_get_text(GTK_ENTRY(entry)); | ||
+ | g_assert(uri); | ||
+ | webkit_web_view_load_uri(webView, | ||
+ | } | ||
+ | |||
+ | static void updateTitle(GtkWindow* window, WebKitWebView* webView) | ||
+ | { | ||
+ | GString *string = g_string_new(webkit_web_view_get_title(webView)); | ||
+ | gdouble loadProgress = webkit_web_view_get_progress(webView) * 100; | ||
+ | g_string_append(string, | ||
+ | if (loadProgress < 100) | ||
+ | g_string_append_printf(string, | ||
+ | gchar *title = g_string_free(string, | ||
+ | gtk_window_set_title(window, | ||
+ | g_free(title); | ||
+ | } | ||
+ | |||
+ | static void linkHoverCb(WebKitWebView* page, const gchar* title, const gchar* link, GtkStatusbar* statusbar) | ||
+ | { | ||
+ | guint statusContextId = | ||
+ | GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(statusbar), | ||
+ | /* underflow is allowed */ | ||
+ | gtk_statusbar_pop(statusbar, | ||
+ | if (link) | ||
+ | gtk_statusbar_push(statusbar, | ||
+ | } | ||
+ | |||
+ | static void notifyTitleCb(WebKitWebView* webView, GParamSpec* pspec, GtkWidget* window) | ||
+ | { | ||
+ | updateTitle(GTK_WINDOW(window), | ||
+ | } | ||
+ | |||
+ | static void notifyLoadStatusCb(WebKitWebView* webView, GParamSpec* pspec, GtkWidget* uriEntry) | ||
+ | { | ||
+ | if (webkit_web_view_get_load_status(webView) == WEBKIT_LOAD_COMMITTED) { | ||
+ | WebKitWebFrame *frame = webkit_web_view_get_main_frame(webView); | ||
+ | const gchar *uri = webkit_web_frame_get_uri(frame); | ||
+ | if (uri) | ||
+ | gtk_entry_set_text(GTK_ENTRY(uriEntry), | ||
+ | } | ||
+ | } | ||
+ | |||
+ | static void notifyProgressCb(WebKitWebView* webView, GParamSpec* pspec, GtkWidget* window) | ||
+ | { | ||
+ | updateTitle(GTK_WINDOW(window), | ||
+ | } | ||
+ | |||
+ | static void destroyCb(GtkWidget* widget, GtkWidget* window) | ||
+ | { | ||
+ | if (g_atomic_int_dec_and_test(& | ||
+ | gtk_main_quit(); | ||
+ | } | ||
+ | |||
+ | static void closeCb(GtkWidget* widget, | ||
+ | { | ||
+ | gtk_main_quit(); | ||
+ | } | ||
+ | |||
+ | static void goBackCb(GtkWidget* widget, | ||
+ | { | ||
+ | webkit_web_view_go_back(webView); | ||
+ | } | ||
+ | |||
+ | static void goForwardCb(GtkWidget* widget, WebKitWebView* webView) | ||
+ | { | ||
+ | webkit_web_view_go_forward(webView); | ||
+ | } | ||
+ | |||
+ | static WebKitWebView* | ||
+ | createWebViewCb(WebKitWebView* webView, WebKitWebFrame* web_frame, GtkWidget* window) | ||
+ | { | ||
+ | WebKitWebView *newWebView; | ||
+ | createWindow(& | ||
+ | return newWebView; | ||
+ | } | ||
+ | |||
+ | static gboolean webViewReadyCb(WebKitWebView* webView, GtkWidget* window) | ||
+ | { | ||
+ | gtk_widget_grab_focus(GTK_WIDGET(webView)); | ||
+ | gtk_widget_show_all(window); | ||
+ | return FALSE; | ||
+ | } | ||
+ | |||
+ | static gboolean closeWebViewCb(WebKitWebView* webView, GtkWidget* window) | ||
+ | { | ||
+ | gtk_widget_destroy(window); | ||
+ | return TRUE; | ||
+ | } | ||
+ | |||
+ | static useProxy(void) | ||
+ | { | ||
+ | SoupSession* session = webkit_get_default_session(); | ||
+ | if(session) { | ||
+ | | ||
+ | | ||
+ | g_object_set(session, | ||
+ | soup_uri_free(uri); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | static GtkWidget* createBrowser(GtkWidget* window, GtkWidget* uriEntry, GtkWidget* statusbar, WebKitWebView* webView) | ||
+ | { | ||
+ | GtkWidget *scrolledWindow = gtk_scrolled_window_new(NULL, | ||
+ | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), | ||
+ | |||
+ | gtk_container_add(GTK_CONTAINER(scrolledWindow), | ||
+ | |||
+ | g_signal_connect(webView, | ||
+ | g_signal_connect(webView, | ||
+ | g_signal_connect(webView, | ||
+ | g_signal_connect(webView, | ||
+ | g_signal_connect(webView, | ||
+ | g_signal_connect(webView, | ||
+ | g_signal_connect(webView, | ||
+ | |||
+ | useProxy(); | ||
+ | |||
+ | return scrolledWindow; | ||
+ | } | ||
+ | |||
+ | static GtkWidget* createStatusbar() | ||
+ | { | ||
+ | GtkStatusbar *statusbar = GTK_STATUSBAR(gtk_statusbar_new()); | ||
+ | guint statusContextId = gtk_statusbar_get_context_id(statusbar, | ||
+ | g_object_set_data(G_OBJECT(statusbar), | ||
+ | GUINT_TO_POINTER(statusContextId)); | ||
+ | |||
+ | return GTK_WIDGET(statusbar); | ||
+ | } | ||
+ | |||
+ | static GtkWidget* createToolbar(GtkWidget* uriEntry, WebKitWebView* webView) | ||
+ | { | ||
+ | GtkWidget *toolbar = gtk_toolbar_new(); | ||
+ | |||
+ | #if GTK_CHECK_VERSION(2, | ||
+ | gtk_orientable_set_orientation(GTK_ORIENTABLE(toolbar), | ||
+ | #else | ||
+ | gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), | ||
+ | #endif | ||
+ | gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), | ||
+ | |||
+ | GtkToolItem *item; | ||
+ | |||
+ | /* the back button */ | ||
+ | item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK); | ||
+ | g_signal_connect(G_OBJECT(item), | ||
+ | gtk_toolbar_insert(GTK_TOOLBAR(toolbar), | ||
+ | |||
+ | /* The forward button */ | ||
+ | item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD); | ||
+ | g_signal_connect(G_OBJECT(item), | ||
+ | gtk_toolbar_insert(GTK_TOOLBAR(toolbar), | ||
+ | |||
+ | /* The URL entry */ | ||
+ | item = gtk_tool_item_new(); | ||
+ | gtk_tool_item_set_expand(item, | ||
+ | gtk_container_add(GTK_CONTAINER(item), | ||
+ | g_signal_connect(G_OBJECT(uriEntry), | ||
+ | gtk_toolbar_insert(GTK_TOOLBAR(toolbar), | ||
+ | |||
+ | /* The go button */ | ||
+ | g_object_set_data(G_OBJECT(uriEntry), | ||
+ | item = gtk_tool_button_new_from_stock(GTK_STOCK_OK); | ||
+ | g_signal_connect_swapped(G_OBJECT(item), | ||
+ | gtk_toolbar_insert(GTK_TOOLBAR(toolbar), | ||
+ | |||
+ | item = gtk_tool_button_new_from_stock(GTK_STOCK_CLOSE); | ||
+ | g_signal_connect_swapped(G_OBJECT(item), | ||
+ | gtk_toolbar_insert(GTK_TOOLBAR(toolbar), | ||
+ | |||
+ | return toolbar; | ||
+ | } | ||
+ | |||
+ | static GtkWidget* createWindow(WebKitWebView** outWebView) | ||
+ | { | ||
+ | WebKitWebView *webView; | ||
+ | GtkWidget *vbox; | ||
+ | GtkWidget *window; | ||
+ | GtkWidget *uriEntry; | ||
+ | GtkWidget *statusbar; | ||
+ | |||
+ | g_atomic_int_inc(& | ||
+ | |||
+ | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | ||
+ | gtk_window_set_default_size(GTK_WINDOW(window), | ||
+ | gtk_widget_set_size_request(window, | ||
+ | gtk_widget_set_name(window, | ||
+ | |||
+ | webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); | ||
+ | uriEntry = gtk_entry_new(); | ||
+ | |||
+ | vbox = gtk_vbox_new(FALSE, | ||
+ | statusbar = createStatusbar(webView); | ||
+ | gtk_box_pack_start(GTK_BOX(vbox), | ||
+ | gtk_box_pack_start(GTK_BOX(vbox), | ||
+ | gtk_box_pack_start(GTK_BOX(vbox), | ||
+ | |||
+ | gtk_container_add(GTK_CONTAINER(window), | ||
+ | |||
+ | g_signal_connect(window, | ||
+ | |||
+ | gtk_window_set_resizable(GTK_WINDOW(window), | ||
+ | |||
+ | if (outWebView) | ||
+ | *outWebView = webView; | ||
+ | |||
+ | return window; | ||
+ | } | ||
+ | |||
+ | static gchar* filenameToURL(const char* filename) | ||
+ | { | ||
+ | if (!g_file_test(filename, | ||
+ | return 0; | ||
+ | |||
+ | GFile *gfile = g_file_new_for_path(filename); | ||
+ | gchar *fileURL = g_file_get_uri(gfile); | ||
+ | g_object_unref(gfile); | ||
+ | |||
+ | return fileURL; | ||
+ | } | ||
+ | |||
+ | #ifndef GTK_API_VERSION_2 | ||
+ | static void disablePlugin(const char* pluginName) | ||
+ | { | ||
+ | WebKitWebPluginDatabase *database = webkit_get_web_plugin_database(); | ||
+ | GSList *plugins = webkit_web_plugin_database_get_plugins(database); | ||
+ | GSList *p; | ||
+ | |||
+ | for (p = plugins; p; p = g_slist_next(p)) { | ||
+ | WebKitWebPlugin *plugin = WEBKIT_WEB_PLUGIN(p-> | ||
+ | |||
+ | if (!g_strcmp0(webkit_web_plugin_get_name(plugin), | ||
+ | webkit_web_plugin_set_enabled(plugin, | ||
+ | } | ||
+ | |||
+ | webkit_web_plugin_database_plugins_list_free(plugins); | ||
+ | } | ||
+ | #endif | ||
+ | int main(int argc, char* argv[]) | ||
+ | { | ||
+ | WebKitWebView *webView; | ||
+ | GtkWidget *main_window; | ||
+ | |||
+ | gtk_init(& | ||
+ | if (!g_thread_supported()) | ||
+ | g_thread_init(NULL); | ||
+ | |||
+ | #ifndef GTK_API_VERSION_2 | ||
+ | disablePlugin(" | ||
+ | #endif | ||
+ | |||
+ | main_window = createWindow(& | ||
+ | |||
+ | gchar *uri =(gchar*)(argc > 1 ? argv[1] : " | ||
+ | gchar *fileURL = filenameToURL(uri); | ||
+ | |||
+ | webkit_web_view_load_uri(webView, | ||
+ | g_free(fileURL); | ||
+ | |||
+ | gtk_widget_grab_focus(GTK_WIDGET(webView)); | ||
+ | gtk_widget_show_all(main_window); | ||
+ | gtk_main(); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ====== Makefile ====== | ||
+ | <code bash> | ||
+ | all: GtkLauncher | ||
+ | |||
+ | GtkLauncher: | ||
+ | gcc -DGTK_API_VERSION_2 -o GtkLauncher main.c `pkg-config --cflags --libs webkit-1.0` | ||
+ | |||
+ | |||
+ | install: GtkLauncher | ||
+ | install GtkLauncher /opt/ | ||
+ | |||
+ | clean: | ||
+ | rm -f GtkLauncher | ||
+ | </ | ||
+ | |||