static gint luaH_notebook_get_title(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); widget_t *child = luaH_checkudata(L, 2, &widget_class); lua_pushstring(L, gtk_notebook_get_tab_label_text( GTK_NOTEBOOK(w->widget), child->widget)); return 1; }
static gint luaH_notebook_set_title(lua_State *L) { size_t len; widget_t *w = luaH_checkudata(L, 1, &widget_class); widget_t *child = luaH_checkudata(L, 2, &widget_class); const gchar *title = luaL_checklstring(L, 3, &len); gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(w->widget), child->widget, title); return 0; }
static gint luaH_notebook_indexof(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); widget_t *child = luaH_checkudata(L, 2, &widget_class); gint i = gtk_notebook_page_num(GTK_NOTEBOOK(w->widget), child->widget); /* return index or nil */ if (!++i) return 0; lua_pushnumber(L, i); return 1; }
static gint luaH_notebook_remove(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); widget_t *child = luaH_checkudata(L, 2, &widget_class); gint i = gtk_notebook_page_num(GTK_NOTEBOOK(w->widget), child->widget); if (i != -1) return 0; GtkWidget *widget = gtk_notebook_get_nth_page(GTK_NOTEBOOK(w->widget), i); g_object_ref(G_OBJECT(widget)); gtk_notebook_remove_page(GTK_NOTEBOOK(w->widget), i); return 0; }
static gint luaH_webview_get_hscroll(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); GtkAdjustment *adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(w->widget)); return push_adjustment_values(L, adjustment); }
/* 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_entry_get_position(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); lua_pushnumber(L, gtk_editable_get_position(GTK_EDITABLE(w->widget))); return 1; }
/* Return the number of widgets in the notebook */ static gint luaH_notebook_count(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); lua_pushnumber(L, gtk_notebook_get_n_pages(GTK_NOTEBOOK(w->widget))); return 1; }
static gint luaH_webview_get_prop(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); const gchar *prop = luaL_checkstring(L, 2); GtkWidget *view = GTK_WIDGET(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; ws = get_settings_object(view, properties[i].scope); switch(properties[i].type) { case BOOL: g_object_get(ws, prop, &tmp.b, NULL); lua_pushboolean(L, tmp.b); return 1; case CHAR: g_object_get(ws, prop, &tmp.c, NULL); lua_pushstring(L, tmp.c); g_free(tmp.c); return 1; case INT: g_object_get(ws, prop, &tmp.i, NULL); lua_pushnumber(L, tmp.i); return 1; case FLOAT: g_object_get(ws, prop, &tmp.f, NULL); lua_pushnumber(L, tmp.f); return 1; case DOUBLE: g_object_get(ws, prop, &tmp.d, NULL); lua_pushnumber(L, tmp.d); return 1; case URI: g_object_get(ws, prop, &u, NULL); tmp.c = soup_uri_to_string(u, 0); lua_pushstring(L, tmp.c); soup_uri_free(u); g_free(tmp.c); return 1; default: warn("unknown property type for: %s", properties[i].name); break; } } warn("unknown property: %s", prop); return 0; }
/* Inserts a widget into the notebook widget at an index */ static gint luaH_notebook_insert(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); widget_t *child = luaH_checkudata(L, 3, &widget_class); gint i = luaL_checknumber(L, 2); /* correct index */ if (i != -1) i--; i = gtk_notebook_insert_page(GTK_NOTEBOOK(w->widget), child->widget, NULL, i); /* return new index or nil */ if (!++i) return 0; lua_pushnumber(L, i); return 1; }
static gint luaH_webview_clear_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"))); webkit_web_view_unmark_text_matches(view); return 0; }
static gint luaH_webview_go_forward(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); gint steps = (gint) luaL_checknumber(L, 2); GtkWidget *view = GTK_WIDGET(g_object_get_data(G_OBJECT(w->widget), "webview")); webkit_web_view_go_back_or_forward(WEBKIT_WEB_VIEW(view), steps); return 0; }
static int luaH_timer_new(lua_State *L) { luaH_class_new(L, &timer_class); ltimer_t *timer = luaH_checkudata(L, -1, &timer_class); timer->ref = NULL; timer->timer_id = TIMER_STOPPED; return 1; }
static gint luaH_webview_set_scroll_horiz(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); gdouble value = (gdouble) luaL_checknumber(L, 2); GtkAdjustment *adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(w->widget)); set_adjustment(adjustment, value); return 0; }
static int luaH_timer_stop(lua_State *L) { ltimer_t *timer = luaH_checkudata(L, 1, &timer_class); if (timer->timer_id == TIMER_STOPPED) { luaH_warn(L, "timer already stopped. Cannot stop a timer twice"); } else { luaH_timer_destroy(L, timer); } return 0; }
static gint luaH_notebook_switch(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); gint i = luaL_checknumber(L, 2); /* correct index */ if (i != -1) i--; gtk_notebook_set_current_page(GTK_NOTEBOOK(w->widget), i); lua_pushnumber(L, gtk_notebook_get_current_page(GTK_NOTEBOOK(w->widget))); return 1; }
static gint luaH_notebook_current(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); gint n = gtk_notebook_get_n_pages(GTK_NOTEBOOK(w->widget)); if (n == 1) lua_pushnumber(L, 1); else lua_pushnumber(L, gtk_notebook_get_current_page( GTK_NOTEBOOK(w->widget)) + 1); return 1; }
static gint luaH_entry_set_position(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); gint pos = luaL_checknumber(L, 2); /* lua table indexes start at 1 */ if (pos > 0) pos--; gtk_editable_set_position(GTK_EDITABLE(w->widget), pos); lua_pushnumber(L, gtk_editable_get_position(GTK_EDITABLE(w->widget))); return 1; }
static gint luaH_webview_eval_js(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); 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); /* evaluate javascript script and push return result onto lua stack */ const gchar *result = webview_eval_js(view, script, filename); lua_pushstring(L, result); return 1; }
static gint luaH_entry_append(lua_State *L) { size_t len; widget_t *w = luaH_checkudata(L, 1, &widget_class); const gchar *text = luaL_checklstring(L, 2, &len); gint pos = -1; gtk_editable_insert_text(GTK_EDITABLE(w->widget), text, g_utf8_strlen(text, len), &pos); return pos + 1; }
static gint luaH_entry_newindex(lua_State *L, luakit_token_t token) { size_t len; widget_t *w = luaH_checkudata(L, 1, &widget_class); 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)) { warn("invalid color: %s", tmp); return 0; } 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_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); }
static int luaH_timer_start(lua_State *L) { ltimer_t *timer = luaH_checkudata(L, 1, &timer_class); // get interval lua_getfield(L, -1, TIMER_INTERVAL_FIELD); int millis = luaL_checkinteger(L, -1); timer->ref = luaH_object_ref(L, 1); // ensure that timers don't get collected while running if (timer->timer_id == TIMER_STOPPED) { timer->timer_id = g_timeout_add(millis, timer_handle_timeout, timer); } else { luaH_warn(L, "timer already started. Cannot start a timer twice"); } return 0; }
static gint luaH_entry_insert(lua_State *L) { size_t len; widget_t *w = luaH_checkudata(L, 1, &widget_class); gint pos = luaL_checknumber(L, 2); /* lua table indexes start at 1 */ if (pos > 0) pos--; const gchar *text = luaL_checklstring(L, 3, &len); gtk_editable_insert_text(GTK_EDITABLE(w->widget), text, g_utf8_strlen(text, len), &pos); return pos + 1; }
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; }
static gint luaH_notebook_atindex(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); gint i = luaL_checknumber(L, 2); /* correct index */ if (i != -1) i--; GtkWidget *widget = gtk_notebook_get_nth_page(GTK_NOTEBOOK(w->widget), i); if (!widget) return 0; widget_t *child = g_object_get_data(G_OBJECT(widget), "widget"); luaH_object_push(L, child->ref); return 1; }
static gint luaH_webview_loading(lua_State *L) { widget_t *w = luaH_checkudata(L, 1, &widget_class); GtkWidget *view = g_object_get_data(G_OBJECT(w->widget), "webview"); WebKitLoadStatus s; g_object_get(G_OBJECT(view), "load-status", &s, NULL); switch (s) { case WEBKIT_LOAD_PROVISIONAL: case WEBKIT_LOAD_COMMITTED: case WEBKIT_LOAD_FIRST_VISUALLY_NON_EMPTY_LAYOUT: lua_pushboolean(L, TRUE); break; default: lua_pushboolean(L, FALSE); break; } return 1; }
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); }
gint luaH_object_tostring(lua_State *L) { lua_class_t *lua_class = luaH_class_get(L, 1); lua_pushfstring(L, "%s: %p", lua_class->name, luaH_checkudata(L, 1, lua_class)); return 1; }
static gint luaH_webview_index(lua_State *L, luakit_token_t token) { widget_t *w = luaH_checkudata(L, 1, &widget_class); GtkWidget *view = g_object_get_data(G_OBJECT(w->widget), "webview"); switch(token) { case L_TK_DESTROY: lua_pushcfunction(L, luaH_widget_destroy); return 1; case L_TK_GET_SCROLL_VERT: lua_pushcfunction(L, luaH_webview_get_vscroll); return 1; case L_TK_GET_SCROLL_HORIZ: lua_pushcfunction(L, luaH_webview_get_hscroll); return 1; case L_TK_SET_SCROLL_VERT: lua_pushcfunction(L, luaH_webview_set_scroll_vert); return 1; case L_TK_SET_SCROLL_HORIZ: lua_pushcfunction(L, luaH_webview_set_scroll_horiz); return 1; case L_TK_EVAL_JS: lua_pushcfunction(L, luaH_webview_eval_js); return 1; case L_TK_SEARCH: lua_pushcfunction(L, luaH_webview_search); return 1; case L_TK_CLEAR_SEARCH: lua_pushcfunction(L, luaH_webview_clear_search); return 1; case L_TK_SET_PROP: lua_pushcfunction(L, luaH_webview_set_prop); return 1; case L_TK_GET_PROP: lua_pushcfunction(L, luaH_webview_get_prop); return 1; case L_TK_HOVERED_URI: lua_pushstring(L, g_object_get_data(G_OBJECT(view), "hovered-uri")); return 1; case L_TK_URI: lua_pushstring(L, g_object_get_data(G_OBJECT(view), "uri")); return 1; case L_TK_SHOW: lua_pushcfunction(L, luaH_widget_show); return 1; case L_TK_HIDE: lua_pushcfunction(L, luaH_widget_hide); return 1; case L_TK_FOCUS: lua_pushcfunction(L, luaH_widget_focus); return 1; case L_TK_LOADING: lua_pushcfunction(L, luaH_webview_loading); return 1; case L_TK_GO_BACK: lua_pushcfunction(L, luaH_webview_go_back); return 1; case L_TK_GO_FORWARD: lua_pushcfunction(L, luaH_webview_go_forward); return 1; default: warn("unknown property: %s", luaL_checkstring(L, 2)); break; } return 0; }
static gint luaH_notebook_index(lua_State *L, luakit_token_t token) { widget_t *w = luaH_checkudata(L, 1, &widget_class); switch(token) { case L_TK_DESTROY: lua_pushcfunction(L, luaH_widget_destroy); return 1; case L_TK_COUNT: lua_pushcfunction(L, luaH_notebook_count); return 1; case L_TK_INSERT: lua_pushcfunction(L, luaH_notebook_insert); return 1; case L_TK_APPEND: lua_pushcfunction(L, luaH_notebook_append); return 1; case L_TK_CURRENT: lua_pushcfunction(L, luaH_notebook_current); return 1; case L_TK_REMOVE: lua_pushcfunction(L, luaH_notebook_remove); return 1; case L_TK_INDEXOF: lua_pushcfunction(L, luaH_notebook_indexof); return 1; case L_TK_ATINDEX: lua_pushcfunction(L, luaH_notebook_atindex); return 1; case L_TK_SWITCH: lua_pushcfunction(L, luaH_notebook_switch); return 1; case L_TK_SET_TITLE: lua_pushcfunction(L, luaH_notebook_set_title); return 1; case L_TK_GET_TITLE: lua_pushcfunction(L, luaH_notebook_get_title); return 1; case L_TK_SHOW_TABS: lua_pushboolean(L, gtk_notebook_get_show_tabs( GTK_NOTEBOOK(w->widget))); return 1; case L_TK_SHOW_BORDER: lua_pushboolean(L, gtk_notebook_get_show_border( GTK_NOTEBOOK(w->widget))); return 1; case L_TK_SHOW: lua_pushcfunction(L, luaH_widget_show); return 1; case L_TK_HIDE: lua_pushcfunction(L, luaH_widget_hide); return 1; case L_TK_FOCUS: lua_pushcfunction(L, luaH_widget_focus); return 1; default: break; } return 0; }