/** \file * \brief Web Browser Control * * See Copyright Notice in "iup.h" */ #ifdef IUPWEB_USE_DLOPEN #include "iupwebgtk_dlopen.h" #else #include #ifdef USE_WEBKIT2 #include #else #include #endif #include #endif #include #include #include #include #include #include "iup.h" #include "iupcbs.h" #include "iup_object.h" #include "iup_layout.h" #include "iup_attrib.h" #include "iup_str.h" #include "iup_webbrowser.h" #include "iup_drv.h" #include "iup_drvfont.h" #include "iup_key.h" #include "iup_register.h" #include "iupgtk_drv.h" #ifndef WEBKIT_LOAD_FAILED #define WEBKIT_LOAD_FAILED 4 #endif #ifdef IUPWEB_USE_DLOPEN #include /* In my past experience with GTK, I don't think it is possible to unload the library. I don't know if WebKit is any better, but for now I am assuming it is not. So load it once and and never close for now. */ static void* s_webKitLibrary = NULL; /* Returns IUP_NOERROR on successful dlopen of libwebkitgtk. IUP_OPENED if already opened. IUP_ERROR on failure to load. Sets IupSetGlobal with key _IUP_WEBBROWSER_MISSING_DLL with a name of a missing libwekkitgtk.so. */ int IupGtkWebBrowserDLOpen() { size_t i; /* TODO: RTLD_LAZY or RTLD_NOW? const mode_flags = RTLD_NOW | RTLD_LOCAL; */ const mode_flags = RTLD_LAZY | RTLD_LOCAL; static const char* listOfWebKitNames[] = { #if GTK_CHECK_VERSION(3, 0, 0) "libwebkitgtk-3.0.so", "libwebkitgtk-3.0.so.0" #else "libwebkitgtk-1.0.so", "libwebkitgtk-1.0.so.0" #endif }; if(NULL != s_webKitLibrary) { return IUP_OPENED; } #define WEBKIT_NAMES_ARRAY_LENGTH (sizeof(listOfWebKitNames)/sizeof(*listOfWebKitNames)) for(i=0; ihandle); WebKitBackForwardListItem* item = webkit_back_forward_list_get_nth_item(back_forward_list, id); #else WebKitWebBackForwardList *back_forward_list = webkit_web_view_get_back_forward_list((WebKitWebView*)ih->handle); WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_nth_item(back_forward_list, id); #endif if (item) #ifdef USE_WEBKIT2 return iupStrReturnStr(webkit_back_forward_list_item_get_uri(item)); #else return iupStrReturnStr(webkit_web_history_item_get_uri(item)); #endif else return NULL; } static char* gtkWebBrowserGetForwardCountAttrib(Ihandle* ih) { #ifdef USE_WEBKIT2 WebKitBackForwardList *back_forward_list = webkit_web_view_get_back_forward_list ((WebKitWebView*)ih->handle); return iupStrReturnInt(g_list_length(webkit_back_forward_list_get_back_list(back_forward_list))); #else WebKitWebBackForwardList *back_forward_list = webkit_web_view_get_back_forward_list((WebKitWebView*)ih->handle); return iupStrReturnInt(webkit_web_back_forward_list_get_forward_length(back_forward_list)); #endif } static char* gtkWebBrowserGetBackCountAttrib(Ihandle* ih) { #ifdef USE_WEBKIT2 WebKitBackForwardList *back_forward_list = webkit_web_view_get_back_forward_list((WebKitWebView*)ih->handle); return iupStrReturnInt(g_list_length(webkit_back_forward_list_get_forward_list(back_forward_list))); #else WebKitWebBackForwardList *back_forward_list = webkit_web_view_get_back_forward_list((WebKitWebView*)ih->handle); return iupStrReturnInt(webkit_web_back_forward_list_get_back_length(back_forward_list)); #endif } static int gtkWebBrowserSetHTMLAttrib(Ihandle* ih, const char* value) { if (value) #ifdef USE_WEBKIT2 webkit_web_view_load_html((WebKitWebView*)ih->handle, iupgtkStrConvertToSystem(value), NULL); #else webkit_web_view_load_string((WebKitWebView*)ih->handle, iupgtkStrConvertToSystem(value), "text/html", "UTF-8", ""); #endif return 0; /* do not store value in hash table */ } #ifdef USE_WEBKIT2 static void gtkWebBrowserGetResourceData(GObject *source_object, GAsyncResult *res, gpointer user_data) { Ihandle* ih = (Ihandle*)user_data; WebKitWebResource *resource = (WebKitWebResource*)source_object; GError *error = NULL; gsize len = 0; char* data = (char*)webkit_web_resource_get_data_finish(resource, res, &len, &error); if (!data) { if (error) { iupAttribSetStrf(ih, "HTML", "ERROR: %s", error->message); g_error_free(error); } else iupAttribSet(ih, "HTML", "ERROR: UNKNOWN"); } else { if (data[len] != 0) data[len] = 0; iupAttribSetStr(ih, "HTML", data); } } #endif static char* gtkWebBrowserGetHTMLAttrib(Ihandle* ih) { #ifdef USE_WEBKIT2 char* value = NULL; WebKitWebResource* resource = webkit_web_view_get_main_resource((WebKitWebView*)ih->handle); webkit_web_resource_get_data(resource, NULL, gtkWebBrowserGetResourceData, ih); int i = 0; while (!value && i < 1000) { IupLoopStep(); value = iupAttribGet(ih, "HTML"); i++; } return NULL; #else WebKitWebFrame* frame = webkit_web_view_get_main_frame((WebKitWebView*)ih->handle); #if 1 WebKitWebDataSource* data_source = webkit_web_frame_get_data_source(frame); GString* string = webkit_web_data_source_get_data(data_source); #else /* ??????? */ WebKitWebResource* resource = webkit_web_data_source_get_main_resource(data_source); GString* string = webkit_web_resource_get_data(resource); #endif return iupStrReturnStr(string->str); #endif } #ifndef USE_WEBKIT2 static int write_file(const char* filename, const char* str, int count) { FILE* file = fopen(filename, "wb"); if (!file) return 0; fwrite(str, 1, count, file); fclose(file); return 1; } #endif static int gtkWebBrowserSetSaveAttrib(Ihandle* ih, const char* value) { if (value) { #ifdef USE_WEBKIT2 GFile* file = g_file_new_for_path(iupgtkStrConvertToFilename(value)); if (file) webkit_web_view_save_to_file((WebKitWebView*)ih->handle, file, WEBKIT_SAVE_MODE_MHTML, NULL, NULL, NULL); #else WebKitWebFrame* frame = webkit_web_view_get_main_frame((WebKitWebView*)ih->handle); WebKitWebDataSource* data_source = webkit_web_frame_get_data_source(frame); GString* string = webkit_web_data_source_get_data(data_source); write_file(iupgtkStrConvertToFilename(value), string->str, string->len); #endif } return 0; } static int gtkWebBrowserSetValueAttrib(Ihandle* ih, const char* value); static int gtkWebBrowserSetEditableAttrib(Ihandle* ih, const char* value); static int gtkWebBrowserSetOpenAttrib(Ihandle* ih, const char* value) { if (value) { char* url = iupStrFileMakeURL(value); gtkWebBrowserSetValueAttrib(ih, url); gtkWebBrowserSetEditableAttrib(ih, "Yes"); free(url); } return 0; } static int gtkWebBrowserSetNewAttrib(Ihandle* ih, const char* value) { gtkWebBrowserSetHTMLAttrib(ih, "

"); gtkWebBrowserSetEditableAttrib(ih, "Yes"); (void)value; return 0; } static int gtkWebBrowserSetCutAttrib(Ihandle* ih, const char* value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command((WebKitWebView*)ih->handle, WEBKIT_EDITING_COMMAND_CUT); #else webkit_web_view_cut_clipboard((WebKitWebView*)ih->handle); #endif (void)value; return 0; } static int gtkWebBrowserSetCopyAttrib(Ihandle* ih, const char* value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command((WebKitWebView*)ih->handle, WEBKIT_EDITING_COMMAND_COPY); #else webkit_web_view_copy_clipboard((WebKitWebView*)ih->handle); #endif (void)value; return 0; } static int gtkWebBrowserSetPasteAttrib(Ihandle* ih, const char* value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command((WebKitWebView*)ih->handle, WEBKIT_EDITING_COMMAND_PASTE); #else webkit_web_view_paste_clipboard((WebKitWebView*)ih->handle); #endif (void)value; return 0; } static int gtkWebBrowserSetUndoAttrib(Ihandle* ih, const char* value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command((WebKitWebView*)ih->handle, WEBKIT_EDITING_COMMAND_UNDO); #else webkit_web_view_undo((WebKitWebView*)ih->handle); #endif (void)value; return 0; } static int gtkWebBrowserSetRedoAttrib(Ihandle* ih, const char* value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command((WebKitWebView*)ih->handle, WEBKIT_EDITING_COMMAND_REDO); #else webkit_web_view_redo((WebKitWebView*)ih->handle); #endif (void)value; return 0; } static char* gtkWebBrowserGetEditableAttrib(Ihandle* ih) { #ifdef USE_WEBKIT2 return iupStrReturnBoolean(webkit_web_view_is_editable((WebKitWebView*)ih->handle)); #else return iupStrReturnBoolean(webkit_web_view_can_paste_clipboard((WebKitWebView*)ih->handle)); #endif } static int gtkWebBrowserSetSelectAllAttrib(Ihandle* ih, const char* value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command((WebKitWebView*)ih->handle, WEBKIT_EDITING_COMMAND_SELECT_ALL); #else webkit_web_view_select_all((WebKitWebView*)ih->handle); #endif (void)value; return 0; } static int gtkWebBrowserSetPrintAttrib(Ihandle* ih, const char* value) { #ifdef USE_WEBKIT2 WebKitPrintOperation *print_operation = webkit_print_operation_new((WebKitWebView*)ih->handle); if (iupStrBoolean(value)) { Ihandle* dlg = IupGetDialog(ih); GtkWindow* parent = NULL; if (dlg && dlg->handle) parent = (GtkWindow*)dlg->handle; webkit_print_operation_run_dialog(print_operation, parent); } else webkit_print_operation_print(print_operation); #else WebKitWebFrame* frame = webkit_web_view_get_main_frame((WebKitWebView*)ih->handle); webkit_web_frame_print(frame); #endif (void)value; return 0; } static int gtkWebBrowserSetZoomAttrib(Ihandle* ih, const char* value) { int zoom; if (iupStrToInt(value, &zoom)) webkit_web_view_set_zoom_level((WebKitWebView*)ih->handle, (float)zoom/100.0f); return 0; } static char* gtkWebBrowserGetZoomAttrib(Ihandle* ih) { int zoom = (int)(webkit_web_view_get_zoom_level((WebKitWebView*)ih->handle) * 100); return iupStrReturnInt(zoom); } static int gtkWebBrowserSetEditableAttrib(Ihandle* ih, const char* value) { webkit_web_view_set_editable((WebKitWebView*)ih->handle, iupStrBoolean(value)); return 0; } static void gtkWebBrowserRunJavascript(Ihandle* ih, const char* format, ...) { char js[1024]; va_list arglist; va_start(arglist, format); vsnprintf(js, 1024, format, arglist); va_end(arglist); #ifdef USE_WEBKIT2 webkit_web_view_run_javascript((WebKitWebView*)ih->handle, js, NULL, NULL, NULL); #else webkit_web_view_execute_script((WebKitWebView*)ih->handle, js); #endif } static int gtkWebBrowserExecCommandAttrib(Ihandle* ih, const char* value) { if (value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command((WebKitWebView*)ih->handle, value); #else gtkWebBrowserRunJavascript(ih, "document.execCommand('%s', false, null)", value); #endif } return 0; } static int gtkWebBrowserSetInsertImageAttrib(Ihandle* ih, const char* value) { if (value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command_with_argument((WebKitWebView*)ih->handle, WEBKIT_EDITING_COMMAND_INSERT_IMAGE, value); #else gtkWebBrowserRunJavascript(ih, "document.execCommand('insertimage', false, '%s')", value); #endif } return 0; } static int gtkWebBrowserSetCreateLinkAttrib(Ihandle* ih, const char* value) { if (value) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command_with_argument((WebKitWebView*)ih->handle, WEBKIT_EDITING_COMMAND_CREATE_LINK, value); #else gtkWebBrowserRunJavascript(ih, "document.execCommand('createLink', false, '%s')", value); #endif } return 0; } static void gtkWebBrowserExecCommandParam(Ihandle* ih, const char* cmd, const char* param) { #ifdef USE_WEBKIT2 webkit_web_view_execute_editing_command_with_argument((WebKitWebView*)ih->handle, cmd, param); #else gtkWebBrowserRunJavascript(ih, "document.execCommand('%s', false, '%s')", cmd, param); #endif } static int gtkWebBrowserSetInsertTextAttrib(Ihandle* ih, const char* value) { if (value) gtkWebBrowserExecCommandParam(ih, "insertText", value); return 0; } static int gtkWebBrowserSetInsertHtmlAttrib(Ihandle* ih, const char* value) { if (value) gtkWebBrowserExecCommandParam(ih, "insertHTML", value); return 0; } static int gtkWebBrowserSetFontNameAttrib(Ihandle* ih, const char* value) { if (value) gtkWebBrowserExecCommandParam(ih, "fontName", value); return 0; } static int gtkWebBrowserSetFontSizeAttrib(Ihandle* ih, const char* value) { int param = 0; if (iupStrToInt(value, ¶m) && param > 0 && param < 8) gtkWebBrowserExecCommandParam(ih, "fontSize", value); return 0; } static int gtkWebBrowserSetFormatBlockAttrib(Ihandle* ih, const char* value) { if (value) gtkWebBrowserExecCommandParam(ih, "formatBlock", value); return 0; } static int gtkWebBrowserSetForeColorAttrib(Ihandle* ih, const char* value) { unsigned char r, g, b; if (iupStrToRGB(value, &r, &g, &b)) gtkWebBrowserExecCommandParam(ih, "forecolor", value); return 0; } static int gtkWebBrowserSetBackColorAttrib(Ihandle* ih, const char* value) { unsigned char r, g, b; if (iupStrToRGB(value, &r, &g, &b)) gtkWebBrowserExecCommandParam(ih, "backcolor", value); return 0; } static int gtkWebBrowserSetInsertImageFileAttrib(Ihandle* ih, const char* value) { if (value) { char* url = iupStrFileMakeURL(value); gtkWebBrowserSetInsertImageAttrib(ih, url); free(url); } return 0; } static char* gtkWebBrowserGetStatusAttrib(Ihandle* ih) { #ifdef USE_WEBKIT2 if (webkit_web_view_is_loading((WebKitWebView*)ih->handle)) return "LOADING"; else return "COMPLETED"; #else WebKitLoadStatus status = webkit_web_view_get_load_status((WebKitWebView*)ih->handle); if (status == WEBKIT_LOAD_FAILED) return "FAILED"; else if (status == WEBKIT_LOAD_FINISHED) return "COMPLETED"; else return "LOADING"; #endif } static int gtkWebBrowserSetReloadAttrib(Ihandle* ih, const char* value) { webkit_web_view_reload((WebKitWebView*)ih->handle); (void)value; return 0; /* do not store value in hash table */ } static int gtkWebBrowserSetStopAttrib(Ihandle* ih, const char* value) { webkit_web_view_stop_loading((WebKitWebView*)ih->handle); (void)value; return 0; /* do not store value in hash table */ } static int gtkWebBrowserSetBackForwardAttrib(Ihandle* ih, const char* value) { int val; if (iupStrToInt(value, &val)) { /* Negative values represent steps backward while positive values represent steps forward. */ #ifdef USE_WEBKIT2 if (val > 0) { int i; for ( i = 0; i < val && webkit_web_view_can_go_forward((WebKitWebView*)ih->handle); i++) webkit_web_view_go_forward((WebKitWebView*)ih->handle); } else if (val < 0) { int i; for (i = 0; i < abs(val) && webkit_web_view_can_go_back((WebKitWebView*)ih->handle); i++) webkit_web_view_go_back((WebKitWebView*)ih->handle); } #else webkit_web_view_go_back_or_forward((WebKitWebView*)ih->handle, val); #endif } return 0; /* do not store value in hash table */ } static int gtkWebBrowserSetGoBackAttrib(Ihandle* ih, const char* value) { (void)value; webkit_web_view_go_back((WebKitWebView*)ih->handle); return 0; /* do not store value in hash table */ } static int gtkWebBrowserSetGoForwardAttrib(Ihandle* ih, const char* value) { (void)value; webkit_web_view_go_forward((WebKitWebView*)ih->handle); return 0; /* do not store value in hash table */ } static char* gtkWebBrowserGetCanGoBackAttrib(Ihandle* ih) { return iupStrReturnBoolean(webkit_web_view_can_go_back((WebKitWebView*)ih->handle)); } static char* gtkWebBrowserGetCanGoForwardAttrib(Ihandle* ih) { return iupStrReturnBoolean(webkit_web_view_can_go_forward((WebKitWebView*)ih->handle)); } static int gtkWebBrowserSetValueAttrib(Ihandle* ih, const char* value) { if (value) webkit_web_view_load_uri((WebKitWebView*)ih->handle, value); return 0; /* do not store value in hash table */ } static char* gtkWebBrowserGetValueAttrib(Ihandle* ih) { const gchar* value = webkit_web_view_get_uri((WebKitWebView*)ih->handle); return iupStrReturnStr(value); } /*********************************************************************************************/ #ifdef USE_WEBKIT2 static void gtkWebBrowserDocumentLoadFinished(WebKitWebView *web_view, WebKitLoadEvent load_event, Ihandle *ih) { IFns cb = (IFns)IupGetCallback(ih, "COMPLETED_CB"); if (load_event != WEBKIT_LOAD_FINISHED) return; if (cb) cb(ih, (char*)webkit_web_view_get_uri(web_view)); } #else static void gtkWebBrowserDocumentLoadFinished(WebKitWebView *web_view, WebKitWebFrame *frame, Ihandle *ih) { IFns cb = (IFns)IupGetCallback(ih, "COMPLETED_CB"); if (cb) cb(ih, (char*)webkit_web_frame_get_uri(frame)); } #endif #ifdef USE_WEBKIT2 static gboolean gtkWebBrowserLoadError(WebKitWebView *web_view, WebKitLoadEvent load_event, gchar *failing_uri, GError *error, Ihandle *ih) { IFns cb = (IFns)IupGetCallback(ih, "ERROR_CB"); if (cb) cb(ih, failing_uri); return FALSE; } #else static gboolean gtkWebBrowserLoadError(WebKitWebView *web_view, WebKitWebFrame *frame, gchar *uri, gpointer web_error, Ihandle *ih) { IFns cb = (IFns)IupGetCallback(ih, "ERROR_CB"); if (cb) cb(ih, uri); return FALSE; } #endif #ifdef USE_WEBKIT2 static int gtkWebBrowserNavigate(WebKitWebView *web_view, WebKitPolicyDecision *decision, WebKitPolicyDecisionType decision_type, Ihandle *ih) { if (decision_type != WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION) return FALSE; IFns cb = (IFns)IupGetCallback(ih, "NAVIGATE_CB"); if (cb) { if (cb(ih, (char*)webkit_web_view_get_uri(web_view)) == IUP_IGNORE) return FALSE; } return FALSE; } #else static int gtkWebBrowserNavigate(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, Ihandle *ih) { /* char *strReason = iupStrGetMemory(50); WebKitWebNavigationReason reason = webkit_web_navigation_action_get_reason(navigation_action); switch(reason) { case WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED: sprintf(strReason, "%s", "LINK_CLICKED"); break; case WEBKIT_WEB_NAVIGATION_REASON_FORM_SUBMITTED: sprintf(strReason, "%s", "FORM_SUBMITTED"); break; case WEBKIT_WEB_NAVIGATION_REASON_BACK_FORWARD: sprintf(strReason, "%s", "BACK_FORWARD"); break; case WEBKIT_WEB_NAVIGATION_REASON_RELOAD: sprintf(strReason, "%s", "RELOAD"); break; case WEBKIT_WEB_NAVIGATION_REASON_FORM_RESUBMITTED: sprintf(strReason, "%s", "FORM_RESUBMITTED"); break; case WEBKIT_WEB_NAVIGATION_REASON_OTHER: sprintf(strReason, "%s", "OTHER"); break; } */ IFns cb = (IFns)IupGetCallback(ih, "NAVIGATE_CB"); if (cb) { if (cb(ih, (char*)webkit_network_request_get_uri(request)) == IUP_IGNORE) return FALSE; } return FALSE; } #endif #ifdef USE_WEBKIT2 static WebKitWebView* gtkWebBrowserNewWindow(WebKitWebView *web_view, WebKitNavigationAction *navigation_action, Ihandle *ih) { IFns cb = (IFns)IupGetCallback(ih, "NEWWINDOW_CB"); if (cb) cb(ih, (char*)webkit_web_view_get_uri(web_view)); return web_view; } #else static WebKitWebView* gtkWebBrowserNewWindow(WebKitWebView *web_view, WebKitWebFrame *frame, Ihandle *ih) { IFns cb = (IFns)IupGetCallback(ih, "NEWWINDOW_CB"); if (cb) cb(ih, (char*)webkit_web_frame_get_uri(frame)); return web_view; } #endif /*********************************************************************************************/ #ifndef USE_WEBKIT2 static void gtkWebBrowserDummyLogFunc(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data) { /* does nothing */ (void)log_domain; (void)log_level; (void)message; (void)user_data; } #endif static int gtkWebBrowserMapMethod(Ihandle* ih) { #ifndef USE_WEBKIT2 GtkScrolledWindow* scrolled_window; #endif ih->handle = (GtkWidget*)webkit_web_view_new(); if (!ih->handle) return IUP_ERROR; #ifndef USE_WEBKIT2 scrolled_window = (GtkScrolledWindow*)gtk_scrolled_window_new(NULL, NULL); if (!scrolled_window) return IUP_ERROR; { /* to avoid the "cannot add non scrollable widget" warning */ #if GTK_CHECK_VERSION(2, 6, 0) GLogFunc def_func = g_log_set_default_handler(gtkWebBrowserDummyLogFunc, NULL); #endif gtk_container_add((GtkContainer*)scrolled_window, ih->handle); #if GTK_CHECK_VERSION(2, 6, 0) g_log_set_default_handler(def_func, NULL); #endif } /* configure scrollbar */ if (ih->data->sb) { GtkPolicyType hscrollbar_policy = GTK_POLICY_NEVER, vscrollbar_policy = GTK_POLICY_NEVER; if (ih->data->sb & IUP_SB_HORIZ) hscrollbar_policy = GTK_POLICY_AUTOMATIC; if (ih->data->sb & IUP_SB_VERT) vscrollbar_policy = GTK_POLICY_AUTOMATIC; gtk_scrolled_window_set_policy(scrolled_window, hscrollbar_policy, vscrollbar_policy); } else gtk_scrolled_window_set_policy(scrolled_window, GTK_POLICY_NEVER, GTK_POLICY_NEVER); gtk_widget_show((GtkWidget*)scrolled_window); iupAttribSet(ih, "_IUP_EXTRAPARENT", (char*)scrolled_window); #endif /* add to the parent, all GTK controls must call this. */ iupgtkAddToParent(ih); g_signal_connect(G_OBJECT(ih->handle), "enter-notify-event", G_CALLBACK(iupgtkEnterLeaveEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "leave-notify-event", G_CALLBACK(iupgtkEnterLeaveEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "focus-in-event", G_CALLBACK(iupgtkFocusInOutEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "focus-out-event", G_CALLBACK(iupgtkFocusInOutEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "show-help", G_CALLBACK(iupgtkShowHelp), ih); g_signal_connect(G_OBJECT(ih->handle), "create-web-view", G_CALLBACK(gtkWebBrowserNewWindow), ih); #ifdef USE_WEBKIT2 g_signal_connect(G_OBJECT(ih->handle), "decide-policy", G_CALLBACK(gtkWebBrowserNavigate), ih); #else g_signal_connect(G_OBJECT(ih->handle), "navigation-policy-decision-requested", G_CALLBACK(gtkWebBrowserNavigate), ih); #endif #ifdef USE_WEBKIT2 g_signal_connect(G_OBJECT(ih->handle), "load-failed", G_CALLBACK(gtkWebBrowserLoadError), ih); #else g_signal_connect(G_OBJECT(ih->handle), "load-error", G_CALLBACK(gtkWebBrowserLoadError), ih); #endif #ifdef USE_WEBKIT2 g_signal_connect(G_OBJECT(ih->handle), "load-changed", G_CALLBACK(gtkWebBrowserDocumentLoadFinished), ih); #else g_signal_connect(G_OBJECT(ih->handle), "document-load-finished", G_CALLBACK(gtkWebBrowserDocumentLoadFinished), ih); #endif #ifndef USE_WEBKIT2 gtk_widget_realize((GtkWidget*)scrolled_window); #endif gtk_widget_realize(ih->handle); return IUP_NOERROR; } static void gtkWebBrowserComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand) { int natural_w = 0, natural_h = 0; (void)children_expand; /* unset if not a container */ /* natural size is 1 character */ iupdrvFontGetCharSize(ih, &natural_w, &natural_h); *w = natural_w; *h = natural_h; } static int gtkWebBrowserCreateMethod(Ihandle* ih, void **params) { (void)params; ih->data = iupALLOCCTRLDATA(); /* default EXPAND is YES */ ih->expand = IUP_EXPAND_BOTH; ih->data->sb = IUP_SB_HORIZ | IUP_SB_VERT; /* default is YES */ return IUP_NOERROR; } Iclass* iupWebBrowserNewClass(void) { Iclass* ic = iupClassNew(NULL); ic->name = "webbrowser"; ic->cons = "WebBrowser"; ic->format = NULL; /* no parameters */ ic->nativetype = IUP_TYPECONTROL; ic->childtype = IUP_CHILDNONE; ic->is_interactive = 1; ic->has_attrib_id = 1; /* has attributes with IDs that must be parsed */ /* Class functions */ ic->New = iupWebBrowserNewClass; ic->Create = gtkWebBrowserCreateMethod; ic->Map = gtkWebBrowserMapMethod; ic->UnMap = iupdrvBaseUnMapMethod; ic->ComputeNaturalSize = gtkWebBrowserComputeNaturalSizeMethod; ic->LayoutUpdate = iupdrvBaseLayoutUpdateMethod; /* Callbacks */ iupClassRegisterCallback(ic, "NEWWINDOW_CB", "s"); iupClassRegisterCallback(ic, "NAVIGATE_CB", "s"); iupClassRegisterCallback(ic, "ERROR_CB", "s"); iupClassRegisterCallback(ic, "COMPLETED_CB", "s"); /* Common */ iupBaseRegisterCommonAttrib(ic); /* Visual */ iupBaseRegisterVisualAttrib(ic); /* Overwrite Visual */ iupClassRegisterAttribute(ic, "BGCOLOR", NULL, iupdrvBaseSetBgColorAttrib, IUPAF_SAMEASSYSTEM, "DLGBGCOLOR", IUPAF_DEFAULT); /* IupWebBrowser only */ iupClassRegisterAttribute(ic, "VALUE", gtkWebBrowserGetValueAttrib, gtkWebBrowserSetValueAttrib, NULL, NULL, IUPAF_NO_DEFAULTVALUE|IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "BACKFORWARD", NULL, gtkWebBrowserSetBackForwardAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "GOBACK", NULL, gtkWebBrowserSetGoBackAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "GOFORWARD", NULL, gtkWebBrowserSetGoForwardAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "STOP", NULL, gtkWebBrowserSetStopAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "RELOAD", NULL, gtkWebBrowserSetReloadAttrib, NULL, NULL, IUPAF_WRITEONLY|IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "HTML", gtkWebBrowserGetHTMLAttrib, gtkWebBrowserSetHTMLAttrib, NULL, NULL, IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "STATUS", gtkWebBrowserGetStatusAttrib, NULL, NULL, NULL, IUPAF_NO_DEFAULTVALUE|IUPAF_READONLY|IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "ZOOM", gtkWebBrowserGetZoomAttrib, gtkWebBrowserSetZoomAttrib, NULL, NULL, IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "PRINT", NULL, gtkWebBrowserSetPrintAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "CANGOBACK", gtkWebBrowserGetCanGoBackAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "CANGOFORWARD", gtkWebBrowserGetCanGoForwardAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "EDITABLE", gtkWebBrowserGetEditableAttrib, gtkWebBrowserSetEditableAttrib, NULL, NULL, IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "NEW", NULL, gtkWebBrowserSetNewAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "OPENFILE", NULL, gtkWebBrowserSetOpenAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "SAVEFILE", NULL, gtkWebBrowserSetSaveAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "UNDO", NULL, gtkWebBrowserSetUndoAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "REDO", NULL, gtkWebBrowserSetRedoAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "CUT", NULL, gtkWebBrowserSetCutAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "COPY", NULL, gtkWebBrowserSetCopyAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "PASTE", NULL, gtkWebBrowserSetPasteAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "SELECTALL", NULL, gtkWebBrowserSetSelectAllAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "EXECCOMMAND", NULL, gtkWebBrowserExecCommandAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "INSERTIMAGE", NULL, gtkWebBrowserSetInsertImageAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "INSERTIMAGEFILE", NULL, gtkWebBrowserSetInsertImageFileAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "CREATELINK", NULL, gtkWebBrowserSetCreateLinkAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "INSERTTEXT", NULL, gtkWebBrowserSetInsertTextAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "INSERTHTML", NULL, gtkWebBrowserSetInsertHtmlAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "FONTNAME", NULL, gtkWebBrowserSetFontNameAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "FONTSIZE", NULL, gtkWebBrowserSetFontSizeAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "FORMATBLOCK", NULL, gtkWebBrowserSetFormatBlockAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "FORECOLOR", NULL, gtkWebBrowserSetForeColorAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "BACKCOLOR", NULL, gtkWebBrowserSetBackColorAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT); /* GTK only */ iupClassRegisterAttribute(ic, "BACKCOUNT", gtkWebBrowserGetBackCountAttrib, NULL, NULL, NULL, IUPAF_NO_DEFAULTVALUE | IUPAF_READONLY | IUPAF_NO_INHERIT); iupClassRegisterAttribute(ic, "FORWARDCOUNT", gtkWebBrowserGetForwardCountAttrib, NULL, NULL, NULL, IUPAF_NO_DEFAULTVALUE|IUPAF_READONLY|IUPAF_NO_INHERIT); iupClassRegisterAttributeId(ic, "ITEMHISTORY", gtkWebBrowserGetItemHistoryAttrib, NULL, IUPAF_READONLY|IUPAF_NO_INHERIT); return ic; } /* Possibilities: wk2 webkit_web_view_can_execute_editing_command Dirty The “user-changed-contents” signal void user_function (WebKitWebView *web_view, gpointer user_data) wk1 The “selection-changed” signal -- UPDATECOMMANDS_CB ??? void user_function (WebKitWebEditor *editor, gpointer user_data) wk2 void user_function (WebKitWebView *web_view, gpointer user_data) wk1 wk1 webkit_web_view_can_copy_clipboard webkit_web_view_can_cut_clipboard webkit_web_view_can_paste_clipboard webkit_web_view_can_redo webkit_web_view_can_undo wk2 guint webkit_editor_state_get_typing_attributes () gboolean webkit_editor_state_is_cut_available () gboolean webkit_editor_state_is_copy_available () gboolean webkit_editor_state_is_paste_available () gboolean webkit_editor_state_is_undo_available () gboolean webkit_editor_state_is_redo_available () Find - no dialog (must build one) webkit_web_view_search_text wk1 WebKitFindController wk2 */