/*
 * Copyright © 2008 Kristian Høgsberg
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#include "config.h"

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <pty.h>
#include <ctype.h>
#include <cairo.h>
#include <sys/epoll.h>
#include <wchar.h>
#include <locale.h>
#include <errno.h>

#include <linux/input.h>

#include <wayland-client.h>

#include "shared/config-parser.h"
#include "shared/helpers.h"
#include "shared/xalloc.h"
#include "window.h"

static int option_fullscreen;
static int option_maximize;
static char *option_font;
static int option_font_size;
static char *option_term;
static char *option_shell;

static struct wl_list terminal_list;

static struct terminal *
terminal_create(struct display *display);
static void
terminal_destroy(struct terminal *terminal);
static int
terminal_run(struct terminal *terminal, const char *path);

#define TERMINAL_DRAW_SINGLE_WIDE_CHARACTERS    \
    " !\"#$%&'()*+,-./"                         \
    "0123456789"                                \
    ":;<=>?@"                                   \
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"                \
    "[\\]^_`"                                   \
    "abcdefghijklmnopqrstuvwxyz"                \
    "{|}~"                                      \
    ""

#define MOD_SHIFT	0x01
#define MOD_ALT		0x02
#define MOD_CTRL	0x04

#define ATTRMASK_BOLD		0x01
#define ATTRMASK_UNDERLINE	0x02
#define ATTRMASK_BLINK		0x04
#define ATTRMASK_INVERSE	0x08
#define ATTRMASK_CONCEALED	0x10

/* Buffer sizes */
#define MAX_RESPONSE		256
#define MAX_ESCAPE		255

/* Terminal modes */
#define MODE_SHOW_CURSOR	0x00000001
#define MODE_INVERSE		0x00000002
#define MODE_AUTOWRAP		0x00000004
#define MODE_AUTOREPEAT		0x00000008
#define MODE_LF_NEWLINE		0x00000010
#define MODE_IRM		0x00000020
#define MODE_DELETE_SENDS_DEL	0x00000040
#define MODE_ALT_SENDS_ESC	0x00000080

union utf8_char {
	unsigned char byte[4];
	uint32_t ch;
};

enum utf8_state {
	utf8state_start,
	utf8state_accept,
	utf8state_reject,
	utf8state_expect3,
	utf8state_expect2,
	utf8state_expect1
};

struct utf8_state_machine {
	enum utf8_state state;
	int len;
	union utf8_char s;
	uint32_t unicode;
};

static void
init_state_machine(struct utf8_state_machine *machine)
{
	machine->state = utf8state_start;
	machine->len = 0;
	machine->s.ch = 0;
	machine->unicode = 0;
}

static enum utf8_state
utf8_next_char(struct utf8_state_machine *machine, unsigned char c)
{
	switch(machine->state) {
	case utf8state_start:
	case utf8state_accept:
	case utf8state_reject:
		machine->s.ch = 0;
		machine->len = 0;
		if (c == 0xC0 || c == 0xC1) {
			/* overlong encoding, reject */
			machine->state = utf8state_reject;
		} else if ((c & 0x80) == 0) {
			/* single byte, accept */
			machine->s.byte[machine->len++] = c;
			machine->state = utf8state_accept;
			machine->unicode = c;
		} else if ((c & 0xC0) == 0x80) {
			/* parser out of sync, ignore byte */
			machine->state = utf8state_start;
		} else if ((c & 0xE0) == 0xC0) {
			/* start of two byte sequence */
			machine->s.byte[machine->len++] = c;
			machine->state = utf8state_expect1;
			machine->unicode = c & 0x1f;
		} else if ((c & 0xF0) == 0xE0) {
			/* start of three byte sequence */
			machine->s.byte[machine->len++] = c;
			machine->state = utf8state_expect2;
			machine->unicode = c & 0x0f;
		} else if ((c & 0xF8) == 0xF0) {
			/* start of four byte sequence */
			machine->s.byte[machine->len++] = c;
			machine->state = utf8state_expect3;
			machine->unicode = c & 0x07;
		} else {
			/* overlong encoding, reject */
			machine->state = utf8state_reject;
		}
		break;
	case utf8state_expect3:
		machine->s.byte[machine->len++] = c;
		machine->unicode = (machine->unicode << 6) | (c & 0x3f);
		if ((c & 0xC0) == 0x80) {
			/* all good, continue */
			machine->state = utf8state_expect2;
		} else {
			/* missing extra byte, reject */
			machine->state = utf8state_reject;
		}
		break;
	case utf8state_expect2:
		machine->s.byte[machine->len++] = c;
		machine->unicode = (machine->unicode << 6) | (c & 0x3f);
		if ((c & 0xC0) == 0x80) {
			/* all good, continue */
			machine->state = utf8state_expect1;
		} else {
			/* missing extra byte, reject */
			machine->state = utf8state_reject;
		}
		break;
	case utf8state_expect1:
		machine->s.byte[machine->len++] = c;
		machine->unicode = (machine->unicode << 6) | (c & 0x3f);
		if ((c & 0xC0) == 0x80) {
			/* all good, accept */
			machine->state = utf8state_accept;
		} else {
			/* missing extra byte, reject */
			machine->state = utf8state_reject;
		}
		break;
	default:
		machine->state = utf8state_reject;
		break;
	}

	return machine->state;
}

static uint32_t
get_unicode(union utf8_char utf8)
{
	struct utf8_state_machine machine;
	int i;

	init_state_machine(&machine);
	for (i = 0; i < 4; i++) {
		utf8_next_char(&machine, utf8.byte[i]);
		if (machine.state == utf8state_accept ||
		    machine.state == utf8state_reject)
			break;
	}

	if (machine.state == utf8state_reject)
		return 0xfffd;

	return machine.unicode;
}

static bool
is_wide(union utf8_char utf8)
{
	uint32_t unichar = get_unicode(utf8);
	return wcwidth(unichar) > 1;
}

struct char_sub {
	union utf8_char match;
	union utf8_char replace;
};
/* Set last char_sub match to NULL char */
typedef struct char_sub *character_set;

struct char_sub CS_US[] = {
	{{{0, }}, {{0, }}}
};
static struct char_sub CS_UK[] = {
	{{{'#', 0, }}, {{0xC2, 0xA3, 0, }}}, /* POUND: £ */
	{{{0, }}, {{0, }}}
};
static struct char_sub CS_SPECIAL[] = {
	{{{'`', 0, }}, {{0xE2, 0x99, 0xA6, 0}}}, /* diamond: ♦ */
	{{{'a', 0, }}, {{0xE2, 0x96, 0x92, 0}}}, /* 50% cell: ▒ */
	{{{'b', 0, }}, {{0xE2, 0x90, 0x89, 0}}}, /* HT: ␉ */
	{{{'c', 0, }}, {{0xE2, 0x90, 0x8C, 0}}}, /* FF: ␌ */
	{{{'d', 0, }}, {{0xE2, 0x90, 0x8D, 0}}}, /* CR: ␍ */
	{{{'e', 0, }}, {{0xE2, 0x90, 0x8A, 0}}}, /* LF: ␊ */
	{{{'f', 0, }}, {{0xC2, 0xB0, 0, }}}, /* Degree: ° */
	{{{'g', 0, }}, {{0xC2, 0xB1, 0, }}}, /* Plus/Minus: ± */
	{{{'h', 0, }}, {{0xE2, 0x90, 0xA4, 0}}}, /* NL: ␤ */
	{{{'i', 0, }}, {{0xE2, 0x90, 0x8B, 0}}}, /* VT: ␋ */
	{{{'j', 0, }}, {{0xE2, 0x94, 0x98, 0}}}, /* CN_RB: ┘ */
	{{{'k', 0, }}, {{0xE2, 0x94, 0x90, 0}}}, /* CN_RT: ┐ */
	{{{'l', 0, }}, {{0xE2, 0x94, 0x8C, 0}}}, /* CN_LT: ┌ */
	{{{'m', 0, }}, {{0xE2, 0x94, 0x94, 0}}}, /* CN_LB: └ */
	{{{'n', 0, }}, {{0xE2, 0x94, 0xBC, 0}}}, /* CROSS: ┼ */
	{{{'o', 0, }}, {{0xE2, 0x8E, 0xBA, 0}}}, /* Horiz. Scan Line 1: ⎺ */
	{{{'p', 0, }}, {{0xE2, 0x8E, 0xBB, 0}}}, /* Horiz. Scan Line 3: ⎻ */
	{{{'q', 0, }}, {{0xE2, 0x94, 0x80, 0}}}, /* Horiz. Scan Line 5: ─ */
	{{{'r', 0, }}, {{0xE2, 0x8E, 0xBC, 0}}}, /* Horiz. Scan Line 7: ⎼ */
	{{{'s', 0, }}, {{0xE2, 0x8E, 0xBD, 0}}}, /* Horiz. Scan Line 9: ⎽ */
	{{{'t', 0, }}, {{0xE2, 0x94, 0x9C, 0}}}, /* TR: ├ */
	{{{'u', 0, }}, {{0xE2, 0x94, 0xA4, 0}}}, /* TL: ┤ */
	{{{'v', 0, }}, {{0xE2, 0x94, 0xB4, 0}}}, /* TU: ┴ */
	{{{'w', 0, }}, {{0xE2, 0x94, 0xAC, 0}}}, /* TD: ┬ */
	{{{'x', 0, }}, {{0xE2, 0x94, 0x82, 0}}}, /* V: │ */
	{{{'y', 0, }}, {{0xE2, 0x89, 0xA4, 0}}}, /* LE: ≤ */
	{{{'z', 0, }}, {{0xE2, 0x89, 0xA5, 0}}}, /* GE: ≥ */
	{{{'{', 0, }}, {{0xCF, 0x80, 0, }}}, /* PI: π */
	{{{'|', 0, }}, {{0xE2, 0x89, 0xA0, 0}}}, /* NEQ: ≠ */
	{{{'}', 0, }}, {{0xC2, 0xA3, 0, }}}, /* POUND: £ */
	{{{'~', 0, }}, {{0xE2, 0x8B, 0x85, 0}}}, /* DOT: ⋅ */
	{{{0, }}, {{0, }}}
};

static void
apply_char_set(character_set cs, union utf8_char *utf8)
{
	int i = 0;

	while (cs[i].match.byte[0]) {
		if ((*utf8).ch == cs[i].match.ch) {
			*utf8 = cs[i].replace;
			break;
		}
		i++;
	}
}

struct key_map {
	int sym;
	int num;
	char escape;
	char code;
};
/* Set last key_sub sym to NULL */
typedef struct key_map *keyboard_mode;

static struct key_map KM_NORMAL[] = {
	{ XKB_KEY_Left,  1, '[', 'D' },
	{ XKB_KEY_Right, 1, '[', 'C' },
	{ XKB_KEY_Up,    1, '[', 'A' },
	{ XKB_KEY_Down,  1, '[', 'B' },
	{ XKB_KEY_Home,  1, '[', 'H' },
	{ XKB_KEY_End,   1, '[', 'F' },
	{ 0, 0, 0, 0 }
};
static struct key_map KM_APPLICATION[] = {
	{ XKB_KEY_Left,          1, 'O', 'D' },
	{ XKB_KEY_Right,         1, 'O', 'C' },
	{ XKB_KEY_Up,            1, 'O', 'A' },
	{ XKB_KEY_Down,          1, 'O', 'B' },
	{ XKB_KEY_Home,          1, 'O', 'H' },
	{ XKB_KEY_End,           1, 'O', 'F' },
	{ XKB_KEY_KP_Enter,      1, 'O', 'M' },
	{ XKB_KEY_KP_Multiply,   1, 'O', 'j' },
	{ XKB_KEY_KP_Add,        1, 'O', 'k' },
	{ XKB_KEY_KP_Separator,  1, 'O', 'l' },
	{ XKB_KEY_KP_Subtract,   1, 'O', 'm' },
	{ XKB_KEY_KP_Divide,     1, 'O', 'o' },
	{ 0, 0, 0, 0 }
};

static int
function_key_response(char escape, int num, uint32_t modifiers,
		      char code, char *response)
{
	int mod_num = 0;
	int len;

	if (modifiers & MOD_SHIFT_MASK) mod_num   |= 1;
	if (modifiers & MOD_ALT_MASK) mod_num    |= 2;
	if (modifiers & MOD_CONTROL_MASK) mod_num |= 4;

	if (mod_num != 0)
		len = snprintf(response, MAX_RESPONSE, "\e[%d;%d%c",
			       num, mod_num + 1, code);
	else if (code != '~')
		len = snprintf(response, MAX_RESPONSE, "\e%c%c",
			       escape, code);
	else
		len = snprintf(response, MAX_RESPONSE, "\e%c%d%c",
			       escape, num, code);

	if (len >= MAX_RESPONSE)	return MAX_RESPONSE - 1;
	else				return len;
}

/* returns the number of bytes written into response,
 * which must have room for MAX_RESPONSE bytes */
static int
apply_key_map(keyboard_mode mode, int sym, uint32_t modifiers, char *response)
{
	struct key_map map;
	int len = 0;
	int i = 0;

	while (mode[i].sym) {
		map = mode[i++];
		if (sym == map.sym) {
			len = function_key_response(map.escape, map.num,
						    modifiers, map.code,
						    response);
			break;
		}
	}

	return len;
}

struct terminal_color { double r, g, b, a; };
struct attr {
	unsigned char fg, bg;
	char a;        /* attributes format:
	                * 76543210
			*    cilub */
	char s;        /* in selection */
};
struct color_scheme {
	struct terminal_color palette[16];
	char border;
	struct attr default_attr;
};

static void
attr_init(struct attr *data_attr, struct attr attr, int n)
{
	int i;
	for (i = 0; i < n; i++) {
		data_attr[i] = attr;
	}
}

enum escape_state {
	escape_state_normal = 0,
	escape_state_escape,
	escape_state_dcs,
	escape_state_csi,
	escape_state_osc,
	escape_state_inner_escape,
	escape_state_ignore,
	escape_state_special
};

#define ESC_FLAG_WHAT	0x01
#define ESC_FLAG_GT	0x02
#define ESC_FLAG_BANG	0x04
#define ESC_FLAG_CASH	0x08
#define ESC_FLAG_SQUOTE 0x10
#define ESC_FLAG_DQUOTE	0x20
#define ESC_FLAG_SPACE	0x40

enum {
	SELECT_NONE,
	SELECT_CHAR,
	SELECT_WORD,
	SELECT_LINE
};

struct terminal {
	struct window *window;
	struct widget *widget;
	struct display *display;
	char *title;
	union utf8_char *data;
	struct task io_task;
	char *tab_ruler;
	struct attr *data_attr;
	struct attr curr_attr;
	uint32_t mode;
	char origin_mode;
	char saved_origin_mode;
	struct attr saved_attr;
	union utf8_char last_char;
	int margin_top, margin_bottom;
	character_set cs, g0, g1;
	character_set saved_cs, saved_g0, saved_g1;
	keyboard_mode key_mode;
	int data_pitch, attr_pitch;  /* The width in bytes of a line */
	int width, height, row, column, max_width;
	uint32_t buffer_height;
	uint32_t start, end, saved_start, log_size;
	wl_fixed_t smooth_scroll;
	int saved_row, saved_column;
	int scrolling;
	int send_cursor_position;
	int fd, master;
	uint32_t modifiers;
	char escape[MAX_ESCAPE+1];
	int escape_length;
	enum escape_state state;
	enum escape_state outer_state;
	int escape_flags;
	struct utf8_state_machine state_machine;
	int margin;
	struct color_scheme *color_scheme;
	struct terminal_color color_table[256];
	cairo_font_extents_t extents;
	double average_width;
	cairo_scaled_font_t *font_normal, *font_bold;
	uint32_t hide_cursor_serial;
	int size_in_title;

	struct wl_data_source *selection;
	uint32_t click_time;
	int dragging, click_count;
	int selection_start_x, selection_start_y;
	int selection_end_x, selection_end_y;
	int selection_start_row, selection_start_col;
	int selection_end_row, selection_end_col;
	struct wl_list link;
	int pace_pipe;
};

/* Create default tab stops, every 8 characters */
static void
terminal_init_tabs(struct terminal *terminal)
{
	int i = 0;

	while (i < terminal->width) {
		if (i % 8 == 0)
			terminal->tab_ruler[i] = 1;
		else
			terminal->tab_ruler[i] = 0;
		i++;
	}
}

static void
terminal_init(struct terminal *terminal)
{
	terminal->curr_attr = terminal->color_scheme->default_attr;
	terminal->origin_mode = 0;
	terminal->mode = MODE_SHOW_CURSOR |
			 MODE_AUTOREPEAT |
			 MODE_ALT_SENDS_ESC |
			 MODE_AUTOWRAP;

	terminal->row = 0;
	terminal->column = 0;

	terminal->g0 = CS_US;
	terminal->g1 = CS_US;
	terminal->cs = terminal->g0;
	terminal->key_mode = KM_NORMAL;

	terminal->saved_g0 = terminal->g0;
	terminal->saved_g1 = terminal->g1;
	terminal->saved_cs = terminal->cs;

	terminal->saved_attr = terminal->curr_attr;
	terminal->saved_origin_mode = terminal->origin_mode;
	terminal->saved_row = terminal->row;
	terminal->saved_column = terminal->column;

	if (terminal->tab_ruler != NULL) terminal_init_tabs(terminal);
}

static void
init_color_table(struct terminal *terminal)
{
	int c, r;
	struct terminal_color *color_table = terminal->color_table;

	for (c = 0; c < 256; c ++) {
		if (c < 16) {
			color_table[c] = terminal->color_scheme->palette[c];
		} else if (c < 232) {
			r = c - 16;
			color_table[c].b = ((double)(r % 6) / 6.0); r /= 6;
			color_table[c].g = ((double)(r % 6) / 6.0); r /= 6;
			color_table[c].r = ((double)(r % 6) / 6.0);
			color_table[c].a = 1.0;
		} else {
			r = (c - 232) * 10 + 8;
			color_table[c].r = ((double) r) / 256.0;
			color_table[c].g = color_table[c].r;
			color_table[c].b = color_table[c].r;
			color_table[c].a = 1.0;
		}
	}
}

static union utf8_char *
terminal_get_row(struct terminal *terminal, int row)
{
	int index;

	index = (row + terminal->start) & (terminal->buffer_height - 1);

	return (void *) terminal->data + index * terminal->data_pitch;
}

static struct attr*
terminal_get_attr_row(struct terminal *terminal, int row)
{
	int index;

	index = (row + terminal->start) & (terminal->buffer_height - 1);

	return (void *) terminal->data_attr + index * terminal->attr_pitch;
}

union decoded_attr {
	struct attr attr;
	uint32_t key;
};

static void
terminal_decode_attr(struct terminal *terminal, int row, int col,
		     union decoded_attr *decoded)
{
	struct attr attr;
	int foreground, background, tmp;

	decoded->attr.s = 0;
	if (((row == terminal->selection_start_row &&
	      col >= terminal->selection_start_col) ||
	     row > terminal->selection_start_row) &&
	    ((row == terminal->selection_end_row &&
	      col < terminal->selection_end_col) ||
	     row < terminal->selection_end_row))
		decoded->attr.s = 1;

	/* get the attributes for this character cell */
	attr = terminal_get_attr_row(terminal, row)[col];
	if ((attr.a & ATTRMASK_INVERSE) ||
	    decoded->attr.s ||
	    ((terminal->mode & MODE_SHOW_CURSOR) &&
	     window_has_focus(terminal->window) && terminal->row == row &&
	     terminal->column == col)) {
		foreground = attr.bg;
		background = attr.fg;
		if (attr.a & ATTRMASK_BOLD) {
			if (foreground <= 16) foreground |= 0x08;
			if (background <= 16) background &= 0x07;
		}
	} else {
		foreground = attr.fg;
		background = attr.bg;
	}

	if (terminal->mode & MODE_INVERSE) {
		tmp = foreground;
		foreground = background;
		background = tmp;
		if (attr.a & ATTRMASK_BOLD) {
			if (foreground <= 16) foreground |= 0x08;
			if (background <= 16) background &= 0x07;
		}
	}

	decoded->attr.fg = foreground;
	decoded->attr.bg = background;
	decoded->attr.a = attr.a;
}


static void
terminal_scroll_buffer(struct terminal *terminal, int d)
{
	int i;

	terminal->start += d;
	if (d < 0) {
		d = 0 - d;
		for (i = 0; i < d; i++) {
			memset(terminal_get_row(terminal, i), 0, terminal->data_pitch);
			attr_init(terminal_get_attr_row(terminal, i),
			    terminal->curr_attr, terminal->width);
		}
	} else {
		for (i = terminal->height - d; i < terminal->height; i++) {
			memset(terminal_get_row(terminal, i), 0, terminal->data_pitch);
			attr_init(terminal_get_attr_row(terminal, i),
			    terminal->curr_attr, terminal->width);
		}
	}

	terminal->selection_start_row -= d;
	terminal->selection_end_row -= d;
}

static void
terminal_scroll_window(struct terminal *terminal, int d)
{
	int i;
	int window_height;
	int from_row, to_row;

	// scrolling range is inclusive
	window_height = terminal->margin_bottom - terminal->margin_top + 1;
	d = d % (window_height + 1);
	if (d < 0) {
		d = 0 - d;
		to_row = terminal->margin_bottom;
		from_row = terminal->margin_bottom - d;

		for (i = 0; i < (window_height - d); i++) {
			memcpy(terminal_get_row(terminal, to_row - i),
			       terminal_get_row(terminal, from_row - i),
			       terminal->data_pitch);
			memcpy(terminal_get_attr_row(terminal, to_row - i),
			       terminal_get_attr_row(terminal, from_row - i),
			       terminal->attr_pitch);
		}
		for (i = terminal->margin_top; i < (terminal->margin_top + d); i++) {
			memset(terminal_get_row(terminal, i), 0, terminal->data_pitch);
			attr_init(terminal_get_attr_row(terminal, i),
				terminal->curr_attr, terminal->width);
		}
	} else {
		to_row = terminal->margin_top;
		from_row = terminal->margin_top + d;

		for (i = 0; i < (window_height - d); i++) {
			memcpy(terminal_get_row(terminal, to_row + i),
			       terminal_get_row(terminal, from_row + i),
			       terminal->data_pitch);
			memcpy(terminal_get_attr_row(terminal, to_row + i),
			       terminal_get_attr_row(terminal, from_row + i),
			       terminal->attr_pitch);
		}
		for (i = terminal->margin_bottom - d + 1; i <= terminal->margin_bottom; i++) {
			memset(terminal_get_row(terminal, i), 0, terminal->data_pitch);
			attr_init(terminal_get_attr_row(terminal, i),
				terminal->curr_attr, terminal->width);
		}
	}
}

static void
terminal_scroll(struct terminal *terminal, int d)
{
	if (terminal->margin_top == 0 && terminal->margin_bottom == terminal->height - 1)
		terminal_scroll_buffer(terminal, d);
	else
		terminal_scroll_window(terminal, d);
}

static void
terminal_shift_line(struct terminal *terminal, int d)
{
	union utf8_char *row;
	struct attr *attr_row;

	row = terminal_get_row(terminal, terminal->row);
	attr_row = terminal_get_attr_row(terminal, terminal->row);

	if ((terminal->width + d) <= terminal->column)
		d = terminal->column + 1 - terminal->width;
	if ((terminal->column + d) >= terminal->width)
		d = terminal->width - terminal->column - 1;

	if (d < 0) {
		d = 0 - d;
		memmove(&row[terminal->column],
		        &row[terminal->column + d],
			(terminal->width - terminal->column - d) * sizeof(union utf8_char));
		memmove(&attr_row[terminal->column], &attr_row[terminal->column + d],
		        (terminal->width - terminal->column - d) * sizeof(struct attr));
		memset(&row[terminal->width - d], 0, d * sizeof(union utf8_char));
		attr_init(&attr_row[terminal->width - d], terminal->curr_attr, d);
	} else {
		memmove(&row[terminal->column + d], &row[terminal->column],
			(terminal->width - terminal->column - d) * sizeof(union utf8_char));
		memmove(&attr_row[terminal->column + d], &attr_row[terminal->column],
			(terminal->width - terminal->column - d) * sizeof(struct attr));
		memset(&row[terminal->column], 0, d * sizeof(union utf8_char));
		attr_init(&attr_row[terminal->column], terminal->curr_attr, d);
	}
}

static void
terminal_resize_cells(struct terminal *terminal,
		      int width, int height)
{
	union utf8_char *data;
	struct attr *data_attr;
	char *tab_ruler;
	int data_pitch, attr_pitch;
	int i, l, total_rows;
	uint32_t d, uheight = height;
	struct rectangle allocation;
	struct winsize ws;

	if (uheight > terminal->buffer_height)
		height = terminal->buffer_height;

	if (terminal->width == width && terminal->height == height)
		return;

	if (terminal->data && width <= terminal->max_width) {
		d = 0;
		if (height < terminal->height && height <= terminal->row)
			d = terminal->height - height;
		else if (height > terminal->height &&
			 terminal->height - 1 == terminal->row) {
			d = terminal->height - height;
			if (terminal->log_size < uheight)
				d = -terminal->start;
		}

		terminal->start += d;
		terminal->row -= d;
	} else {
		terminal->max_width = width;
		data_pitch = width * sizeof(union utf8_char);
		data = xzalloc(data_pitch * terminal->buffer_height);
		attr_pitch = width * sizeof(struct attr);
		data_attr = xmalloc(attr_pitch * terminal->buffer_height);
		tab_ruler = xzalloc(width);
		attr_init(data_attr, terminal->curr_attr,
			  width * terminal->buffer_height);

		if (terminal->data && terminal->data_attr) {
			if (width > terminal->width)
				l = terminal->width;
			else
				l = width;

			if (terminal->height > height) {
				total_rows = height;
				i = 1 + terminal->row - height;
				if (i > 0) {
					terminal->start += i;
					terminal->row = terminal->row - i;
				}
			} else {
				total_rows = terminal->height;
			}

			for (i = 0; i < total_rows; i++) {
				memcpy(&data[width * i],
				       terminal_get_row(terminal, i),
				       l * sizeof(union utf8_char));
				memcpy(&data_attr[width * i],
				       terminal_get_attr_row(terminal, i),
				       l * sizeof(struct attr));
			}

			free(terminal->data);
			free(terminal->data_attr);
			free(terminal->tab_ruler);
		}

		terminal->data_pitch = data_pitch;
		terminal->attr_pitch = attr_pitch;
		terminal->data = data;
		terminal->data_attr = data_attr;
		terminal->tab_ruler = tab_ruler;
		terminal->start = 0;
	}

	terminal->margin_bottom =
		height - (terminal->height - terminal->margin_bottom);
	terminal->width = width;
	terminal->height = height;
	terminal_init_tabs(terminal);

	/* Update the window size */
	ws.ws_row = terminal->height;
	ws.ws_col = terminal->width;
	widget_get_allocation(terminal->widget, &allocation);
	ws.ws_xpixel = allocation.width;
	ws.ws_ypixel = allocation.height;
	ioctl(terminal->master, TIOCSWINSZ, &ws);
}

static void
update_title(struct terminal *terminal)
{
	if (window_is_resizing(terminal->window)) {
		char *p;
		if (asprintf(&p, "%s — [%dx%d]", terminal->title, terminal->width, terminal->height) > 0) {
			window_set_title(terminal->window, p);
			free(p);
		}
	} else {
		window_set_title(terminal->window, terminal->title);
	}
}

static void
resize_handler(struct widget *widget,
	       int32_t width, int32_t height, void *data)
{
	struct terminal *terminal = data;
	int32_t columns, rows, m;

	if (terminal->pace_pipe >= 0) {
		close(terminal->pace_pipe);
		terminal->pace_pipe = -1;
	}
	m = 2 * terminal->margin;
	columns = (width - m) / (int32_t) terminal->average_width;
	rows = (height - m) / (int32_t) terminal->extents.height;

	if (!window_is_fullscreen(terminal->window) &&
	    !window_is_maximized(terminal->window)) {
		width = columns * terminal->average_width + m;
		height = rows * terminal->extents.height + m;
		widget_set_size(terminal->widget, width, height);
	}

	terminal_resize_cells(terminal, columns, rows);
	update_title(terminal);
}

static void
state_changed_handler(struct window *window, void *data)
{
	struct terminal *terminal = data;
	update_title(terminal);
}

static void
terminal_resize(struct terminal *terminal, int columns, int rows)
{
	int32_t width, height, m;

	if (window_is_fullscreen(terminal->window) ||
	    window_is_maximized(terminal->window))
		return;

	m = 2 * terminal->margin;
	width = columns * terminal->average_width + m;
	height = rows * terminal->extents.height + m;

	window_frame_set_child_size(terminal->widget, width, height);
}

struct color_scheme DEFAULT_COLORS = {
	{
		{0,    0,    0,    1}, /* black */
		{0.66, 0,    0,    1}, /* red */
		{0  ,  0.66, 0,    1}, /* green */
		{0.66, 0.33, 0,    1}, /* orange (nicer than muddy yellow) */
		{0  ,  0  ,  0.66, 1}, /* blue */
		{0.66, 0  ,  0.66, 1}, /* magenta */
		{0,    0.66, 0.66, 1}, /* cyan */
		{0.66, 0.66, 0.66, 1}, /* light grey */
		{0.22, 0.33, 0.33, 1}, /* dark grey */
		{1,    0.33, 0.33, 1}, /* high red */
		{0.33, 1,    0.33, 1}, /* high green */
		{1,    1,    0.33, 1}, /* high yellow */
		{0.33, 0.33, 1,    1}, /* high blue */
		{1,    0.33, 1,    1}, /* high magenta */
		{0.33, 1,    1,    1}, /* high cyan */
		{1,    1,    1,    1}  /* white */
	},
	0,                             /* black border */
	{7, 0, 0, }                    /* bg:black (0), fg:light gray (7)  */
};

static void
terminal_set_color(struct terminal *terminal, cairo_t *cr, int index)
{
	cairo_set_source_rgba(cr,
			      terminal->color_table[index].r,
			      terminal->color_table[index].g,
			      terminal->color_table[index].b,
			      terminal->color_table[index].a);
}

static void
terminal_send_selection(struct terminal *terminal, int fd)
{
	int row, col;
	union utf8_char *p_row;
	union decoded_attr attr;
	FILE *fp;
	int len;

	fp = fdopen(fd, "w");
	if (fp == NULL){
		close(fd);
		return;
	}
	for (row = terminal->selection_start_row; row < terminal->height; row++) {
		p_row = terminal_get_row(terminal, row);
		for (col = 0; col < terminal->width; col++) {
			if (p_row[col].ch == 0x200B) /* space glyph */
				continue;
			/* get the attributes for this character cell */
			terminal_decode_attr(terminal, row, col, &attr);
			if (!attr.attr.s)
				continue;
			len = strnlen((char *) p_row[col].byte, 4);
			if (len > 0)
				fwrite(p_row[col].byte, 1, len, fp);
			if (len == 0 || col == terminal->width - 1) {
				fwrite("\n", 1, 1, fp);
				break;
			}
		}
	}
	fclose(fp);
}

struct glyph_run {
	struct terminal *terminal;
	cairo_t *cr;
	unsigned int count;
	union decoded_attr attr;
	cairo_glyph_t glyphs[256], *g;
};

static void
glyph_run_init(struct glyph_run *run, struct terminal *terminal, cairo_t *cr)
{
	run->terminal = terminal;
	run->cr = cr;
	run->g = run->glyphs;
	run->count = 0;
	run->attr.key = 0;
}

static void
glyph_run_flush(struct glyph_run *run, union decoded_attr attr)
{
	cairo_scaled_font_t *font;

	if (run->count > ARRAY_LENGTH(run->glyphs) - 10 ||
	    (attr.key != run->attr.key)) {
		if (run->attr.attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK))
			font = run->terminal->font_bold;
		else
			font = run->terminal->font_normal;
		cairo_set_scaled_font(run->cr, font);
		terminal_set_color(run->terminal, run->cr,
				   run->attr.attr.fg);

		if (!(run->attr.attr.a & ATTRMASK_CONCEALED))
			cairo_show_glyphs (run->cr, run->glyphs, run->count);
		run->g = run->glyphs;
		run->count = 0;
	}
	run->attr = attr;
}

static void
glyph_run_add(struct glyph_run *run, int x, int y, union utf8_char *c)
{
	int num_glyphs;
	cairo_scaled_font_t *font;

	num_glyphs = ARRAY_LENGTH(run->glyphs) - run->count;

	if (run->attr.attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK))
		font = run->terminal->font_bold;
	else
		font = run->terminal->font_normal;

	cairo_move_to(run->cr, x, y);
	cairo_scaled_font_text_to_glyphs (font, x, y,
					  (char *) c->byte, 4,
					  &run->g, &num_glyphs,
					  NULL, NULL, NULL);
	run->g += num_glyphs;
	run->count += num_glyphs;
}


static void
redraw_handler(struct widget *widget, void *data)
{
	struct terminal *terminal = data;
	struct rectangle allocation;
	cairo_t *cr;
	int top_margin, side_margin;
	int row, col, cursor_x, cursor_y;
	union utf8_char *p_row;
	union decoded_attr attr;
	int text_x, text_y;
	cairo_surface_t *surface;
	double d;
	struct glyph_run run;
	cairo_font_extents_t extents;
	double average_width;
	double unichar_width;

	surface = window_get_surface(terminal->window);
	widget_get_allocation(terminal->widget, &allocation);
	cr = widget_cairo_create(terminal->widget);
	cairo_rectangle(cr, allocation.x, allocation.y,
			allocation.width, allocation.height);
	cairo_clip(cr);
	cairo_push_group(cr);

	cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
	terminal_set_color(terminal, cr, terminal->color_scheme->border);
	cairo_paint(cr);

	cairo_set_scaled_font(cr, terminal->font_normal);

	extents = terminal->extents;
	average_width = terminal->average_width;
	side_margin = (allocation.width - terminal->width * average_width) / 2;
	top_margin = (allocation.height - terminal->height * extents.height) / 2;

	cairo_set_line_width(cr, 1.0);
	cairo_translate(cr, allocation.x + side_margin,
			allocation.y + top_margin);
	/* paint the background */
	for (row = 0; row < terminal->height; row++) {
		p_row = terminal_get_row(terminal, row);
		for (col = 0; col < terminal->width; col++) {
			/* get the attributes for this character cell */
			terminal_decode_attr(terminal, row, col, &attr);

			if (attr.attr.bg == terminal->color_scheme->border)
				continue;

			if (is_wide(p_row[col]))
				unichar_width = 2 * average_width;
			else
				unichar_width = average_width;

			terminal_set_color(terminal, cr, attr.attr.bg);
			cairo_move_to(cr, col * average_width,
				      row * extents.height);
			cairo_rel_line_to(cr, unichar_width, 0);
			cairo_rel_line_to(cr, 0, extents.height);
			cairo_rel_line_to(cr, -unichar_width, 0);
			cairo_close_path(cr);
			cairo_fill(cr);
		}
	}

	cairo_set_operator(cr, CAIRO_OPERATOR_OVER);

	/* paint the foreground */
	glyph_run_init(&run, terminal, cr);
	for (row = 0; row < terminal->height; row++) {
		p_row = terminal_get_row(terminal, row);
		for (col = 0; col < terminal->width; col++) {
			/* get the attributes for this character cell */
			terminal_decode_attr(terminal, row, col, &attr);

			glyph_run_flush(&run, attr);

			text_x = col * average_width;
			text_y = extents.ascent + row * extents.height;
			if (attr.attr.a & ATTRMASK_UNDERLINE) {
				terminal_set_color(terminal, cr, attr.attr.fg);
				cairo_move_to(cr, text_x, (double)text_y + 1.5);
				cairo_line_to(cr, text_x + average_width, (double) text_y + 1.5);
				cairo_stroke(cr);
			}

                        /* skip space glyph (RLE) we use as a placeholder of
                           the right half of a double-width character,
                           because RLE is not available in every font. */
			if (p_row[col].ch == 0x200B)
				continue;

			glyph_run_add(&run, text_x, text_y, &p_row[col]);
		}
	}

	attr.key = ~0;
	glyph_run_flush(&run, attr);

	if ((terminal->mode & MODE_SHOW_CURSOR) &&
	    !window_has_focus(terminal->window)) {
		d = 0.5;

		cairo_set_line_width(cr, 1);
		cairo_move_to(cr, terminal->column * average_width + d,
			      terminal->row * extents.height + d);
		cairo_rel_line_to(cr, average_width - 2 * d, 0);
		cairo_rel_line_to(cr, 0, extents.height - 2 * d);
		cairo_rel_line_to(cr, -average_width + 2 * d, 0);
		cairo_close_path(cr);

		cairo_stroke(cr);
	}

	cairo_pop_group_to_source(cr);
	cairo_paint(cr);
	cairo_destroy(cr);
	cairo_surface_destroy(surface);

	if (terminal->send_cursor_position) {
		cursor_x = side_margin + allocation.x +
				terminal->column * average_width;
		cursor_y = top_margin + allocation.y +
				terminal->row * extents.height;
		window_set_text_cursor_position(terminal->window,
						cursor_x, cursor_y);
		terminal->send_cursor_position = 0;
	}
}

static void
terminal_write(struct terminal *terminal, const char *data, size_t length)
{
	if (write(terminal->master, data, length) < 0)
		abort();
	terminal->send_cursor_position = 1;
}

static void
terminal_data(struct terminal *terminal, const char *data, size_t length);

static void
handle_char(struct terminal *terminal, union utf8_char utf8);

static void
handle_sgr(struct terminal *terminal, int code);

static void
handle_term_parameter(struct terminal *terminal, int code, int sr)
{
	int i;

	if (terminal->escape_flags & ESC_FLAG_WHAT) {
		switch(code) {
		case 1:  /* DECCKM */
			if (sr)	terminal->key_mode = KM_APPLICATION;
			else	terminal->key_mode = KM_NORMAL;
			break;
		case 2:  /* DECANM */
			/* No VT52 support yet */
			terminal->g0 = CS_US;
			terminal->g1 = CS_US;
			terminal->cs = terminal->g0;
			break;
		case 3:  /* DECCOLM */
			if (sr)
				terminal_resize(terminal, 132, 24);
			else
				terminal_resize(terminal, 80, 24);

			/* set columns, but also home cursor and clear screen */
			terminal->row = 0; terminal->column = 0;
			for (i = 0; i < terminal->height; i++) {
				memset(terminal_get_row(terminal, i),
				    0, terminal->data_pitch);
				attr_init(terminal_get_attr_row(terminal, i),
				    terminal->curr_attr, terminal->width);
			}
			break;
		case 5:  /* DECSCNM */
			if (sr)	terminal->mode |=  MODE_INVERSE;
			else	terminal->mode &= ~MODE_INVERSE;
			break;
		case 6:  /* DECOM */
			terminal->origin_mode = sr;
			if (terminal->origin_mode)
				terminal->row = terminal->margin_top;
			else
				terminal->row = 0;
			terminal->column = 0;
			break;
		case 7:  /* DECAWM */
			if (sr)	terminal->mode |=  MODE_AUTOWRAP;
			else	terminal->mode &= ~MODE_AUTOWRAP;
			break;
		case 8:  /* DECARM */
			if (sr)	terminal->mode |=  MODE_AUTOREPEAT;
			else	terminal->mode &= ~MODE_AUTOREPEAT;
			break;
		case 12:  /* Very visible cursor (CVVIS) */
			/* FIXME: What do we do here. */
			break;
		case 25:
			if (sr)	terminal->mode |=  MODE_SHOW_CURSOR;
			else	terminal->mode &= ~MODE_SHOW_CURSOR;
			break;
		case 1034:   /* smm/rmm, meta mode on/off */
			/* ignore */
			break;
		case 1037:   /* deleteSendsDel */
			if (sr)	terminal->mode |=  MODE_DELETE_SENDS_DEL;
			else	terminal->mode &= ~MODE_DELETE_SENDS_DEL;
			break;
		case 1039:   /* altSendsEscape */
			if (sr)	terminal->mode |=  MODE_ALT_SENDS_ESC;
			else	terminal->mode &= ~MODE_ALT_SENDS_ESC;
			break;
		case 1049:   /* rmcup/smcup, alternate screen */
			/* Ignore.  Should be possible to implement,
			 * but it's kind of annoying. */
			break;
		default:
			fprintf(stderr, "Unknown parameter: ?%d\n", code);
			break;
		}
	} else {
		switch(code) {
		case 4:  /* IRM */
			if (sr)	terminal->mode |=  MODE_IRM;
			else	terminal->mode &= ~MODE_IRM;
			break;
		case 20: /* LNM */
			if (sr)	terminal->mode |=  MODE_LF_NEWLINE;
			else	terminal->mode &= ~MODE_LF_NEWLINE;
			break;
		default:
			fprintf(stderr, "Unknown parameter: %d\n", code);
			break;
		}
	}
}

static void
handle_dcs(struct terminal *terminal)
{
}

static void
handle_osc(struct terminal *terminal)
{
	char *p;
	int code;

	terminal->escape[terminal->escape_length++] = '\0';
	p = &terminal->escape[2];
	code = strtol(p, &p, 10);
	if (*p == ';') p++;

	switch (code) {
	case 0: /* Icon name and window title */
	case 1: /* Icon label */
	case 2: /* Window title*/
		free(terminal->title);
		terminal->title = strdup(p);
		window_set_title(terminal->window, p);
		break;
	case 7: /* shell cwd as uri */
		break;
	case 777: /* Desktop notifications */
		break;
	default:
		fprintf(stderr, "Unknown OSC escape code %d, text %s\n",
			code, p);
		break;
	}
}

static void
handle_escape(struct terminal *terminal)
{
	union utf8_char *row;
	struct attr *attr_row;
	char *p;
	int i, count, x, y, top, bottom;
	int args[10], set[10] = { 0, };
	char response[MAX_RESPONSE] = {0, };
	struct rectangle allocation;

	terminal->escape[terminal->escape_length++] = '\0';
	i = 0;
	p = &terminal->escape[2];
	while ((isdigit(*p) || *p == ';') && i < 10) {
		if (*p == ';') {
			if (!set[i]) {
				args[i] = 0;
				set[i] = 1;
			}
			p++;
			i++;
		} else {
			args[i] = strtol(p, &p, 10);
			set[i] = 1;
		}
	}

	switch (*p) {
	case '@':    /* ICH - Insert <count> blank characters */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		terminal_shift_line(terminal, count);
		break;
	case 'A':    /* CUU - Move cursor up <count> rows */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		if (terminal->row - count >= terminal->margin_top)
			terminal->row -= count;
		else
			terminal->row = terminal->margin_top;
		break;
	case 'B':    /* CUD - Move cursor down <count> rows */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		if (terminal->row + count <= terminal->margin_bottom)
			terminal->row += count;
		else
			terminal->row = terminal->margin_bottom;
		break;
	case 'C':    /* CUF - Move cursor right by <count> columns */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		if ((terminal->column + count) < terminal->width)
			terminal->column += count;
		else
			terminal->column = terminal->width - 1;
		break;
	case 'D':    /* CUB - Move cursor left <count> columns */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		if ((terminal->column - count) >= 0)
			terminal->column -= count;
		else
			terminal->column = 0;
		break;
	case 'E':    /* CNL - Move cursor down <count> rows, to column 1 */
		count = set[0] ? args[0] : 1;
		if (terminal->row + count <= terminal->margin_bottom)
			terminal->row += count;
		else
			terminal->row = terminal->margin_bottom;
		terminal->column = 0;
		break;
	case 'F':    /* CPL - Move cursour up <count> rows, to column 1 */
		count = set[0] ? args[0] : 1;
		if (terminal->row - count >= terminal->margin_top)
			terminal->row -= count;
		else
			terminal->row = terminal->margin_top;
		terminal->column = 0;
		break;
	case 'G':    /* CHA - Move cursor to column <y> in current row */
		y = set[0] ? args[0] : 1;
		y = y <= 0 ? 1 : y > terminal->width ? terminal->width : y;

		terminal->column = y - 1;
		break;
	case 'f':    /* HVP - Move cursor to <x, y> */
	case 'H':    /* CUP - Move cursor to <x, y> (origin at 1,1) */
		x = (set[1] ? args[1] : 1) - 1;
		x = x < 0 ? 0 :
		    (x >= terminal->width ? terminal->width - 1 : x);

		y = (set[0] ? args[0] : 1) - 1;
		if (terminal->origin_mode) {
			y += terminal->margin_top;
			y = y < terminal->margin_top ? terminal->margin_top :
			    (y > terminal->margin_bottom ? terminal->margin_bottom : y);
		} else {
			y = y < 0 ? 0 :
			    (y >= terminal->height ? terminal->height - 1 : y);
		}

		terminal->row = y;
		terminal->column = x;
		break;
	case 'I':    /* CHT */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		while (count > 0 && terminal->column < terminal->width) {
			if (terminal->tab_ruler[terminal->column]) count--;
			terminal->column++;
		}
		terminal->column--;
		break;
	case 'J':    /* ED - Erase display */
		row = terminal_get_row(terminal, terminal->row);
		attr_row = terminal_get_attr_row(terminal, terminal->row);
		if (!set[0] || args[0] == 0 || args[0] > 2) {
			memset(&row[terminal->column],
			       0, (terminal->width - terminal->column) * sizeof(union utf8_char));
			attr_init(&attr_row[terminal->column],
			       terminal->curr_attr, terminal->width - terminal->column);
			for (i = terminal->row + 1; i < terminal->height; i++) {
				memset(terminal_get_row(terminal, i),
				    0, terminal->data_pitch);
				attr_init(terminal_get_attr_row(terminal, i),
				    terminal->curr_attr, terminal->width);
			}
		} else if (args[0] == 1) {
			memset(row, 0, (terminal->column+1) * sizeof(union utf8_char));
			attr_init(attr_row, terminal->curr_attr, terminal->column+1);
			for (i = 0; i < terminal->row; i++) {
				memset(terminal_get_row(terminal, i),
				    0, terminal->data_pitch);
				attr_init(terminal_get_attr_row(terminal, i),
				    terminal->curr_attr, terminal->width);
			}
		} else if (args[0] == 2) {
			/* Clear screen by scrolling contents out */
			terminal_scroll_buffer(terminal,
					       terminal->end - terminal->start);
		}
		break;
	case 'K':    /* EL - Erase line */
		row = terminal_get_row(terminal, terminal->row);
		attr_row = terminal_get_attr_row(terminal, terminal->row);
		if (!set[0] || args[0] == 0 || args[0] > 2) {
			memset(&row[terminal->column], 0,
			    (terminal->width - terminal->column) * sizeof(union utf8_char));
			attr_init(&attr_row[terminal->column], terminal->curr_attr,
			    terminal->width - terminal->column);
		} else if (args[0] == 1) {
			memset(row, 0, (terminal->column+1) * sizeof(union utf8_char));
			attr_init(attr_row, terminal->curr_attr, terminal->column+1);
		} else if (args[0] == 2) {
			memset(row, 0, terminal->data_pitch);
			attr_init(attr_row, terminal->curr_attr, terminal->width);
		}
		break;
	case 'L':    /* IL - Insert <count> blank lines */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		if (terminal->row >= terminal->margin_top &&
			terminal->row < terminal->margin_bottom)
		{
			top = terminal->margin_top;
			terminal->margin_top = terminal->row;
			terminal_scroll(terminal, 0 - count);
			terminal->margin_top = top;
		} else if (terminal->row == terminal->margin_bottom) {
			memset(terminal_get_row(terminal, terminal->row),
			       0, terminal->data_pitch);
			attr_init(terminal_get_attr_row(terminal, terminal->row),
				terminal->curr_attr, terminal->width);
		}
		break;
	case 'M':    /* DL - Delete <count> lines */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		if (terminal->row >= terminal->margin_top &&
			terminal->row < terminal->margin_bottom)
		{
			top = terminal->margin_top;
			terminal->margin_top = terminal->row;
			terminal_scroll(terminal, count);
			terminal->margin_top = top;
		} else if (terminal->row == terminal->margin_bottom) {
			memset(terminal_get_row(terminal, terminal->row),
			       0, terminal->data_pitch);
		}
		break;
	case 'P':    /* DCH - Delete <count> characters on current line */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		terminal_shift_line(terminal, 0 - count);
		break;
	case 'S':    /* SU */
		terminal_scroll(terminal, set[0] ? args[0] : 1);
		break;
	case 'T':    /* SD */
		terminal_scroll(terminal, 0 - (set[0] ? args[0] : 1));
		break;
	case 'X':    /* ECH - Erase <count> characters on current line */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		if ((terminal->column + count) > terminal->width)
			count = terminal->width - terminal->column;
		row = terminal_get_row(terminal, terminal->row);
		attr_row = terminal_get_attr_row(terminal, terminal->row);
		memset(&row[terminal->column], 0, count * sizeof(union utf8_char));
		attr_init(&attr_row[terminal->column], terminal->curr_attr, count);
		break;
	case 'Z':    /* CBT */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		while (count > 0 && terminal->column >= 0) {
			if (terminal->tab_ruler[terminal->column]) count--;
			terminal->column--;
		}
		terminal->column++;
		break;
	case '`':    /* HPA - Move cursor to <y> column in current row */
		y = set[0] ? args[0] : 1;
		y = y <= 0 ? 1 : y > terminal->width ? terminal->width : y;

		terminal->column = y - 1;
		break;
	case 'b':    /* REP */
		count = set[0] ? args[0] : 1;
		if (count == 0) count = 1;
		if (terminal->last_char.byte[0])
			for (i = 0; i < count; i++)
				handle_char(terminal, terminal->last_char);
		terminal->last_char.byte[0] = 0;
		break;
	case 'c':    /* Primary DA - Answer "I am a VT102" */
		terminal_write(terminal, "\e[?6c", 5);
		break;
	case 'd':    /* VPA - Move cursor to <x> row, current column */
		x = set[0] ? args[0] : 1;
		x = x <= 0 ? 1 : x > terminal->height ? terminal->height : x;

		terminal->row = x - 1;
		break;
	case 'g':    /* TBC - Clear tab stop(s) */
		if (!set[0] || args[0] == 0) {
			terminal->tab_ruler[terminal->column] = 0;
		} else if (args[0] == 3) {
			memset(terminal->tab_ruler, 0, terminal->width);
		}
		break;
	case 'h':    /* SM - Set mode */
		for (i = 0; i < 10 && set[i]; i++) {
			handle_term_parameter(terminal, args[i], 1);
		}
		break;
	case 'l':    /* RM - Reset mode */
		for (i = 0; i < 10 && set[i]; i++) {
			handle_term_parameter(terminal, args[i], 0);
		}
		break;
	case 'm':    /* SGR - Set attributes */
		for (i = 0; i < 10; i++) {
			if (i <= 7 && set[i] && set[i + 1] &&
				set[i + 2] && args[i + 1] == 5)
			{
				if (args[i] == 38) {
					handle_sgr(terminal, args[i + 2] + 256);
					break;
				} else if (args[i] == 48) {
					handle_sgr(terminal, args[i + 2] + 512);
					break;
				}
			}
			if (set[i]) {
				handle_sgr(terminal, args[i]);
			} else if (i == 0) {
				handle_sgr(terminal, 0);
				break;
			} else {
				break;
			}
		}
		break;
	case 'n':    /* DSR - Status report */
		i = set[0] ? args[0] : 0;
		if (i == 0 || i == 5) {
			terminal_write(terminal, "\e[0n", 4);
		} else if (i == 6) {
			snprintf(response, MAX_RESPONSE, "\e[%d;%dR",
			         terminal->origin_mode ?
				     terminal->row+terminal->margin_top : terminal->row+1,
				 terminal->column+1);
			terminal_write(terminal, response, strlen(response));
		}
 		break;
	case 'r':    /* DECSTBM - Set scrolling region */
		if (!set[0]) {
			terminal->margin_top = 0;
			terminal->margin_bottom = terminal->height-1;
			terminal->row = 0;
			terminal->column = 0;
		} else {
			top = (set[0] ? args[0] : 1) - 1;
			top = top < 0 ? 0 :
			      (top >= terminal->height ? terminal->height - 1 : top);
			bottom = (set[1] ? args[1] : 1) - 1;
			bottom = bottom < 0 ? 0 :
			         (bottom >= terminal->height ? terminal->height - 1 : bottom);
			if (bottom > top) {
				terminal->margin_top = top;
				terminal->margin_bottom = bottom;
			} else {
				terminal->margin_top = 0;
				terminal->margin_bottom = terminal->height-1;
			}
			if (terminal->origin_mode)
				terminal->row = terminal->margin_top;
			else
				terminal->row = 0;
			terminal->column = 0;
		}
		break;
	case 's':    /* Save cursor location */
		terminal->saved_row = terminal->row;
		terminal->saved_column = terminal->column;
		break;
	case 't':    /* windowOps */
		if (!set[0]) break;
		switch (args[0]) {
		case 4:  /* resize px */
			if (set[1] && set[2]) {
				widget_schedule_resize(terminal->widget,
						       args[2], args[1]);
			}
			break;
		case 8:  /* resize ch */
			if (set[1] && set[2]) {
				terminal_resize(terminal, args[2], args[1]);
			}
			break;
		case 13: /* report position */
			widget_get_allocation(terminal->widget, &allocation);
			snprintf(response, MAX_RESPONSE, "\e[3;%d;%dt",
				 allocation.x, allocation.y);
			terminal_write(terminal, response, strlen(response));
			break;
		case 14: /* report px */
			widget_get_allocation(terminal->widget, &allocation);
			snprintf(response, MAX_RESPONSE, "\e[4;%d;%dt",
				 allocation.height, allocation.width);
			terminal_write(terminal, response, strlen(response));
			break;
		case 18: /* report ch */
			snprintf(response, MAX_RESPONSE, "\e[9;%d;%dt",
				 terminal->height, terminal->width);
			terminal_write(terminal, response, strlen(response));
			break;
		case 21: /* report title */
			snprintf(response, MAX_RESPONSE, "\e]l%s\e\\",
				 window_get_title(terminal->window));
			terminal_write(terminal, response, strlen(response));
			break;
		default:
			if (args[0] >= 24)
				terminal_resize(terminal, terminal->width, args[0]);
			else
				fprintf(stderr, "Unimplemented windowOp %d\n", args[0]);
			break;
		}
	case 'u':    /* Restore cursor location */
		terminal->row = terminal->saved_row;
		terminal->column = terminal->saved_column;
		break;
	default:
		fprintf(stderr, "Unknown CSI escape: %c\n", *p);
		break;
	}
}

static void
handle_non_csi_escape(struct terminal *terminal, char code)
{
	switch(code) {
	case 'M':    /* RI - Reverse linefeed */
		terminal->row -= 1;
		if (terminal->row < terminal->margin_top) {
			terminal->row = terminal->margin_top;
			terminal_scroll(terminal, -1);
		}
		break;
	case 'E':    /* NEL - Newline */
		terminal->column = 0;
		// fallthrough
	case 'D':    /* IND - Linefeed */
		terminal->row += 1;
		if (terminal->row > terminal->margin_bottom) {
			terminal->row = terminal->margin_bottom;
			terminal_scroll(terminal, +1);
		}
		break;
	case 'c':    /* RIS - Reset*/
		terminal_init(terminal);
		break;
	case 'H':    /* HTS - Set tab stop at current column */
		terminal->tab_ruler[terminal->column] = 1;
		break;
	case '7':    /* DECSC - Save current state */
		terminal->saved_row = terminal->row;
		terminal->saved_column = terminal->column;
		terminal->saved_attr = terminal->curr_attr;
		terminal->saved_origin_mode = terminal->origin_mode;
		terminal->saved_cs = terminal->cs;
		terminal->saved_g0 = terminal->g0;
		terminal->saved_g1 = terminal->g1;
		break;
	case '8':    /* DECRC - Restore state most recently saved by ESC 7 */
		terminal->row = terminal->saved_row;
		terminal->column = terminal->saved_column;
		terminal->curr_attr = terminal->saved_attr;
		terminal->origin_mode = terminal->saved_origin_mode;
		terminal->cs = terminal->saved_cs;
		terminal->g0 = terminal->saved_g0;
		terminal->g1 = terminal->saved_g1;
		break;
	case '=':    /* DECPAM - Set application keypad mode */
		terminal->key_mode = KM_APPLICATION;
		break;
	case '>':    /* DECPNM - Set numeric keypad mode */
		terminal->key_mode = KM_NORMAL;
		break;
	default:
		fprintf(stderr, "Unknown escape code: %c\n", code);
		break;
	}
}

static void
handle_special_escape(struct terminal *terminal, char special, char code)
{
	int i, numChars;

	if (special == '#') {
		switch(code) {
		case '8':
			/* fill with 'E', no cheap way to do this */
			memset(terminal->data, 0, terminal->data_pitch * terminal->height);
			numChars = terminal->width * terminal->height;
			for (i = 0; i < numChars; i++) {
				terminal->data[i].byte[0] = 'E';
			}
			break;
		default:
			fprintf(stderr, "Unknown HASH escape #%c\n", code);
			break;
		}
	} else if (special == '(' || special == ')') {
		switch(code) {
		case '0':
			if (special == '(')
				terminal->g0 = CS_SPECIAL;
			else
				terminal->g1 = CS_SPECIAL;
			break;
		case 'A':
			if (special == '(')
				terminal->g0 = CS_UK;
			else
				terminal->g1 = CS_UK;
			break;
		case 'B':
			if (special == '(')
				terminal->g0 = CS_US;
			else
				terminal->g1 = CS_US;
			break;
		default:
			fprintf(stderr, "Unknown character set %c\n", code);
			break;
		}
	} else {
		fprintf(stderr, "Unknown special escape %c%c\n", special, code);
	}
}

static void
handle_sgr(struct terminal *terminal, int code)
{
	switch(code) {
	case 0:
		terminal->curr_attr = terminal->color_scheme->default_attr;
		break;
	case 1:
		terminal->curr_attr.a |= ATTRMASK_BOLD;
		if (terminal->curr_attr.fg < 8)
			terminal->curr_attr.fg += 8;
		break;
	case 4:
		terminal->curr_attr.a |= ATTRMASK_UNDERLINE;
		break;
	case 5:
		terminal->curr_attr.a |= ATTRMASK_BLINK;
		break;
	case 8:
		terminal->curr_attr.a |= ATTRMASK_CONCEALED;
		break;
	case 2:
	case 21:
	case 22:
		terminal->curr_attr.a &= ~ATTRMASK_BOLD;
		if (terminal->curr_attr.fg < 16 && terminal->curr_attr.fg >= 8)
			terminal->curr_attr.fg -= 8;
		break;
	case 24:
		terminal->curr_attr.a &= ~ATTRMASK_UNDERLINE;
		break;
	case 25:
		terminal->curr_attr.a &= ~ATTRMASK_BLINK;
		break;
	case 7:
	case 26:
		terminal->curr_attr.a |= ATTRMASK_INVERSE;
		break;
	case 27:
		terminal->curr_attr.a &= ~ATTRMASK_INVERSE;
		break;
	case 28:
		terminal->curr_attr.a &= ~ATTRMASK_CONCEALED;
		break;
	case 39:
		terminal->curr_attr.fg = terminal->color_scheme->default_attr.fg;
		break;
	case 49:
		terminal->curr_attr.bg = terminal->color_scheme->default_attr.bg;
		break;
	default:
		if (code >= 30 && code <= 37) {
			terminal->curr_attr.fg = code - 30;
			if (terminal->curr_attr.a & ATTRMASK_BOLD)
				terminal->curr_attr.fg += 8;
		} else if (code >= 40 && code <= 47) {
			terminal->curr_attr.bg = code - 40;
		} else if (code >= 90 && code <= 97) {
			terminal->curr_attr.fg = code - 90 + 8;
		} else if (code >= 100 && code <= 107) {
			terminal->curr_attr.bg = code - 100 + 8;
		} else if (code >= 256 && code < 512) {
			terminal->curr_attr.fg = code - 256;
		} else if (code >= 512 && code < 768) {
			terminal->curr_attr.bg = code - 512;
		} else {
			fprintf(stderr, "Unknown SGR code: %d\n", code);
		}
		break;
	}
}

/* Returns 1 if c was special, otherwise 0 */
static int
handle_special_char(struct terminal *terminal, char c)
{
	union utf8_char *row;
	struct attr *attr_row;

	row = terminal_get_row(terminal, terminal->row);
	attr_row = terminal_get_attr_row(terminal, terminal->row);

	switch(c) {
	case '\r':
		terminal->column = 0;
		break;
	case '\n':
		if (terminal->mode & MODE_LF_NEWLINE) {
			terminal->column = 0;
		}
		/* fallthrough */
	case '\v':
	case '\f':
		terminal->row++;
		if (terminal->row > terminal->margin_bottom) {
			terminal->row = terminal->margin_bottom;
			terminal_scroll(terminal, +1);
		}

		break;
	case '\t':
		while (terminal->column < terminal->width) {
			if (terminal->mode & MODE_IRM)
				terminal_shift_line(terminal, +1);

			if (row[terminal->column].byte[0] == '\0') {
				row[terminal->column].byte[0] = ' ';
				row[terminal->column].byte[1] = '\0';
				attr_row[terminal->column] = terminal->curr_attr;
			}

			terminal->column++;
			if (terminal->tab_ruler[terminal->column]) break;
		}
		if (terminal->column >= terminal->width) {
			terminal->column = terminal->width - 1;
		}

		break;
	case '\b':
		if (terminal->column >= terminal->width) {
			terminal->column = terminal->width - 2;
		} else if (terminal->column > 0) {
			terminal->column--;
		} else if (terminal->mode & MODE_AUTOWRAP) {
			terminal->column = terminal->width - 1;
			terminal->row -= 1;
			if (terminal->row < terminal->margin_top) {
				terminal->row = terminal->margin_top;
				terminal_scroll(terminal, -1);
			}
		}

		break;
	case '\a':
		/* Bell */
		break;
	case '\x0E': /* SO */
		terminal->cs = terminal->g1;
		break;
	case '\x0F': /* SI */
		terminal->cs = terminal->g0;
		break;
	case '\0':
		break;
	default:
		return 0;
	}

	return 1;
}

static void
handle_char(struct terminal *terminal, union utf8_char utf8)
{
	union utf8_char *row;
	struct attr *attr_row;

	if (handle_special_char(terminal, utf8.byte[0])) return;

	apply_char_set(terminal->cs, &utf8);

	/* There are a whole lot of non-characters, control codes,
	 * and formatting codes that should probably be ignored,
	 * for example: */
	if (strncmp((char*) utf8.byte, "\xEF\xBB\xBF", 3) == 0) {
		/* BOM, ignore */
		return;
	}

	/* Some of these non-characters should be translated, e.g.: */
	if (utf8.byte[0] < 32) {
		utf8.byte[0] = utf8.byte[0] + 64;
	}

	/* handle right margin effects */
	if (terminal->column >= terminal->width) {
		if (terminal->mode & MODE_AUTOWRAP) {
			terminal->column = 0;
			terminal->row += 1;
			if (terminal->row > terminal->margin_bottom) {
				terminal->row = terminal->margin_bottom;
				terminal_scroll(terminal, +1);
			}
		} else {
			terminal->column--;
 		}
 	}

	row = terminal_get_row(terminal, terminal->row);
	attr_row = terminal_get_attr_row(terminal, terminal->row);

	if (terminal->mode & MODE_IRM)
		terminal_shift_line(terminal, +1);
	row[terminal->column] = utf8;
	attr_row[terminal->column++] = terminal->curr_attr;

	if (terminal->row + terminal->start + 1 > terminal->end)
		terminal->end = terminal->row + terminal->start + 1;
	if (terminal->end == terminal->buffer_height)
		terminal->log_size = terminal->buffer_height;
	else if (terminal->log_size < terminal->buffer_height)
		terminal->log_size = terminal->end;

	/* cursor jump for wide character. */
	if (is_wide(utf8))
		row[terminal->column++].ch = 0x200B; /* space glyph */

	if (utf8.ch != terminal->last_char.ch)
		terminal->last_char = utf8;
}

static void
escape_append_utf8(struct terminal *terminal, union utf8_char utf8)
{
	int len, i;

	if ((utf8.byte[0] & 0x80) == 0x00)       len = 1;
	else if ((utf8.byte[0] & 0xE0) == 0xC0)  len = 2;
	else if ((utf8.byte[0] & 0xF0) == 0xE0)  len = 3;
	else if ((utf8.byte[0] & 0xF8) == 0xF0)  len = 4;
	else                                     len = 1;  /* Invalid, cannot happen */

	if (terminal->escape_length + len <= MAX_ESCAPE) {
		for (i = 0; i < len; i++)
			terminal->escape[terminal->escape_length + i] = utf8.byte[i];
		terminal->escape_length += len;
	} else if (terminal->escape_length < MAX_ESCAPE) {
		terminal->escape[terminal->escape_length++] = 0;
	}
}

static void
terminal_data(struct terminal *terminal, const char *data, size_t length)
{
	unsigned int i;
	union utf8_char utf8;
	enum utf8_state parser_state;

	for (i = 0; i < length; i++) {
		parser_state =
			utf8_next_char(&terminal->state_machine, data[i]);
		switch(parser_state) {
		case utf8state_accept:
			utf8.ch = terminal->state_machine.s.ch;
			break;
		case utf8state_reject:
			/* the unicode replacement character */
			utf8.byte[0] = 0xEF;
			utf8.byte[1] = 0xBF;
			utf8.byte[2] = 0xBD;
			utf8.byte[3] = 0x00;
			break;
		default:
			continue;
		}

		/* assume escape codes never use non-ASCII characters */
		switch (terminal->state) {
		case escape_state_escape:
			escape_append_utf8(terminal, utf8);
			switch (utf8.byte[0]) {
			case 'P':  /* DCS */
				terminal->state = escape_state_dcs;
				break;
			case '[':  /* CSI */
				terminal->state = escape_state_csi;
				break;
			case ']':  /* OSC */
				terminal->state = escape_state_osc;
				break;
			case '#':
			case '(':
			case ')':  /* special */
				terminal->state = escape_state_special;
				break;
			case '^':  /* PM (not implemented) */
			case '_':  /* APC (not implemented) */
				terminal->state = escape_state_ignore;
				break;
			default:
				terminal->state = escape_state_normal;
				handle_non_csi_escape(terminal, utf8.byte[0]);
				break;
			}
			continue;
		case escape_state_csi:
			if (handle_special_char(terminal, utf8.byte[0]) != 0) {
				/* do nothing */
			} else if (utf8.byte[0] == '?') {
				terminal->escape_flags |= ESC_FLAG_WHAT;
			} else if (utf8.byte[0] == '>') {
				terminal->escape_flags |= ESC_FLAG_GT;
			} else if (utf8.byte[0] == '!') {
				terminal->escape_flags |= ESC_FLAG_BANG;
			} else if (utf8.byte[0] == '$') {
				terminal->escape_flags |= ESC_FLAG_CASH;
			} else if (utf8.byte[0] == '\'') {
				terminal->escape_flags |= ESC_FLAG_SQUOTE;
			} else if (utf8.byte[0] == '"') {
				terminal->escape_flags |= ESC_FLAG_DQUOTE;
			} else if (utf8.byte[0] == ' ') {
				terminal->escape_flags |= ESC_FLAG_SPACE;
			} else {
				escape_append_utf8(terminal, utf8);
				if (terminal->escape_length >= MAX_ESCAPE)
					terminal->state = escape_state_normal;
			}

			if (isalpha(utf8.byte[0]) || utf8.byte[0] == '@' ||
				utf8.byte[0] == '`')
			{
				terminal->state = escape_state_normal;
				handle_escape(terminal);
			} else {
			}
			continue;
		case escape_state_inner_escape:
			if (utf8.byte[0] == '\\') {
				terminal->state = escape_state_normal;
				if (terminal->outer_state == escape_state_dcs) {
					handle_dcs(terminal);
				} else if (terminal->outer_state == escape_state_osc) {
					handle_osc(terminal);
				}
			} else if (utf8.byte[0] == '\e') {
				terminal->state = terminal->outer_state;
				escape_append_utf8(terminal, utf8);
				if (terminal->escape_length >= MAX_ESCAPE)
					terminal->state = escape_state_normal;
			} else {
				terminal->state = terminal->outer_state;
				if (terminal->escape_length < MAX_ESCAPE)
					terminal->escape[terminal->escape_length++] = '\e';
				escape_append_utf8(terminal, utf8);
				if (terminal->escape_length >= MAX_ESCAPE)
					terminal->state = escape_state_normal;
			}
			continue;
		case escape_state_dcs:
		case escape_state_osc:
		case escape_state_ignore:
			if (utf8.byte[0] == '\e') {
				terminal->outer_state = terminal->state;
				terminal->state = escape_state_inner_escape;
			} else if (utf8.byte[0] == '\a' && terminal->state == escape_state_osc) {
				terminal->state = escape_state_normal;
				handle_osc(terminal);
			} else {
				escape_append_utf8(terminal, utf8);
				if (terminal->escape_length >= MAX_ESCAPE)
					terminal->state = escape_state_normal;
			}
			continue;
		case escape_state_special:
			escape_append_utf8(terminal, utf8);
			terminal->state = escape_state_normal;
			if (isdigit(utf8.byte[0]) || isalpha(utf8.byte[0])) {
				handle_special_escape(terminal, terminal->escape[1],
				                      utf8.byte[0]);
			}
			continue;
		default:
			break;
		}

		/* this is valid, because ASCII characters are never used to
		 * introduce a multibyte sequence in UTF-8 */
		if (utf8.byte[0] == '\e') {
			terminal->state = escape_state_escape;
			terminal->outer_state = escape_state_normal;
			terminal->escape[0] = '\e';
			terminal->escape_length = 1;
			terminal->escape_flags = 0;
		} else {
			handle_char(terminal, utf8);
		} /* if */
	} /* for */

	window_schedule_redraw(terminal->window);
}

static void
data_source_target(void *data,
		   struct wl_data_source *source, const char *mime_type)
{
	fprintf(stderr, "data_source_target, %s\n", mime_type);
}

static void
data_source_send(void *data,
		 struct wl_data_source *source,
		 const char *mime_type, int32_t fd)
{
	struct terminal *terminal = data;

	terminal_send_selection(terminal, fd);
}

static void
data_source_cancelled(void *data, struct wl_data_source *source)
{
	wl_data_source_destroy(source);
}

static const struct wl_data_source_listener data_source_listener = {
	data_source_target,
	data_source_send,
	data_source_cancelled
};

static const char text_mime_type[] = "text/plain;charset=utf-8";

static void
data_handler(struct window *window,
	     struct input *input,
	     float x, float y, const char **types, void *data)
{
	int i, has_text = 0;

	if (!types)
		return;
	for (i = 0; types[i]; i++)
		if (strcmp(types[i], text_mime_type) == 0)
			has_text = 1;

	if (!has_text) {
		input_accept(input, NULL);
	} else {
		input_accept(input, text_mime_type);
	}
}

static void
drop_handler(struct window *window, struct input *input,
	     int32_t x, int32_t y, void *data)
{
	struct terminal *terminal = data;

	input_receive_drag_data_to_fd(input, text_mime_type, terminal->master);
}

static void
fullscreen_handler(struct window *window, void *data)
{
	struct terminal *terminal = data;

	window_set_fullscreen(window, !window_is_fullscreen(terminal->window));
}

static void
close_handler(void *data)
{
	struct terminal *terminal = data;

	terminal_destroy(terminal);
}

static void
terminal_copy(struct terminal *terminal, struct input *input)
{
	terminal->selection =
		display_create_data_source(terminal->display);
	wl_data_source_offer(terminal->selection,
			     "text/plain;charset=utf-8");
	wl_data_source_add_listener(terminal->selection,
				    &data_source_listener, terminal);
	input_set_selection(input, terminal->selection,
			    display_get_serial(terminal->display));
}

static void
terminal_paste(struct terminal *terminal, struct input *input)
{
	input_receive_selection_data_to_fd(input,
					   "text/plain;charset=utf-8",
					   terminal->master);

}

static void
terminal_new_instance(struct terminal *terminal)
{
	struct terminal *new_terminal;

	new_terminal = terminal_create(terminal->display);
	if (terminal_run(new_terminal, option_shell))
		terminal_destroy(new_terminal);
}

static int
handle_bound_key(struct terminal *terminal,
		 struct input *input, uint32_t sym, uint32_t time)
{
	switch (sym) {
	case XKB_KEY_X:
		/* Cut selection; terminal doesn't do cut, fall
		 * through to copy. */
	case XKB_KEY_C:
		terminal_copy(terminal, input);
		return 1;
	case XKB_KEY_V:
		terminal_paste(terminal, input);
		return 1;
	case XKB_KEY_N:
		terminal_new_instance(terminal);
		return 1;

	case XKB_KEY_Up:
		if (!terminal->scrolling)
			terminal->saved_start = terminal->start;
		if (terminal->start == terminal->end - terminal->log_size)
			return 1;

		terminal->scrolling = 1;
		terminal->start--;
		terminal->row++;
		terminal->selection_start_row++;
		terminal->selection_end_row++;
		widget_schedule_redraw(terminal->widget);
		return 1;

	case XKB_KEY_Down:
		if (!terminal->scrolling)
			terminal->saved_start = terminal->start;

		if (terminal->start == terminal->saved_start)
			return 1;

		terminal->scrolling = 1;
		terminal->start++;
		terminal->row--;
		terminal->selection_start_row--;
		terminal->selection_end_row--;
		widget_schedule_redraw(terminal->widget);
		return 1;

	default:
		return 0;
	}
}

static void
key_handler(struct window *window, struct input *input, uint32_t time,
	    uint32_t key, uint32_t sym, enum wl_keyboard_key_state state,
	    void *data)
{
	struct terminal *terminal = data;
	char ch[MAX_RESPONSE];
	uint32_t modifiers, serial;
	int ret, len = 0, d;
	bool convert_utf8 = true;

	modifiers = input_get_modifiers(input);
	if ((modifiers & MOD_CONTROL_MASK) &&
	    (modifiers & MOD_SHIFT_MASK) &&
	    state == WL_KEYBOARD_KEY_STATE_PRESSED &&
	    handle_bound_key(terminal, input, sym, time))
		return;

	/* Map keypad symbols to 'normal' equivalents before processing */
	switch (sym) {
	case XKB_KEY_KP_Space:
		sym = XKB_KEY_space;
		break;
	case XKB_KEY_KP_Tab:
		sym = XKB_KEY_Tab;
		break;
	case XKB_KEY_KP_Enter:
		sym = XKB_KEY_Return;
		break;
	case XKB_KEY_KP_Left:
		sym = XKB_KEY_Left;
		break;
	case XKB_KEY_KP_Up:
		sym = XKB_KEY_Up;
		break;
	case XKB_KEY_KP_Right:
		sym = XKB_KEY_Right;
		break;
	case XKB_KEY_KP_Down:
		sym = XKB_KEY_Down;
		break;
	case XKB_KEY_KP_Equal:
		sym = XKB_KEY_equal;
		break;
	case XKB_KEY_KP_Multiply:
		sym = XKB_KEY_asterisk;
		break;
	case XKB_KEY_KP_Add:
		sym = XKB_KEY_plus;
		break;
	case XKB_KEY_KP_Separator:
		/* Note this is actually locale-dependent and should mostly be
		 * a comma.  But leave it as period until we one day start
		 * doing the right thing. */
		sym = XKB_KEY_period;
		break;
	case XKB_KEY_KP_Subtract:
		sym = XKB_KEY_minus;
		break;
	case XKB_KEY_KP_Decimal:
		sym = XKB_KEY_period;
		break;
	case XKB_KEY_KP_Divide:
		sym = XKB_KEY_slash;
		break;
	case XKB_KEY_KP_0:
	case XKB_KEY_KP_1:
	case XKB_KEY_KP_2:
	case XKB_KEY_KP_3:
	case XKB_KEY_KP_4:
	case XKB_KEY_KP_5:
	case XKB_KEY_KP_6:
	case XKB_KEY_KP_7:
	case XKB_KEY_KP_8:
	case XKB_KEY_KP_9:
		sym = (sym - XKB_KEY_KP_0) + XKB_KEY_0;
		break;
	default:
		break;
	}

	switch (sym) {
	case XKB_KEY_BackSpace:
		if (modifiers & MOD_ALT_MASK)
			ch[len++] = 0x1b;
		ch[len++] = 0x7f;
		break;
	case XKB_KEY_Tab:
	case XKB_KEY_Linefeed:
	case XKB_KEY_Clear:
	case XKB_KEY_Pause:
	case XKB_KEY_Scroll_Lock:
	case XKB_KEY_Sys_Req:
	case XKB_KEY_Escape:
		ch[len++] = sym & 0x7f;
		break;

	case XKB_KEY_Return:
		if (terminal->mode & MODE_LF_NEWLINE) {
			ch[len++] = 0x0D;
			ch[len++] = 0x0A;
		} else {
			ch[len++] = 0x0D;
		}
		break;

	case XKB_KEY_Shift_L:
	case XKB_KEY_Shift_R:
	case XKB_KEY_Control_L:
	case XKB_KEY_Control_R:
	case XKB_KEY_Alt_L:
	case XKB_KEY_Alt_R:
	case XKB_KEY_Meta_L:
	case XKB_KEY_Meta_R:
	case XKB_KEY_Super_L:
	case XKB_KEY_Super_R:
	case XKB_KEY_Hyper_L:
	case XKB_KEY_Hyper_R:
		break;

	case XKB_KEY_Insert:
		len = function_key_response('[', 2, modifiers, '~', ch);
		break;
	case XKB_KEY_Delete:
		if (terminal->mode & MODE_DELETE_SENDS_DEL) {
			ch[len++] = '\x04';
		} else {
			len = function_key_response('[', 3, modifiers, '~', ch);
		}
		break;
	case XKB_KEY_Page_Up:
		len = function_key_response('[', 5, modifiers, '~', ch);
		break;
	case XKB_KEY_Page_Down:
		len = function_key_response('[', 6, modifiers, '~', ch);
		break;
	case XKB_KEY_F1:
		len = function_key_response('O', 1, modifiers, 'P', ch);
		break;
	case XKB_KEY_F2:
		len = function_key_response('O', 1, modifiers, 'Q', ch);
		break;
	case XKB_KEY_F3:
		len = function_key_response('O', 1, modifiers, 'R', ch);
		break;
	case XKB_KEY_F4:
		len = function_key_response('O', 1, modifiers, 'S', ch);
		break;
	case XKB_KEY_F5:
		len = function_key_response('[', 15, modifiers, '~', ch);
		break;
	case XKB_KEY_F6:
		len = function_key_response('[', 17, modifiers, '~', ch);
		break;
	case XKB_KEY_F7:
		len = function_key_response('[', 18, modifiers, '~', ch);
		break;
	case XKB_KEY_F8:
		len = function_key_response('[', 19, modifiers, '~', ch);
		break;
	case XKB_KEY_F9:
		len = function_key_response('[', 20, modifiers, '~', ch);
		break;
	case XKB_KEY_F10:
		len = function_key_response('[', 21, modifiers, '~', ch);
		break;
	case XKB_KEY_F12:
		len = function_key_response('[', 24, modifiers, '~', ch);
		break;
	default:
		/* Handle special keys with alternate mappings */
		len = apply_key_map(terminal->key_mode, sym, modifiers, ch);
		if (len != 0) break;

		if (modifiers & MOD_CONTROL_MASK) {
			if (sym >= '3' && sym <= '7')
				sym = (sym & 0x1f) + 8;

			if (!((sym >= '!' && sym <= '/') ||
				(sym >= '8' && sym <= '?') ||
				(sym >= '0' && sym <= '2'))) sym = sym & 0x1f;
			else if (sym == '2') sym = 0x00;
			else if (sym == '/') sym = 0x1F;
			else if (sym == '8' || sym == '?') sym = 0x7F;
		}
		if (modifiers & MOD_ALT_MASK) {
			if (terminal->mode & MODE_ALT_SENDS_ESC) {
				ch[len++] = 0x1b;
			} else {
				sym = sym | 0x80;
				convert_utf8 = false;
			}
		}

		if ((sym < 128) ||
		    (!convert_utf8 && sym < 256)) {
			ch[len++] = sym;
		} else {
			ret = xkb_keysym_to_utf8(sym, ch + len,
						 MAX_RESPONSE - len);
			if (ret < 0)
				fprintf(stderr,
					"Warning: buffer too small to encode "
					"UTF8 character\n");
			else
				len += ret;
		}

		break;
	}

	if (state == WL_KEYBOARD_KEY_STATE_PRESSED && len > 0) {
		if (terminal->scrolling) {
			d = terminal->saved_start - terminal->start;
			terminal->row -= d;
			terminal->selection_start_row -= d;
			terminal->selection_end_row -= d;
			terminal->start = terminal->saved_start;
			terminal->scrolling = 0;
			widget_schedule_redraw(terminal->widget);
		}

		terminal_write(terminal, ch, len);

		/* Hide cursor, except if this was coming from a
		 * repeating key press. */
		serial = display_get_serial(terminal->display);
		if (terminal->hide_cursor_serial != serial) {
			input_set_pointer_image(input, CURSOR_BLANK);
			terminal->hide_cursor_serial = serial;
		}
	}
}

static void
keyboard_focus_handler(struct window *window,
		       struct input *device, void *data)
{
	struct terminal *terminal = data;

	window_schedule_redraw(terminal->window);
}

static int wordsep(int ch)
{
	const char extra[] = "-,./?%&#:_=+@~";

	if (ch > 127 || ch < 0)
		return 1;

	return ch == 0 || !(isalpha(ch) || isdigit(ch) || strchr(extra, ch));
}

static int
recompute_selection(struct terminal *terminal)
{
	struct rectangle allocation;
	int col, x, width, height;
	int start_row, end_row;
	int word_start, eol;
	int side_margin, top_margin;
	int start_x, end_x;
	int cw, ch;
	union utf8_char *data;

	cw = terminal->average_width;
	ch = terminal->extents.height;
	widget_get_allocation(terminal->widget, &allocation);
	width = terminal->width * cw;
	height = terminal->height * ch;
	side_margin = allocation.x + (allocation.width - width) / 2;
	top_margin = allocation.y + (allocation.height - height) / 2;

	start_row = (terminal->selection_start_y - top_margin + ch) / ch - 1;
	end_row = (terminal->selection_end_y - top_margin + ch) / ch - 1;

	if (start_row < end_row ||
	    (start_row == end_row &&
	     terminal->selection_start_x < terminal->selection_end_x)) {
		terminal->selection_start_row = start_row;
		terminal->selection_end_row = end_row;
		start_x = terminal->selection_start_x;
		end_x = terminal->selection_end_x;
	} else {
		terminal->selection_start_row = end_row;
		terminal->selection_end_row = start_row;
		start_x = terminal->selection_end_x;
		end_x = terminal->selection_start_x;
	}

	eol = 0;
	if (terminal->selection_start_row < 0) {
		terminal->selection_start_row = 0;
		terminal->selection_start_col = 0;
	} else {
		x = side_margin + cw / 2;
		data = terminal_get_row(terminal,
					terminal->selection_start_row);
		word_start = 0;
		for (col = 0; col < terminal->width; col++, x += cw) {
			if (col == 0 || wordsep(data[col - 1].ch))
				word_start = col;
			if (data[col].ch != 0)
				eol = col + 1;
			if (start_x < x)
				break;
		}

		switch (terminal->dragging) {
		case SELECT_LINE:
			terminal->selection_start_col = 0;
			break;
		case SELECT_WORD:
			terminal->selection_start_col = word_start;
			break;
		case SELECT_CHAR:
			terminal->selection_start_col = col;
			break;
		}
	}

	if (terminal->selection_end_row >= terminal->height) {
		terminal->selection_end_row = terminal->height;
		terminal->selection_end_col = 0;
	} else {
		x = side_margin + cw / 2;
		data = terminal_get_row(terminal, terminal->selection_end_row);
		for (col = 0; col < terminal->width; col++, x += cw) {
			if (terminal->dragging == SELECT_CHAR && end_x < x)
				break;
			if (terminal->dragging == SELECT_WORD &&
			    end_x < x && wordsep(data[col].ch))
				break;
		}
		terminal->selection_end_col = col;
	}

	if (terminal->selection_end_col != terminal->selection_start_col ||
	    terminal->selection_start_row != terminal->selection_end_row) {
		col = terminal->selection_end_col;
		if (col > 0 && data[col - 1].ch == 0)
			terminal->selection_end_col = terminal->width;
		data = terminal_get_row(terminal, terminal->selection_start_row);
		if (data[terminal->selection_start_col].ch == 0)
			terminal->selection_start_col = eol;
	}

	return 1;
}

static void
terminal_minimize(struct terminal *terminal)
{
	window_set_minimized(terminal->window);
}

static void
menu_func(void *data, struct input *input, int index)
{
	struct window *window = data;
	struct terminal *terminal = window_get_user_data(window);

	fprintf(stderr, "picked entry %d\n", index);

	switch (index) {
	case 0:
		terminal_new_instance(terminal);
		break;
	case 1:
		terminal_copy(terminal, input);
		break;
	case 2:
		terminal_paste(terminal, input);
		break;
	case 3:
		terminal_minimize(terminal);
		break;
	}
}

static void
show_menu(struct terminal *terminal, struct input *input, uint32_t time)
{
	int32_t x, y;
	static const char *entries[] = {
		"Open Terminal", "Copy", "Paste", "Minimize"
	};

	input_get_position(input, &x, &y);
	window_show_menu(terminal->display, input, time, terminal->window,
			 x - 10, y - 10, menu_func,
			 entries, ARRAY_LENGTH(entries));
}

static void
click_handler(struct widget *widget, struct terminal *terminal,
		struct input *input, int32_t x, int32_t y,
		uint32_t time)
{
	if (time - terminal->click_time < 500)
		terminal->click_count++;
	else
		terminal->click_count = 1;

	terminal->click_time = time;
	terminal->dragging = (terminal->click_count - 1) % 3 + SELECT_CHAR;

	terminal->selection_end_x = terminal->selection_start_x = x;
	terminal->selection_end_y = terminal->selection_start_y = y;
	if (recompute_selection(terminal))
			widget_schedule_redraw(widget);
}

static void
button_handler(struct widget *widget,
	       struct input *input, uint32_t time,
	       uint32_t button,
	       enum wl_pointer_button_state state, void *data)
{
	struct terminal *terminal = data;
	int32_t x, y;

	switch (button) {
	case BTN_LEFT:
		if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
			input_get_position(input, &x, &y);
			click_handler(widget, terminal, input, x, y, time);
		} else {
			terminal->dragging = SELECT_NONE;
		}
		break;

	case BTN_RIGHT:
		if (state == WL_POINTER_BUTTON_STATE_PRESSED)
			show_menu(terminal, input, time);
		break;
	}
}

static int
enter_handler(struct widget *widget,
	      struct input *input, float x, float y, void *data)
{
	return CURSOR_IBEAM;
}

static int
motion_handler(struct widget *widget,
	       struct input *input, uint32_t time,
	       float x, float y, void *data)
{
	struct terminal *terminal = data;

	if (terminal->dragging) {
		input_get_position(input,
				   &terminal->selection_end_x,
				   &terminal->selection_end_y);

		if (recompute_selection(terminal))
			widget_schedule_redraw(widget);
	}

	return CURSOR_IBEAM;
}

/* This magnitude is chosen rather arbitrarily. Really, the scrolling
 * should happen on a (fractional) pixel basis, not a line basis. */
#define AXIS_UNITS_PER_LINE 256

static void
axis_handler(struct widget *widget,
	     struct input *input, uint32_t time,
	     uint32_t axis,
	     wl_fixed_t value,
	     void *data)
{
	struct terminal *terminal = data;
	int lines;

	if (axis != WL_POINTER_AXIS_VERTICAL_SCROLL)
		return;

	terminal->smooth_scroll += value;
	lines = terminal->smooth_scroll / AXIS_UNITS_PER_LINE;
	terminal->smooth_scroll -= lines * AXIS_UNITS_PER_LINE;

	if (lines > 0) {
		if (terminal->scrolling) {
			if ((uint32_t)lines > terminal->saved_start - terminal->start)
				lines = terminal->saved_start - terminal->start;
		} else {
			lines = 0;
		}
	} else if (lines < 0) {
		uint32_t neg_lines = -lines;

		if (neg_lines > terminal->log_size + terminal->start - terminal->end)
			lines = terminal->end - terminal->log_size - terminal->start;
	}

	if (lines) {
		if (!terminal->scrolling)
			terminal->saved_start = terminal->start;
		terminal->scrolling = 1;

		terminal->start += lines;
		terminal->row -= lines;
		terminal->selection_start_row -= lines;
		terminal->selection_end_row -= lines;

		widget_schedule_redraw(widget);
	}
}

static void
output_handler(struct window *window, struct output *output, int enter,
	       void *data)
{
	if (enter)
		window_set_buffer_transform(window, output_get_transform(output));
	window_set_buffer_scale(window, window_get_output_scale(window));
	window_schedule_redraw(window);
}

static void
touch_down_handler(struct widget *widget, struct input *input,
		uint32_t serial, uint32_t time, int32_t id,
		float x, float y, void *data)
{
	struct terminal *terminal = data;

	if (id == 0)
		click_handler(widget, terminal, input, x, y, time);
}

static void
touch_up_handler(struct widget *widget, struct input *input,
		uint32_t serial, uint32_t time, int32_t id, void *data)
{
	struct terminal *terminal = data;

	if (id == 0)
		terminal->dragging = SELECT_NONE;
}

static void
touch_motion_handler(struct widget *widget, struct input *input,
		uint32_t time, int32_t id, float x, float y, void *data)
{
	struct terminal *terminal = data;

	if (terminal->dragging &&
		id == 0) {
		terminal->selection_end_x = (int)x;
		terminal->selection_end_y = (int)y;

		if (recompute_selection(terminal))
			widget_schedule_redraw(widget);
	}
}

#ifndef howmany
#define howmany(x, y) (((x) + ((y) - 1)) / (y))
#endif

static struct terminal *
terminal_create(struct display *display)
{
	struct terminal *terminal;
	cairo_surface_t *surface;
	cairo_t *cr;
	cairo_text_extents_t text_extents;

	terminal = xzalloc(sizeof *terminal);
	terminal->color_scheme = &DEFAULT_COLORS;
	terminal_init(terminal);
	terminal->margin_top = 0;
	terminal->margin_bottom = -1;
	terminal->window = window_create(display);
	terminal->widget = window_frame_create(terminal->window, terminal);
	terminal->title = xstrdup("Wayland Terminal");
	window_set_title(terminal->window, terminal->title);
	widget_set_transparent(terminal->widget, 0);

	init_state_machine(&terminal->state_machine);
	init_color_table(terminal);

	terminal->display = display;
	terminal->margin = 5;
	terminal->buffer_height = 1024;
	terminal->end = 1;

	window_set_user_data(terminal->window, terminal);
	window_set_key_handler(terminal->window, key_handler);
	window_set_keyboard_focus_handler(terminal->window,
					  keyboard_focus_handler);
	window_set_fullscreen_handler(terminal->window, fullscreen_handler);
	window_set_output_handler(terminal->window, output_handler);
	window_set_close_handler(terminal->window, close_handler);
	window_set_state_changed_handler(terminal->window, state_changed_handler);

	window_set_data_handler(terminal->window, data_handler);
	window_set_drop_handler(terminal->window, drop_handler);

	widget_set_redraw_handler(terminal->widget, redraw_handler);
	widget_set_resize_handler(terminal->widget, resize_handler);
	widget_set_button_handler(terminal->widget, button_handler);
	widget_set_enter_handler(terminal->widget, enter_handler);
	widget_set_motion_handler(terminal->widget, motion_handler);
	widget_set_axis_handler(terminal->widget, axis_handler);
	widget_set_touch_up_handler(terminal->widget, touch_up_handler);
	widget_set_touch_down_handler(terminal->widget, touch_down_handler);
	widget_set_touch_motion_handler(terminal->widget, touch_motion_handler);

	surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 0, 0);
	cr = cairo_create(surface);
	cairo_set_font_size(cr, option_font_size);
	cairo_select_font_face (cr, option_font,
				CAIRO_FONT_SLANT_NORMAL,
				CAIRO_FONT_WEIGHT_BOLD);
	terminal->font_bold = cairo_get_scaled_font (cr);
	cairo_scaled_font_reference(terminal->font_bold);

	cairo_select_font_face (cr, option_font,
				CAIRO_FONT_SLANT_NORMAL,
				CAIRO_FONT_WEIGHT_NORMAL);
	terminal->font_normal = cairo_get_scaled_font (cr);
	cairo_scaled_font_reference(terminal->font_normal);

	cairo_font_extents(cr, &terminal->extents);

	/* Compute the average ascii glyph width */
	cairo_text_extents(cr, TERMINAL_DRAW_SINGLE_WIDE_CHARACTERS,
			   &text_extents);
	terminal->average_width = howmany
		(text_extents.width,
		 strlen(TERMINAL_DRAW_SINGLE_WIDE_CHARACTERS));
	terminal->average_width = ceil(terminal->average_width);

	cairo_destroy(cr);
	cairo_surface_destroy(surface);

	terminal_resize(terminal, 20, 5); /* Set minimum size first */
	terminal_resize(terminal, 80, 25);

	wl_list_insert(terminal_list.prev, &terminal->link);

	return terminal;
}

static void
terminal_destroy(struct terminal *terminal)
{
	display_unwatch_fd(terminal->display, terminal->master);
	window_destroy(terminal->window);
	close(terminal->master);
	wl_list_remove(&terminal->link);

	if (wl_list_empty(&terminal_list))
		display_exit(terminal->display);

	free(terminal->title);
	free(terminal);
}

static void
io_handler(struct task *task, uint32_t events)
{
	struct terminal *terminal =
		container_of(task, struct terminal, io_task);
	char buffer[256];
	int len;

	if (events & EPOLLHUP) {
		terminal_destroy(terminal);
		return;
	}

	len = read(terminal->master, buffer, sizeof buffer);
	if (len < 0)
		terminal_destroy(terminal);
	else
		terminal_data(terminal, buffer, len);
}

static int
terminal_run(struct terminal *terminal, const char *path)
{
	int master;
	pid_t pid;
	int pipes[2];

	/* Awkwardness: There's a sticky race condition here.  If
	 * anything prints after the forkpty() but before the window has
	 * a size then we'll segfault.  So we make a pipe and wait on
	 * it before actually exec()ing the terminal.  The resize
	 * handler closes it in the parent process and the child continues
	 * on to launch a shell.
	 *
	 * The reason we don't just do terminal_run() after the window
	 * has a size is that we'd prefer to perform the fork() before
	 * the process opens a wayland connection.
	 */
	if (pipe(pipes) == -1) {
		fprintf(stderr, "Can't create pipe for pacing.\n");
		exit(EXIT_FAILURE);
	}

	pid = forkpty(&master, NULL, NULL, NULL);
	if (pid == 0) {
		int ret;

		close(pipes[1]);
		do {
			char tmp;
			ret = read(pipes[0], &tmp, 1);
		} while (ret == -1 && errno == EINTR);
		close(pipes[0]);
		setenv("TERM", option_term, 1);
		setenv("COLORTERM", option_term, 1);
		if (execl(path, path, NULL)) {
			printf("exec failed: %m\n");
			exit(EXIT_FAILURE);
		}
	} else if (pid < 0) {
		fprintf(stderr, "failed to fork and create pty (%m).\n");
		return -1;
	}

	close(pipes[0]);
	terminal->master = master;
	terminal->pace_pipe = pipes[1];
	fcntl(master, F_SETFL, O_NONBLOCK);
	terminal->io_task.run = io_handler;
	display_watch_fd(terminal->display, terminal->master,
			 EPOLLIN | EPOLLHUP, &terminal->io_task);

	if (option_fullscreen)
		window_set_fullscreen(terminal->window, 1);
	else if (option_maximize)
		window_set_maximized(terminal->window, 1);
	else
		terminal_resize(terminal, 80, 24);

	return 0;
}

static const struct weston_option terminal_options[] = {
	{ WESTON_OPTION_BOOLEAN, "fullscreen", 'f', &option_fullscreen },
	{ WESTON_OPTION_BOOLEAN, "maximized", 'm', &option_maximize },
	{ WESTON_OPTION_STRING, "font", 0, &option_font },
	{ WESTON_OPTION_INTEGER, "font-size", 0, &option_font_size },
	{ WESTON_OPTION_STRING, "shell", 0, &option_shell },
};

int main(int argc, char *argv[])
{
	struct display *d;
	struct terminal *terminal;
	const char *config_file;
	struct weston_config *config;
	struct weston_config_section *s;

	/* as wcwidth is locale-dependent,
	   wcwidth needs setlocale call to function properly. */
	setlocale(LC_ALL, "");

	option_shell = getenv("SHELL");
	if (!option_shell)
		option_shell = "/bin/bash";

	config_file = weston_config_get_name_from_env();
	config = weston_config_parse(config_file);
	s = weston_config_get_section(config, "terminal", NULL, NULL);
	weston_config_section_get_string(s, "font", &option_font, "mono");
	weston_config_section_get_int(s, "font-size", &option_font_size, 14);
	weston_config_section_get_string(s, "term", &option_term, "xterm");
	weston_config_destroy(config);

	if (parse_options(terminal_options,
			  ARRAY_LENGTH(terminal_options), &argc, argv) > 1) {
		printf("Usage: %s [OPTIONS]\n"
		       "  --fullscreen or -f\n"
		       "  --maximized or -m\n"
		       "  --font=NAME\n"
		       "  --font-size=SIZE\n"
		       "  --shell=NAME\n", argv[0]);
		return 1;
	}

	d = display_create(&argc, argv);
	if (d == NULL) {
		fprintf(stderr, "failed to create display: %m\n");
		return -1;
	}

	wl_list_init(&terminal_list);
	terminal = terminal_create(d);
	if (terminal_run(terminal, option_shell))
		exit(EXIT_FAILURE);

	display_run(d);

	return 0;
}
