/* vi:set ts=8 sw=4 sts=4:
 *
 * VIM - Vi IMproved	by Bram Moolenaar
 *			Photon GUI support by Julian Kinraid
 *
 * Do ":help uganda"  in Vim to read copying and usage conditions.
 * Do ":help credits" in Vim to see a list of people who contributed.
 *
 *
 * Clipboard support is in os_qnx.c
 * PhAttach() is called in os_qnx.c:qnx_init()
 */

#include "vim.h"

#ifdef FEAT_TOOLBAR
# include <photon/PxImage.h>
#endif

#if !defined(__QNX__)
/* Used when generating prototypes. */
# define PgColor_t	int
# define PhEvent_t	int
# define PhPoint_t	int
# define PtWidget_t	int
# define Pg_BLACK	0
# define PtCallbackF_t	int
# define PtCallbackInfo_t int
# define PhTile_t	int
# define PtWidget_t	int
# define PhImage_t	int
#endif

#define ARRAY_LENGTH(a) (sizeof(a) / sizeof(a[0]))
#define RGB(r, g, b) PgRGB(r, g, b)

#define EVENT_BUFFER_SIZE sizeof(PhEvent_t) + 1000

/* Some defines for gui_mch_mousehide() */
#define MOUSE_HIDE		TRUE
#define MOUSE_SHOW		FALSE

/* Optional support for using a PtPanelGroup widget, needs work */
#undef USE_PANEL_GROUP

#ifdef USE_PANEL_GROUP
static char	*empty_title = "    ";
static char	**panel_titles = NULL;
static ushort_t	num_panels = 0;
static short pg_margin_left, pg_margin_right, pg_margin_top, pg_margin_bottom;
#endif

#define GUI_PH_MARGIN		4	/* Size of the bevel */

#define GUI_PH_MOUSE_TYPE		Ph_CURSOR_INSERT
static PgColor_t gui_ph_mouse_color =	Pg_BLACK;

static PhPoint_t    gui_ph_raw_offset;
static PtWidget_t   *gui_ph_timer_cursor;   /* handle cursor blinking */
static PtWidget_t   *gui_ph_timer_timeout;  /* used in gui_mch_wait_for_chars */
static short	    is_timeout;		    /* Has the timeout occured? */

/*
 * This is set inside the mouse callback for a right mouse
 * button click, and used for the popup menus
 */
static PhPoint_t    abs_mouse;

/* Try and avoid redraws while a resize is in progress */
static int is_ignore_draw = FALSE;

/* Used for converting to/from utf-8 and other charsets */
static struct PxTransCtrl *charset_translate;

/*
 * Cursor blink functions.
 *
 * This is a simple state machine:
 * BLINK_NONE	not blinking at all
 * BLINK_OFF	blinking, cursor is not shown
 * BLINK_ON	blinking, cursor is shown
 */
static enum {
    BLINK_NONE,
    BLINK_OFF,
    BLINK_ON
} blink_state = BLINK_NONE;

static long_u	blink_waittime	= 700;
static long_u	blink_ontime	= 400;
static long_u	blink_offtime	= 250;

static struct
{
    int	    key_sym;
    char_u  vim_code0;
    char_u  vim_code1;
} special_keys[] =
{
    {Pk_Up,	    'k', 'u'},
    {Pk_Down,	    'k', 'd'},
    {Pk_Left,	    'k', 'l'},
    {Pk_Right,	    'k', 'r'},

    {Pk_F1,	    'k', '1'},
    {Pk_F2,	    'k', '2'},
    {Pk_F3,	    'k', '3'},
    {Pk_F4,	    'k', '4'},
    {Pk_F5,	    'k', '5'},
    {Pk_F6,	    'k', '6'},
    {Pk_F7,	    'k', '7'},
    {Pk_F8,	    'k', '8'},
    {Pk_F9,	    'k', '9'},
    {Pk_F10,	    'k', ';'},

    {Pk_F11,	    'F', '1'},
    {Pk_F12,	    'F', '2'},
    {Pk_F13,	    'F', '3'},
    {Pk_F14,	    'F', '4'},
    {Pk_F15,	    'F', '5'},
    {Pk_F16,	    'F', '6'},
    {Pk_F17,	    'F', '7'},
    {Pk_F18,	    'F', '8'},
    {Pk_F19,	    'F', '9'},
    {Pk_F20,	    'F', 'A'},

    {Pk_F21,	    'F', 'B'},
    {Pk_F22,	    'F', 'C'},
    {Pk_F23,	    'F', 'D'},
    {Pk_F24,	    'F', 'E'},
    {Pk_F25,	    'F', 'F'},
    {Pk_F26,	    'F', 'G'},
    {Pk_F27,	    'F', 'H'},
    {Pk_F28,	    'F', 'I'},
    {Pk_F29,	    'F', 'J'},

    {Pk_F30,	    'F', 'K'},
    {Pk_F31,	    'F', 'L'},
    {Pk_F32,	    'F', 'M'},
    {Pk_F33,	    'F', 'N'},
    {Pk_F34,	    'F', 'O'},
    {Pk_F35,	    'F', 'P'},

    {Pk_Help,	    '%', '1'},
    {Pk_BackSpace,  'k', 'b'},
    {Pk_Insert,	    'k', 'I'},
    {Pk_Delete,	    'k', 'D'},
    {Pk_Home,	    'k', 'h'},
    {Pk_End,	    '@', '7'},
    {Pk_Prior,	    'k', 'P'},
    {Pk_Next,	    'k', 'N'},
    {Pk_Print,	    '%', '9'},

    {Pk_KP_Add,	    'K', '6'},
    {Pk_KP_Subtract,'K', '7'},
    {Pk_KP_Divide,  'K', '8'},
    {Pk_KP_Multiply,'K', '9'},
    {Pk_KP_Enter,   'K', 'A'},

    {Pk_KP_0,	    KS_EXTRA, KE_KINS}, /* Insert    */
    {Pk_KP_Decimal, KS_EXTRA, KE_KDEL}, /* Delete    */

    {Pk_KP_4,	    'k', 'l'}, /* Left	    */
    {Pk_KP_6,	    'k', 'r'}, /* Right	    */
    {Pk_KP_8,	    'k', 'u'}, /* Up	    */
    {Pk_KP_2,	    'k', 'd'}, /* Down	    */

    {Pk_KP_7,	    'K', '1'}, /* Home	    */
    {Pk_KP_1,	    'K', '4'}, /* End	    */

    {Pk_KP_9,	    'K', '3'}, /* Page Up   */
    {Pk_KP_3,	    'K', '5'}, /* Page Down */

    {Pk_KP_5,	    '&', '8'}, /* Undo	    */

    /* Keys that we want to be able to use any modifier with: */
    {Pk_Return,	    CAR,  NUL},
    {Pk_space,	    ' ', NUL},
    {Pk_Tab,	    TAB, NUL},
    {Pk_Escape,	    ESC, NUL},
    {NL,	    NL,	 NUL},
    {CAR,	    CAR,  NUL},

    /* End of list marker: */
    {0,		0, 0}
};


/****************************************************************************/

static PtCallbackF_t gui_ph_handle_timer_cursor;
static PtCallbackF_t gui_ph_handle_timer_timeout;

static PtCallbackF_t gui_ph_handle_window_cb;

static PtCallbackF_t gui_ph_handle_scrollbar;
static PtCallbackF_t gui_ph_handle_keyboard;
static PtCallbackF_t gui_ph_handle_mouse;
static PtCallbackF_t gui_ph_handle_pulldown_menu;
static PtCallbackF_t gui_ph_handle_menu;
static PtCallbackF_t gui_ph_handle_focus;	/* focus change of text area */

static PtCallbackF_t gui_ph_handle_menu_resize;

/* When a menu is unrealized, give focus back to vimTextArea */
static PtCallbackF_t gui_ph_handle_menu_unrealized;

#ifdef USE_PANEL_GROUP
static void gui_ph_get_panelgroup_margins(short*, short*, short*, short*);
#endif

#ifdef FEAT_TOOLBAR
static PhImage_t *gui_ph_toolbar_find_icon(vimmenu_T *menu);
#endif

static void gui_ph_draw_start(void);
static void gui_ph_draw_end(void);

/* Set the text for the balloon */
static PtWidget_t * gui_ph_show_tooltip(PtWidget_t *window,
			     PtWidget_t *widget,
			     int position,
			     char *text,
			     char *font,
			     PgColor_t fill_color,
			     PgColor_t text_color);

/****************************************************************************/

static PtWidget_t * gui_ph_show_tooltip(PtWidget_t *window,
			     PtWidget_t *widget,
			     int position,
			     char *text,
			     char *font,
			     PgColor_t fill_color,
			     PgColor_t text_color)
{
    PtArg_t arg;
    vimmenu_T *menu;
    char_u  *tooltip;

    PtSetArg(&arg, Pt_ARG_POINTER, &menu, 0);
    PtGetResources(widget, 1, &arg);

    /* Override the text and position */

    tooltip = text;
    if (menu != NULL)
    {
	int index = MENU_INDEX_TIP;
	if (menu->strings[ index ] != NULL)
	    tooltip = menu->strings[ index ];
    }

    return PtInflateBalloon(
	    window,
	    widget,
	    /* Don't put the balloon at the bottom,
	     * it gets drawn over by gfx done in the PtRaw */
	    Pt_BALLOON_TOP,
	    tooltip,
	    font,
	    fill_color,
	    text_color);
}

    static void
gui_ph_resize_container(void)
{
    PhArea_t area;

    PtWidgetArea(gui.vimWindow, &area);
    PtWidgetPos (gui.vimContainer, &area.pos);

    PtSetResource(gui.vimContainer, Pt_ARG_AREA, &area, 0);
}

    static int
gui_ph_handle_menu_resize(
	PtWidget_t *widget,
	void *other,
	PtCallbackInfo_t *info)
{
    PtContainerCallback_t *sizes = info->cbdata;
    PtWidget_t		*container;
    PhPoint_t		below_menu;
    int_u		height;

    height = sizes->new_dim.h;

    /* Because vim treats the toolbar and menubar separately,
     * and here they're lumped together into a PtToolbarGroup,
     * we only need either menu_height or toolbar_height set at once */
    if (gui.menu_is_active)
    {
	gui.menu_height = height;
	gui.toolbar_height = 0;
    }
#ifdef FEAT_TOOLBAR
    else
	gui.toolbar_height = height;
#endif

    below_menu.x = 0;
    below_menu.y = height;

#ifdef USE_PANEL_GROUP
    container = gui.vimPanelGroup;
#else
    container = gui.vimContainer;
#endif

    PtSetResource(container, Pt_ARG_POS, &below_menu, 0);

    gui_ph_resize_container();

#ifdef USE_PANEL_GROUP
    gui_ph_get_panelgroup_margins(
	    &pg_margin_top, &pg_margin_bottom,
	    &pg_margin_left, &pg_margin_right);
#endif
    return Pt_CONTINUE;
}

/*
 * Pt_ARG_TIMER_REPEAT isn't used because the on & off times
 * are different
 */
    static int
gui_ph_handle_timer_cursor(
	PtWidget_t *widget,
	void *data,
	PtCallbackInfo_t *info)
{
    if (blink_state == BLINK_ON)
    {
	gui_undraw_cursor();
	blink_state = BLINK_OFF;
	PtSetResource(gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL,
		blink_offtime, 0);
    }
    else
    {
	gui_update_cursor(TRUE, FALSE);
	blink_state = BLINK_ON;
	PtSetResource(gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL,
		blink_ontime, 0);
    }
    return Pt_CONTINUE;
}

    static int
gui_ph_handle_timer_timeout(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
{
    is_timeout = TRUE;

    return Pt_CONTINUE;
}

    static int
gui_ph_handle_window_cb(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
{
    PhWindowEvent_t *we = info->cbdata;
    ushort_t *width, *height;

    switch (we->event_f) {
	case Ph_WM_CLOSE:
	    gui_shell_closed();
	    break;

	case Ph_WM_FOCUS:
	    /* Just in case it's hidden and needs to be shown */
	    gui_mch_mousehide(MOUSE_SHOW);

	    if (we->event_state == Ph_WM_EVSTATE_FOCUS)
	    {
		gui_focus_change(TRUE);
		gui_mch_start_blink();
	    }
	    else
	    {
		gui_focus_change(FALSE);
		gui_mch_stop_blink();
	    }
	    break;

	case Ph_WM_RESIZE:
	    PtGetResource(gui.vimWindow, Pt_ARG_WIDTH, &width, 0);
	    PtGetResource(gui.vimWindow, Pt_ARG_HEIGHT, &height, 0);
#ifdef USE_PANEL_GROUP
	    width  -= (pg_margin_left + pg_margin_right);
	    height -= (pg_margin_top + pg_margin_bottom);
#endif
	    gui_resize_shell(*width, *height);
	    gui_set_shellsize(FALSE, FALSE, RESIZE_BOTH);
	    is_ignore_draw = FALSE;
	    PtEndFlux(gui.vimContainer);
	    PtContainerRelease(gui.vimContainer);
	    break;

	default:
	    break;
    }

    return Pt_CONTINUE;
}

    static int
gui_ph_handle_scrollbar(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
{
    PtScrollbarCallback_t *scroll;
    scrollbar_T *sb;
    int	    value, dragging = FALSE;

    scroll = info->cbdata;

    sb = (scrollbar_T *) data;
    if (sb != NULL)
    {
	value = scroll->position;
	switch (scroll->action)
	{
	    case Pt_SCROLL_DRAGGED:
		dragging = TRUE;
		break;

	    case Pt_SCROLL_SET:
		/* FIXME: return straight away here? */
		return Pt_CONTINUE;
		break;
	}

	gui_drag_scrollbar(sb, value, dragging);
    }
    return Pt_CONTINUE;
}

    static int
gui_ph_handle_keyboard(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
{
    PhKeyEvent_t    *key;
    unsigned char   string[6];
    int		    len, i;
    int		    ch, modifiers;

    key = PhGetData(info->event);

    ch = modifiers = len = 0;

    if (p_mh)
	gui_mch_mousehide(MOUSE_HIDE);

    /* We're a good lil photon program, aren't we? yes we are, yeess wee arrr */
    if (key->key_flags & Pk_KF_Compose)
    {
	return Pt_CONTINUE;
    }

    if ((key->key_flags & Pk_KF_Cap_Valid) &&
	    PkIsKeyDown(key->key_flags))
    {
#ifdef FEAT_MENU
	/*
	 * Only show the menu if the Alt key is down, and the Shift & Ctrl
	 * keys aren't down, as well as the other conditions
	 */
	if (((key->key_mods & Pk_KM_Alt) &&
		    !(key->key_mods & Pk_KM_Shift) &&
		    !(key->key_mods & Pk_KM_Ctrl)) &&
	    gui.menu_is_active &&
	    (*p_wak == 'y' ||
	      (*p_wak == 'm' &&
		gui_is_menu_shortcut(key->key_cap))))
	{
	    /* Fallthrough and let photon look for the hotkey */
	    return Pt_CONTINUE;
	}
#endif

	for(i = 0; special_keys[i].key_sym != 0; i++)
	{
	    if (special_keys[i].key_sym == key->key_cap)
	    {
		len = 0;
		if (special_keys[i].vim_code1 == NUL)
		    ch = special_keys[i].vim_code0;
		else
		{
		    /* Detect if a keypad number key has been pressed
		     * and change the key if Num Lock is on */
		    if (key->key_cap >= Pk_KP_Enter && key->key_cap <= Pk_KP_9
			    && (key->key_mods & Pk_KM_Num_Lock))
		    {
			/* FIXME: For now, just map the key to a ascii value
			 * (see <photon/PkKeyDef.h>) */
			ch = key->key_cap - 0xf080;
		    }
		    else
			ch = TO_SPECIAL(special_keys[i].vim_code0,
				special_keys[i].vim_code1);
		}
		break;
	    }
	}

	if (key->key_mods & Pk_KM_Ctrl)
	    modifiers |= MOD_MASK_CTRL;
	if (key->key_mods & Pk_KM_Alt)
	    modifiers |= MOD_MASK_ALT;
	if (key->key_mods & Pk_KM_Shift)
	    modifiers |= MOD_MASK_SHIFT;

	/* Is this not a special key? */
	if (special_keys[i].key_sym == 0)
	{
	    ch = PhTo8859_1(key);
	    if (ch == -1
#ifdef FEAT_MBYTE
		|| (enc_utf8 && ch > 127)
#endif
		)
	    {
#ifdef FEAT_MBYTE
		len = PhKeyToMb(string, key);
		if (len > 0)
		{
		    static char buf[6];
		    int src_taken, dst_made;
		    if (enc_utf8 != TRUE)
		    {
			PxTranslateFromUTF(
				charset_translate,
				string,
				len,
				&src_taken,
				buf,
				6,
				&dst_made );

			add_to_input_buf( buf, dst_made );
		    }
		    else
		    {
			add_to_input_buf( string, len );
		    }

		    return Pt_CONSUME;
		}
		len = 0;
#endif
		ch = key->key_cap;
		if( ch < 0xff )
		{
		    /* FIXME: is this the right thing to do? */
		    if( modifiers & MOD_MASK_CTRL )
		    {
			modifiers &= ~MOD_MASK_CTRL;

			if( ( ch >= 'a'  &&  ch <= 'z' ) ||
				ch == '[' ||
				ch == ']' ||
				ch == '\\' )
			    ch = Ctrl_chr( ch );
			else if( ch == '2' )
			    ch = NUL;
			else if( ch == '6' )
			    ch = 0x1e;
			else if( ch == '-' )
			    ch = 0x1f;
			else
			    modifiers |= MOD_MASK_CTRL;
		    }

		    if( modifiers & MOD_MASK_ALT )
		    {
			ch = Meta( ch );
			modifiers &= ~MOD_MASK_ALT;
		    }
		}
		else
		{
		    return Pt_CONTINUE;
		}
	    }
	    else
		modifiers &= ~MOD_MASK_SHIFT;
	}

	ch = simplify_key( ch, &modifiers );
	if( modifiers )
	{
	    string[ len++ ] = CSI;
	    string[ len++ ] = KS_MODIFIER;
	    string[ len++ ] = modifiers;
	}

	if( IS_SPECIAL( ch ) )
	{
	    string[ len++ ] = CSI;
	    string[ len++ ] = K_SECOND( ch );
	    string[ len++ ] = K_THIRD( ch );
	}
	else
	{
	    string[ len++ ] = ch;
	}

	if (len == 1 && ((ch == Ctrl_C && ctrl_c_interrupts)
							  || ch == intr_char))
	{
	    trash_input_buf();
	    got_int = TRUE;
	}

	if (len == 1 && string[0] == CSI)
	{
	    /* Turn CSI into K_CSI. */
	    string[ len++ ] = KS_EXTRA;
	    string[ len++ ] = KE_CSI;
	}

	if( len > 0 )
	{
	    add_to_input_buf( string, len );
	    return Pt_CONSUME;
	}
    }

    return Pt_CONTINUE;
}

    static int
gui_ph_handle_mouse( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
{
    PhPointerEvent_t *pointer;
    PhRect_t	     *pos;
    int		     button = 0, repeated_click, modifiers = 0x0;
    short	     mouse_x, mouse_y;

    pointer = PhGetData( info->event );
    pos = PhGetRects( info->event );

    gui_mch_mousehide( MOUSE_SHOW );

    /*
     * Coordinates need to be relative to the base window,
     * not relative to the vimTextArea widget
     */
    mouse_x = pos->ul.x + gui.border_width;
    mouse_y = pos->ul.y + gui.border_width;

    if( info->event->type == Ph_EV_PTR_MOTION_NOBUTTON )
    {
	gui_mouse_moved( mouse_x, mouse_y );
	return Pt_CONTINUE;
    }

    if( pointer->key_mods & Pk_KM_Shift )
	modifiers |= MOUSE_SHIFT;
    if( pointer->key_mods & Pk_KM_Ctrl )
	modifiers |= MOUSE_CTRL;
    if( pointer->key_mods & Pk_KM_Alt )
	modifiers |= MOUSE_ALT;

    /*
     * FIXME More than one button may be involved, but for
     * now just deal with one
     */
    if( pointer->buttons & Ph_BUTTON_SELECT )
	button = MOUSE_LEFT;

    if( pointer->buttons & Ph_BUTTON_MENU )
    {
	button = MOUSE_RIGHT;
	/* Need the absolute coordinates for the popup menu */
	abs_mouse.x = pointer->pos.x;
	abs_mouse.y = pointer->pos.y;
    }

    if( pointer->buttons & Ph_BUTTON_ADJUST )
	button = MOUSE_MIDDLE;

    /* Catch a real release (not phantom or other releases */
    if( info->event->type == Ph_EV_BUT_RELEASE )
	button = MOUSE_RELEASE;

    if( info->event->type & Ph_EV_PTR_MOTION_BUTTON )
	button = MOUSE_DRAG;

#if 0
    /* Vim doesn't use button repeats */
    if( info->event->type & Ph_EV_BUT_REPEAT )
	button = MOUSE_DRAG;
#endif

    /* Don't do anything if it is one of the phantom mouse release events */
    if( ( button != MOUSE_RELEASE ) ||
	    ( info->event->subtype == Ph_EV_RELEASE_REAL ) )
    {
	repeated_click = (pointer->click_count >= 2) ? TRUE : FALSE;

	gui_send_mouse_event( button , mouse_x, mouse_y, repeated_click, modifiers );
    }

    return Pt_CONTINUE;
}

/* Handle a focus change of the PtRaw widget */
    static int
gui_ph_handle_focus( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
{
    if( info->reason == Pt_CB_LOST_FOCUS )
    {
	PtRemoveEventHandler( gui.vimTextArea, Ph_EV_PTR_MOTION_NOBUTTON,
		gui_ph_handle_mouse, NULL );

	gui_mch_mousehide( MOUSE_SHOW );
    }
    else
    {
	PtAddEventHandler( gui.vimTextArea, Ph_EV_PTR_MOTION_NOBUTTON,
		gui_ph_handle_mouse, NULL );
    }
    return Pt_CONTINUE;
}

    static void
gui_ph_handle_raw_draw( PtWidget_t *widget, PhTile_t *damage )
{
    PhRect_t	*r;
    PhPoint_t	offset;
    PhPoint_t	translation;

    if( is_ignore_draw == TRUE )
	return;

    PtSuperClassDraw( PtBasic, widget, damage );
    PgGetTranslation( &translation );
    PgClearTranslation();

#if 0
    /*
     * This causes some weird problems, with drawing being done from
     * within this raw drawing function (rather than just simple clearing
     * and text drawing done by gui_redraw)
     *
     * The main problem is when PhBlit is used, and the cursor appearing
     * in places where it shouldn't
     */
    out_flush();
#endif

    PtWidgetOffset( widget, &offset );
    PhTranslatePoint( &offset, PtWidgetPos( gui.vimTextArea, NULL ) );

#if 1
    /* Redraw individual damage regions */
    if( damage->next != NULL )
	damage = damage->next;

    while( damage != NULL )
    {
	r = &damage->rect;
	gui_redraw(
		r->ul.x - offset.x, r->ul.y - offset.y,
		r->lr.x - r->ul.x + 1,
		r->lr.y - r->ul.y + 1 );
	damage = damage->next;
    }
#else
    /* Redraw the rectangle that covers all the damaged regions */
    r = &damage->rect;
    gui_redraw(
	    r->ul.x - offset.x, r->ul.y - offset.y,
	    r->lr.x - r->ul.x + 1,
	    r->lr.y - r->ul.y + 1 );
#endif

    PgSetTranslation( &translation, 0 );
}

    static int
gui_ph_handle_pulldown_menu(
	PtWidget_t *widget,
	void *data,
	PtCallbackInfo_t *info )
{
    if( data != NULL )
    {
	vimmenu_T *menu = (vimmenu_T *) data;

	PtPositionMenu( menu->submenu_id, NULL );
	PtRealizeWidget( menu->submenu_id );
    }

    return Pt_CONTINUE;
}

/* This is used for pulldown/popup menus and also toolbar buttons */
    static int
gui_ph_handle_menu( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
{
    if( data != NULL )
    {
	vimmenu_T *menu = (vimmenu_T *) data;
	gui_menu_cb( menu );
    }
    return Pt_CONTINUE;
}

/* Stop focus from disappearing into the menubar... */
    static int
gui_ph_handle_menu_unrealized(
	PtWidget_t *widget,
	void *data,
	PtCallbackInfo_t *info )
{
    PtGiveFocus( gui.vimTextArea, NULL );
    return Pt_CONTINUE;
}

    static int
gui_ph_handle_window_open(
	PtWidget_t *widget,
	void *data,
	PtCallbackInfo_t *info )
{
    gui_set_shellsize( FALSE, TRUE, RESIZE_BOTH );
    return Pt_CONTINUE;
}

/****************************************************************************/

#define DRAW_START  gui_ph_draw_start()
#define DRAW_END    gui_ph_draw_end()

/* TODO: Set a clipping rect? */
    static void
gui_ph_draw_start( void )
{
    PhGC_t *gc;

    gc = PgGetGC();
    PgSetRegion( PtWidgetRid( PtFindDisjoint( gui.vimTextArea ) ) );
    PgClearClippingsCx( gc );
    PgClearTranslationCx( gc );

    PtWidgetOffset( gui.vimTextArea, &gui_ph_raw_offset );
    PhTranslatePoint( &gui_ph_raw_offset, PtWidgetPos( gui.vimTextArea, NULL ) );

    PgSetTranslation( &gui_ph_raw_offset, Pg_RELATIVE );
}

    static void
gui_ph_draw_end( void )
{
    gui_ph_raw_offset.x = -gui_ph_raw_offset.x;
    gui_ph_raw_offset.y = -gui_ph_raw_offset.y;
    PgSetTranslation( &gui_ph_raw_offset, Pg_RELATIVE );
}

#ifdef USE_PANEL_GROUP
    static vimmenu_T *
gui_ph_find_buffer_item( char_u *name )
{
    vimmenu_T *top_level = root_menu;
    vimmenu_T *items = NULL;

    while( top_level != NULL &&
	    ( STRCMP( top_level->dname, "Buffers" ) != 0 ) )
	top_level = top_level->next;

    if( top_level != NULL )
    {
	items = top_level->children;

	while( items != NULL &&
		( STRCMP( items->dname, name ) != 0 ) )
	    items = items->next;
    }
    return items;
}

    static void
gui_ph_pg_set_buffer_num( int_u buf_num )
{
    int i;
    char search[16];
    char *mark;

    if( gui.vimTextArea == NULL || buf_num == 0 )
	return;

    search[0] = '(';
    ultoa( buf_num, &search[1], 10 );
    STRCAT( search, ")" );

    for( i = 0; i < num_panels; i++ )
    {
	/* find the last "(" in the panel title and see if the buffer
	 * number in the title matches the one we're looking for */
	mark = STRRCHR( panel_titles[ i ], '(' );
	if( mark != NULL && STRCMP( mark, search ) == 0 )
	{
	    PtSetResource( gui.vimPanelGroup, Pt_ARG_PG_CURRENT_INDEX,
		    i, 0 );
	}
    }
}

    static int
gui_ph_handle_pg_change(
	PtWidget_t *widget,
	void *data,
	PtCallbackInfo_t *info )
{
    vimmenu_T *menu;
    PtPanelGroupCallback_t *panel;

    if( info->event != NULL )
    {
	panel = info->cbdata;
	if( panel->new_panel != NULL )
	{
	    menu = gui_ph_find_buffer_item( panel->new_panel );
	    if( menu )
		gui_menu_cb( menu );
	}
    }
    return Pt_CONTINUE;
}

    static void
gui_ph_get_panelgroup_margins(
	short *top,
	short *bottom,
	short *left,
	short *right )
{
    unsigned short abs_raw_x, abs_raw_y, abs_panel_x, abs_panel_y;
    const unsigned short *margin_top, *margin_bottom;
    const unsigned short *margin_left, *margin_right;

    PtGetAbsPosition( gui.vimTextArea, &abs_raw_x, &abs_raw_y );
    PtGetAbsPosition( gui.vimPanelGroup, &abs_panel_x, &abs_panel_y );

    PtGetResource( gui.vimPanelGroup, Pt_ARG_MARGIN_RIGHT, &margin_right, 0 );
    PtGetResource( gui.vimPanelGroup, Pt_ARG_MARGIN_BOTTOM, &margin_bottom, 0 );

    abs_raw_x -= abs_panel_x;
    abs_raw_y -= abs_panel_y;

    *top    = abs_raw_y;
    *bottom = *margin_bottom;

    *left  = abs_raw_x;
    *right = *margin_right;
}

/* Used for the tabs for PtPanelGroup */
    static int
gui_ph_is_buffer_item( vimmenu_T *menu, vimmenu_T *parent )
{
    char *mark;

    if( STRCMP( parent->dname, "Buffers" ) == 0 )
    {
	/* Look for '(' digits ')' */
	mark = vim_strchr( menu->dname, '(' );
	if( mark != NULL )
	{
	    mark++;
	    while( isdigit( *mark ) )
		mark++;

	    if( *mark == ')' )
		return TRUE;
	}
    }
    return FALSE;
}

    static void
gui_ph_pg_add_buffer(char *name )
{
    char **new_titles = NULL;

    new_titles = (char **) alloc( ( num_panels + 1 ) * sizeof( char ** ) );
    if( new_titles != NULL )
    {
	if( num_panels > 0 )
	    memcpy( new_titles, panel_titles, num_panels * sizeof( char ** ) );

	new_titles[ num_panels++ ] = name;

	PtSetResource( gui.vimPanelGroup, Pt_ARG_PG_PANEL_TITLES, new_titles,
		num_panels );

	vim_free( panel_titles );
	panel_titles = new_titles;
    }
}

    static void
gui_ph_pg_remove_buffer( char *name )
{
    int i;
    char **new_titles = NULL;

    /* If there is only 1 panel, we just use the temporary place holder */
    if( num_panels > 1 )
    {
	new_titles = (char **) alloc( ( num_panels - 1 ) * sizeof( char ** ) );
	if( new_titles != NULL )
	{
	    char **s = new_titles;
	    /* Copy all the titles except the one we're removing */
	    for( i = 0; i < num_panels; i++ )
	    {
		if( STRCMP( panel_titles[ i ], name ) != 0 )
		{
		    *s++ = panel_titles[ i ];
		}
	    }
	    num_panels--;

	    PtSetResource( gui.vimPanelGroup, Pt_ARG_PG_PANEL_TITLES, new_titles,
		    num_panels );

	    vim_free( panel_titles );
	    panel_titles = new_titles;
	}
    }
    else
    {
	num_panels--;
	PtSetResource( gui.vimPanelGroup, Pt_ARG_PG_PANEL_TITLES, &empty_title,
		1 );

	vim_free( panel_titles );
	panel_titles = NULL;
    }
}

/* When a buffer item is deleted from the buffer menu */
    static int
gui_ph_handle_buffer_remove(
	PtWidget_t *widget,
	void *data,
	PtCallbackInfo_t *info )
{
    vimmenu_T *menu;

    if( data != NULL )
    {
	menu = (vimmenu_T *) data;
	gui_ph_pg_remove_buffer( menu->dname );
    }

    return Pt_CONTINUE;
}
#endif

    static int
gui_ph_pane_resize( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
{
    if( PtWidgetIsRealized( widget ) )
    {
	is_ignore_draw = TRUE;
	PtStartFlux( gui.vimContainer );
	PtContainerHold( gui.vimContainer );
    }

    return Pt_CONTINUE;
}

/****************************************************************************/

#ifdef FEAT_MBYTE
    void
gui_ph_encoding_changed( int new_encoding )
{
    /* Default encoding is latin1 */
    char *charset = "latin1";
    int i;

    struct {
	int encoding;
	char *name;
    } charsets[] = {
	{ DBCS_JPN, "SHIFT_JIS" },
	{ DBCS_KOR, "csEUCKR" },
	{ DBCS_CHT, "big5" },
	{ DBCS_CHS, "gb" }
    };

    for( i = 0; i < ARRAY_LENGTH( charsets ); i++ )
    {
	if( new_encoding == charsets[ i ].encoding )
	    charset = charsets[ i ].name;
    }

    charset_translate = PxTranslateSet( charset_translate, charset );
}
#endif

/****************************************************************************/
/****************************************************************************/

    void
gui_mch_prepare(argc, argv)
    int	    *argc;
    char    **argv;
{
    PtInit( NULL );
}

    int
gui_mch_init(void)
{
    PtArg_t args[10];
    int	    flags = 0, n = 0;

    PhDim_t	window_size = {100, 100}; /* Arbitrary values */
    PhPoint_t	pos = {0, 0};

    gui.event_buffer = (PhEvent_t *) alloc( EVENT_BUFFER_SIZE );
    if( gui.event_buffer == NULL )
	return FAIL;

    /* Get a translation so we can convert from ISO Latin-1 to UTF */
    charset_translate = PxTranslateSet( NULL, "latin1" );

    /* The +2 is for the 1 pixel dark line on each side */
    gui.border_offset = gui.border_width = GUI_PH_MARGIN + 2;

    /* Handle close events ourselves */
    PtSetArg( &args[ n++ ], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_CLOSE );
    PtSetArg( &args[ n++ ], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE,
	    Ph_WM_CLOSE | Ph_WM_RESIZE | Ph_WM_FOCUS );
    PtSetArg( &args[ n++ ], Pt_ARG_DIM, &window_size, 0 );
    gui.vimWindow = PtCreateWidget( PtWindow, NULL, n, args );
    if( gui.vimWindow == NULL )
	return FAIL;

    PtAddCallback( gui.vimWindow, Pt_CB_WINDOW, gui_ph_handle_window_cb, NULL );
    PtAddCallback( gui.vimWindow, Pt_CB_WINDOW_OPENING,
	    gui_ph_handle_window_open, NULL );

    n = 0;
    PtSetArg( &args[ n++ ], Pt_ARG_ANCHOR_FLAGS, Pt_ANCHOR_ALL, Pt_IS_ANCHORED );
    PtSetArg( &args[ n++ ], Pt_ARG_DIM, &window_size, 0 );
    PtSetArg( &args[ n++ ], Pt_ARG_POS, &pos, 0 );

#ifdef USE_PANEL_GROUP
    /* Put in a temprary place holder title */
    PtSetArg( &args[ n++ ], Pt_ARG_PG_PANEL_TITLES, &empty_title, 1 );

    gui.vimPanelGroup = PtCreateWidget( PtPanelGroup, gui.vimWindow, n, args );
    if( gui.vimPanelGroup == NULL )
	return FAIL;

    PtAddCallback( gui.vimPanelGroup, Pt_CB_PG_PANEL_SWITCHING,
	    gui_ph_handle_pg_change, NULL );
#else
    /* Turn off all edge decorations */
    PtSetArg( &args[ n++ ], Pt_ARG_BASIC_FLAGS, Pt_FALSE, Pt_ALL );
    PtSetArg( &args[ n++ ], Pt_ARG_BEVEL_WIDTH, 0, 0 );
    PtSetArg( &args[ n++ ], Pt_ARG_MARGIN_WIDTH, 0, 0 );
    PtSetArg( &args[ n++ ], Pt_ARG_MARGIN_HEIGHT, 0, 0 );
    PtSetArg( &args[ n++ ], Pt_ARG_CONTAINER_FLAGS, Pt_TRUE, Pt_AUTO_EXTENT );

    gui.vimContainer = PtCreateWidget( PtPane, gui.vimWindow, n, args );
    if( gui.vimContainer == NULL )
	return FAIL;

    PtAddCallback( gui.vimContainer, Pt_CB_RESIZE, gui_ph_pane_resize, NULL );
#endif

    /* Size for the text area is set in gui_mch_set_text_area_pos */
    n = 0;

    PtSetArg( &args[ n++ ], Pt_ARG_RAW_DRAW_F, gui_ph_handle_raw_draw, 1 );
    PtSetArg( &args[ n++ ], Pt_ARG_BEVEL_WIDTH, GUI_PH_MARGIN, 0 );
    /*
     * Using focus render also causes the whole widget to be redrawn
     * whenever it changes focus, which is very annoying :p
     */
    PtSetArg( &args[ n++ ], Pt_ARG_FLAGS, Pt_TRUE,
	    Pt_GETS_FOCUS | Pt_HIGHLIGHTED );
#ifndef FEAT_MOUSESHAPE
    PtSetArg( &args[ n++ ], Pt_ARG_CURSOR_TYPE, GUI_PH_MOUSE_TYPE, 0 );
    PtSetArg( &args[ n++ ], Pt_ARG_CURSOR_COLOR, gui_ph_mouse_color, 0 );
#endif

    gui.vimTextArea = PtCreateWidget( PtRaw, Pt_DFLT_PARENT, n, args );
    if( gui.vimTextArea == NULL)
	return FAIL;

    /* TODO: use PtAddEventHandlers instead? */
    /* Not using Ph_EV_BUT_REPEAT because vim wouldn't use it anyway */
    PtAddEventHandler( gui.vimTextArea,
	    Ph_EV_BUT_PRESS | Ph_EV_BUT_RELEASE | Ph_EV_PTR_MOTION_BUTTON,
	    gui_ph_handle_mouse, NULL );
    PtAddEventHandler( gui.vimTextArea, Ph_EV_KEY,
	    gui_ph_handle_keyboard, NULL );
    PtAddCallback( gui.vimTextArea, Pt_CB_GOT_FOCUS,
	    gui_ph_handle_focus, NULL );
    PtAddCallback( gui.vimTextArea, Pt_CB_LOST_FOCUS,
	    gui_ph_handle_focus, NULL );

    /*
     * Now that the text area widget has been created, set up the colours,
     * which wil call PtSetResource from gui_mch_new_colors
     */

    /*
     * Create the two timers, not as accurate as using the kernel timer
     * functions, but good enough
     */
    gui_ph_timer_cursor  = PtCreateWidget( PtTimer, gui.vimWindow, 0, NULL );
    if( gui_ph_timer_cursor == NULL )
	return FAIL;

    gui_ph_timer_timeout = PtCreateWidget( PtTimer, gui.vimWindow, 0, NULL );
    if( gui_ph_timer_timeout == NULL )
	return FAIL;

    PtAddCallback( gui_ph_timer_cursor,  Pt_CB_TIMER_ACTIVATE,
	    gui_ph_handle_timer_cursor, NULL);
    PtAddCallback( gui_ph_timer_timeout, Pt_CB_TIMER_ACTIVATE,
	    gui_ph_handle_timer_timeout, NULL);

#ifdef FEAT_MENU
    n = 0;
    PtSetArg( &args[ n++ ], Pt_ARG_WIDTH, window_size.w, 0 );
    PtSetArg( &args[ n++ ], Pt_ARG_ANCHOR_FLAGS, Pt_ANCHOR_LEFT_RIGHT,
	    Pt_IS_ANCHORED );
    gui.vimToolBarGroup = PtCreateWidget( PtToolbarGroup, gui.vimWindow,
	    n, args );
    if( gui.vimToolBarGroup == NULL )
	return FAIL;

    PtAddCallback( gui.vimToolBarGroup, Pt_CB_RESIZE,
	    gui_ph_handle_menu_resize, NULL );

    n = 0;
    flags = 0;
    PtSetArg( &args[ n++ ], Pt_ARG_WIDTH, window_size.w, 0 );
    if( ! vim_strchr( p_go, GO_MENUS ) )
    {
	flags |= Pt_DELAY_REALIZE;
	PtSetArg( &args[ n++ ], Pt_ARG_FLAGS, Pt_TRUE, flags );
    }
    gui.vimMenuBar = PtCreateWidget( PtMenuBar, gui.vimToolBarGroup, n, args );
    if( gui.vimMenuBar == NULL )
	return FAIL;

# ifdef FEAT_TOOLBAR
    n = 0;

    PtSetArg( &args[ n++ ], Pt_ARG_ANCHOR_FLAGS,
	    Pt_ANCHOR_LEFT_RIGHT |Pt_TOP_ANCHORED_TOP, Pt_IS_ANCHORED );
    PtSetArg( &args[ n++ ], Pt_ARG_RESIZE_FLAGS, Pt_TRUE,
	    Pt_RESIZE_Y_AS_REQUIRED );
    PtSetArg( &args[ n++ ], Pt_ARG_WIDTH, window_size.w, 0 );

    flags = Pt_GETS_FOCUS;
    if( ! vim_strchr( p_go, GO_TOOLBAR ) )
	flags |= Pt_DELAY_REALIZE;

    PtSetArg( &args[ n++ ], Pt_ARG_FLAGS, Pt_DELAY_REALIZE, flags );

    gui.vimToolBar = PtCreateWidget( PtToolbar, gui.vimToolBarGroup, n, args );
    if( gui.vimToolBar == NULL )
	return FAIL;

    /*
     * Size for the toolbar is fetched in gui_mch_show_toolbar, after
     * the buttons have been added and the toolbar has resized it's height
     * for the buttons to fit
     */
# endif

#endif

    return OK;
}

    int
gui_mch_init_check(void)
{
    return (is_photon_available == TRUE) ? OK : FAIL;
}

    int
gui_mch_open(void)
{
    gui.norm_pixel =  Pg_BLACK;
    gui.back_pixel =  Pg_WHITE;

    set_normal_colors();

    gui_check_colors();
    gui.def_norm_pixel = gui.norm_pixel;
    gui.def_back_pixel = gui.back_pixel;

    highlight_gui_started();

    if (gui_win_x != -1 && gui_win_y != -1)
	gui_mch_set_winpos(gui_win_x, gui_win_y);

    return (PtRealizeWidget( gui.vimWindow ) == 0) ? OK : FAIL;
}

    void
gui_mch_exit(int rc)
{
    PtDestroyWidget( gui.vimWindow );

    PxTranslateSet( charset_translate, NULL );

    vim_free( gui.event_buffer );

#ifdef USE_PANEL_GROUPS
    vim_free( panel_titles );
#endif
}

/****************************************************************************/
/* events */

/* When no events are available, photon will call this function, working is
 * set to FALSE, and the gui_mch_update loop will exit. */
    static int
exit_gui_mch_update( void *data )
{
    *(int *)data = FALSE;
    return Pt_END;
}

    void
gui_mch_update(void)
{
    int working = TRUE;

    PtAppAddWorkProc( NULL, exit_gui_mch_update, &working );
    while( ( working == TRUE ) && !vim_is_input_buf_full())
    {
	PtProcessEvent();
    }
}

    int
gui_mch_wait_for_chars(int wtime)
{
    is_timeout = FALSE;

    if( wtime > 0 )
	PtSetResource( gui_ph_timer_timeout, Pt_ARG_TIMER_INITIAL, wtime, 0 );

    while( 1 )
    {
	PtProcessEvent();
	if( input_available() )
	{
	    PtSetResource( gui_ph_timer_timeout, Pt_ARG_TIMER_INITIAL, 0, 0 );
	    return OK;
	}
	else if( is_timeout == TRUE )
	    return FAIL;
    }
}

#if defined( FEAT_BROWSE ) || defined( PROTO )
/*
 * Put up a file requester.
 * Returns the selected name in allocated memory, or NULL for Cancel.
 * saving,	    select file to write
 * title	    title for the window
 * default_name	    default name (well duh!)
 * ext		    not used (extension added)
 * initdir	    initial directory, NULL for current dir
 * filter	    not used (file name filter)
 */
    char_u *
gui_mch_browse(
	int saving,
	char_u *title,
	char_u *default_name,
	char_u *ext,
	char_u *initdir,
	char_u *filter)
{
    PtFileSelectionInfo_t file;
    int	    flags;
    char_u  *default_path;
    char_u  *open_text = NULL;

    flags = 0;
    memset( &file, 0, sizeof( file ) );

    default_path = alloc( MAXPATHL + 1 + NAME_MAX + 1 );
    if( default_path != NULL )
    {
	if( saving == TRUE )
	{
	    /* Don't need Pt_FSR_CONFIRM_EXISTING, vim will ask anyway */
	    flags |= Pt_FSR_NO_FCHECK;
	    open_text = "&Save";
	}

	/* combine the directory and filename into a single path */
	if( initdir == NULL || *initdir == NUL )
	{
	    mch_dirname( default_path, MAXPATHL );
	    initdir = default_path;
	}
	else
	{
	    STRCPY( default_path, initdir );
	    initdir = default_path;
	}

	if( default_name != NULL )
	{
	    if( default_path[ STRLEN( default_path ) - 1 ] != '/' )
		STRCAT( default_path, "/" );

	    STRCAT( default_path, default_name );
	}

	/* TODO: add a filter? */
	PtFileSelection(
		gui.vimWindow,
		NULL,
		title,
		default_path,
		NULL,
		open_text,
		NULL,
		NULL,
		&file,
		flags );

	vim_free( default_path );

	if( file.ret == Pt_FSDIALOG_BTN1 )
	    return vim_strsave(file.path);
    }
    return NULL;
}
#endif

#if defined( FEAT_GUI_DIALOG ) || defined( PROTO )
static PtWidget_t *gui_ph_dialog_text = NULL;

    static int
gui_ph_dialog_close( int button, void *data )
{
    PtModalCtrl_t *modal_ctrl = data;
    char_u *dialog_text, *vim_text;

    if( gui_ph_dialog_text != NULL )
    {
	PtGetResource( gui_ph_dialog_text, Pt_ARG_TEXT_STRING, &dialog_text, 0 );
	PtGetResource( gui_ph_dialog_text, Pt_ARG_POINTER, &vim_text, 0 );
	STRNCPY( vim_text, dialog_text, IOSIZE - 1 );
    }

    PtModalUnblock( modal_ctrl, (void *) button );

    return Pt_TRUE;
}

    static int
gui_ph_dialog_text_enter( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
{
    if( info->reason_subtype == Pt_EDIT_ACTIVATE )
	gui_ph_dialog_close( 1, data );
    return Pt_CONTINUE;
}

    static int
gui_ph_dialog_esc( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
{
    PhKeyEvent_t *key;

    key = PhGetData( info->event );
    if( ( key->key_flags & Pk_KF_Cap_Valid ) && ( key->key_cap == Pk_Escape ) )
    {
	gui_ph_dialog_close( 0, data );
	return Pt_CONSUME;
    }
    return Pt_PROCESS;
}

    int
gui_mch_dialog(
	int	type,
	char_u	*title,
	char_u	*message,
	char_u	*buttons,
	int	default_button,
	char_u	*textfield,
	int	ex_cmd)
{
    char_u	*str;
    char_u	**button_array;
    char_u	*buttons_copy;

    int		button_count;
    int		i, len;
    int		dialog_result = -1;

    /* FIXME: the vertical option in guioptions is blatantly ignored */
    /* FIXME: so is the type */

    button_count = len = i = 0;

    if( buttons == NULL || *buttons == NUL )
	return -1;

    /* There is one less separator than buttons, so bump up the button count */
    button_count = 1;

    /* Count string length and number of seperators */
    for( str = buttons; *str; str++ )
    {
	len++;
	if( *str == DLG_BUTTON_SEP )
	    button_count++;
    }

    if ( title == NULL )
	title = "Vim";

    buttons_copy = alloc( len + 1 );
    button_array = (char_u **) alloc( button_count * sizeof( char_u * ) );
    if( buttons_copy != NULL && button_array != NULL )
    {
	STRCPY( buttons_copy, buttons );

	/*
	 * Convert DLG_BUTTON_SEP into NUL's and fill in
	 * button_array with the pointer to each NUL terminated string
	 */
	str = buttons_copy;
	for( i = 0; i < button_count; i++ )
	{
	    button_array[ i ] = str;
	    for( ; *str; str++ )
	    {
		if( *str == DLG_BUTTON_SEP )
		{
		    *str++ = NUL;
		    break;
		}
	    }
	}
#ifndef FEAT_GUI_TEXTDIALOG
	dialog_result = PtAlert(
		gui.vimWindow, NULL,
		title,
		NULL,
		message, NULL,
		button_count, (const char **) button_array, NULL,
		default_button, 0, Pt_MODAL );
#else
	/* Writing the dialog ourselves lets us add extra features, like
	 * trapping the escape key and returning 0 to vim */
	{
	    int n;
	    PtArg_t args[5];
	    PtWidget_t *dialog, *pane;
	    PtModalCtrl_t modal_ctrl;
	    PtDialogInfo_t di;

	    memset( &di, 0, sizeof( di ) );
	    memset( &modal_ctrl, 0, sizeof( modal_ctrl ) );

	    n = 0;
	    PtSetArg( &args[n++], Pt_ARG_GROUP_ROWS_COLS, 0, 0 );
	    PtSetArg( &args[n++], Pt_ARG_WIDTH, 350, 0 );
	    PtSetArg( &args[n++], Pt_ARG_GROUP_ORIENTATION,
		    Pt_GROUP_VERTICAL, 0 );
	    PtSetArg( &args[n++], Pt_ARG_GROUP_FLAGS,
		    Pt_TRUE, Pt_GROUP_NO_KEYS | Pt_GROUP_STRETCH_HORIZONTAL );
	    PtSetArg( &args[n++], Pt_ARG_CONTAINER_FLAGS, Pt_FALSE, Pt_TRUE );
	    pane = PtCreateWidget( PtGroup, NULL, n, args );

	    n = 0;
	    PtSetArg( &args[n++], Pt_ARG_TEXT_STRING, message, 0 );
	    PtCreateWidget( PtLabel, pane, n, args );

	    if( textfield != NULL )
	    {
		n = 0;
		PtSetArg( &args[n++], Pt_ARG_MAX_LENGTH, IOSIZE - 1, 0 );
		PtSetArg( &args[n++], Pt_ARG_TEXT_STRING, textfield, 0 );
		PtSetArg( &args[n++], Pt_ARG_POINTER, textfield, 0 );
		gui_ph_dialog_text = PtCreateWidget( PtText, pane, n, args );
		PtAddCallback( gui_ph_dialog_text, Pt_CB_ACTIVATE,
			gui_ph_dialog_text_enter, &modal_ctrl );
	    }

	    di.parent = gui.vimWindow;
	    di.pane = pane;
	    di.title = title;
	    di.buttons = (const char **) button_array;
	    di.nbtns = button_count;
	    di.def_btn = default_button;
	    /* This is just to give the dialog the close button.
	     * We check for the Escape key ourselves and return 0 */
	    di.esc_btn = button_count;
	    di.callback = gui_ph_dialog_close;
	    di.data = &modal_ctrl;

	    dialog = PtCreateDialog( &di );
	    PtAddFilterCallback( dialog, Ph_EV_KEY,
		    gui_ph_dialog_esc, &modal_ctrl );

	    if( gui_ph_dialog_text != NULL )
		PtGiveFocus( gui_ph_dialog_text, NULL );

	    /* Open dialog, block the vim window and wait for the dialog to close */
	    PtRealizeWidget( dialog );
	    PtMakeModal( dialog, Ph_CURSOR_NOINPUT, Ph_CURSOR_DEFAULT_COLOR );
	    dialog_result = (int) PtModalBlock( &modal_ctrl, 0 );

	    PtDestroyWidget( dialog );
	    gui_ph_dialog_text = NULL;
	}
#endif
    }

    vim_free( button_array );
    vim_free( buttons_copy );

    return dialog_result;
}
#endif
/****************************************************************************/
/* window size/position/state */

    int
gui_mch_get_winpos(int *x, int *y)
{
    PhPoint_t *pos;

    pos = PtWidgetPos( gui.vimWindow, NULL );

    *x = pos->x;
    *y = pos->y;

    return OK;
}

    void
gui_mch_set_winpos(int x, int y)
{
    PhPoint_t pos = { x, y };

    PtSetResource( gui.vimWindow, Pt_ARG_POS, &pos, 0 );
}

    void
gui_mch_set_shellsize(int width, int height,
	int min_width, int min_height, int base_width, int base_height,
	int direction)
{
    PhDim_t window_size = { width, height };
    PhDim_t min_size = { min_width, min_height };

#ifdef USE_PANEL_GROUP
    window_size.w += pg_margin_left + pg_margin_right;
    window_size.h += pg_margin_top + pg_margin_bottom;
#endif

    PtSetResource( gui.vimWindow, Pt_ARG_MINIMUM_DIM, &min_size, 0 );
    PtSetResource( gui.vimWindow, Pt_ARG_DIM, &window_size, 0 );

    if( ! PtWidgetIsRealized( gui.vimWindow ) )
	gui_ph_resize_container();
}

/*
 * Return the amount of screen space that hasn't been allocated (such as
 * by the shelf).
 */
    void
gui_mch_get_screen_dimensions(int *screen_w, int *screen_h)
{
    PhRect_t console;

    PhWindowQueryVisible( Ph_QUERY_WORKSPACE, 0,
	    PhInputGroup( NULL ), &console );

    *screen_w = console.lr.x - console.ul.x + 1;
    *screen_h = console.lr.y - console.ul.y + 1;
}

    void
gui_mch_iconify(void)
{
    PhWindowEvent_t event;

    memset( &event, 0, sizeof (event) );
    event.event_f = Ph_WM_HIDE;
    event.event_state = Ph_WM_EVSTATE_HIDE;
    event.rid = PtWidgetRid( gui.vimWindow );
    PtForwardWindowEvent( &event );
}

#if defined(FEAT_EVAL) || defined(PROTO)
/*
 * Bring the Vim window to the foreground.
 */
    void
gui_mch_set_foreground()
{
    PhWindowEvent_t event;

    memset( &event, 0, sizeof (event) );
    event.event_f = Ph_WM_TOFRONT;
    event.event_state = Ph_WM_EVSTATE_FFRONT;
    event.rid = PtWidgetRid( gui.vimWindow );
    PtForwardWindowEvent( &event );
}
#endif

    void
gui_mch_settitle(char_u *title,	char_u *icon)
{
#ifdef USE_PANEL_GROUP
    gui_ph_pg_set_buffer_num( curwin->w_buffer->b_fnum );
#endif
    PtSetResource( gui.vimWindow, Pt_ARG_WINDOW_TITLE, title, 0 );
    /* Not sure what to do with the icon text, set balloon text somehow? */
}

/****************************************************************************/
/* Scrollbar */

    void
gui_mch_set_scrollbar_thumb(scrollbar_T *sb, int val, int size, int max)
{
    int	    n = 0;
    PtArg_t args[3];

    PtSetArg( &args[ n++ ], Pt_ARG_MAXIMUM, max, 0 );
    PtSetArg( &args[ n++ ], Pt_ARG_SLIDER_SIZE, size, 0 );
    PtSetArg( &args[ n++ ], Pt_ARG_GAUGE_VALUE, val, 0 );
    PtSetResources( sb->id, n, args );
}

    void
gui_mch_set_scrollbar_pos(scrollbar_T *sb, int x, int y, int w, int h)
{
    PhArea_t area = {{ x, y }, { w, h }};

    PtSetResource( sb->id, Pt_ARG_AREA, &area, 0 );
}

    void
gui_mch_create_scrollbar(scrollbar_T *sb, int orient)
{
    int	    n = 0;
/*    int	    anchor_flags = 0;*/
    PtArg_t args[4];

    /*
     * Stop the scrollbar from being realized when the parent
     * is realized, so it can be explicitly realized by vim.
     *
     * Also, don't let the scrollbar get focus
     */
    PtSetArg( &args[ n++ ], Pt_ARG_FLAGS, Pt_DELAY_REALIZE,
	    Pt_DELAY_REALIZE | Pt_GETS_FOCUS );
    PtSetArg( &args[ n++ ], Pt_ARG_SCROLLBAR_FLAGS, Pt_SCROLLBAR_SHOW_ARROWS, 0);
#if 0
    /* Don't need this anchoring for the scrollbars */
    if( orient == SBAR_HORIZ )
    {
	anchor_flags = Pt_BOTTOM_ANCHORED_BOTTOM |
	    Pt_LEFT_ANCHORED_LEFT | Pt_RIGHT_ANCHORED_RIGHT;
    }
    else
    {
	anchor_flags = Pt_BOTTOM_ANCHORED_BOTTOM | Pt_TOP_ANCHORED_TOP;
	if( sb->wp != NULL )
	{
	    if( sb == &sb->wp->w_scrollbars[ SBAR_LEFT ] )
		anchor_flags |= Pt_LEFT_ANCHORED_LEFT;
	    else
		anchor_flags |= Pt_RIGHT_ANCHORED_RIGHT;
	}
    }
    PtSetArg( &args[ n++ ], Pt_ARG_ANCHOR_FLAGS, anchor_flags, Pt_IS_ANCHORED );
#endif
    PtSetArg( &args[ n++ ], Pt_ARG_ORIENTATION,
	    (orient == SBAR_HORIZ) ? Pt_HORIZONTAL : Pt_VERTICAL, 0 );
#ifdef USE_PANEL_GROUP
    sb->id = PtCreateWidget( PtScrollbar, gui.vimPanelGroup, n, args );
#else
    sb->id = PtCreateWidget( PtScrollbar, gui.vimContainer, n, args );
#endif

    PtAddCallback( sb->id, Pt_CB_SCROLLBAR_MOVE, gui_ph_handle_scrollbar, sb );
}

    void
gui_mch_enable_scrollbar(scrollbar_T *sb, int flag)
{
    if( flag != 0 )
	PtRealizeWidget( sb->id );
    else
	PtUnrealizeWidget( sb->id );
}

    void
gui_mch_destroy_scrollbar(scrollbar_T *sb)
{
    PtDestroyWidget( sb->id );
    sb->id = NULL;
}

/****************************************************************************/
/* Mouse functions */

#if defined(FEAT_MOUSESHAPE) || defined(PROTO)
/* The last set mouse pointer shape is remembered, to be used when it goes
 * from hidden to not hidden. */
static int last_shape = 0;

/* Table for shape IDs.  Keep in sync with the mshape_names[] table in
 * misc2.c! */
static int mshape_ids[] =
{
    Ph_CURSOR_POINTER,		/* arrow */
    Ph_CURSOR_NONE,		/* blank */
    Ph_CURSOR_INSERT,		/* beam */
    Ph_CURSOR_DRAG_VERTICAL,	/* updown */
    Ph_CURSOR_DRAG_VERTICAL,	/* udsizing */
    Ph_CURSOR_DRAG_HORIZONTAL,	/* leftright */
    Ph_CURSOR_DRAG_HORIZONTAL,	/* lrsizing */
    Ph_CURSOR_WAIT,		/* busy */
    Ph_CURSOR_DONT,		/* no */
    Ph_CURSOR_CROSSHAIR,	/* crosshair */
    Ph_CURSOR_FINGER,		/* hand1 */
    Ph_CURSOR_FINGER,		/* hand2 */
    Ph_CURSOR_FINGER,		/* pencil */
    Ph_CURSOR_QUESTION_POINT,	/* question */
    Ph_CURSOR_POINTER,		/* right-arrow */
    Ph_CURSOR_POINTER,		/* up-arrow */
    Ph_CURSOR_POINTER		/* last one */
};

    void
mch_set_mouse_shape(shape)
    int	shape;
{
    int	    id;

    if (!gui.in_use)
	return;

    if (shape == MSHAPE_HIDE || gui.pointer_hidden)
	PtSetResource( gui.vimTextArea, Pt_ARG_CURSOR_TYPE, Ph_CURSOR_NONE,
		0 );
    else
    {
	if (shape >= MSHAPE_NUMBERED)
	    id = Ph_CURSOR_POINTER;
	else
	    id = mshape_ids[shape];

	PtSetResource( gui.vimTextArea, Pt_ARG_CURSOR_TYPE, id,	0 );
    }
    if (shape != MSHAPE_HIDE)
	last_shape = shape;
}
#endif

    void
gui_mch_mousehide(int hide)
{
    if( gui.pointer_hidden != hide )
    {
	gui.pointer_hidden = hide;
#ifdef FEAT_MOUSESHAPE
	if( hide )
	    PtSetResource( gui.vimTextArea, Pt_ARG_CURSOR_TYPE,
		    Ph_CURSOR_NONE, 0 );
	else
	    mch_set_mouse_shape( last_shape );
#else
	PtSetResource( gui.vimTextArea, Pt_ARG_CURSOR_TYPE,
		( hide == MOUSE_SHOW ) ? GUI_PH_MOUSE_TYPE : Ph_CURSOR_NONE,
		0 );
#endif
    }
}

    void
gui_mch_getmouse(int *x, int *y)
{
    PhCursorInfo_t info;
    short ix, iy;

    /* FIXME: does this return the correct position,
     * with respect to the border? */
    PhQueryCursor( PhInputGroup( NULL ), &info );
    PtGetAbsPosition( gui.vimTextArea , &ix, &iy );

    *x = info.pos.x - ix;
    *y = info.pos.y - iy;
}

    void
gui_mch_setmouse(int x, int y)
{
    short abs_x, abs_y;

    PtGetAbsPosition( gui.vimTextArea, &abs_x, &abs_y );
    /* Add the border offset? */
    PhMoveCursorAbs( PhInputGroup( NULL ), abs_x + x, abs_y + y );
}

/****************************************************************************/
/* Colours */

/*
 * Return the RGB value of a pixel as a long.
 */
    long_u
gui_mch_get_rgb(guicolor_T pixel)
{
    return PgRGB(PgRedValue(pixel), PgGreenValue(pixel), PgBlueValue(pixel));
}

    void
gui_mch_new_colors(void)
{
#if 0 /* Don't bother changing the cursor colour */
    short color_diff;

    /*
     * If there isn't enough difference between the background colour and
     * the mouse pointer colour then change the mouse pointer colour
     */
    color_diff = gui_get_lightness(gui_ph_mouse_color)
					  - gui_get_lightness(gui.back_pixel);

    if( abs( color_diff ) < 64 )
    {
	short r, g, b;
	/* not a great algorithm... */
	r = PgRedValue( gui_ph_mouse_color ) ^ 255;
	g = PgGreenValue( gui_ph_mouse_color ) ^ 255;
	b = PgBlueValue( gui_ph_mouse_color ) ^ 255;

#ifndef FEAT_MOUSESHAPE
	gui_ph_mouse_color = PgRGB( r, g, b );
	PtSetResource( gui.vimTextArea, Pt_ARG_CURSOR_COLOR,
		gui_ph_mouse_color, 0 );
#endif
    }
#endif

    PtSetResource( gui.vimTextArea, Pt_ARG_FILL_COLOR, gui.back_pixel, 0 );
}

    static int
hex_digit(int c)
{
    if (VIM_ISDIGIT(c))
	return c - '0';
    c = TOLOWER_ASC(c);
    if (c >= 'a' && c <= 'f')
	return c - 'a' + 10;
    return -1000;
}


/*
 * This should be split out into a separate file,
 * every port does basically the same thing.
 *
 * This is the gui_w32.c version (i think..)
 * Return INVALCOLOR when failed.
 */

    guicolor_T
gui_mch_get_color(char_u *name)
{
    int i;
    int r, g, b;


    typedef struct GuiColourTable
    {
	char	    *name;
	guicolor_T     colour;
    } GuiColourTable;

    static GuiColourTable table[] =
    {
	{"Black",	    RGB(0x00, 0x00, 0x00)},
	{"DarkGray",	    RGB(0x80, 0x80, 0x80)},
	{"DarkGrey",	    RGB(0x80, 0x80, 0x80)},
	{"Gray",	    RGB(0xC0, 0xC0, 0xC0)},
	{"Grey",	    RGB(0xC0, 0xC0, 0xC0)},
	{"LightGray",	    RGB(0xD3, 0xD3, 0xD3)},
	{"LightGrey",	    RGB(0xD3, 0xD3, 0xD3)},
	{"Gray10",	    RGB(0x1A, 0x1A, 0x1A)},
	{"Grey10",	    RGB(0x1A, 0x1A, 0x1A)},
	{"Gray20",	    RGB(0x33, 0x33, 0x33)},
	{"Grey20",	    RGB(0x33, 0x33, 0x33)},
	{"Gray30",	    RGB(0x4D, 0x4D, 0x4D)},
	{"Grey30",	    RGB(0x4D, 0x4D, 0x4D)},
	{"Gray40",	    RGB(0x66, 0x66, 0x66)},
	{"Grey40",	    RGB(0x66, 0x66, 0x66)},
	{"Gray50",	    RGB(0x7F, 0x7F, 0x7F)},
	{"Grey50",	    RGB(0x7F, 0x7F, 0x7F)},
	{"Gray60",	    RGB(0x99, 0x99, 0x99)},
	{"Grey60",	    RGB(0x99, 0x99, 0x99)},
	{"Gray70",	    RGB(0xB3, 0xB3, 0xB3)},
	{"Grey70",	    RGB(0xB3, 0xB3, 0xB3)},
	{"Gray80",	    RGB(0xCC, 0xCC, 0xCC)},
	{"Grey80",	    RGB(0xCC, 0xCC, 0xCC)},
	{"Gray90",	    RGB(0xE5, 0xE5, 0xE5)},
	{"Grey90",	    RGB(0xE5, 0xE5, 0xE5)},
	{"White",	    RGB(0xFF, 0xFF, 0xFF)},
	{"DarkRed",	    RGB(0x80, 0x00, 0x00)},
	{"Red",		    RGB(0xFF, 0x00, 0x00)},
	{"LightRed",	    RGB(0xFF, 0xA0, 0xA0)},
	{"DarkBlue",	    RGB(0x00, 0x00, 0x80)},
	{"Blue",	    RGB(0x00, 0x00, 0xFF)},
	{"LightBlue",	    RGB(0xA0, 0xA0, 0xFF)},
	{"DarkGreen",	    RGB(0x00, 0x80, 0x00)},
	{"Green",	    RGB(0x00, 0xFF, 0x00)},
	{"LightGreen",	    RGB(0xA0, 0xFF, 0xA0)},
	{"DarkCyan",	    RGB(0x00, 0x80, 0x80)},
	{"Cyan",	    RGB(0x00, 0xFF, 0xFF)},
	{"LightCyan",	    RGB(0xA0, 0xFF, 0xFF)},
	{"DarkMagenta",	    RGB(0x80, 0x00, 0x80)},
	{"Magenta",	    RGB(0xFF, 0x00, 0xFF)},
	{"LightMagenta",    RGB(0xFF, 0xA0, 0xFF)},
	{"Brown",	    RGB(0x80, 0x40, 0x40)},
	{"Yellow",	    RGB(0xFF, 0xFF, 0x00)},
	{"LightYellow",	    RGB(0xFF, 0xFF, 0xA0)},
	{"SeaGreen",	    RGB(0x2E, 0x8B, 0x57)},
	{"Orange",	    RGB(0xFF, 0xA5, 0x00)},
	{"Purple",	    RGB(0xA0, 0x20, 0xF0)},
	{"SlateBlue",	    RGB(0x6A, 0x5A, 0xCD)},
	{"Violet",	    RGB(0xEE, 0x82, 0xEE)},
    };

    /* is name #rrggbb format? */
    if( name[0] == '#' && STRLEN( name ) == 7 )
    {
	r = hex_digit( name[1] ) * 16 + hex_digit( name[2] );
	g = hex_digit( name[3] ) * 16 + hex_digit( name[4] );
	b = hex_digit( name[5] ) * 16 + hex_digit( name[6] );
	if( r < 0 || g < 0 || b < 0 )
	    return INVALCOLOR;
	return RGB(r, g, b);
    }

    for( i = 0; i < ARRAY_LENGTH( table ); i++ )
    {
	if( STRICMP( name, table[i].name ) == 0 )
	    return table[i].colour;
    }

    /*
     * Last attempt. Look in the file "$VIMRUNTIME/rgb.txt".
     */
    {
#define LINE_LEN 100
	FILE	*fd;
	char	line[LINE_LEN];
	char_u	*fname;

	fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt");
	if (fname == NULL)
	    return INVALCOLOR;

	fd = fopen((char *)fname, "rt");
	vim_free(fname);
	if (fd == NULL)
	    return INVALCOLOR;

	while (!feof(fd))
	{
	    int	    len;
	    int	    pos;
	    char    *color;

	    fgets(line, LINE_LEN, fd);
	    len = STRLEN(line);

	    if (len <= 1 || line[len-1] != '\n')
		continue;

	    line[len-1] = '\0';

	    i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
	    if (i != 3)
		continue;

	    color = line + pos;

	    if (STRICMP(color, name) == 0)
	    {
		fclose(fd);
		return (guicolor_T)RGB(r, g, b);
	    }
	}

	fclose(fd);
    }


    return INVALCOLOR;
}

    void
gui_mch_set_fg_color(guicolor_T color)
{
    PgSetTextColor( color );
}

    void
gui_mch_set_bg_color(guicolor_T color)
{
    PgSetFillColor( color );
}

    void
gui_mch_set_sp_color(guicolor_T color)
{
}

    void
gui_mch_invert_rectangle(int row, int col, int nr, int nc)
{
    PhRect_t rect;

    rect.ul.x = FILL_X( col );
    rect.ul.y = FILL_Y( row );

    /* FIXME: This has an off by one pixel problem */
    rect.lr.x = rect.ul.x + nc * gui.char_width;
    rect.lr.y = rect.ul.y + nr * gui.char_height;
    if( nc > 0 )
	rect.lr.x -= 1;
    if( nr > 0 )
	rect.lr.y -= 1;

    DRAW_START;
    PgSetDrawMode( Pg_DrawModeDSTINVERT );
    PgDrawRect( &rect, Pg_DRAW_FILL );
    PgSetDrawMode( Pg_DrawModeSRCCOPY );
    DRAW_END;
}

    void
gui_mch_clear_block(int row1, int col1, int row2, int col2)
{
    PhRect_t block = {
	{ FILL_X( col1 ), FILL_Y( row1 ) },
	{ FILL_X( col2 + 1 ) - 1, FILL_Y( row2 + 1 ) - 1}
    };

    DRAW_START;
    gui_mch_set_bg_color( gui.back_pixel );
    PgDrawRect( &block, Pg_DRAW_FILL );
    DRAW_END;
}

    void
gui_mch_clear_all()
{
    PhRect_t text_rect = {
	{ gui.border_width, gui.border_width },
	{ Columns * gui.char_width + gui.border_width - 1 ,
	    Rows * gui.char_height + gui.border_width - 1 }
    };

    if( is_ignore_draw == TRUE )
	return;

    DRAW_START;
    gui_mch_set_bg_color( gui.back_pixel );
    PgDrawRect( &text_rect, Pg_DRAW_FILL );
    DRAW_END;
}

    void
gui_mch_delete_lines(int row, int num_lines)
{
    PhRect_t    rect;
    PhPoint_t   delta;

    rect.ul.x = FILL_X( gui.scroll_region_left );
    rect.ul.y = FILL_Y( row + num_lines );

    rect.lr.x = FILL_X( gui.scroll_region_right + 1 ) - 1;
    rect.lr.y = FILL_Y( gui.scroll_region_bot + 1) - 1;

    PtWidgetOffset( gui.vimTextArea, &gui_ph_raw_offset );
    PhTranslatePoint( &gui_ph_raw_offset, PtWidgetPos(gui.vimTextArea, NULL));
    PhTranslateRect( &rect, &gui_ph_raw_offset );

    delta.x = 0;
    delta.y = -num_lines * gui.char_height;

    PgFlush();

    PhBlit( PtWidgetRid( PtFindDisjoint( gui.vimTextArea ) ), &rect, &delta );

    gui_clear_block(
	gui.scroll_region_bot - num_lines + 1,
	gui.scroll_region_left,
	gui.scroll_region_bot,
	gui.scroll_region_right );
}

    void
gui_mch_insert_lines(int row, int num_lines)
{
    PhRect_t    rect;
    PhPoint_t   delta;

    rect.ul.x = FILL_X( gui.scroll_region_left );
    rect.ul.y = FILL_Y( row );

    rect.lr.x = FILL_X( gui.scroll_region_right + 1 ) - 1;
    rect.lr.y = FILL_Y( gui.scroll_region_bot - num_lines + 1 ) - 1;

    PtWidgetOffset( gui.vimTextArea, &gui_ph_raw_offset );
    PhTranslatePoint( &gui_ph_raw_offset, PtWidgetPos( gui.vimTextArea, NULL ) );
    PhTranslateRect( &rect, &gui_ph_raw_offset );

    delta.x = 0;
    delta.y = num_lines * gui.char_height;

    PgFlush();

    PhBlit( PtWidgetRid( PtFindDisjoint( gui.vimTextArea ) ) , &rect, &delta );

    gui_clear_block( row, gui.scroll_region_left,
	    row + num_lines - 1, gui.scroll_region_right );
}

    void
gui_mch_draw_string(int row, int col, char_u *s, int len, int flags)
{
    static char *utf8_buffer = NULL;
    static int	utf8_len = 0;

    PhPoint_t	pos = { TEXT_X( col ), TEXT_Y( row ) };
    PhRect_t	rect;

    if( is_ignore_draw == TRUE )
	return;

    DRAW_START;

    if( !( flags & DRAW_TRANSP ) )
    {
	PgDrawIRect(
		FILL_X( col ), FILL_Y( row ),
		FILL_X( col + len ) - 1, FILL_Y( row + 1 ) - 1,
		Pg_DRAW_FILL );
    }

    if( flags & DRAW_UNDERL )
	PgSetUnderline( gui.norm_pixel, Pg_TRANSPARENT, 0 );

    if( charset_translate != NULL
#ifdef FEAT_MBYTE
	    && enc_utf8 == 0
#endif
	    )
    {
	int src_taken, dst_made;

	/* Use a static buffer to avoid large amounts of de/allocations */
	if( utf8_len < len )
	{
	    utf8_buffer = realloc( utf8_buffer, len * MB_LEN_MAX );
	    utf8_len = len;
	}

	PxTranslateToUTF(
		charset_translate,
		s,
		len,
		&src_taken,
		utf8_buffer,
		utf8_len,
		&dst_made );
	s = utf8_buffer;
	len = dst_made;
    }

    PgDrawText( s, len, &pos, 0 );

    if( flags & DRAW_BOLD )
    {
	/* FIXME: try and only calculate these values once... */
	rect.ul.x = FILL_X( col ) + 1;
	rect.ul.y = FILL_Y( row );
	rect.lr.x = FILL_X( col + len ) - 1;
	rect.lr.y = FILL_Y( row + 1) - 1;
	/* PgSetUserClip( NULL ) causes the scrollbar to not redraw... */
#if 0
	pos.x++;

	PgSetUserClip( &rect );
	PgDrawText( s, len, &pos, 0 );
	PgSetUserClip( NULL );
#else
	rect.lr.y -= ( p_linespace + 1 ) / 2;
	/* XXX: DrawTextArea doesn't work with phditto */
	PgDrawTextArea( s, len, &rect, Pg_TEXT_BOTTOM );
#endif
    }

    if( flags & DRAW_UNDERL )
	PgSetUnderline( Pg_TRANSPARENT, Pg_TRANSPARENT, 0 );

    DRAW_END;
}

/****************************************************************************/
/* Cursor */

    void
gui_mch_draw_hollow_cursor(guicolor_T color)
{
    PhRect_t r;

    /* FIXME: Double width characters */

    r.ul.x = FILL_X( gui.col );
    r.ul.y = FILL_Y( gui.row );
    r.lr.x = r.ul.x + gui.char_width - 1;
    r.lr.y = r.ul.y + gui.char_height - 1;

    DRAW_START;
    PgSetStrokeColor( color );
    PgDrawRect( &r, Pg_DRAW_STROKE );
    DRAW_END;
}

    void
gui_mch_draw_part_cursor(int w, int h, guicolor_T color)
{
    PhRect_t r;

    r.ul.x = FILL_X( gui.col );
    r.ul.y = FILL_Y( gui.row ) + gui.char_height - h;
    r.lr.x = r.ul.x + w - 1;
    r.lr.y = r.ul.y + h - 1;

    DRAW_START;
    gui_mch_set_bg_color( color );
    PgDrawRect( &r, Pg_DRAW_FILL );
    DRAW_END;
}

    void
gui_mch_set_blinking(long wait, long on, long off)
{
    blink_waittime = wait;
    blink_ontime = on;
    blink_offtime = off;
}

    void
gui_mch_start_blink(void)
{
    /* Only turn on the timer on if none of the times are zero */
    if( blink_waittime && blink_ontime && blink_offtime && gui.in_focus)
    {
	PtSetResource( gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL,
		blink_waittime, 0 );
	blink_state = BLINK_ON;
	gui_update_cursor(TRUE, FALSE);
    }
}

    void
gui_mch_stop_blink(void)
{
    PtSetResource( gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL, 0, 0 );

    if( blink_state == BLINK_OFF )
	gui_update_cursor(TRUE, FALSE);

    blink_state = BLINK_NONE;
}

/****************************************************************************/
/* miscellaneous functions */

    void
gui_mch_beep(void)
{
    PtBeep();
}

    void
gui_mch_flash(int msec)
{
    PgSetFillXORColor( Pg_BLACK, Pg_WHITE );
    PgSetDrawMode( Pg_DRAWMODE_XOR );
    gui_mch_clear_all();
    gui_mch_flush();

    ui_delay( (long) msec, TRUE );

    gui_mch_clear_all();
    PgSetDrawMode( Pg_DRAWMODE_OPAQUE );
    gui_mch_flush();
}

    void
gui_mch_flush(void)
{
    PgFlush();
}

    void
gui_mch_set_text_area_pos(int x, int y, int w, int h)
{
    PhArea_t area = {{x, y}, {w, h}};

    PtSetResource( gui.vimTextArea, Pt_ARG_AREA, &area, 0 );
}

    int
gui_mch_haskey(char_u *name)
{
    int i;

    for (i = 0; special_keys[i].key_sym != 0; i++)
	if (name[0] == special_keys[i].vim_code0 &&
		 name[1] == special_keys[i].vim_code1)
	    return OK;
    return FAIL;
}

/****************************************************************************/
/* Menu */

#ifdef FEAT_TOOLBAR
#include "toolbar.phi"

static PhImage_t *gui_ph_toolbar_images[] = {
    &tb_new_phi,
    &tb_open_phi,
    &tb_save_phi,
    &tb_undo_phi,
    &tb_redo_phi,
    &tb_cut_phi,
    &tb_copy_phi,
    &tb_paste_phi,
    &tb_print_phi,
    &tb_help_phi,
    &tb_find_phi,
    &tb_save_all_phi,
    &tb_save_session_phi,
    &tb_new_session_phi,
    &tb_load_session_phi,
    &tb_macro_phi,
    &tb_replace_phi,
    &tb_close_phi,
    &tb_maximize_phi,
    &tb_minimize_phi,
    &tb_split_phi,
    &tb_shell_phi,
    &tb_find_prev_phi,
    &tb_find_next_phi,
    &tb_find_help_phi,
    &tb_make_phi,
    &tb_jump_phi,
    &tb_ctags_phi,
    &tb_vsplit_phi,
    &tb_maxwidth_phi,
    &tb_minwidth_phi
};

static PhImage_t *
gui_ph_toolbar_load_icon( char_u *iconfile )
{
    static PhImage_t external_icon;
    PhImage_t *temp_phi = NULL;

    temp_phi = PxLoadImage( iconfile, NULL );
    if( temp_phi != NULL )
    {
	/* The label widget will free the image/palette/etc. for us when
	 * it's destroyed */
	temp_phi->flags |= Ph_RELEASE_IMAGE_ALL;
	memcpy( &external_icon, temp_phi, sizeof( external_icon ) );
	free( temp_phi );

	temp_phi = &external_icon;
    }
    return temp_phi;
}

/*
 * This returns either a builtin icon image, an external image or NULL
 * if it can't find either.  The caller can't and doesn't need to try and
 * free() the returned image, and it can't store the image pointer.
 * (When setting the Pt_ARG_LABEL_IMAGE resource, the contents of the
 * PhImage_t are copied, and the original PhImage_t aren't needed anymore).
 */
static PhImage_t *
gui_ph_toolbar_find_icon( vimmenu_T *menu )
{
    char_u full_pathname[ MAXPATHL + 1 ];
    PhImage_t *icon = NULL;

    if( menu->icon_builtin == FALSE )
    {
	if( menu->iconfile != NULL )
	    /* TODO: use gui_find_iconfile() */
	    icon = gui_ph_toolbar_load_icon( menu->iconfile );

	/* TODO: Restrict loading to just .png? Search for any format? */
	if( ( icon == NULL ) &&
	    ( ( gui_find_bitmap( menu->name, full_pathname, "gif" ) == OK ) ||
	      ( gui_find_bitmap( menu->name, full_pathname, "png" ) == OK ) ) )
	    icon = gui_ph_toolbar_load_icon( full_pathname );

	if( icon != NULL )
	    return icon;
    }

    if( menu->iconidx >= 0 &&
	    ( menu->iconidx < ARRAY_LENGTH( gui_ph_toolbar_images ) ) )
    {
	return gui_ph_toolbar_images[menu->iconidx];
    }

    return NULL;
}
#endif

#if defined( FEAT_MENU ) || defined( PROTO )
    void
gui_mch_enable_menu(int flag)
{
    if( flag != 0 )
	PtRealizeWidget( gui.vimMenuBar );
    else
	PtUnrealizeWidget( gui.vimMenuBar );
}

    void
gui_mch_set_menu_pos(int x, int y, int w, int h)
{
    /* Nothing */
}

/* Change the position of a menu button in the parent */
    static void
gui_ph_position_menu( PtWidget_t *widget, int priority )
{
    PtWidget_t	*traverse;
    vimmenu_T	*menu;

    traverse = PtWidgetChildBack( PtWidgetParent( widget ) );

    /* Iterate through the list of widgets in traverse, until
     * we find the position we want to insert our widget into */
    /* TODO: traverse from front to back, possible speedup? */
    while( traverse != NULL )
    {
	PtGetResource( traverse, Pt_ARG_POINTER, &menu, 0 );

	if( menu != NULL &&
		priority < menu->priority &&
		widget != traverse )
	{
	    /* Insert the widget before the current traverse widget */
	    PtWidgetInsert( widget, traverse, 1 );
	    return;
	}

	traverse = PtWidgetBrotherInFront( traverse );
    }
}

/* the index is ignored because it's not useful for our purposes */
    void
gui_mch_add_menu(vimmenu_T *menu, int index)
{
    vimmenu_T	*parent = menu->parent;
    char_u	*accel_key;
    char_u	mnemonic_str[MB_LEN_MAX];
    int	    n;
    PtArg_t args[5];

    menu->submenu_id = menu->id = NULL;

    if( menu_is_menubar( menu->name ) )
    {

	accel_key = vim_strchr( menu->name, '&' );
	if( accel_key != NULL )
	{
	    mnemonic_str[0] = accel_key[1];
	    mnemonic_str[1] = NUL;
	}

	/* Create the menu button */
	n = 0;
	PtSetArg( &args[ n++ ], Pt_ARG_TEXT_STRING, menu->dname, 0 );
	PtSetArg( &args[ n++ ], Pt_ARG_ACCEL_TEXT, menu->actext, 0 );
	if( accel_key != NULL )
	    PtSetArg( &args[ n++ ], Pt_ARG_ACCEL_KEY, mnemonic_str, 0 );
	PtSetArg( &args[ n++ ], Pt_ARG_POINTER, menu, 0 );

	if( parent != NULL )
	    PtSetArg( &args[ n++ ], Pt_ARG_BUTTON_TYPE, Pt_MENU_RIGHT, 0 );

	menu->id = PtCreateWidget( PtMenuButton,
		(parent == NULL) ? gui.vimMenuBar : parent->submenu_id,
		n, args );

	PtAddCallback( menu->id, Pt_CB_ARM, gui_ph_handle_pulldown_menu, menu );

	/* Create the actual menu */
	n = 0;
	if( parent != NULL )
	    PtSetArg( &args[ n++ ], Pt_ARG_MENU_FLAGS, Pt_TRUE, Pt_MENU_CHILD );

	menu->submenu_id = PtCreateWidget( PtMenu, menu->id, n, args );

	if( parent == NULL )
	{
	    PtAddCallback( menu->submenu_id, Pt_CB_UNREALIZED,
		    gui_ph_handle_menu_unrealized, menu );

	    if( menu->mnemonic != 0 )
	    {
		PtAddHotkeyHandler( gui.vimWindow, tolower( menu->mnemonic ),
			Pk_KM_Alt, 0, menu, gui_ph_handle_pulldown_menu );
	    }
	}

	gui_ph_position_menu( menu->id, menu->priority );

	/* Redraw menubar here instead of gui_mch_draw_menubar */
	if( gui.menu_is_active )
	    PtRealizeWidget( menu->id );
    }
    else if( menu_is_popup( menu->name ) )
    {
	menu->submenu_id = PtCreateWidget( PtMenu, gui.vimWindow, 0, NULL );
	PtAddCallback( menu->submenu_id, Pt_CB_UNREALIZED,
		gui_ph_handle_menu_unrealized, menu );
    }
}

    void
gui_mch_add_menu_item(vimmenu_T *menu, int index)
{
    vimmenu_T	*parent = menu->parent;
    char_u	*accel_key;
    char_u	mnemonic_str[MB_LEN_MAX];
    int	    n;
    PtArg_t args[13];

    n = 0;
    PtSetArg( &args[ n++ ], Pt_ARG_POINTER, menu, 0 );

#ifdef FEAT_TOOLBAR
    if( menu_is_toolbar( parent->name ) )
    {
	if( menu_is_separator( menu->name ) )
	{
	    PtSetArg( &args[ n++ ], Pt_ARG_SEP_FLAGS,
		    Pt_SEP_VERTICAL, Pt_SEP_ORIENTATION );
	    PtSetArg( &args[ n++ ], Pt_ARG_SEP_TYPE, Pt_ETCHED_IN, 0 );
	    PtSetArg( &args[ n++ ], Pt_ARG_ANCHOR_FLAGS,
		    Pt_TRUE, Pt_ANCHOR_TOP_BOTTOM );
	    PtSetArg( &args[ n++ ], Pt_ARG_WIDTH, 2, 0 );
	    menu->id = PtCreateWidget( PtSeparator, gui.vimToolBar, n, args );
	}
	else
	{
	    if( strstr( (const char *) p_toolbar, "text" ) != NULL )
	    {
		PtSetArg( &args[ n++ ], Pt_ARG_BALLOON_POSITION,
			Pt_BALLOON_BOTTOM, 0 );
		PtSetArg( &args[ n++ ], Pt_ARG_TEXT_STRING, menu->dname, 0 );
		PtSetArg( &args[ n++ ], Pt_ARG_TEXT_FONT, "TextFont08", 0 );
	    }
	    if( ( strstr( (const char *) p_toolbar, "icons" ) != NULL ) &&
		    ( gui_ph_toolbar_images != NULL ) )
	    {
		PtSetArg( &args[ n++ ], Pt_ARG_LABEL_IMAGE,
			gui_ph_toolbar_find_icon( menu ), 0 );
		PtSetArg( &args[ n++ ], Pt_ARG_LABEL_TYPE, Pt_TEXT_IMAGE, 0 );
		PtSetArg( &args[ n++ ], Pt_ARG_TEXT_IMAGE_SPACING, 0, 0 );
	    }
	    if( strstr( (const char *) p_toolbar, "tooltips" ) != NULL )
	    {
		PtSetArg( &args[ n++ ], Pt_ARG_LABEL_BALLOON,
			gui_ph_show_tooltip, 0 );
		PtSetArg( &args[ n++ ], Pt_ARG_LABEL_FLAGS,
			Pt_TRUE, Pt_SHOW_BALLOON );
	    }
	    PtSetArg( &args[ n++ ], Pt_ARG_MARGIN_HEIGHT, 1, 0 );
	    PtSetArg( &args[ n++ ], Pt_ARG_MARGIN_WIDTH, 1, 0 );
	    PtSetArg( &args[ n++ ], Pt_ARG_FLAGS, Pt_FALSE,
		    Pt_HIGHLIGHTED | Pt_GETS_FOCUS );
	    PtSetArg( &args[ n++ ], Pt_ARG_FILL_COLOR, Pg_TRANSPARENT, 0 );
	    menu->id = PtCreateWidget( PtButton, gui.vimToolBar, n, args );

	    PtAddCallback( menu->id, Pt_CB_ACTIVATE, gui_ph_handle_menu, menu );
	}
	/* Update toolbar if it's open */
	if( PtWidgetIsRealized( gui.vimToolBar ) )
	    PtRealizeWidget( menu->id );
    }
    else
#endif
	if( menu_is_separator( menu->name ) )
    {
	menu->id = PtCreateWidget( PtSeparator, parent->submenu_id, n, args );
    }
    else
    {
	accel_key = vim_strchr( menu->name, '&' );
	if( accel_key != NULL )
	{
	    mnemonic_str[0] = accel_key[1];
	    mnemonic_str[1] = NUL;
	}

	PtSetArg( &args[ n++ ], Pt_ARG_TEXT_STRING, menu->dname, 0 );
	if( accel_key != NULL )
	    PtSetArg( &args[ n++ ], Pt_ARG_ACCEL_KEY, mnemonic_str,
		    0 );

	PtSetArg( &args[ n++ ], Pt_ARG_ACCEL_TEXT, menu->actext, 0 );

	menu->id = PtCreateWidget( PtMenuButton, parent->submenu_id, n, args );

	PtAddCallback( menu->id, Pt_CB_ACTIVATE, gui_ph_handle_menu, menu );

#ifdef USE_PANEL_GROUP
	if( gui_ph_is_buffer_item( menu, parent ) == TRUE )
	{
	    PtAddCallback( menu->id, Pt_CB_DESTROYED,
		    gui_ph_handle_buffer_remove, menu );
	    gui_ph_pg_add_buffer( menu->dname );
	}
#endif
    }

    gui_ph_position_menu( menu->id, menu->priority );
}

    void
gui_mch_destroy_menu(vimmenu_T *menu)
{
    if( menu->submenu_id != NULL )
	PtDestroyWidget( menu->submenu_id );
    if( menu->id != NULL )
	PtDestroyWidget( menu->id );

    menu->submenu_id = NULL;
    menu->id = NULL;
}

    void
gui_mch_menu_grey(vimmenu_T *menu, int grey)
{
    long    flags, mask, fields;

    if( menu->id == NULL )
	return;

    flags = PtWidgetFlags( menu->id );
    if( PtWidgetIsClass( menu->id, PtMenuButton ) &&
	    PtWidgetIsClass( PtWidgetParent( menu->id ), PtMenu ) )
    {
	fields = Pt_FALSE;
	mask = Pt_SELECTABLE | Pt_HIGHLIGHTED;
    }
    else
    {
	fields = Pt_TRUE;
	mask = Pt_BLOCKED | Pt_GHOST;
    }

    if( ! grey )
	fields = ~fields;

    PtSetResource( menu->id, Pt_ARG_FLAGS, fields,
	    mask );
}

    void
gui_mch_menu_hidden(vimmenu_T *menu, int hidden)
{
    /* TODO: [un]realize the widget? */
}

    void
gui_mch_draw_menubar(void)
{
    /* The only time a redraw is needed is when a menu button
     * is added to the menubar, and that is detected and the bar
     * redrawn in gui_mch_add_menu_item
     */
}

    void
gui_mch_show_popupmenu(vimmenu_T *menu)
{
    PtSetResource( menu->submenu_id, Pt_ARG_POS, &abs_mouse, 0 );
    PtRealizeWidget( menu->submenu_id );
}

    void
gui_mch_toggle_tearoffs(int enable)
{
    /* No tearoffs yet */
}

#endif

#if defined( FEAT_TOOLBAR ) || defined( PROTO )
    void
gui_mch_show_toolbar(int showit)
{
    if( showit )
	PtRealizeWidget( gui.vimToolBar );
    else
	PtUnrealizeWidget( gui.vimToolBar );
}
#endif

/****************************************************************************/
/* Fonts */

    static GuiFont
gui_ph_get_font(
	char_u	*font_name,
	int_u	font_flags,
	int_u	font_size,
	/* Check whether the resulting font has the font flags and size that
	 * was asked for */
	int_u	enforce
	)
{
    char_u	    *font_tag;
    FontQueryInfo   info;
    int_u	    style;

    font_tag = alloc( MAX_FONT_TAG );
    if( font_tag != NULL )
    {
	if( PfGenerateFontName( font_name, font_flags, font_size,
		    font_tag ) != NULL )
	{
	    /* Enforce some limits on the font used */
	    style = PHFONT_INFO_FIXED;

	    if( enforce & PF_STYLE_BOLD )
		style |= PHFONT_INFO_BOLD;
	    if( enforce & PF_STYLE_ANTIALIAS )
		style |= PHFONT_INFO_ALIAS;
	    if( enforce & PF_STYLE_ITALIC )
		style |= PHFONT_INFO_ITALIC;

	    PfQueryFontInfo( font_tag, &info );

	    if( info.size == 0 )
		font_size = 0;

	    /* Make sure font size matches, and that the font style
	     * at least has the bits we're checking for */
	    if( font_size == info.size &&
		    style == (info.style & style) )
		return (GuiFont)font_tag;
	}
	vim_free( font_tag );
    }
    return NULL;
}

/*
 * Split up the vim font name
 *
 * vim_font is in the form of
 * <name>:s<height>:a:b:i
 *
 * a = antialias
 * b = bold
 * i = italic
 *
 */

    static int
gui_ph_parse_font_name(
	char_u *vim_font,
	char_u **font_name,
	int_u *font_flags,
	int_u *font_size )
{
    char_u  *mark;
    int_u   name_len, size;

    mark = vim_strchr( vim_font, ':' );
    if( mark == NULL )
	name_len = STRLEN( vim_font );
    else
	name_len = (int_u) ( mark - vim_font );

    *font_name = vim_strnsave( vim_font, name_len );
    if (*font_name != NULL)
    {
	if (mark != NULL)
	{
	    while (*mark != NUL && *mark++ == ':')
	    {
		switch (tolower(*mark++))
		{
		    case 'a': *font_flags |= PF_STYLE_ANTIALIAS; break;
		    case 'b': *font_flags |= PF_STYLE_BOLD; break;
		    case 'i': *font_flags |= PF_STYLE_ITALIC; break;

		    case 's':
			size = getdigits( &mark );
			/* Restrict the size to some vague limits */
			if (size < 1 || size > 100)
			    size = 8;

			*font_size = size;
			break;

		    default:
			break;
		}
	    }
	}
	return TRUE;
    }
    return FALSE;
}

    int
gui_mch_init_font(char_u *vim_font_name, int fontset)
{
    char_u  *font_tag;
    char_u  *font_name = NULL;
    int_u   font_flags = 0;
    int_u   font_size  = 12;

    FontQueryInfo info;
    PhRect_t extent;

    if (vim_font_name == NULL)
    {
	/* Default font */
	vim_font_name = "PC Terminal";
    }

    if (STRCMP( vim_font_name, "*" ) == 0)
    {
	font_tag = PtFontSelection( gui.vimWindow, NULL, NULL,
		"pcterm12", -1, PHFONT_FIXED, NULL );

	if (font_tag == NULL)
	    return FAIL;

	gui_mch_free_font( gui.norm_font );
	gui.norm_font = font_tag;

	PfQueryFontInfo( font_tag, &info );
	font_name = vim_strsave( info.font );
    }
    else
    {
	if (gui_ph_parse_font_name( vim_font_name, &font_name, &font_flags,
		    &font_size ) == FALSE)
	    return FAIL;

	font_tag = gui_ph_get_font( font_name, font_flags, font_size, 0 );
	if (font_tag == NULL)
	{
	    vim_free( font_name );
	    return FAIL;
	}

	gui_mch_free_font( gui.norm_font );
	gui.norm_font = font_tag;
    }

    gui_mch_free_font( gui.bold_font );
    gui.bold_font = gui_ph_get_font( font_name, font_flags | PF_STYLE_BOLD,
	    font_size, PF_STYLE_BOLD );

    gui_mch_free_font( gui.ital_font );
    gui.ital_font = gui_ph_get_font( font_name, font_flags | PF_STYLE_ITALIC,
	    font_size, PF_STYLE_ITALIC );

    /* This extent was brought to you by the letter 'g' */
    PfExtentText( &extent, NULL, font_tag, "g", 1 );

    gui.char_width = extent.lr.x - extent.ul.x + 1;
    gui.char_height = (- extent.ul.y) + extent.lr.y + 1;
    gui.char_ascent = - extent.ul.y;

    vim_free( font_name );
    return OK;
}

/*
 * Adjust gui.char_height (after 'linespace' was changed).
 */
    int
gui_mch_adjust_charheight(void)
{
    FontQueryInfo info;

    PfQueryFontInfo( gui.norm_font, &info );

    gui.char_height = - info.ascender + info.descender + p_linespace;
    gui.char_ascent = - info.ascender + p_linespace / 2;

    return OK;
}

    GuiFont
gui_mch_get_font(char_u *vim_font_name, int report_error)
{
    char_u  *font_name;
    char_u  *font_tag;
    int_u   font_size = 12;
    int_u   font_flags = 0;

    if (gui_ph_parse_font_name( vim_font_name, &font_name, &font_flags,
		&font_size ) != FALSE)
    {
	font_tag = gui_ph_get_font( font_name, font_flags, font_size, -1 );
	vim_free( font_name );

	if (font_tag != NULL)
	    return (GuiFont)font_tag;
    }

    if (report_error)
	EMSG2(e_font, vim_font_name );

    return FAIL;
}

#if defined(FEAT_EVAL) || defined(PROTO)
/*
 * Return the name of font "font" in allocated memory.
 * Don't know how to get the actual name, thus use the provided name.
 */
    char_u *
gui_mch_get_fontname(font, name)
    GuiFont font;
    char_u  *name;
{
    if (name == NULL)
	return NULL;
    return vim_strsave(name);
}
#endif

    void
gui_mch_set_font(GuiFont font)
{
    PgSetFont( font );
}

    void
gui_mch_free_font(GuiFont font)
{
    vim_free( font );
}

