/* direct wrapper around gtk_box_pack_end */ static gint luaH_box_pack_end(lua_State *L) { widget_t *w = luaH_checkwidget(L, 1); widget_t *child = luaH_checkwidget(L, 2); gboolean expand = luaH_checkboolean(L, 3); gboolean fill = luaH_checkboolean(L, 4); guint padding = luaL_checknumber(L, 5); gtk_box_pack_end(GTK_BOX(w->widget), GTK_WIDGET(child->widget), expand, fill, padding); return 0; }
static gint luaH_webview_search(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); WebKitWebView *view = WEBKIT_WEB_VIEW(GTK_WIDGET(g_object_get_data(G_OBJECT(w->widget), "webview"))); const gchar *text = luaL_checkstring(L, 2); gboolean case_sensitive = luaH_checkboolean(L, 3); gboolean forward = luaH_checkboolean(L, 4); gboolean wrap = luaH_checkboolean(L, 5); webkit_web_view_unmark_text_matches(view); webkit_web_view_search_text(view, text, case_sensitive, forward, wrap); webkit_web_view_mark_text_matches(view, text, case_sensitive, 0); webkit_web_view_set_highlight_text_matches(view, TRUE); return 0; }
/* Raises the "navigation-request" signal on a webkit navigation policy * decision request. The default action is to load the requested uri. * * The signal handler is able to: * - return true for the handler execution to stop and the request to continue * - return false for the handler execution to stop and the request to hault * - do nothing and give the navigation decision to the next signal handler * * This signal is also where you would attach custom scheme handlers to take * over the navigation request by launching an external application. */ static gboolean navigation_decision_cb(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *a, WebKitWebPolicyDecision *p, widget_t *w) { (void) v; (void) f; (void) a; lua_State *L = globalconf.L; const gchar *uri = webkit_network_request_get_uri(r); gint ret; luaH_object_push(L, w->ref); lua_pushstring(L, uri); ret = luaH_object_emit_signal(L, -2, "navigation-request", 1, 1); if (ret && !luaH_checkboolean(L, -1)) /* User responded with false, do not continue navigation request */ webkit_web_policy_decision_ignore(p); else webkit_web_policy_decision_use(p); lua_pop(L, ret + 1); return TRUE; }
static gboolean mime_type_decision_cb(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, gchar *mime, WebKitWebPolicyDecision *pd, widget_t *w) { (void) v; (void) f; lua_State *L = globalconf.L; const gchar *uri = webkit_network_request_get_uri(r); gint ret; luaH_object_push(L, w->ref); lua_pushstring(L, uri); lua_pushstring(L, mime); ret = luaH_object_emit_signal(L, -3, "mime-type-decision", 2, 1); if (ret && !luaH_checkboolean(L, -1)) /* User responded with false, ignore request */ webkit_web_policy_decision_ignore(pd); else if (!webkit_web_view_can_show_mime_type(v, mime)) webkit_web_policy_decision_download(pd); else webkit_web_policy_decision_use(pd); lua_pop(L, ret + 1); return TRUE; }
static gint luaH_window_newindex(lua_State *L, luapdf_token_t token) { widget_t *w = luaH_checkwidget(L, 1); switch(token) { LUAPDF_WIDGET_BIN_NEWINDEX_COMMON(w) case L_TK_DECORATED: gtk_window_set_decorated(GTK_WINDOW(w->widget), luaH_checkboolean(L, 3)); break; case L_TK_TITLE: gtk_window_set_title(GTK_WINDOW(w->widget), luaL_checkstring(L, 3)); break; case L_TK_ICON: gtk_window_set_icon_from_file(GTK_WINDOW(w->widget), luaL_checkstring(L, 3), NULL); break; default: return 0; } return luaH_object_emit_property_signal(L, 1); }
gint luaH_cookiejar_add_cookies(lua_State *L) { SoupCookieJar *sj = SOUP_COOKIE_JAR(soupconf.cookiejar); LuakitCookieJar *j = LUAKIT_COOKIE_JAR(soupconf.cookiejar); GSList *cookies; gboolean silent = TRUE; /* cookies table */ luaH_checktable(L, 1); /* optional silent parameter */ if (lua_gettop(L) >= 2) silent = luaH_checkboolean(L, 2); /* get cookies from table */ if ((cookies = cookies_from_table(L, 1))) { j->silent = silent; /* insert cookies */ for (GSList *p = cookies; p; p = g_slist_next(p)) soup_cookie_jar_add_cookie(sj, soup_cookie_copy(p->data)); g_slist_free(cookies); j->silent = FALSE; } return 0; }
/* The __newindex method for the webview object */ static gint luaH_webview_newindex(lua_State *L, luakit_token_t token) { size_t len; widget_t *w = luaH_checkudata(L, 1, &widget_class); GtkWidget *view = g_object_get_data(G_OBJECT(w->widget), "webview"); gchar *uri; switch(token) { case L_TK_URI: uri = (gchar*) luaL_checklstring(L, 3, &len); uri = g_strrstr(uri, "://") ? g_strdup(uri) : g_strdup_printf("http://%s", uri); webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), uri); g_object_set_data_full(G_OBJECT(view), "uri", uri, g_free); break; case L_TK_SHOW_SCROLLBARS: show_scrollbars(w, luaH_checkboolean(L, 3)); return 0; default: warn("unknown property: %s", luaL_checkstring(L, 2)); return 0; } return luaH_object_emit_property_signal(L, 1); }
static gint luaH_label_newindex(lua_State *L, widget_t *w, luakit_token_t token) { size_t len; const gchar *tmp; GdkColor c; PangoFontDescription *font; switch(token) { LUAKIT_WIDGET_NEWINDEX_COMMON(w) case L_TK_PADDING: return luaH_label_set_padding(L, w); case L_TK_ALIGN: return luaH_label_set_align(L, w); case L_TK_TEXT: gtk_label_set_markup(GTK_LABEL(w->widget), luaL_checklstring(L, 3, &len)); break; case L_TK_FG: tmp = luaL_checklstring(L, 3, &len); if (!gdk_color_parse(tmp, &c)) { warn("invalid color: %s", tmp); return 0; } gtk_widget_modify_fg(GTK_WIDGET(w->widget), GTK_STATE_NORMAL, &c); g_object_set_data_full(G_OBJECT(w->widget), "fg", g_strdup(tmp), g_free); break; case L_TK_FONT: tmp = luaL_checklstring(L, 3, &len); font = pango_font_description_from_string(tmp); gtk_widget_modify_font(GTK_WIDGET(w->widget), font); pango_font_description_free(font); g_object_set_data_full(G_OBJECT(w->widget), "font", g_strdup(tmp), g_free); break; case L_TK_SELECTABLE: gtk_label_set_selectable(GTK_LABEL(w->widget), luaH_checkboolean(L, 3)); break; case L_TK_WIDTH: gtk_label_set_width_chars(GTK_LABEL(w->widget), (gint)luaL_checknumber(L, 3)); return 0; default: warn("unknown property: %s", luaL_checkstring(L, 2)); return 0; } return luaH_object_property_signal(L, 1, token); }
static gint luaH_notebook_newindex(lua_State *L, widget_t *w, luakit_token_t token) { switch(token) { LUAKIT_WIDGET_NEWINDEX_COMMON(w) case L_TK_SHOW_TABS: gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w->widget), luaH_checkboolean(L, 3)); break; case L_TK_SHOW_BORDER: gtk_notebook_set_show_border(GTK_NOTEBOOK(w->widget), luaH_checkboolean(L, 3)); break; default: return 0; } return luaH_object_property_signal(L, 1, token); }
static gint luaH_entry_newindex(lua_State *L, luakit_token_t token) { size_t len; widget_t *w = luaH_checkwidget(L, 1); const gchar *tmp; GdkColor c; PangoFontDescription *font; switch(token) { case L_TK_TEXT: gtk_entry_set_text(GTK_ENTRY(w->widget), luaL_checklstring(L, 3, &len)); break; case L_TK_FG: case L_TK_BG: tmp = luaL_checklstring(L, 3, &len); if (!gdk_color_parse(tmp, &c)) luaL_argerror(L, 3, "unable to parse color"); if (token == L_TK_FG) { gtk_widget_modify_text(GTK_WIDGET(w->widget), GTK_STATE_NORMAL, &c); g_object_set_data_full(G_OBJECT(w->widget), "fg", g_strdup(tmp), g_free); } else { gtk_widget_modify_base(GTK_WIDGET(w->widget), GTK_STATE_NORMAL, &c); g_object_set_data_full(G_OBJECT(w->widget), "bg", g_strdup(tmp), g_free); } break; case L_TK_SHOW_FRAME: gtk_entry_set_has_frame(GTK_ENTRY(w->widget), luaH_checkboolean(L, 3)); break; case L_TK_POSITION: gtk_editable_set_position(GTK_EDITABLE(w->widget), luaL_checknumber(L, 3)); break; case L_TK_FONT: tmp = luaL_checklstring(L, 3, &len); font = pango_font_description_from_string(tmp); gtk_widget_modify_font(GTK_WIDGET(w->widget), font); g_object_set_data_full(G_OBJECT(w->widget), "font", g_strdup(tmp), g_free); break; default: warn("unknown property: %s", luaL_checkstring(L, 2)); return 0; } return luaH_object_emit_property_signal(L, 1); }
/* gets a gobject property from lua */ gint luaH_set_property(lua_State *L, GHashTable *properties, gpointer obj, gint nidx, gint vidx) { GObject *so; property_t *p; property_tmp_value_t tmp; /* get property struct */ const gchar *name = luaL_checkstring(L, nidx); if ((p = g_hash_table_lookup(properties, name))) { if (!p->writable) { warn("attempt to set read-only property: %s", p->name); return 0; } so = G_OBJECT(obj); switch(p->type) { case BOOL: tmp.b = luaH_checkboolean(L, vidx); g_object_set(so, p->name, tmp.b, NULL); return 0; case INT: tmp.i = (gint) luaL_checknumber(L, vidx); g_object_set(so, p->name, tmp.i, NULL); return 0; case FLOAT: tmp.f = (gfloat) luaL_checknumber(L, vidx); g_object_set(so, p->name, tmp.f, NULL); return 0; case DOUBLE: tmp.d = (gdouble) luaL_checknumber(L, vidx); g_object_set(so, p->name, tmp.d, NULL); return 0; case CHAR: tmp.c = (gchar*) luaL_checkstring(L, vidx); g_object_set(so, p->name, tmp.c, NULL); return 0; default: warn("unknown property type for: %s", p->name); break; } } warn("unknown property: %s", name); return 0; }
static gint luaH_notebook_newindex(lua_State *L, luakit_token_t token) { widget_t *w = luaH_checkudata(L, 1, &widget_class); switch(token) { case L_TK_SHOW_TABS: gtk_notebook_set_show_tabs(GTK_NOTEBOOK(w->widget), luaH_checkboolean(L, 3)); break; case L_TK_SHOW_BORDER: gtk_notebook_set_show_border(GTK_NOTEBOOK(w->widget), luaH_checkboolean(L, 3)); break; default: return 0; } return luaH_object_emit_property_signal(L, 1); }
static gint luaH_webview_eval_js(lua_State *L) { WebKitWebFrame *frame = NULL; widget_t *w = luaH_checkwidget(L, 1); WebKitWebView *view = WEBKIT_WEB_VIEW(g_object_get_data(G_OBJECT(w->widget), "webview")); const gchar *script = luaL_checkstring(L, 2); const gchar *filename = luaL_checkstring(L, 3); /* Check if js should be run on currently focused frame */ if (lua_gettop(L) >= 4 && luaH_checkboolean(L, 4)) frame = webkit_web_view_get_focused_frame(view); /* Fall back on main frame */ if (!frame) frame = webkit_web_view_get_main_frame(WEBKIT_WEB_VIEW(view)); /* evaluate javascript script and push return result onto lua stack */ const gchar *result = webview_eval_js(frame, script, filename); lua_pushstring(L, result); return 1; }
static gint luaH_box_newindex(lua_State *L, luakit_token_t token) { widget_t *w = luaH_checkwidget(L, 1); switch(token) { case L_TK_HOMOGENEOUS: gtk_box_set_homogeneous(GTK_BOX(w->widget), luaH_checkboolean(L, 3)); break; case L_TK_SPACING: gtk_box_set_spacing(GTK_BOX(w->widget), luaL_checknumber(L, 3)); break; default: return 0; } return luaH_object_emit_property_signal(L, 1); }
static gint luaH_webview_register_function(lua_State *L) { WebKitWebFrame *frame = NULL; widget_t *w = luaH_checkwidget(L, 1); WebKitWebView *view = WEBKIT_WEB_VIEW(g_object_get_data(G_OBJECT(w->widget), "webview")); const gchar *name = luaL_checkstring(L, 2); lua_pushvalue(L, 3); gpointer ref = luaH_object_ref(L, -1); /* Check if function should be registered on currently focused frame */ if (lua_gettop(L) >= 4 && luaH_checkboolean(L, 4)) frame = webkit_web_view_get_focused_frame(view); /* Fall back on main frame */ if (!frame) frame = webkit_web_view_get_main_frame(WEBKIT_WEB_VIEW(view)); /* register function */ webview_register_function(frame, name, ref); return 0; }
static gint luaH_box_newindex(lua_State *L, widget_t *w, luakit_token_t token) { size_t len; const gchar *tmp; GdkRGBA c; switch(token) { LUAKIT_WIDGET_NEWINDEX_COMMON(w) case L_TK_HOMOGENEOUS: gtk_box_set_homogeneous(GTK_BOX(w->widget), luaH_checkboolean(L, 3)); break; case L_TK_SPACING: gtk_box_set_spacing(GTK_BOX(w->widget), luaL_checknumber(L, 3)); break; case L_TK_BG: tmp = luaL_checklstring(L, 3, &len); if (!gdk_rgba_parse(&c, tmp)) luaL_argerror(L, 3, "unable to parse colour"); #if GTK_CHECK_VERSION(3,16,0) widget_set_css_properties(w, "background-color", tmp, NULL); #else gtk_widget_override_background_color(GTK_WIDGET(w->widget), GTK_STATE_FLAG_NORMAL, &c); #endif g_object_set_data_full(G_OBJECT(w->widget), "bg", g_strdup(tmp), g_free); break; default: return 0; } return luaH_object_property_signal(L, 1, token); }
static gint luaH_webview_set_prop(lua_State *L) { size_t len; widget_t *w = luaH_checkudata(L, 1, &widget_class); const gchar *prop = luaL_checklstring(L, 2, &len); GtkWidget *view = g_object_get_data(G_OBJECT(w->widget), "webview"); GObject *ws; property_tmp_values tmp; SoupURI *u; for (guint i = 0; i < LENGTH(properties); i++) { if (g_strcmp0(properties[i].name, prop)) continue; if (!properties[i].writable) { warn("attempt to set read-only property: %s", prop); return 0; } ws = get_settings_object(view, properties[i].scope); switch(properties[i].type) { case BOOL: tmp.b = luaH_checkboolean(L, 3); g_object_set(ws, prop, tmp.b, NULL); return 0; case CHAR: tmp.c = (gchar*) luaL_checklstring(L, 3, &len); g_object_set(ws, prop, tmp.c, NULL); return 0; case INT: tmp.i = (gint) luaL_checknumber(L, 3); g_object_set(ws, prop, tmp.i, NULL); return 0; case FLOAT: tmp.f = (gfloat) luaL_checknumber(L, 3); g_object_set(ws, prop, tmp.f, NULL); return 0; case DOUBLE: tmp.d = (gdouble) luaL_checknumber(L, 3); g_object_set(ws, prop, tmp.d, NULL); return 0; case URI: tmp.c = (gchar*) luaL_checkstring(L, 3); u = soup_uri_new(tmp.c); if (SOUP_URI_VALID_FOR_HTTP(u)) g_object_set(ws, prop, u, NULL); else luaL_error(L, "cannot parse uri: %s", tmp.c); soup_uri_free(u); return 0; default: warn("unknown property type for: %s", properties[i].name); break; } } warn("unknown property: %s", prop); return 0; }