diff options
author | 2012-05-23 09:27:05 -0400 | |
---|---|---|
committer | 2012-05-23 09:27:05 -0400 | |
commit | 42895f1e4cd8d291e45c9f1b7d0c90628166e06b (patch) | |
tree | fd2769eca949301b4ca08813c4e6539769fa125e /src | |
parent | 7872e44d71de9371f4eef162287c14d2e6b8dc29 (diff) | |
download | textadept-42895f1e4cd8d291e45c9f1b7d0c90628166e06b.tar.gz textadept-42895f1e4cd8d291e45c9f1b7d0c90628166e06b.zip |
Removed some forward declarations and cleaned up code; src/textadept.c
Diffstat (limited to 'src')
-rw-r--r-- | src/textadept.c | 924 |
1 files changed, 443 insertions, 481 deletions
diff --git a/src/textadept.c b/src/textadept.c index 19ac73bc..1d4567d7 100644 --- a/src/textadept.c +++ b/src/textadept.c @@ -42,6 +42,7 @@ typedef GtkWidget Scintilla; #define SS(view, m, w, l) scintilla_send_message(SCINTILLA(view), m, w, l) #define signal(o, s, c) g_signal_connect(G_OBJECT(o), s, G_CALLBACK(c), 0) +#define osx_signal(a, s, c) g_signal_connect(a, s, G_CALLBACK(c), 0) #define focus_view(v) gtk_widget_grab_focus(v) #define scintilla_delete(w) gtk_widget_destroy(w) #if GTK_CHECK_VERSION(3,0,0) @@ -64,75 +65,45 @@ typedef GtkWidget Scintilla; // Window char *textadept_home = NULL; +Scintilla *focused_view; #if GTK -GtkWidget *window, *focused_view, *menubar, *statusbar[2]; +GtkWidget *window, *menubar, *statusbar[2]; GtkAccelGroup *accel; -static void new_window(); -static GtkWidget *new_view(sptr_t); -static void new_buffer(sptr_t); -static void s_notify(GtkWidget *, int, void *, void *); -static void s_command(GtkWidget *, int, void *, void *); -static int s_keypress(GtkWidget *, GdkEventKey *, void *); -static int s_buttonpress(GtkWidget *, GdkEventButton *, void *); -static int w_focus(GtkWidget *, GdkEventFocus *, void *); -static int w_keypress(GtkWidget *, GdkEventKey *, void *); -static int w_exit(GtkWidget *, GdkEventAny *, void *); -#if GLIB_CHECK_VERSION(2,28,0) && SINGLE_INSTANCE -static int a_command_line(GApplication *, GApplicationCommandLine *, void *); -#endif #if __OSX__ GtkOSXApplication *osxapp; -#define app_signal(a, s, c) g_signal_connect(a, s, G_CALLBACK(c), 0) -static int w_open_osx(GtkOSXApplication *, char *, void *); -static int w_exit_osx(GtkOSXApplication *, void *); -static void w_quit_osx(GtkOSXApplication *, void *); #endif -#elif NCURSES -Scintilla *focused_view; -static void new_window(); -static Scintilla *new_view(sptr_t); -static void new_buffer(sptr_t); -static void s_notify(Scintilla *, int, void *, void *); #endif // Find/Replace #if GTK -GtkWidget *findbox, *find_entry, *replace_entry, *fnext_button, *fprev_button, - *r_button, *ra_button, *match_case_opt, *whole_word_opt, *lua_opt, - *in_files_opt, *flabel, *rlabel; -typedef GtkListStore LIST_STORE; -LIST_STORE *find_store, *repl_store; -typedef GtkWidget FINDBOX; -typedef GtkWidget * FIND_BUTTON; +typedef GtkWidget FindBox; +GtkWidget *find_entry, *replace_entry, *flabel, *rlabel; +typedef GtkWidget * FindButton; +FindButton fnext_button, fprev_button, r_button, ra_button; +typedef GtkWidget * Option; +typedef GtkListStore ListStore; +ListStore *find_store, *repl_store; #elif NCURSES -WINDOW *findbox; -char *find_text = NULL, *repl_text = NULL; -enum { fnext_button, fprev_button, r_button, ra_button }; -int match_case_opt = FALSE, whole_word_opt = FALSE, lua_opt = FALSE, - in_files_opt = FALSE; -typedef char * LIST_STORE; -LIST_STORE find_store[10] = { +typedef WINDOW FindBox; +char *find_text = NULL, *repl_text = NULL, *flabel = NULL, *rlabel = NULL; +typedef int FindButton; +FindButton fnext_button = 1, fprev_button = 2, r_button = 3, ra_button = 4; +typedef int Option; +typedef char * ListStore; +ListStore find_store[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, repl_store[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; -typedef WINDOW FINDBOX; -typedef int FIND_BUTTON; #endif -static FINDBOX *new_findbox(); -static void f_clicked(FIND_BUTTON, void *); +FindBox *findbox; +Option match_case = 0, whole_word = 0, lua_pattern = 0, in_files = 0; // Command Entry #if GTK GtkWidget *command_entry; GtkListStore *cc_store; GtkEntryCompletion *command_entry_completion; -static int cc_matchfunc(GtkEntryCompletion *, const char *, GtkTreeIter *, - void *); -static int cc_matchselected(GtkEntryCompletion *, GtkTreeModel *, GtkTreeIter *, - void *); -static void c_activate(GtkWidget *, void *); -static int c_keypress(GtkWidget *, GdkEventKey *, void *); #elif NCURSES char *command_text = NULL; #endif @@ -181,239 +152,97 @@ static int lbuf_property(lua_State *), lfind_replace_all(lua_State *), lce_focus(lua_State *), lce_show_completions(lua_State *); -/******************************************************************************/ -/******************************* GUI Interface ********************************/ -/******************************************************************************/ +// Scintilla signals. /** - * Runs Textadept. - * Initializes the Lua state, creates the user interface, and then runs - * `core/init.lua` followed by `init.lua`. - * @param argc The number of command line params. - * @param argv The array of command line params. + * Change focus to the given Scintilla view. + * Generates 'view_before_switch' and 'view_after_switch' events. + * @param view The Scintilla view to focus. */ -int main(int argc, char **argv) { -#if GTK - gtk_init(&argc, &argv); -#elif NCURSES - TermKey *tk = termkey_new(0, TERMKEY_FLAG_NOTERMIOS); - initscr(); // raw()/cbreak() and noecho() are taken care of in libtermkey -#endif - -#if !(__WIN32__ || __OSX__ || __BSD__) - textadept_home = malloc(FILENAME_MAX); - readlink("/proc/self/exe", textadept_home, FILENAME_MAX); -#elif __WIN32__ - textadept_home = malloc(FILENAME_MAX); - GetModuleFileName(0, textadept_home, FILENAME_MAX); -#elif __OSX__ - osxapp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL); - char *path = quartz_application_get_resource_path(); - textadept_home = g_filename_from_utf8((const char *)path, -1, NULL, NULL, - NULL); - g_free(path); -#elif __BSD__ - textadept_home = malloc(FILENAME_MAX); - int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; - size_t cb = FILENAME_MAX; - sysctl(mib, 4, textadept_home, &cb, NULL, 0); -#endif -#if !(__WIN32__ || __OSX__) - char *last_slash = strrchr(textadept_home, '/'); -#elif !__OSX__ - char *last_slash = strrchr(textadept_home, '\\'); -#endif - if (last_slash) *last_slash = '\0'; - -#if GTK -#if GLIB_CHECK_VERSION(2,28,0) && SINGLE_INSTANCE - int force = FALSE; - for (int i = 0; i < argc; i++) - if (strcmp("-f", argv[i]) == 0 || strcmp("--force", argv[i]) == 0) { - force = TRUE; - break; - } - GApplication *app = g_application_new("textadept.editor", - G_APPLICATION_HANDLES_COMMAND_LINE); - g_signal_connect(app, "command-line", G_CALLBACK(a_command_line), 0); - int registered = g_application_register(app, NULL, NULL); - if (!registered || !g_application_get_is_remote(app) || force) { -#endif -#endif +static void goto_view(Scintilla *view) { + if (!closing) lL_event(lua, "view_before_switch", -1); + focused_view = view; + l_setglobalview(lua, view); + l_setglobaldoc(lua, SS(view, SCI_GETDOCPOINTER, 0, 0)); + if (!closing) lL_event(lua, "view_after_switch", -1); +} - setlocale(LC_NUMERIC, "C"); - if (lua = luaL_newstate(), !lL_init(lua, argc, argv, FALSE)) return 1; - new_window(); - lL_dofile(lua, "init.lua"); -#if __OSX__ - gtk_osxapplication_ready(osxapp); -#endif +/** + * Signal for a Scintilla notification. + */ +static void s_notify(Scintilla *view, int _, void *lParam, void*__) { + struct SCNotification *n = (struct SCNotification *)lParam; + if (focused_view == view || n->nmhdr.code == SCN_URIDROPPED) { + if (focused_view != view) goto_view(view); + lL_notify(lua, n); + } else if (n->nmhdr.code == SCN_SAVEPOINTLEFT) { + Scintilla *prev = focused_view; + goto_view(view); + lL_notify(lua, n); + goto_view(prev); // do not let a split view steal focus + } +} #if GTK -#if GLIB_CHECK_VERSION(2,28,0) && SINGLE_INSTANCE - gtk_main(); - } else g_application_run(app, argc, argv); - g_object_unref(app); -#else - gtk_main(); -#endif -#elif NCURSES - TermKeyResult res; - TermKeyKey key; - int c = 0; - while ((res = termkey_waitkey(tk, &key)) != TERMKEY_RES_EOF) { - if (res == TERMKEY_RES_ERROR) continue; - switch (key.type) { - case TERMKEY_TYPE_UNICODE: c = key.code.codepoint; break; - case TERMKEY_TYPE_KEYSYM: - switch (key.code.sym) { - case TERMKEY_SYM_BACKSPACE: c = SCK_BACK; break; - case TERMKEY_SYM_TAB: c = SCK_TAB; break; - case TERMKEY_SYM_ENTER: c = SCK_RETURN; break; - case TERMKEY_SYM_ESCAPE: c = SCK_ESCAPE; break; - case TERMKEY_SYM_UP: c = SCK_UP; break; - case TERMKEY_SYM_DOWN: c = SCK_DOWN; break; - case TERMKEY_SYM_LEFT: c = SCK_LEFT; break; - case TERMKEY_SYM_RIGHT: c = SCK_RIGHT; break; - case TERMKEY_SYM_INSERT: c = SCK_INSERT; break; - case TERMKEY_SYM_DELETE: c = SCK_DELETE; break; - case TERMKEY_SYM_PAGEUP: c = SCK_PRIOR; break; - case TERMKEY_SYM_PAGEDOWN: c = SCK_NEXT; break; - case TERMKEY_SYM_HOME: c = SCK_HOME; break; - case TERMKEY_SYM_END: c = SCK_END; break; - default: break; - } - break; - default: continue; - } -// if (c == SCK_ESCAPE && gtk_widget_get_visible(findbox) && -// !gtk_widget_has_focus(command_entry)) { -// gtk_widget_hide(findbox); -// gtk_widget_grab_focus(focused_view); -// } else - curs_set(0); // disable cursor when Scintilla has focus - if (!lL_event(lua, "keypress", LUA_TNUMBER, c, LUA_TBOOLEAN, - key.modifiers & TERMKEY_KEYMOD_SHIFT, LUA_TBOOLEAN, - key.modifiers & TERMKEY_KEYMOD_CTRL, LUA_TBOOLEAN, - key.modifiers & TERMKEY_KEYMOD_ALT, LUA_TBOOLEAN, FALSE, -1)) - scintilla_send_key(focused_view, c, key.modifiers & TERMKEY_KEYMOD_SHIFT, - key.modifiers & TERMKEY_KEYMOD_CTRL, - key.modifiers & TERMKEY_KEYMOD_ALT); - if (quit && lL_event(lua, "quit", -1)) { - l_close(lua); - break; - } else quit = FALSE; -// redrawwin(stdscr); - wrefresh(scintilla_get_window(focused_view)); - redrawwin(scintilla_get_window(focused_view)); - } - endwin(); - termkey_destroy(tk); -#endif +/** + * Signal for a Scintilla command. + * Currently handles SCEN_SETFOCUS. + */ +static void s_command(GtkWidget *view, int wParam, void*_, void*__) { + if (wParam >> 16 == SCEN_SETFOCUS) goto_view(view); +} - free(textadept_home); - return 0; +/** + * Signal for a Scintilla keypress. + */ +static int s_keypress(GtkWidget *view, GdkEventKey *event, void*_) { + return lL_event(lua, "keypress", LUA_TNUMBER, event->keyval, LUA_TBOOLEAN, + event->state & GDK_SHIFT_MASK, LUA_TBOOLEAN, + event->state & GDK_CONTROL_MASK, LUA_TBOOLEAN, + event->state & GDK_MOD1_MASK, LUA_TBOOLEAN, + event->state & GDK_META_MASK, -1); } -#if __WIN32__ /** - * Runs Textadept in Windows. - * @see main + * Signal for a Scintilla mouse click. */ -int WINAPI WinMain(HINSTANCE _, HINSTANCE __, LPSTR lpCmdLine, int ___) { - return main(1, &lpCmdLine); +static int s_buttonpress(GtkWidget*_, GdkEventButton *event, void*__) { + if (event->type == GDK_BUTTON_PRESS && event->button == 3) + return (lL_showcontextmenu(lua, (void *)event), TRUE); + return FALSE; } #endif /** - * Creates the Textadept window. - * The window contains a menubar, frame for Scintilla views, hidden find box, - * hidden command entry, and two status bars: one for notifications and the - * other for buffer status. + * Creates a new Scintilla document and adds it to the Lua state. + * Generates 'buffer_before_switch' and 'buffer_new' events. + * @param doc Almost always zero, except for the first Scintilla view created, + * in which its doc pointer would be given here. + * @see lL_adddoc */ -static void new_window() { -#if GTK - GList *icon_list = NULL; - const char *icons[] = { "16x16", "32x32", "48x48", "64x64", "128x128" }; - for (int i = 0; i < 5; i++) { - char *icon_file = g_strconcat(textadept_home, "/core/images/ta_", icons[i], - ".png", NULL); - GdkPixbuf *pb = gdk_pixbuf_new_from_file(icon_file, NULL); - if (pb) icon_list = g_list_prepend(icon_list, pb); - g_free(icon_file); +static void new_buffer(sptr_t doc) { + if (!doc) { // create the new document + doc = SS(focused_view, SCI_CREATEDOCUMENT, 0, 0); + lL_event(lua, "buffer_before_switch", -1); + lL_adddoc(lua, doc); + lL_gotodoc(lua, focused_view, -1, FALSE); + } else { + // The first Scintilla window already has a pre-created buffer. + lL_adddoc(lua, doc); + SS(focused_view, SCI_ADDREFDOCUMENT, 0, doc); } - gtk_window_set_default_icon_list(icon_list); - g_list_foreach(icon_list, (GFunc)g_object_unref, NULL); - g_list_free(icon_list); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_set_name(window, "textadept"); - gtk_window_set_default_size(GTK_WINDOW(window), 500, 400); - signal(window, "delete-event", w_exit); - signal(window, "focus-in-event", w_focus); - signal(window, "key-press-event", w_keypress); - accel = gtk_accel_group_new(); - -#if __OSX__ - gtk_osxapplication_set_use_quartz_accelerators(osxapp, FALSE); - app_signal(osxapp, "NSApplicationOpenFile", w_open_osx); - app_signal(osxapp, "NSApplicationBlockTermination", w_exit_osx); - app_signal(osxapp, "NSApplicationWillTerminate", w_quit_osx); -#endif - - GtkWidget *vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(window), vbox); - - menubar = gtk_menu_bar_new(); - gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); - - GtkWidget *hbox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); - - GtkWidget *view = new_view(0); - gtk_box_pack_start(GTK_BOX(hbox), view, TRUE, TRUE, 0); - - GtkWidget *find = new_findbox(); - gtk_box_pack_start(GTK_BOX(vbox), find, FALSE, FALSE, 5); - - command_entry = gtk_entry_new(); - signal(command_entry, "activate", c_activate); - signal(command_entry, "key-press-event", c_keypress); - gtk_box_pack_start(GTK_BOX(vbox), command_entry, FALSE, FALSE, 0); - - command_entry_completion = gtk_entry_completion_new(); - signal(command_entry_completion, "match-selected", cc_matchselected); - gtk_entry_completion_set_match_func(command_entry_completion, cc_matchfunc, - NULL, NULL); - gtk_entry_completion_set_popup_set_width(command_entry_completion, FALSE); - gtk_entry_completion_set_text_column(command_entry_completion, 0); - cc_store = gtk_list_store_new(1, G_TYPE_STRING); - gtk_entry_completion_set_model(command_entry_completion, - GTK_TREE_MODEL(cc_store)); - gtk_entry_set_completion(GTK_ENTRY(command_entry), command_entry_completion); - - GtkWidget *hboxs = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), hboxs, FALSE, FALSE, 0); - - statusbar[0] = gtk_statusbar_new(); - gtk_statusbar_push(GTK_STATUSBAR(statusbar[0]), 0, ""); - gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(statusbar[0]), FALSE); - gtk_box_pack_start(GTK_BOX(hboxs), statusbar[0], TRUE, TRUE, 0); - - statusbar[1] = gtk_statusbar_new(); - gtk_statusbar_push(GTK_STATUSBAR(statusbar[1]), 0, ""); - g_object_set(G_OBJECT(statusbar[1]), "width-request", 400, NULL); - gtk_box_pack_start(GTK_BOX(hboxs), statusbar[1], FALSE, FALSE, 0); + l_setglobaldoc(lua, doc); + lL_event(lua, "buffer_new", -1); +} - gtk_widget_show_all(window); - gtk_widget_hide(menubar); // hide initially - gtk_widget_hide(findbox); // hide initially - gtk_widget_hide(command_entry); // hide initially -#elif NCURSES - Scintilla *view = new_view(0); - wresize(scintilla_get_window(view), LINES - 2, COLS); - mvwin(scintilla_get_window(view), 1, 0); -#endif +/** + * Removes the Scintilla buffer from the current Scintilla view. + * @param doc The Scintilla document. + * @see lL_removedoc + */ +static void delete_buffer(sptr_t doc) { + lL_removedoc(lua, doc); + SS(focused_view, SCI_RELEASEDOCUMENT, 0, doc); } /** @@ -459,38 +288,6 @@ static void delete_view(Scintilla *view) { } /** - * Creates a new Scintilla document and adds it to the Lua state. - * Generates 'buffer_before_switch' and 'buffer_new' events. - * @param doc Almost always zero, except for the first Scintilla view created, - * in which its doc pointer would be given here. - * @see lL_adddoc - */ -static void new_buffer(sptr_t doc) { - if (!doc) { // create the new document - doc = SS(focused_view, SCI_CREATEDOCUMENT, 0, 0); - lL_event(lua, "buffer_before_switch", -1); - lL_adddoc(lua, doc); - lL_gotodoc(lua, focused_view, -1, FALSE); - } else { - // The first Scintilla window already has a pre-created buffer. - lL_adddoc(lua, doc); - SS(focused_view, SCI_ADDREFDOCUMENT, 0, doc); - } - l_setglobaldoc(lua, doc); - lL_event(lua, "buffer_new", -1); -} - -/** - * Removes the Scintilla buffer from the current Scintilla view. - * @param doc The Scintilla document. - * @see lL_removedoc - */ -static void delete_buffer(sptr_t doc) { - lL_removedoc(lua, doc); - SS(focused_view, SCI_RELEASEDOCUMENT, 0, doc); -} - -/** * Splits the given Scintilla view into two views. * The new view shows the same document as the original one. * @param view The Scintilla view to split. @@ -586,67 +383,40 @@ static int unsplit_view(Scintilla *view) { #endif } -/******************************************************************************/ -/************************* GUI Notifications/Signals **************************/ -/******************************************************************************/ +// Textadept signals. -/** - * Change focus to the given Scintilla view. - * Generates 'view_before_switch' and 'view_after_switch' events. - * @param view The Scintilla view to focus. - */ -static void goto_view(Scintilla *view) { - if (!closing) lL_event(lua, "view_before_switch", -1); - focused_view = view; - l_setglobalview(lua, view); - l_setglobaldoc(lua, SS(view, SCI_GETDOCPOINTER, 0, 0)); - if (!closing) lL_event(lua, "view_after_switch", -1); -} +#if GTK +// Application signal. +#if GLIB_CHECK_VERSION(2,28,0) && SINGLE_INSTANCE /** - * Signal for a Scintilla notification. + * Processes a remote Textadept's command line arguments. */ -static void s_notify(Scintilla *view, int _, void *lParam, void*__) { - struct SCNotification *n = (struct SCNotification *)lParam; - if (focused_view == view || n->nmhdr.code == SCN_URIDROPPED) { - if (focused_view != view) goto_view(view); - lL_notify(lua, n); - } else if (n->nmhdr.code == SCN_SAVEPOINTLEFT) { - Scintilla *prev = focused_view; - goto_view(view); - lL_notify(lua, n); - goto_view(prev); // do not let a split view steal focus +static int a_command_line(GApplication *app, GApplicationCommandLine *cmdline, + void*_) { + if (!lua) return 0; // only process argv for secondary/remote instances + int argc = 0; + char **argv = g_application_command_line_get_arguments(cmdline, &argc); + if (argc > 1) { + lua_getglobal(lua, "args"), lua_getfield(lua, -1, "process"); + lua_newtable(lua); + const char *cwd = g_application_command_line_get_cwd(cmdline); + lua_pushstring(lua, cwd ? cwd : ""), lua_rawseti(lua, -2, -1); + for (int i = 0; i < argc; i++) + lua_pushstring(lua, argv[i]), lua_rawseti(lua, -2, i); + if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { + lL_event(lua, "error", LUA_TSTRING, lua_tostring(lua, -1), -1); + lua_pop(lua, 1); // error message + } + lua_pop(lua, 1); // args } + g_strfreev(argv); + gtk_window_present(GTK_WINDOW(window)); + return 0; } +#endif -#if GTK -/** - * Signal for a Scintilla command. - * Currently handles SCEN_SETFOCUS. - */ -static void s_command(GtkWidget *view, int wParam, void*_, void*__) { - if (wParam >> 16 == SCEN_SETFOCUS) goto_view(view); -} - -/** - * Signal for a Scintilla keypress. - */ -static int s_keypress(GtkWidget *view, GdkEventKey *event, void*_) { - return lL_event(lua, "keypress", LUA_TNUMBER, event->keyval, LUA_TBOOLEAN, - event->state & GDK_SHIFT_MASK, LUA_TBOOLEAN, - event->state & GDK_CONTROL_MASK, LUA_TBOOLEAN, - event->state & GDK_MOD1_MASK, LUA_TBOOLEAN, - event->state & GDK_META_MASK, -1); -} - -/** - * Signal for a Scintilla mouse click. - */ -static int s_buttonpress(GtkWidget*_, GdkEventButton *event, void*__) { - if (event->type == GDK_BUTTON_PRESS && event->button == 3) - return (lL_showcontextmenu(lua, (void *)event), TRUE); - return FALSE; -} +// Window signals. /** * Signal for a Textadept window focus change. @@ -685,34 +455,6 @@ static int w_exit(GtkWidget*_, GdkEventAny*__, void*___) { return FALSE; } -#if GLIB_CHECK_VERSION(2,28,0) && SINGLE_INSTANCE -/** - * Processes a remote Textadept's command line arguments. - */ -static int a_command_line(GApplication *app, GApplicationCommandLine *cmdline, - void*_) { - if (!lua) return 0; // only process argv for secondary/remote instances - int argc = 0; - char **argv = g_application_command_line_get_arguments(cmdline, &argc); - if (argc > 1) { - lua_getglobal(lua, "args"), lua_getfield(lua, -1, "process"); - lua_newtable(lua); - const char *cwd = g_application_command_line_get_cwd(cmdline); - lua_pushstring(lua, cwd ? cwd : ""), lua_rawseti(lua, -2, -1); - for (int i = 0; i < argc; i++) - lua_pushstring(lua, argv[i]), lua_rawseti(lua, -2, i); - if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { - lL_event(lua, "error", LUA_TSTRING, lua_tostring(lua, -1), -1); - lua_pop(lua, 1); // error message - } - lua_pop(lua, 1); // args - } - g_strfreev(argv); - gtk_window_present(GTK_WINDOW(window)); - return 0; -} -#endif - #if __OSX__ /** * Signal for opening files from OSX. @@ -745,95 +487,14 @@ static void w_quit_osx(GtkOSXApplication*_, void*__) { #endif #endif // if GTK -/******************************************************************************/ -/************************* Find/Replace GUI Interface *************************/ -/******************************************************************************/ - -#if GTK -#define attach(w, x1, x2, y1, y2, xo, yo, xp, yp) \ - gtk_table_attach(GTK_TABLE(findbox), w, x1, x2, y1, y2, xo, yo, xp, yp) -#define EXPAND_FILL (GtkAttachOptions)(GTK_EXPAND | GTK_FILL) -#define SHRINK_FILL (GtkAttachOptions)(GTK_SHRINK | GTK_FILL) -#endif -/** - * Creates the Find box. - */ -static FINDBOX *new_findbox() { -#if GTK - findbox = gtk_table_new(2, 6, FALSE); - find_store = gtk_list_store_new(1, G_TYPE_STRING); - repl_store = gtk_list_store_new(1, G_TYPE_STRING); - - flabel = gtk_label_new_with_mnemonic("_Find:"); - rlabel = gtk_label_new_with_mnemonic("R_eplace:"); - GtkWidget *find_combo = gtk_combo_box_entry_new_with_model( - GTK_TREE_MODEL(find_store), 0); - gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(find_combo), 0); - g_object_unref(find_store); - gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(find_combo), FALSE); - find_entry = gtk_bin_get_child(GTK_BIN(find_combo)); - gtk_entry_set_activates_default(GTK_ENTRY(find_entry), TRUE); - GtkWidget *replace_combo = gtk_combo_box_entry_new_with_model( - GTK_TREE_MODEL(repl_store), 0); - gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(replace_combo), 0); - g_object_unref(repl_store); - gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(replace_combo), FALSE); - replace_entry = gtk_bin_get_child(GTK_BIN(replace_combo)); - gtk_entry_set_activates_default(GTK_ENTRY(replace_entry), TRUE); - fnext_button = gtk_button_new_with_mnemonic("Find _Next"); - fprev_button = gtk_button_new_with_mnemonic("Find _Prev"); - r_button = gtk_button_new_with_mnemonic("_Replace"); - ra_button = gtk_button_new_with_mnemonic("Replace _All"); - match_case_opt = gtk_check_button_new_with_mnemonic("_Match case"); - whole_word_opt = gtk_check_button_new_with_mnemonic("_Whole word"); - lua_opt = gtk_check_button_new_with_mnemonic("_Lua pattern"); - in_files_opt = gtk_check_button_new_with_mnemonic("_In files"); - - gtk_label_set_mnemonic_widget(GTK_LABEL(flabel), find_entry); - gtk_label_set_mnemonic_widget(GTK_LABEL(rlabel), replace_entry); - - attach(find_combo, 1, 2, 0, 1, EXPAND_FILL, SHRINK_FILL, 5, 0); - attach(replace_combo, 1, 2, 1, 2, EXPAND_FILL, SHRINK_FILL, 5, 0); - attach(flabel, 0, 1, 0, 1, SHRINK_FILL, SHRINK_FILL, 5, 0); - attach(rlabel, 0, 1, 1, 2, SHRINK_FILL, SHRINK_FILL, 5, 0); - attach(fnext_button, 2, 3, 0, 1, SHRINK_FILL, SHRINK_FILL, 0, 0); - attach(fprev_button, 3, 4, 0, 1, SHRINK_FILL, SHRINK_FILL, 0, 0); - attach(r_button, 2, 3, 1, 2, SHRINK_FILL, SHRINK_FILL, 0, 0); - attach(ra_button, 3, 4, 1, 2, SHRINK_FILL, SHRINK_FILL, 0, 0); - attach(match_case_opt, 4, 5, 0, 1, SHRINK_FILL, SHRINK_FILL, 5, 0); - attach(whole_word_opt, 4, 5, 1, 2, SHRINK_FILL, SHRINK_FILL, 5, 0); - attach(lua_opt, 5, 6, 0, 1, SHRINK_FILL, SHRINK_FILL, 5, 0); - attach(in_files_opt, 5, 6, 1, 2, SHRINK_FILL, SHRINK_FILL, 5, 0); - - signal(fnext_button, "clicked", f_clicked); - signal(fprev_button, "clicked", f_clicked); - signal(r_button, "clicked", f_clicked); - signal(ra_button, "clicked", f_clicked); - - gtk_widget_set_can_default(fnext_button, TRUE); - gtk_widget_set_can_focus(fnext_button, FALSE); - gtk_widget_set_can_focus(fprev_button, FALSE); - gtk_widget_set_can_focus(r_button, FALSE); - gtk_widget_set_can_focus(ra_button, FALSE); - gtk_widget_set_can_focus(match_case_opt, FALSE); - gtk_widget_set_can_focus(whole_word_opt, FALSE); - gtk_widget_set_can_focus(lua_opt, FALSE); - gtk_widget_set_can_focus(in_files_opt, FALSE); -#endif - - return findbox; -} - -/******************************************************************************/ -/**************************** Find/Replace Signals ****************************/ -/******************************************************************************/ +// Find/replace signals. /** * Adds the given text to the find/replace history list if it is not at the top. * @param text The text to add. - * @param store The LIST_STORE to add the text to. + * @param store The ListStore to add the text to. */ -static void find_add_to_history(const char *text, LIST_STORE *store) { +static void find_add_to_history(const char *text, ListStore *store) { #if GTK char *first_item = NULL; GtkTreeIter iter; @@ -859,7 +520,7 @@ static void find_add_to_history(const char *text, LIST_STORE *store) { /** * Signal for a find box button click. */ -static void f_clicked(FIND_BUTTON button, void*_) { +static void f_clicked(FindButton button, void*_) { #if GTK const char *find_text = gtk_entry_get_text(GTK_ENTRY(find_entry)); const char *repl_text = gtk_entry_get_text(GTK_ENTRY(replace_entry)); @@ -880,11 +541,9 @@ static void f_clicked(FIND_BUTTON button, void*_) { } } -/******************************************************************************/ -/************************ Command Entry GUI Interface *************************/ -/******************************************************************************/ - #if GTK +// Command entry completion signals. + /** * The match function for the command entry. * Since the completion list is filled by Lua, every item is a "match". @@ -914,9 +573,7 @@ static int cc_matchselected(GtkEntryCompletion*_, GtkTreeModel *model, return TRUE; } -/******************************************************************************/ -/*************************** Command Entry Signals ****************************/ -/******************************************************************************/ +// Command entry signals. /** * Signal for the 'enter' key being pressed in the Command Entry. @@ -938,6 +595,311 @@ static int c_keypress(GtkWidget*_, GdkEventKey *event, void*__) { } #endif // if GTK +/** + * Creates the Find box. + */ +static FindBox *new_findbox() { +#if GTK +#define attach(w, x1, x2, y1, y2, xo, yo, xp, yp) \ + gtk_table_attach(GTK_TABLE(findbox), w, x1, x2, y1, y2, xo, yo, xp, yp) +#define EXPAND_FILL (GtkAttachOptions)(GTK_EXPAND | GTK_FILL) +#define SHRINK_FILL (GtkAttachOptions)(GTK_SHRINK | GTK_FILL) + + findbox = gtk_table_new(2, 6, FALSE); + find_store = gtk_list_store_new(1, G_TYPE_STRING); + repl_store = gtk_list_store_new(1, G_TYPE_STRING); + + flabel = gtk_label_new_with_mnemonic("_Find:"); + rlabel = gtk_label_new_with_mnemonic("R_eplace:"); + GtkWidget *find_combo = gtk_combo_box_entry_new_with_model( + GTK_TREE_MODEL(find_store), 0); + gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(find_combo), 0); + g_object_unref(find_store); + gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(find_combo), FALSE); + find_entry = gtk_bin_get_child(GTK_BIN(find_combo)); + gtk_entry_set_activates_default(GTK_ENTRY(find_entry), TRUE); + GtkWidget *replace_combo = gtk_combo_box_entry_new_with_model( + GTK_TREE_MODEL(repl_store), 0); + gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(replace_combo), 0); + g_object_unref(repl_store); + gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(replace_combo), FALSE); + replace_entry = gtk_bin_get_child(GTK_BIN(replace_combo)); + gtk_entry_set_activates_default(GTK_ENTRY(replace_entry), TRUE); + fnext_button = gtk_button_new_with_mnemonic("Find _Next"); + fprev_button = gtk_button_new_with_mnemonic("Find _Prev"); + r_button = gtk_button_new_with_mnemonic("_Replace"); + ra_button = gtk_button_new_with_mnemonic("Replace _All"); + match_case = gtk_check_button_new_with_mnemonic("_Match case"); + whole_word = gtk_check_button_new_with_mnemonic("_Whole word"); + lua_pattern = gtk_check_button_new_with_mnemonic("_Lua pattern"); + in_files = gtk_check_button_new_with_mnemonic("_In files"); + + gtk_label_set_mnemonic_widget(GTK_LABEL(flabel), find_entry); + gtk_label_set_mnemonic_widget(GTK_LABEL(rlabel), replace_entry); + + attach(find_combo, 1, 2, 0, 1, EXPAND_FILL, SHRINK_FILL, 5, 0); + attach(replace_combo, 1, 2, 1, 2, EXPAND_FILL, SHRINK_FILL, 5, 0); + attach(flabel, 0, 1, 0, 1, SHRINK_FILL, SHRINK_FILL, 5, 0); + attach(rlabel, 0, 1, 1, 2, SHRINK_FILL, SHRINK_FILL, 5, 0); + attach(fnext_button, 2, 3, 0, 1, SHRINK_FILL, SHRINK_FILL, 0, 0); + attach(fprev_button, 3, 4, 0, 1, SHRINK_FILL, SHRINK_FILL, 0, 0); + attach(r_button, 2, 3, 1, 2, SHRINK_FILL, SHRINK_FILL, 0, 0); + attach(ra_button, 3, 4, 1, 2, SHRINK_FILL, SHRINK_FILL, 0, 0); + attach(match_case, 4, 5, 0, 1, SHRINK_FILL, SHRINK_FILL, 5, 0); + attach(whole_word, 4, 5, 1, 2, SHRINK_FILL, SHRINK_FILL, 5, 0); + attach(lua_pattern, 5, 6, 0, 1, SHRINK_FILL, SHRINK_FILL, 5, 0); + attach(in_files, 5, 6, 1, 2, SHRINK_FILL, SHRINK_FILL, 5, 0); + + signal(fnext_button, "clicked", f_clicked); + signal(fprev_button, "clicked", f_clicked); + signal(r_button, "clicked", f_clicked); + signal(ra_button, "clicked", f_clicked); + + gtk_widget_set_can_default(fnext_button, TRUE); + gtk_widget_set_can_focus(fnext_button, FALSE); + gtk_widget_set_can_focus(fprev_button, FALSE); + gtk_widget_set_can_focus(r_button, FALSE); + gtk_widget_set_can_focus(ra_button, FALSE); + gtk_widget_set_can_focus(match_case, FALSE); + gtk_widget_set_can_focus(whole_word, FALSE); + gtk_widget_set_can_focus(lua_pattern, FALSE); + gtk_widget_set_can_focus(in_files, FALSE); +#endif + + return findbox; +} + +/** + * Creates the Textadept window. + * The window contains a menubar, frame for Scintilla views, hidden find box, + * hidden command entry, and two status bars: one for notifications and the + * other for buffer status. + */ +static void new_window() { +#if GTK + GList *icon_list = NULL; + const char *icons[] = { "16x16", "32x32", "48x48", "64x64", "128x128" }; + for (int i = 0; i < 5; i++) { + char *icon_file = g_strconcat(textadept_home, "/core/images/ta_", icons[i], + ".png", NULL); + GdkPixbuf *pb = gdk_pixbuf_new_from_file(icon_file, NULL); + if (pb) icon_list = g_list_prepend(icon_list, pb); + g_free(icon_file); + } + gtk_window_set_default_icon_list(icon_list); + g_list_foreach(icon_list, (GFunc)g_object_unref, NULL); + g_list_free(icon_list); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name(window, "textadept"); + gtk_window_set_default_size(GTK_WINDOW(window), 500, 400); + signal(window, "delete-event", w_exit); + signal(window, "focus-in-event", w_focus); + signal(window, "key-press-event", w_keypress); + accel = gtk_accel_group_new(); + +#if __OSX__ + gtk_osxapplication_set_use_quartz_accelerators(osxapp, FALSE); + osx_signal(osxapp, "NSApplicationOpenFile", w_open_osx); + osx_signal(osxapp, "NSApplicationBlockTermination", w_exit_osx); + osx_signal(osxapp, "NSApplicationWillTerminate", w_quit_osx); +#endif + + GtkWidget *vbox = gtk_vbox_new(FALSE, 0); + gtk_container_add(GTK_CONTAINER(window), vbox); + + menubar = gtk_menu_bar_new(); + gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); + + GtkWidget *hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); + + GtkWidget *view = new_view(0); + gtk_box_pack_start(GTK_BOX(hbox), view, TRUE, TRUE, 0); + + GtkWidget *find = new_findbox(); + gtk_box_pack_start(GTK_BOX(vbox), find, FALSE, FALSE, 5); + + command_entry = gtk_entry_new(); + signal(command_entry, "activate", c_activate); + signal(command_entry, "key-press-event", c_keypress); + gtk_box_pack_start(GTK_BOX(vbox), command_entry, FALSE, FALSE, 0); + + command_entry_completion = gtk_entry_completion_new(); + signal(command_entry_completion, "match-selected", cc_matchselected); + gtk_entry_completion_set_match_func(command_entry_completion, cc_matchfunc, + NULL, NULL); + gtk_entry_completion_set_popup_set_width(command_entry_completion, FALSE); + gtk_entry_completion_set_text_column(command_entry_completion, 0); + cc_store = gtk_list_store_new(1, G_TYPE_STRING); + gtk_entry_completion_set_model(command_entry_completion, + GTK_TREE_MODEL(cc_store)); + gtk_entry_set_completion(GTK_ENTRY(command_entry), command_entry_completion); + + GtkWidget *hboxs = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), hboxs, FALSE, FALSE, 0); + + statusbar[0] = gtk_statusbar_new(); + gtk_statusbar_push(GTK_STATUSBAR(statusbar[0]), 0, ""); + gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(statusbar[0]), FALSE); + gtk_box_pack_start(GTK_BOX(hboxs), statusbar[0], TRUE, TRUE, 0); + + statusbar[1] = gtk_statusbar_new(); + gtk_statusbar_push(GTK_STATUSBAR(statusbar[1]), 0, ""); + g_object_set(G_OBJECT(statusbar[1]), "width-request", 400, NULL); + gtk_box_pack_start(GTK_BOX(hboxs), statusbar[1], FALSE, FALSE, 0); + + gtk_widget_show_all(window); + gtk_widget_hide(menubar); // hide initially + gtk_widget_hide(findbox); // hide initially + gtk_widget_hide(command_entry); // hide initially +#elif NCURSES + Scintilla *view = new_view(0); + wresize(scintilla_get_window(view), LINES - 2, COLS); + mvwin(scintilla_get_window(view), 1, 0); +#endif +} + +/** + * Runs Textadept. + * Initializes the Lua state, creates the user interface, and then runs + * `core/init.lua` followed by `init.lua`. + * @param argc The number of command line params. + * @param argv The array of command line params. + */ +int main(int argc, char **argv) { +#if GTK + gtk_init(&argc, &argv); +#elif NCURSES + TermKey *tk = termkey_new(0, TERMKEY_FLAG_NOTERMIOS); + initscr(); // raw()/cbreak() and noecho() are taken care of in libtermkey +#endif + +#if !(__WIN32__ || __OSX__ || __BSD__) + textadept_home = malloc(FILENAME_MAX); + readlink("/proc/self/exe", textadept_home, FILENAME_MAX); +#elif __WIN32__ + textadept_home = malloc(FILENAME_MAX); + GetModuleFileName(0, textadept_home, FILENAME_MAX); +#elif __OSX__ + osxapp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL); + char *path = quartz_application_get_resource_path(); + textadept_home = g_filename_from_utf8((const char *)path, -1, NULL, NULL, + NULL); + g_free(path); +#elif __BSD__ + textadept_home = malloc(FILENAME_MAX); + int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + size_t cb = FILENAME_MAX; + sysctl(mib, 4, textadept_home, &cb, NULL, 0); +#endif +#if !(__WIN32__ || __OSX__) + char *last_slash = strrchr(textadept_home, '/'); +#elif !__OSX__ + char *last_slash = strrchr(textadept_home, '\\'); +#endif + if (last_slash) *last_slash = '\0'; + +#if GTK +#if GLIB_CHECK_VERSION(2,28,0) && SINGLE_INSTANCE + int force = FALSE; + for (int i = 0; i < argc; i++) + if (strcmp("-f", argv[i]) == 0 || strcmp("--force", argv[i]) == 0) { + force = TRUE; + break; + } + GApplication *app = g_application_new("textadept.editor", + G_APPLICATION_HANDLES_COMMAND_LINE); + g_signal_connect(app, "command-line", G_CALLBACK(a_command_line), 0); + int registered = g_application_register(app, NULL, NULL); + if (!registered || !g_application_get_is_remote(app) || force) { +#endif +#endif + + setlocale(LC_NUMERIC, "C"); + if (lua = luaL_newstate(), !lL_init(lua, argc, argv, FALSE)) return 1; + new_window(); + lL_dofile(lua, "init.lua"); +#if __OSX__ + gtk_osxapplication_ready(osxapp); +#endif + +#if GTK +#if GLIB_CHECK_VERSION(2,28,0) && SINGLE_INSTANCE + gtk_main(); + } else g_application_run(app, argc, argv); + g_object_unref(app); +#else + gtk_main(); +#endif +#elif NCURSES + TermKeyResult res; + TermKeyKey key; + int c = 0; + while ((res = termkey_waitkey(tk, &key)) != TERMKEY_RES_EOF) { + if (res == TERMKEY_RES_ERROR) continue; + switch (key.type) { + case TERMKEY_TYPE_UNICODE: c = key.code.codepoint; break; + case TERMKEY_TYPE_KEYSYM: + switch (key.code.sym) { + case TERMKEY_SYM_BACKSPACE: c = SCK_BACK; break; + case TERMKEY_SYM_TAB: c = SCK_TAB; break; + case TERMKEY_SYM_ENTER: c = SCK_RETURN; break; + case TERMKEY_SYM_ESCAPE: c = SCK_ESCAPE; break; + case TERMKEY_SYM_UP: c = SCK_UP; break; + case TERMKEY_SYM_DOWN: c = SCK_DOWN; break; + case TERMKEY_SYM_LEFT: c = SCK_LEFT; break; + case TERMKEY_SYM_RIGHT: c = SCK_RIGHT; break; + case TERMKEY_SYM_INSERT: c = SCK_INSERT; break; + case TERMKEY_SYM_DELETE: c = SCK_DELETE; break; + case TERMKEY_SYM_PAGEUP: c = SCK_PRIOR; break; + case TERMKEY_SYM_PAGEDOWN: c = SCK_NEXT; break; + case TERMKEY_SYM_HOME: c = SCK_HOME; break; + case TERMKEY_SYM_END: c = SCK_END; break; + default: break; + } + break; + default: continue; + } +// if (c == SCK_ESCAPE && gtk_widget_get_visible(findbox) && +// !gtk_widget_has_focus(command_entry)) { +// gtk_widget_hide(findbox); +// gtk_widget_grab_focus(focused_view); +// } else + curs_set(0); // disable cursor when Scintilla has focus + if (!lL_event(lua, "keypress", LUA_TNUMBER, c, LUA_TBOOLEAN, + key.modifiers & TERMKEY_KEYMOD_SHIFT, LUA_TBOOLEAN, + key.modifiers & TERMKEY_KEYMOD_CTRL, LUA_TBOOLEAN, + key.modifiers & TERMKEY_KEYMOD_ALT, LUA_TBOOLEAN, FALSE, -1)) + scintilla_send_key(focused_view, c, key.modifiers & TERMKEY_KEYMOD_SHIFT, + key.modifiers & TERMKEY_KEYMOD_CTRL, + key.modifiers & TERMKEY_KEYMOD_ALT); + if (quit && lL_event(lua, "quit", -1)) { + l_close(lua); + break; + } else quit = FALSE; +// redrawwin(stdscr); + wrefresh(scintilla_get_window(focused_view)); + redrawwin(scintilla_get_window(focused_view)); + } + endwin(); + termkey_destroy(tk); +#endif + + free(textadept_home); + return 0; +} + +#if __WIN32__ +/** + * Runs Textadept in Windows. + * @see main + */ +int WINAPI WinMain(HINSTANCE _, HINSTANCE __, LPSTR lpCmdLine, int ___) { + return main(1, &lpCmdLine); +} +#endif + /******************************************************************************/ /******************************** Lua Interface *******************************/ /******************************************************************************/ @@ -1873,13 +1835,13 @@ static int lfind__index(lua_State *L) { lua_pushstring(L, repl_text); #endif else if (strcmp(key, "match_case") == 0) - lua_pushboolean(L, toggled(match_case_opt)); + lua_pushboolean(L, toggled(match_case)); else if (strcmp(key, "whole_word") == 0) - lua_pushboolean(L, toggled(whole_word_opt)); + lua_pushboolean(L, toggled(whole_word)); else if (strcmp(key, "lua") == 0) - lua_pushboolean(L, toggled(lua_opt)); + lua_pushboolean(L, toggled(lua_pattern)); else if (strcmp(key, "in_files") == 0) - lua_pushboolean(L, toggled(in_files_opt)); + lua_pushboolean(L, toggled(in_files)); else lua_rawget(L, 1); return 1; @@ -1907,13 +1869,13 @@ static int lfind__newindex(lua_State *L) { repl_text = copy(lua_tostring(L, 3)); #endif } else if (strcmp(key, "match_case") == 0) - toggle(match_case_opt, lua_toboolean(L, -1)); + toggle(match_case, lua_toboolean(L, -1)); else if (strcmp(key, "whole_word") == 0) - toggle(whole_word_opt, lua_toboolean(L, -1)); + toggle(whole_word, lua_toboolean(L, -1)); else if (strcmp(key, "lua") == 0) - toggle(lua_opt, lua_toboolean(L, -1)); + toggle(lua_pattern, lua_toboolean(L, -1)); else if (strcmp(key, "in_files") == 0) - toggle(in_files_opt, lua_toboolean(L, -1)); + toggle(in_files, lua_toboolean(L, -1)); #if GTK else if (strcmp(key, "find_label_text") == 0) gtk_label_set_text_with_mnemonic(GTK_LABEL(flabel), lua_tostring(L, 3)); @@ -1928,13 +1890,13 @@ static int lfind__newindex(lua_State *L) { else if (strcmp(key, "replace_all_button_text") == 0) gtk_button_set_label(GTK_BUTTON(ra_button), lua_tostring(L, 3)); else if (strcmp(key, "match_case_label_text") == 0) - gtk_button_set_label(GTK_BUTTON(match_case_opt), lua_tostring(L, 3)); + gtk_button_set_label(GTK_BUTTON(match_case), lua_tostring(L, 3)); else if (strcmp(key, "whole_word_label_text") == 0) - gtk_button_set_label(GTK_BUTTON(whole_word_opt), lua_tostring(L, 3)); + gtk_button_set_label(GTK_BUTTON(whole_word), lua_tostring(L, 3)); else if (strcmp(key, "lua_pattern_label_text") == 0) - gtk_button_set_label(GTK_BUTTON(lua_opt), lua_tostring(L, 3)); + gtk_button_set_label(GTK_BUTTON(lua_pattern), lua_tostring(L, 3)); else if (strcmp(key, "in_files_label_text") == 0) - gtk_button_set_label(GTK_BUTTON(in_files_opt), lua_tostring(L, 3)); + gtk_button_set_label(GTK_BUTTON(in_files), lua_tostring(L, 3)); #endif else lua_rawset(L, 1); |