aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2012-05-23 09:27:05 -0400
committermitchell <70453897+667e-11@users.noreply.github.com>2012-05-23 09:27:05 -0400
commit42895f1e4cd8d291e45c9f1b7d0c90628166e06b (patch)
treefd2769eca949301b4ca08813c4e6539769fa125e /src
parent7872e44d71de9371f4eef162287c14d2e6b8dc29 (diff)
downloadtextadept-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.c924
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);