aboutsummaryrefslogtreecommitdiffstats
path: root/src/term.c
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-05-10 17:25:12 -0400
committerJesse Luehrs <doy@tozt.net>2016-05-10 17:31:39 -0400
commitec77a7037586864ece6505c448ab5c15bf8a57d9 (patch)
treead23ca8d2ded6ffc0a9d9c6c5320e457c37ece32 /src/term.c
parent9118ead5ae15548c8a5b96340f9a0a24b3104e32 (diff)
downloadrunes-ec77a7037586864ece6505c448ab5c15bf8a57d9.tar.gz
runes-ec77a7037586864ece6505c448ab5c15bf8a57d9.zip
refactor how submodules are handled
let them own their own memory, so that they can free themselves once they exit the loop. also split out the parts of the terminal that we only want to initialize once, even if we open multiple terminal windows
Diffstat (limited to 'src/term.c')
-rw-r--r--src/term.c70
1 files changed, 30 insertions, 40 deletions
diff --git a/src/term.c b/src/term.c
index fe79cc5..49d214f 100644
--- a/src/term.c
+++ b/src/term.c
@@ -9,26 +9,18 @@
#include "pty-unix.h"
#include "window-xlib.h"
-static void runes_term_init_loop(RunesTerm *t, RunesLoop *loop);
-
-void runes_term_init(RunesTerm *t, RunesLoop *loop, int argc, char *argv[])
+RunesTerm *runes_term_new(int argc, char *argv[], RunesWindowBackendGlobal *wg)
{
+ RunesTerm *t;
int width, height;
- t->config = calloc(1, sizeof(RunesConfig));
- runes_config_init(t->config, argc, argv);
-
- t->display = calloc(1, sizeof(RunesDisplay));
- runes_display_init(t->display, t->config->font_name);
-
- t->w = calloc(1, sizeof(RunesWindowBackend));
- runes_window_backend_init(t->w);
-
- t->pty = calloc(1, sizeof(RunesPtyBackend));
- runes_pty_backend_init(t->pty);
+ t = calloc(1, sizeof(RunesTerm));
- t->scr = calloc(1, sizeof(VT100Screen));
- vt100_screen_init(t->scr);
+ t->config = runes_config_new(argc, argv);
+ t->display = runes_display_new(t->config->font_name);
+ t->w = runes_window_backend_new(wg);
+ t->pty = runes_pty_backend_new();
+ t->scr = vt100_screen_new(t->config->default_cols, t->config->default_rows);
vt100_screen_set_scrollback_length(t->scr, t->config->scrollback_length);
runes_window_backend_create_window(t, argc, argv);
@@ -38,22 +30,14 @@ void runes_term_init(RunesTerm *t, RunesLoop *loop, int argc, char *argv[])
runes_window_backend_get_size(t, &width, &height);
runes_term_set_window_size(t, width, height);
- t->loop = loop;
- runes_term_init_loop(t, loop);
+ return t;
}
-void runes_term_refcnt_inc(RunesTerm *t)
+void runes_term_register_with_loop(RunesTerm *t, RunesLoop *loop)
{
- t->refcnt++;
-}
-
-void runes_term_refcnt_dec(RunesTerm *t)
-{
- t->refcnt--;
- if (t->refcnt <= 0) {
- runes_term_cleanup(t);
- free(t);
- }
+ t->loop = loop;
+ runes_window_backend_init_loop(t, loop);
+ runes_pty_backend_init_loop(t, loop);
}
void runes_term_set_window_size(RunesTerm *t, int xpixel, int ypixel)
@@ -64,20 +48,26 @@ void runes_term_set_window_size(RunesTerm *t, int xpixel, int ypixel)
vt100_screen_set_window_size(t->scr, row, col);
}
-void runes_term_cleanup(RunesTerm *t)
+void runes_term_refcnt_inc(RunesTerm *t)
{
- vt100_screen_cleanup(t->scr);
- free(t->scr);
-
- runes_display_cleanup(t->display);
- free(t->display);
+ t->refcnt++;
+}
- runes_config_cleanup(t->config);
- free(t->config);
+void runes_term_refcnt_dec(RunesTerm *t)
+{
+ t->refcnt--;
+ if (t->refcnt <= 0) {
+ runes_term_delete(t);
+ }
}
-static void runes_term_init_loop(RunesTerm *t, RunesLoop *loop)
+void runes_term_delete(RunesTerm *t)
{
- runes_window_backend_init_loop(t, loop);
- runes_pty_backend_init_loop(t, loop);
+ vt100_screen_delete(t->scr);
+ runes_pty_backend_delete(t->pty);
+ runes_window_backend_delete(t->w);
+ runes_display_delete(t->display);
+ runes_config_delete(t->config);
+
+ free(t);
}