aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interface-gtk.cpp11
-rw-r--r--src/interface-gtk.h12
-rw-r--r--src/interface-ncurses.cpp19
-rw-r--r--src/interface-ncurses.h21
-rw-r--r--src/interface.h3
-rw-r--r--src/main.cpp6
-rw-r--r--src/qregisters.cpp6
7 files changed, 53 insertions, 25 deletions
diff --git a/src/interface-gtk.cpp b/src/interface-gtk.cpp
index d1d20cd..cc39699 100644
--- a/src/interface-gtk.cpp
+++ b/src/interface-gtk.cpp
@@ -53,12 +53,13 @@ static gboolean exit_app(GtkWidget *w, GdkEventAny *e, gpointer p);
#define UNNAMED_FILE "(Unnamed)"
-InterfaceGtk::InterfaceGtk()
+void
+InterfaceGtk::main(int &argc, char **&argv)
{
GtkWidget *vbox;
GtkWidget *info_content;
- gtk_init(NULL, NULL);
+ gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), PACKAGE_NAME);
@@ -203,8 +204,10 @@ InterfaceGtk::widget_set_font(GtkWidget *widget, const gchar *font_name)
InterfaceGtk::~InterfaceGtk()
{
- gtk_widget_destroy(popup_widget);
- gtk_widget_destroy(window);
+ if (popup_widget)
+ gtk_widget_destroy(popup_widget);
+ if (window)
+ gtk_widget_destroy(window);
scintilla_release_resources();
}
diff --git a/src/interface-gtk.h b/src/interface-gtk.h
index 43e9e89..baa499c 100644
--- a/src/interface-gtk.h
+++ b/src/interface-gtk.h
@@ -37,7 +37,11 @@ extern class InterfaceGtk : public Interface {
GtkWidget *popup_widget;
public:
- InterfaceGtk();
+ InterfaceGtk() : window(NULL),
+ editor_widget(NULL),
+ cmdline_widget(NULL),
+ info_widget(NULL), message_widget(NULL),
+ popup_widget(NULL) {}
~InterfaceGtk();
inline GOptionGroup *
@@ -45,11 +49,7 @@ public:
{
return gtk_get_option_group(TRUE);
}
- inline void
- parse_args(int &argc, char **&argv)
- {
- gtk_parse_args(&argc, &argv);
- }
+ void main(int &argc, char **&argv);
void vmsg(MessageType type, const gchar *fmt, va_list ap);
void msg_clear(void);
diff --git a/src/interface-ncurses.cpp b/src/interface-ncurses.cpp
index a0e1e9a..3458813 100644
--- a/src/interface-ncurses.cpp
+++ b/src/interface-ncurses.cpp
@@ -52,7 +52,9 @@ static void scintilla_notify(Scintilla *sci, int idFrom,
#define SCI_COLOR_ATTR(f, b) \
COLOR_PAIR(SCI_COLOR_PAIR(f, b))
-InterfaceNCurses::InterfaceNCurses()
+void
+InterfaceNCurses::main(int &argc __attribute__((unused)),
+ char **&argv __attribute__((unused)))
{
init_screen();
cbreak();
@@ -442,18 +444,23 @@ InterfaceNCurses::Popup::~Popup()
InterfaceNCurses::~InterfaceNCurses()
{
- delwin(info_window);
+ if (info_window)
+ delwin(info_window);
g_free(info_current);
/* also deletes curses window */
- scintilla_delete(sci);
- delwin(cmdline_window);
+ if (sci)
+ scintilla_delete(sci);
+ if (cmdline_window)
+ delwin(cmdline_window);
g_free(cmdline_current);
- delwin(msg_window);
+ if (msg_window)
+ delwin(msg_window);
if (!isendwin())
endwin();
- delscreen(screen);
+ if (screen)
+ delscreen(screen);
if (screen_tty)
fclose(screen_tty);
}
diff --git a/src/interface-ncurses.h b/src/interface-ncurses.h
index dffa892..86c193b 100644
--- a/src/interface-ncurses.h
+++ b/src/interface-ncurses.h
@@ -52,14 +52,20 @@ extern class InterfaceNCurses : public Interface {
~Popup();
} popup;
- void init_screen(void);
- void resize_all_windows(void);
- void draw_info(void);
-
public:
- InterfaceNCurses();
+ InterfaceNCurses() : screen(NULL),
+ screen_tty(NULL),
+ sci(NULL),
+ info_window(NULL),
+ info_current(NULL),
+ sci_window(NULL),
+ msg_window(NULL),
+ cmdline_window(NULL),
+ cmdline_current(NULL) {}
~InterfaceNCurses();
+ void main(int &argc, char **&argv);
+
void vmsg(MessageType type, const gchar *fmt, va_list ap);
void msg_clear(void);
@@ -81,6 +87,11 @@ public:
/* main entry point */
void event_loop(void);
+
+private:
+ void init_screen(void);
+ void resize_all_windows(void);
+ void draw_info(void);
} interface;
#endif
diff --git a/src/interface.h b/src/interface.h
index 24c5b89..6f7bc84 100644
--- a/src/interface.h
+++ b/src/interface.h
@@ -63,7 +63,8 @@ public:
{
return NULL;
}
- virtual void parse_args(int &argc, char **&argv) {}
+ /* expected to initialize Scintilla */
+ virtual void main(int &argc, char **&argv) = 0;
enum MessageType {
MSG_USER,
diff --git a/src/main.cpp b/src/main.cpp
index 78e4daa..9979ee8 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -160,9 +160,7 @@ process_options(int &argc, char **&argv)
mung_file = get_teco_ini(argv[0]);
}
- interface.parse_args(argc, argv);
-
- /* remaining arguments, are arguments to the munged file */
+ /* remaining arguments, are arguments to the interface */
}
static inline void
@@ -197,6 +195,8 @@ main(int argc, char **argv)
signal(SIGINT, sigint_handler);
process_options(argc, argv);
+ interface.main(argc, argv);
+ /* remaining arguments are arguments to the munged file */
interface.ssm(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK);
interface.ssm(SCI_SETCARETFORE, 0xFFFFFF);
diff --git a/src/qregisters.cpp b/src/qregisters.cpp
index 41e1a16..69b3ea9 100644
--- a/src/qregisters.cpp
+++ b/src/qregisters.cpp
@@ -53,6 +53,12 @@ namespace States {
}
namespace QRegisters {
+ /*
+ * NOTE: the ctor will still be called before
+ * Scintilla is initialized.
+ * But the dtor is called before Scintilla
+ * destruction.
+ */
QRegisterTable globals INIT_PRIO(PRIO_INTERFACE+1);
QRegisterTable *locals = NULL;
QRegister *current = NULL;