#include <term.h>
+#define PANE_DATA_TYPE struct display_data
#include "core.h"
#ifdef RECORD_REPLAY
int clears; /* counts of Draw:clear events */
#endif
};
+#include "core-pane.h"
static SCREEN *current_screen;
static void ncurses_text(struct pane *p safe, struct pane *display safe,
current_screen = NULL;
return;
}
- dd = p->data;
+ dd = &p->data;
current_dd = dd;
if (!dd)
return;
static bool parse_event(struct pane *p safe);
static bool prepare_recrep(struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
char *name;
name = getenv("EDLIB_RECORD");
static void close_recrep(struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
if (dd->log) {
fprintf(dd->log, "Close %d\n", dd->clears);
static void record_key(struct pane *p safe, char *key safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
char q;
if (!dd->log)
static void record_mouse(struct pane *p safe, char *key safe, int x, int y)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
char q;
if (!dd->log)
return;
static void record_screen(struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
struct md5_state ctx;
uint16_t buf[CCHARW_MAX+5];
char out[MD5_DIGEST_SIZE*2+1];
static bool parse_event(struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
char line[80];
line[79] = 0;
REDEF_CMD(next_evt)
{
struct pane *p = ci->home;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
int button = 0, type = 0;
dd->input_sleeping = 0;
{
/* If this is only display, then refuse to close this one */
struct call_return cr;
- struct display_data *dd = ci->home->data;
+ struct display_data *dd = &ci->home->data;
if (dd->noclose) {
call("Message", ci->focus, 0, NULL, dd->noclose);
DEF_CMD(nc_set_noclose)
{
- struct display_data *dd = ci->home->data;
+ struct display_data *dd = &ci->home->data;
free(dd->noclose);
dd->noclose = NULL;
DEF_CB(ns_resume)
{
- struct display_data *dd = ci->home->data;
+ struct display_data *dd = &ci->home->data;
if (dd->suspended) {
dd->suspended = False;
DEF_CMD(nc_external_viewer)
{
struct pane *p = ci->home;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
char *disp = pane_attr_get(p, "DISPLAY");
char *disp_auth = pane_attr_get(p, "XAUTHORITY");
char *remote = pane_attr_get(p, "REMOTE_SESSION");
static void ncurses_stop(struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
if (dd->is_xterm) {
/* disable bracketed-paste */
static void ncurses_end(struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
if (dd->did_close)
return;
static int cvt_attrs(struct pane *p safe, struct pane *home safe,
const char *attrs, int *pairp safe, bool use_parent)
{
- struct display_data *dd = home->data;
+ struct display_data *dd = &home->data;
int attr = 0;
char tmp[40];
const char *a;
DEF_CMD(nc_notify_display)
{
- struct display_data *dd = ci->home->data;
+ struct display_data *dd = &ci->home->data;
comm_call(ci->comm2, "callback:display", ci->home, dd->last_event);
return 1;
}
DEF_CMD(nc_close)
{
struct pane *p = ci->home;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
ncurses_end(p);
hash_free(dd);
fclose(dd->scr_file);
DEF_CMD(nc_clear)
{
struct pane *p = ci->home;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
cchar_t cc = {};
int pair = 0;
int attr = cvt_attrs(ci->focus, p, ci->str, &pair, ci->str == NULL);
* 'y' will fit down.
*/
struct pane *p = ci->home;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
int x = 0, y = 0;
bool stretch = ci->num & 16;
int pos = ci->num;
DEF_CMD(nc_refresh_post)
{
struct pane *p = ci->home;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
struct pane *p1;
PANEL *pan, *pan2;
static void ncurses_start(struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
int rows, cols;
start_color();
if (!scr)
return NULL;
- alloc(dd, pane);
+ p = pane_register(ed, 1, &ncurses_handle.c);
+ if (!p)
+ return NULL;
+ dd = &p->data;
dd->scr = scr;
dd->scr_file = f;
dd->is_xterm = (term && strstarts(term, "xterm"));
- p = pane_register(ed, 1, &ncurses_handle.c, dd);
- if (!p) {
- unalloc(dd, pane);
- return NULL;
- }
set_screen(p);
ncurses_start(p);
REDEF_CMD(handle_winch)
{
struct pane *p = ci->home;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
struct winsize size;
ioctl(fileno(dd->scr_file), TIOCGWINSZ, &size);
set_screen(p);
static void send_key(int keytype, wint_t c, int alt, struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
char *n;
char buf[100];/* FIXME */
char t[5];
int button, char *mod, int type)
{
int ret;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
record_mouse(p, cmd, x, y);
ret = call("Mouse-event", p, button, NULL, cmd, type, NULL, mod, x, y);
static void send_mouse(MEVENT *mev safe, struct pane *p safe)
{
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
int x = mev->x;
int y = mev->y;
int b;
static void paste_start(struct pane *home safe)
{
- struct display_data *dd = home->data;
+ struct display_data *dd = &home->data;
dd->paste_start = time(NULL);
buf_init(&dd->paste_buf);
static void paste_flush(struct pane *home safe)
{
- struct display_data *dd = home->data;
+ struct display_data *dd = &home->data;
if (!dd->paste_start)
return;
static bool paste_recv(struct pane *home safe, int is_keycode, wint_t ch)
{
- struct display_data *dd = home->data;
+ struct display_data *dd = &home->data;
time_t now;
if (dd->paste_start == 0)
return False;
DEF_CMD(nc_get_paste)
{
- struct display_data *dd = ci->home->data;
+ struct display_data *dd = &ci->home->data;
comm_call(ci->comm2, "cb", ci->focus,
dd->paste_start, NULL, dd->paste_latest);
REDEF_CMD(input_handle)
{
struct pane *p = ci->home;
- struct display_data *dd = p->data;
+ struct display_data *dd = &p->data;
static const char paste_seq[] = "\e[200~";
wint_t c;
int is_keycode;
int have_escape = 0;
int i;
- if (!(void*)p->data)
- /* already closed */
- return 0;
wait_for(dd);
set_screen(p);
while ((is_keycode = get_wch(&c)) != ERR) {
key_add(nc_map, "Display:set-noclose", &nc_set_noclose);
key_add(nc_map, "Display:external-viewer", &nc_external_viewer);
key_add(nc_map, "Close", &nc_close);
- key_add(nc_map, "Free", &edlib_do_free);
key_add(nc_map, "Draw:clear", &nc_clear);
key_add(nc_map, "Draw:text-size", &nc_text_size);
key_add(nc_map, "Draw:text", &nc_draw_text);