/*
  $Id: gtk.c,v 1.3 1999/12/01 03:51:06 issei Exp issei $
 */
/*
  GTK+ NetHack Copyright (c) Issei Numata 1999-2000
  GTK+ NetHack may be freely redistributed.  See license for details. 
*/

#include <sys/types.h>
#include <signal.h>
#include "winGTK.h"
#include "wintype.h"
#include "func_tab.h"

static int	initialized;
static int	initialized2;

static void	select_player(GtkWidget *w, gpointer data);
static void	key_command(GtkWidget *w, gpointer data);
static void	game_option(GtkWidget *w, gpointer data);
static void	game_topten(GtkWidget *w, gpointer data);

static void	help_help(GtkWidget *w, gpointer data);
static void	help_shelp(GtkWidget *w, gpointer data);
static void	help_option(GtkWidget *w, gpointer data);
static void	help_je(GtkWidget *w, gpointer data);
static void	help_history(GtkWidget *w, gpointer data);
static void	help_license(GtkWidget *w, gpointer data);

NHWindow gtkWindows[MAXWIN];

static GtkWidget	*credit_window;
static GtkWidget 	*credit_vbox;
static GtkWidget 	*credit_credit;

static GtkStyle		*credit_style;
static GdkPixmap	*credit_pixmap;
static GdkBitmap	*credit_mask;

GtkWidget		*main_window;
static GtkWidget	*main_vbox;
static GtkWidget	*main_hbox;

static GtkWidget	*main_bar;
static GtkWidget	*main_message;
#ifdef RADAR
static GtkWidget	*main_radar;
#endif

static GtkWidget	*main_status;
static GtkWidget	*main_map;
static GtkItemFactory	*main_item_factory;

int			root_width;
int			root_height;

GdkColor	  nh_color[N_NH_COLORS] = {
    {0, 0*257, 0*257, 0*257,},		/* black */
    {0, 255*257, 0*257, 0*257,},	/* red */
    {0, 152*257, 251*257, 152*257,},	/* pale green */
    {0, 165*257, 42*257, 42*257,},	/* brown */
    {0, 0*257, 0*257, 255*257,},	/* blue */
    {0, 255*257, 0*257, 255*257,}, 	/* magenta */
    {0, 224*257, 255*257, 255*257,}, 	/* light cyan */
    {0, 190*257, 190*257, 190*257,},	/* gray */
    {1, 0*257, 0*257, 0*257,},		/* default  */
    {0, 255*257, 165*257, 0*257,},	/* orange */
    {0, 0*257, 255*257, 0*257,},	/* green */
    {0, 255*257, 255*257, 0*257,}, 	/* yellow */
    {0, 65*257, 105*257, 225*257,},	/* royal blue */
    {0, 238*257, 130*257, 238*257,},	/* violet */
    {0, 0*257, 255*257, 255*257,},	/* cyan */
    {0, 255*257, 255*257, 255*257,},	/* white */
    {0, 0*257, 100*257, 0*257,},	/* dark green */
    {0, 20*257, 60*257, 20*257,},	/* map background */
};

void
hook()
{
    ;
}

struct window_procs GTK_procs = {
    "gtk",
    GTK_init_nhwindows,
    GTK_player_selection,
    hook, /* tty_askname,*/
    GTK_get_nh_event,
    GTK_exit_nhwindows,
    hook, /*tty_suspend_nhwindows,*/
    hook, /*tty_resume_nhwindows,*/
    GTK_create_nhwindow,
    GTK_clear_nhwindow,
    GTK_display_nhwindow,
    GTK_destroy_nhwindow,
    GTK_curs,
    GTK_putstr,
    GTK_display_file,
    GTK_start_menu,
    GTK_add_menu,
    GTK_end_menu,
    GTK_select_menu,
    genl_message_menu,
    hook, /*tty_update_inventory,*/
    GTK_mark_synch,
    GTK_wait_synch,
#ifdef CLIPPING
    GTK_cliparound,
#endif
#ifdef POSITIONBAR
    hook,
#endif
    GTK_print_glyph,
    GTK_raw_print,
    GTK_raw_print_bold,
    GTK_nhgetch,
    GTK_nh_poskey,
    hook, /* tty_nhbell,*/
    GTK_doprev_message,
    GTK_yn_function,
    GTK_getlin,
    GTK_get_ext_cmd,
    hook, /*tty_number_pad,*/
    hook, /*tty_delay_output,*/
#ifdef CHANGE_COLOR     /* only a Mac option currently */
    hook,
    hook,
#endif
    /* other defs that really should go away (they're tty specific) */
    hook, /* tty_start_screen,*/
    hook, /* tty_end_screen,*/
#ifdef GRAPHIC_TOMBSTONE
    GTK_outrip,
#else
    genl_outrip,
#endif
};

#ifdef JNETHACK
static GtkItemFactoryEntry menu_items[] = {
    {"/ゲーム",			NULL,		NULL,		0,	"<Branch>"},
    {"/ゲーム/遊ぶ",		NULL,		NULL,		0,	"<Branch>"},
    {"/ゲーム/遊ぶ/考古学者",	"F1",		select_player,	'A',	NULL},
    {"/ゲーム/遊ぶ/野蛮人",	"F2",		select_player,	'B',	NULL},
    {"/ゲーム/遊ぶ/洞窟人",	"F3",		select_player,	'C',	NULL},
    {"/ゲーム/遊ぶ/エルフ",	"F4",		select_player,	'E',	NULL},
#ifdef FIGHTER
    {"/ゲーム/遊ぶ/戦士",	"F5",		select_player,	'F',	NULL},
    {"/ゲーム/遊ぶ/薬師",	"F6",		select_player,	'H',	NULL},
    {"/ゲーム/遊ぶ/騎士",	"F7",		select_player,	'K',	NULL},
    {"/ゲーム/遊ぶ/僧侶",	"F8",		select_player,	'P',	NULL},
    {"/ゲーム/遊ぶ/盗賊",		"F9",		select_player,	'R',	NULL},
    {"/ゲーム/遊ぶ/侍",		"F10",		select_player,	'S',	NULL},
    {"/ゲーム/遊ぶ/旅行者",	"F11",		select_player,	'T',	NULL},
    {"/ゲーム/遊ぶ/ワルキューレ", "F12",		select_player,	'V',	NULL},
    {"/ゲーム/遊ぶ/魔法使い",	"<shift>F1",	select_player,	'W',	NULL},
#else
    {"/ゲーム/遊ぶ/薬師",	"F5",		select_player,	'H',	NULL},
    {"/ゲーム/遊ぶ/騎士",	"F6",		select_player,	'K',	NULL},
    {"/ゲーム/遊ぶ/僧侶",	"F7",		select_player,	'P',	NULL},
    {"/ゲーム/遊ぶ/盗賊",	"F8",		select_player,	'R',	NULL},
    {"/ゲーム/遊ぶ/侍",		"F9",		select_player,	'S',	NULL},
    {"/ゲーム/遊ぶ/旅行者",	"F10",		select_player,	'T',	NULL},
    {"/ゲーム/遊ぶ/ワルキューレ", "F11",		select_player,	'V',	NULL},
    {"/ゲーム/遊ぶ/魔法使い",	"F12",		select_player,	'W',	NULL},
#endif
    {"/ゲーム/遊ぶ/GPsep1",	NULL,		NULL,		0,	"<Separator>"},
    {"/ゲーム/遊ぶ/ランダム",	"<shift>F2",	select_player,	'Y',	NULL},
    {"/ゲーム/Gsep1",		NULL,		NULL,		0,	"<Separator>"},
    {"/ゲーム/保存",		"<shift>S",	key_command,	'S',	NULL},
    {"/ゲーム/オプション",	"<shift>O",	game_option,	'O',    NULL},
    {"/ゲーム/スコア",		NULL,		game_topten,	0,	NULL},
    {"/ゲーム/Gsep2",		NULL,		NULL,		0,	"<Separator>"},

    {"/ゲーム/終了",		NULL,		select_player,	'Q',	NULL},
};

static GtkItemFactoryEntry helpmenu_items[] = {
    {"/ヘルプ",			NULL,		NULL,		0,	"<LastBranch>"},
    {"/ヘルプ/コマンドヘルプ",	NULL,		help_help,	0,	NULL},
    {"/ヘルプ/キーヘルプ",	NULL,		help_shelp,	0,	NULL},
    {"/ヘルプ/オプションヘルプ", NULL,		help_option,	0,	NULL},
    {"/ヘルプ/sep3",		NULL,		NULL,		0,	"<Separator>"},
    {"/ヘルプ/日本語<->英語",	NULL,		help_je,	0,	NULL},
    {"/ヘルプ/sep3",		NULL,		NULL,		0,	"<Separator>"},
    {"/ヘルプ/歴史",		NULL,		help_history,	0,	NULL},
    {"/ヘルプ/ライセンス",	NULL,		help_license,	0,	NULL},
};

static GtkItemFactoryEntry playmenu_items[] = {
    {"/移動",			NULL,		NULL,		0,	"<Branch>"},
    {"/移動/北",		"k",		key_command,	'k',	NULL},
    {"/移動/東",		"h",		key_command,	'h',	NULL},
    {"/移動/南",		"j",		key_command,	'j',	NULL},
    {"/移動/西",		"l",		key_command,	'l',	NULL},
    {"/移動/北東",		"u",		key_command,	'u',	NULL},
    {"/移動/北西",		"y",		key_command,	'y',	NULL},
    {"/移動/南東",		"n",		key_command,	'n',	NULL},
    {"/移動/南西",		"b",		key_command,	'b',	NULL},
    {"/移動/下",		"greater",	key_command,	'>',	NULL},
    {"/移動/上",		"less",		key_command,	'<',	NULL},
    {"/調査",			NULL,		NULL,		0,	"<Branch>"},
    {"/調査/足元を調査",	"colon",	key_command,	':',	NULL},
    {"/調査/遠くの元を調査",	"semicolon",	key_command,	';',	NULL},
    {"/調査/罠を調査",		"asciicircum",	key_command,	'^',	NULL},
    {"/装備/手にする",		"w",		key_command,	'w',	NULL},	
    {"/装備/鎧を身につける",	"<shift>w",	key_command,	'W',	NULL},	
    {"/装備/鎧をはずす",	"<shift>T",	key_command,	'T',	NULL},	
    {"/装備/指輪や魔除けをつける", "<shift>p",	key_command,	'P',	NULL},	
    {"/装備/指輪や魔除けをはずす", "<shift>r",	key_command,	'R',	NULL},	
    {"/あなた自身",		NULL,		NULL,		0,	"<Branch>"},
    {"/あなた自身/持ち物一覧",	"i",		key_command,	'i',	NULL},
    {"/あなた自身/装備武器",	"parenright",	key_command,	')',	NULL},	
    {"/あなた自身/装備鎧",	"bracketleft",	key_command,	'[',	NULL},	
    {"/あなた自身/身につけいる指輪", "equal",	key_command,	'=',	NULL},	
    {"/あなた自身/身につけている魔除け",	"quotedbl",	key_command,	'"',	NULL},	
    {"/あなた自身/使っている道具", "parenleft",	key_command,	'(',	NULL},	
    {"/あなた自身/魔法一覧",	"x",		key_command,	'x',	NULL},	
    {"/あなた自身/識別済アイテム","backslash",	key_command,	'\\',	NULL},	
    {"/冒険",			NULL,		NULL,		0,	"<Branch>"},
    {"/冒険/アイテムに名前をつける","<alt>n",	key_command,	'n' | 0x80,	NULL},
    {"/冒険/生き物に名前をつける","<shift>C",	key_command,	'C',	NULL},
    {"/冒険/目録文字変更",	"<alt>a",	key_command,	'a' | 0x80,	NULL},
    {"/行動",			NULL,		NULL,		0,	"<Branch>"},
    {"/行動/休む",		"period",	key_command,	'.',	NULL},
    {"/行動/探索",		"s",		key_command,	's',	NULL},
    {"/行動/食べる",		"e",		key_command,	'e',	NULL},
    {"/行動/Asep1",		NULL,		NULL,		0,	"<Separator>"},
    {"/行動/開ける",		"o",		key_command,	'o',	NULL},
    {"/行動/閉める",		"c",		key_command,	'c',	NULL},
    {"/行動/Asep2",		NULL,		NULL,		0,	"<Separator>"},
    {"/行動/拾う",		"comma",	key_command,	',',	NULL},
    {"/行動/置く",		"<shift>d",	key_command,	'D',	NULL},
    {"/行動/箱から取る",	"<alt>l",	key_command,	'l' | 0x80, NULL},
    {"/行動/道具を使う",	"a",		key_command,	'a',	NULL},
    {"/行動/蹴る",		"<control>D",	key_command,	'\04',	NULL},
    {"/行動/投げる",		"t",		key_command,	't',	NULL},
    {"/行動/Asep3",		NULL,		NULL,		0,	"<Separator>"},
    {"/行動/飲む",		"q",		key_command,	'q',	NULL},
    {"/行動/読む",		"r",		key_command,	'r',	NULL},
    {"/行動/魔法を唱える",	"<shift>Z",	key_command,	'Z',	NULL},
    {"/行動/杖を振る",		"z",		key_command,	'z',	NULL},
    {"/行動/水に浸す",		"<alt>d",	key_command,	'd' | 0x80,	NULL},
    {"/行動/座る",		"<alt>s",	key_command,	's' | 0x80,	NULL},
    {"/信仰",			NULL,		NULL, 0, "<Branch>"},
    {"/信仰/祈る",		"<alt>p",	key_command,	'p' | 0x80,	NULL},
    {"/信仰/死体を捧げる",	"<alt>o",	key_command,	'o' | 0x80,	NULL},
    {"/特殊",			NULL,		NULL, 0, "<Branch>"},
    {"/特殊/床に刻む",		"<shift>E",	key_command,	'E',		NULL},
    {"/特殊/勘定を払う",	"p",		key_command,	'p',		NULL},
    {"/特殊/会話をする",	"<alt>c",	key_command,	'c' | 0x80,	NULL},
    {"/特殊/能力を高める",	"<alt>e",	key_command,	'e' | 0x80,	NULL},
    {"/特殊/こじあける",	"<alt>f",	key_command,	'f' | 0x80,	NULL},
    {"/特殊/道具の特殊能力を使用する","<alt>i",	key_command,	'i' | 0x80,	NULL},
    {"/特殊/魔物の特殊能力を使用する","<alt>m",	key_command,	'm' | 0x80,	NULL},
    {"/特殊/擦る",		"<alt>r",	key_command,	'r' | 0x80,	NULL},
    {"/特殊/拭きとる",		"<alt>w",	key_command,	'w' | 0x80,	NULL},
    {"/特殊/テレポート",	"<control>t",	key_command,	'',	NULL},
    {"/特殊/土に返す",		"<alt>t",	key_command,	't' | 0x80,	NULL},
    {"/特殊/罠解除",		"<alt>u",	key_command,	'u' | 0x80,	NULL},
    {"/特殊/ジャンプ",		"<alt>j",	key_command,	'j' | 0x80,	NULL},
};
#else
static GtkItemFactoryEntry menu_items[] = {
    {"/Game",			NULL,		NULL,		0,	"<Branch>"},
    {"/Game/Play",		NULL,		NULL,		0,	"<Branch>"},
    {"/Game/Play/Archeologist",	"F1",		select_player,	'A',	NULL},
    {"/Game/Play/Barbarian",	"F2",		select_player,	'B',	NULL},
    {"/Game/Play/Caveman",	"F3",		select_player,	'C',	NULL},
    {"/Game/Play/Elf",		"F4",		select_player,	'E',	NULL},
#ifdef FIGHTER
    {"/Game/Play/Fighter",	"F5",		select_player,	'F',	NULL},
    {"/Game/Play/Healer",	"F6",		select_player,	'H',	NULL},
    {"/Game/Play/Knight",	"F7",		select_player,	'K',	NULL},
    {"/Game/Play/Priest",	"F8",		select_player,	'P',	NULL},
    {"/Game/Play/Rogue",	"F9",		select_player,	'R',	NULL},
    {"/Game/Play/Samurai",	"F10",		select_player,	'S',	NULL},
    {"/Game/Play/Tourist",	"F11",		select_player,	'T',	NULL},
    {"/Game/Play/Valkyrie",	"F12",		select_player,	'V',	NULL},
    {"/Game/Play/Wizard",	"<shift>F1",	select_player,	'W',	NULL},
#else
    {"/Game/Play/Healer",	"F5",		select_player,	'H',	NULL},
    {"/Game/Play/Knight",	"F6",		select_player,	'K',	NULL},
    {"/Game/Play/Priest",	"F7",		select_player,	'P',	NULL},
    {"/Game/Play/Rogue",	"F8",		select_player,	'R',	NULL},
    {"/Game/Play/Samurai",	"F9",		select_player,	'S',	NULL},
    {"/Game/Play/Tourist",	"F10",		select_player,	'T',	NULL},
    {"/Game/Play/Valkyrie",	"F11",		select_player,	'V',	NULL},
    {"/Game/Play/Wizard",	"F12",		select_player,	'W',	NULL},
#endif
    {"/Game/Play/GPsep1",	NULL,		NULL,		0,	"<Separator>"},
    {"/Game/Play/Random",	"<shift>F2",	select_player,	'Y',	NULL},
    {"/Game/Gsep1",		NULL,		NULL,		0,	"<Separator>"},
    {"/Game/Save",		"<shift>S",	key_command,	'S',	NULL},
    {"/Game/Option",		"<shift>O",	game_option,	'O',    NULL},
    {"/Game/Score",		NULL,		game_topten,	0,	NULL},
    {"/Game/Gsep2",		NULL,		NULL,		0,	"<Separator>"},
    {"/Game/Quit",		NULL,		select_player,	'Q',	NULL},
};

static GtkItemFactoryEntry helpmenu_items[] = {
    {"/Help",			NULL,		NULL,		0,	"<LastBranch>"},
    {"/Help/Command Help",	NULL,		help_help,	0,	NULL},
    {"/Help/Key Help",		NULL,		help_shelp,	0,	NULL},
    {"/Help/Option Help",	NULL,		help_option,	0,	NULL},
    {"/Help/sep3",		NULL,		NULL,		0,	"<Separator>"},
    {"/Help/sep3",		NULL,		NULL,		0,	"<Separator>"},
    {"/Help/History",		NULL,		help_history,	0,	NULL},
    {"/Help/License",		NULL,		help_license,	0,	NULL},
};

static GtkItemFactoryEntry playmenu_items[] = {
    {"/Move",			NULL,		NULL,		0,	"<Branch>"},
    {"/Move/North",		"k",		key_command,	'k',	NULL},
    {"/Move/East",		"h",		key_command,	'h',	NULL},
    {"/Move/South",		"j",		key_command,	'j',	NULL},
    {"/Move/West",		"l",		key_command,	'l',	NULL},
    {"/Move/Northeast",		"u",		key_command,	'u',	NULL},
    {"/Move/Northwest",		"y",		key_command,	'y',	NULL},
    {"/Move/Southeast",		"n",		key_command,	'n',	NULL},
    {"/Move/Southwest",		"b",		key_command,	'b',	NULL},
    {"/Move/Down",		"greater",	key_command,	'>',	NULL},
    {"/Move/Up",		"less",		key_command,	'<',	NULL},
    {"/Check",			NULL,		NULL,		0,	"<Branch>"},
    {"/Check/Here",		"colon",	key_command,	':',	NULL},
    {"/Check/There",		"semicolon",	key_command,	';',	NULL},
    {"/Check/Trap",		"asciicircum",	key_command,	'^',	NULL},
    {"/Equip/Wield",		"w",		key_command,	'w',	NULL},	
    {"/Equip/Wear",		"<shift>w",	key_command,	'W',	NULL},	
    {"/Equip/Take off",		"<shift>T",	key_command,	'T',	NULL},	
    {"/Equip/Puton",		"<shift>p",	key_command,	'P',	NULL},	
    {"/Equip/Remove",		"<shift>r",	key_command,	'R',	NULL},	
    {"/You",			NULL,		NULL,		0,	"<Branch>"},
    {"/You/Inventory",		"i",		key_command,	'i',	NULL},
    {"/You/Weapon",		"parenright",	key_command,	')',	NULL},	
    {"/You/Armor",		"bracketleft",	key_command,	'[',	NULL},	
    {"/You/Ring",		"equal",	key_command,	'=',	NULL},	
    {"/You/Amulet",		"quotedbl",	key_command,	'"',	NULL},	
    {"/You/Item",		"parenleft",	key_command,	'(',	NULL},	
    {"/You/Spells",		"x",		key_command,	'x',	NULL},	
    {"/You/Known Item",		"backslash",	key_command,	'\\',	NULL},	
    {"/Adventure",		NULL,		NULL,		0,	"<Branch>"},
    {"/Adventure/Name",		"<alt>n",	key_command,	'n' | 0x80,	NULL},
    {"/Adventure/Call",		"<shift>C",	key_command,	'C',	NULL},
    {"/Adventure/Adjust",	"<alt>a",	key_command,	'a' | 0x80,	NULL},
    {"/Action",			NULL,		NULL,		0,	"<Branch>"},
    {"/Action/Rest",		"period",	key_command,	'.',	NULL},
    {"/Action/Search",		"s",		key_command,	's',	NULL},
    {"/Action/Eat",		"e",		key_command,	'e',	NULL},
    {"/Action/Asep1",		NULL,		NULL,		0,	"<Separator>"},
    {"/Action/Open",		"o",		key_command,	'o',	NULL},
    {"/Action/Close",		"c",		key_command,	'c',	NULL},
    {"/Action/Asep2",		NULL,		NULL,		0,	"<Separator>"},
    {"/Action/Pickup",		"comma",	key_command,	',',	NULL},
    {"/Action/Drop",		"d",		key_command,	'd',	NULL},
    {"/Action/Loot",		"<alt>l",	key_command,	'l' | 0x80, NULL},
    {"/Action/Apply",		"a",		key_command,	'a',	NULL},
    {"/Action/Kick",		"<control>D",	key_command,	'\04',	NULL},
    {"/Action/Throw",		"t",		key_command,	't',	NULL},
    {"/Action/Asep3",		NULL,		NULL,		0,	"<Separator>"},
    {"/Action/Drink",		"q",		key_command,	'q',	NULL},
    {"/Action/Read",		"r",		key_command,	'r',	NULL},
    {"/Action/Cast Spell",	"<shift>Z",	key_command,	'Z',	NULL},
    {"/Action/Zap",		"z",		key_command,	'z',	NULL},
    {"/Action/Dip",		"<alt>d",	key_command,	'd' | 0x80,	NULL},
    {"/Action/Sit",		"<alt>s",	key_command,	's' | 0x80,	NULL},
    {"/Religion",		NULL,		NULL,		0, 	"<Branch>"},
    {"/Religion/Pray",		"<alt>p",	key_command,	'p' | 0x80,	NULL},
    {"/Religion/Offer",		"<alt>o",	key_command,	'o' | 0x80,	NULL},
    {"/Special",		NULL,		NULL,		0, 	"<Branch>"},
    {"/Special/Engrave",	"<shift>E",	key_command,	'E', 		NULL},
    {"/Special/Pay",		"p",		key_command,	'p', 		NULL},
    {"/Special/Chat",		"<alt>c",	key_command,	'c' | 0x80,	NULL},
    {"/Special/Enhance",	"<alt>e",	key_command,	'e' | 0x80,	NULL},
    {"/Special/Force",		"<alt>f",	key_command,	'f' | 0x80,	NULL},
    {"/Special/Invoke",		"<alt>i",	key_command,	'i' | 0x80,	NULL},
    {"/Special/Monster",	"<alt>m",	key_command,	'm' | 0x80,	NULL},
    {"/Special/Rub",		"<alt>r",	key_command,	'r' | 0x80,	NULL},
    {"/Special/Wipe",		"<alt>w",	key_command,	'w' | 0x80,	NULL},
    {"/Special/Teleport",	"<control>t",	key_command,	'',	NULL},
    {"/Special/Turn",		"<alt>t",	key_command,	't' | 0x80,	NULL},
    {"/Special/Untrap",		"<alt>u",	key_command,	'u' | 0x80,	NULL},
    {"/Special/Jump",		"<alt>j",	key_command,	'j' | 0x80,	NULL},
};
#endif

static int keysym;
static int pl_selection;

void
win_GTK_init()
{
    ;
}

GtkWidget *
nh_gtk_new(GtkWidget *w, GtkWidget *parent, gchar *lbl)
{
    gtk_widget_ref(w);
    gtk_object_set_data_full(
	GTK_OBJECT(parent), lbl, w,
	(GtkDestroyNotify)gtk_widget_unref);
    gtk_widget_show(w);

    return w;
}

GtkWidget *
nh_gtk_new_and_add(GtkWidget *w, GtkWidget *parent, gchar *lbl)
{
    gtk_widget_ref(w);
    gtk_object_set_data_full(
	GTK_OBJECT(parent), lbl, w,
	(GtkDestroyNotify)gtk_widget_unref);
    gtk_widget_show(w);

    gtk_container_add(GTK_CONTAINER(parent), w);

    return w;
}

GtkWidget *
nh_gtk_new_and_pack(GtkWidget *w, GtkWidget *parent, gchar *lbl, 
		    gboolean a1, gboolean a2, guint a3)
{
    gtk_widget_ref(w);
    gtk_object_set_data_full(
	GTK_OBJECT(parent), lbl, w,
	(GtkDestroyNotify)gtk_widget_unref);
    gtk_widget_show(w);

    gtk_box_pack_start(GTK_BOX(parent), w, a1, a2, a3);

    return w;
}

GtkWidget *
nh_gtk_new_and_attach(GtkWidget *w, GtkWidget *parent, gchar *lbl, 
		      guint a1, guint a2, guint a3, guint a4)
{
    gtk_widget_ref(w);
    gtk_object_set_data_full(
	GTK_OBJECT(parent), lbl, w,
	(GtkDestroyNotify)gtk_widget_unref);
    gtk_widget_show(w);

    gtk_table_attach_defaults(GTK_TABLE(parent), w, a1, a2, a3, a4);

    return w;
}

GtkWidget *
nh_gtk_new_and_attach2(GtkWidget *w, GtkWidget *parent, gchar *lbl, 
		      guint a1, guint a2, guint a3, guint a4,
		      GtkAttachOptions a5,
		      GtkAttachOptions a6,
		      guint a7, guint  a8)
{
    gtk_widget_ref(w);
    gtk_object_set_data_full(
	GTK_OBJECT(parent), lbl, w,
	(GtkDestroyNotify)gtk_widget_unref);
    gtk_widget_show(w);

    gtk_table_attach(GTK_TABLE(parent), w, a1, a2, a3, a4, a5, a6, a7, a8);

    return w;
}

int
nh_keysym(GdkEventKey *ev)
{
    int ret;
    int key;

    key = ev->keyval;

    ret = 0;

    if(key == GDK_KP_End)
	ret = 'b';
    else if(key == GDK_KP_Down)
	ret = 'j';
    else if(key == GDK_KP_Page_Down)
	ret = 'n';
    else if(key == GDK_KP_Left)
	ret = 'h';
    else if(key == GDK_KP_Begin)
	ret = '.';
    else if(key == GDK_KP_Right)
	ret = 'l';
    else if(key == GDK_KP_Home)
	ret = 'y';
    else if(key == GDK_KP_Up)
	ret = 'k';
    else if(key == GDK_KP_Page_Up)
	ret = 'u';
    else if(key == GDK_KP_Enter || key == GDK_Return)
	ret = '\n';
    else if(key == GDK_KP_Insert)
	ret = 'i';

    if(!ret)
	ret = *ev->string;

    return ret;
}

static void
nh_menu_sensitive(char *menu, boolean f)
{
    GtkWidget *p;
    
    p = gtk_item_factory_get_widget(
	main_item_factory, menu);
    gtk_widget_set_sensitive(p, f);
}

void
quit_hook()
{
    gtk_main_quit();
}

void
main_hook()
{
    nh_map_check_visibility();
#ifdef RADAR
    nh_radar_update();
#endif

    gtk_main();
}

static void
game_option(GtkWidget *widget, gpointer data)
{
    nh_option_new();
    keysym = '\0';
}

static void
game_topten(GtkWidget *widget, gpointer data)
{
    winid id;
#ifdef JNETHACK
    char *argv[] = {
	"jnethack",
	"-sall",
    };
#else
    char *argv[] = {
	"nethack",
	"-sall",
    };
#endif
    
    id = create_toptenwin();
    prscore(2, argv);
    GTK_display_nhwindow(id, TRUE);
    GTK_destroy_nhwindow(id);
    keysym = '\0';
}

static void
help_license(GtkWidget *widget, gpointer data)
{
    GTK_display_file(LICENSE, TRUE);
    keysym = '\0';
}

static void
help_history(GtkWidget *widget, gpointer data)
{
    dohistory();
    keysym = '\0';
}

#ifdef JNETHACK
static void
help_je(GtkWidget *widget, gpointer data)
{
    GTK_display_file(JJJ, TRUE);
    keysym = '\0';
}
#endif

static void
help_option(GtkWidget *widget, gpointer data)
{
    GTK_display_file(OPTIONFILE, TRUE);
    keysym = '\0';
}

static void
help_shelp(GtkWidget *widget, gpointer data)
{
    GTK_display_file(SHELP, TRUE);
    keysym = '\0';
}

static void
help_help(GtkWidget *widget, gpointer data)
{
    GTK_display_file(HELP, TRUE);
    keysym = '\0';
}

static void
key_command(GtkWidget *widget, gpointer data)
{
    keysym = (int)data;

    if(iflags.num_pad){
	switch(keysym){
	case 'y':
	    keysym = '7';
	    break;
	case 'u':
	    keysym = '9';
	    break;
	case 'b':
	    keysym = '1';
	    break;
	case 'n':
	    keysym = '3';
	    break;
	case 'h':
	    keysym = '4';
	    break;
	case 'j':
	    keysym = '2';
	    break;
	case 'k':
	    keysym = '8';
	    break;
	case 'l':
	    keysym = '6';
	    break;
	}
    }

    quit_hook();
}

static void
quit()
{
    if(initialized2)
	done2();
    else{
	clearlocks();
	GTK_exit_nhwindows(NULL);
	terminate(0);
    }
}

static gint
main_window_destroy(GtkWidget *widget, gpointer data)
{
    quit();

    return TRUE;
}

static gint
default_destroy(GtkWidget *widget, gpointer data)
{
    guint *hid = (guint *)data;
    *hid = 0;
    keysym = '\033';
    
    quit_hook();
    return FALSE;
}

static gint
default_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
    keysym = nh_keysym(event);

    if(keysym)
	quit_hook();
    
    return FALSE;
}

static gint
default_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
    if(data)
	keysym = (int)data;
    else
	keysym = '\n';

    quit_hook();

    return FALSE;
}

static void
select_player(GtkWidget *widget, gpointer data)
{
#ifdef FIGHTER
    static char *class = "ABCEFHKPRSTVW";
#else
    static char *class = "ABCEHKPRSTVW";
#endif

    pl_selection = 0;

    if((int)data == 'Y')
	pl_selection = class[rn2(strlen(class))];
    else if((int)data == 'Q'){
	quit();
    }
    else
	pl_selection = (int)data;
    
    if(pl_selection)
	quit_hook();
}

static gint
credit_expose_event(GtkWidget *widget, GdkEventExpose *event)
{
    gtk_main_quit();

    return FALSE;
}

static void
nh_rc(void)
{
    gtk_rc_parse("gtkrc");
}

void
GTK_init_nhwindows(int *argc, char **argv)
{
    if(initialized2)
	goto selection;

    gtk_set_locale();
    nh_rc();

    gtk_init(argc, &argv);
/*
  creat credit widget and show
*/
    credit_window = gtk_window_new(GTK_WINDOW_DIALOG);
    gtk_window_set_position(GTK_WINDOW(credit_window), GTK_WIN_POS_CENTER);

    gtk_container_border_width(GTK_CONTAINER(credit_window), 2);
/*
  gtk_signal_connect(GTK_OBJECT(credit_window), "check_resize",
  GTK_SIGNAL_FUNC(credit_map_event), NULL);
*/

    gtk_signal_connect(GTK_OBJECT(credit_window), "expose_event",
		       GTK_SIGNAL_FUNC(credit_expose_event), NULL);

    gtk_widget_realize(credit_window);
    root_width = gdk_screen_width();
    root_height = gdk_screen_height();

    credit_vbox = nh_gtk_new_and_add(
	gtk_vbox_new(FALSE, 0), credit_window, "");
     
    credit_style = gtk_widget_get_style(credit_window);
    credit_pixmap = gdk_pixmap_create_from_xpm(
	credit_window->window,
	&credit_mask,
	&credit_style->bg[GTK_STATE_NORMAL],
	"credit.xpm");
    credit_credit = nh_gtk_new_and_pack(
	gtk_pixmap_new(credit_pixmap, credit_mask), credit_vbox, "",
	FALSE, FALSE, NH_PAD);

    gtk_widget_show_all(credit_window);
    gtk_main();

/*
  create main widget
*/
    main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_policy(GTK_WINDOW(main_window), TRUE, TRUE, TRUE);

    gtk_signal_connect(
	GTK_OBJECT(main_window), "delete_event",
	GTK_SIGNAL_FUNC(main_window_destroy), 0);

#ifdef JNETHACK
    gtk_window_set_title(GTK_WINDOW(main_window), "JNetHack");
#else
    gtk_window_set_title(GTK_WINDOW(main_window), "NetHack");
#endif
    
    gtk_widget_set_events(main_window, GDK_KEY_PRESS_MASK);
    gtk_widget_realize(main_window);

/*
  allocate color
 */
    {
	int 		i;
	GdkColormap	*cmap;

	cmap = gdk_window_get_colormap(main_window->window);
  
	for(i=0 ; i < N_NH_COLORS ; ++i){
	    if(0 && nh_color[i].pixel){
		nh_color[i] = *(main_window->style->fg);
	    }
	    else if(gdk_colormap_alloc_color(cmap, &nh_color[i], TRUE, TRUE) == TRUE){
		;
	    }
	    else{
		fprintf(stderr, "cannot allocate color\n");
	    }
	}
    }

    main_vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), main_window, "");

    {
	int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
	int nplaymenu_items = sizeof(playmenu_items) / sizeof(playmenu_items[0]);
	int nhelpmenu_items = sizeof(helpmenu_items) / sizeof(helpmenu_items[0]);

	GtkAccelGroup *accel_group;

	accel_group = gtk_accel_group_new();

	main_item_factory = gtk_item_factory_new(
	    GTK_TYPE_MENU_BAR, "<main>",
	    accel_group);

	gtk_item_factory_create_items(
	    main_item_factory,
	    nmenu_items, menu_items,
	    NULL);

	gtk_item_factory_create_items(
	    main_item_factory,
	    nplaymenu_items, playmenu_items,
	    NULL);

	gtk_item_factory_create_items(
	    main_item_factory,
	    nhelpmenu_items, helpmenu_items,
	    NULL);


	gtk_accel_group_attach(accel_group, GTK_OBJECT(main_window));
    }

    main_bar = nh_gtk_new_and_pack(
	gtk_item_factory_get_widget(main_item_factory, "<main>"), main_vbox, "",
	FALSE, FALSE, 0);
#ifdef JNETHACK
    nh_menu_sensitive("/ゲーム/保存", FALSE);
/*
  nh_menu_sensitive("/ゲーム/オプション", FALSE);
*/
    nh_menu_sensitive("/移動", FALSE);
    nh_menu_sensitive("/調査", FALSE);
    nh_menu_sensitive("/装備", FALSE);
    nh_menu_sensitive("/あなた自身", FALSE);
    nh_menu_sensitive("/冒険", FALSE);
    nh_menu_sensitive("/行動", FALSE);
    nh_menu_sensitive("/信仰", FALSE);
    nh_menu_sensitive("/特殊", FALSE);
#else
    nh_menu_sensitive("/Game/Save", FALSE);
/*
  nh_menu_sensitive("/Game/Option", FALSE);
*/
    nh_menu_sensitive("/Move", FALSE);
    nh_menu_sensitive("/Check", FALSE);
    nh_menu_sensitive("/Equip", FALSE);
    nh_menu_sensitive("/You", FALSE);
    nh_menu_sensitive("/Adventure", FALSE);
    nh_menu_sensitive("/Action", FALSE);
    nh_menu_sensitive("/Religion", FALSE);
    nh_menu_sensitive("/Special", FALSE);
#endif
    
    main_hbox = nh_gtk_new_and_pack(
	gtk_hbox_new(FALSE, 0), main_vbox, "",
	FALSE, FALSE, 0);
	
    main_message = nh_gtk_new_and_pack(
	nh_message_new(), main_hbox, "",
	FALSE, FALSE, 0);

    main_status = nh_gtk_new_and_pack(
	nh_status_new(), main_hbox, "",
	FALSE, FALSE, 0);
#ifdef RADAR
    main_radar = nh_radar_new();
#endif
    main_map = nh_gtk_new_and_pack(
	nh_map_new(main_window), main_vbox, "",
	FALSE, FALSE, 0);

 selection:
    initialized = 1;

    gtk_widget_hide(credit_window);
    gtk_widget_show_all(main_window);
    
    iflags.window_inited = 1;
}

void
GTK_exit_nhwindows(const char *str)
{
    int id;

    if(str && *str){
	id = GTK_create_nhwindow(NHW_MENU);
	GTK_putstr(id, 0, str);
	GTK_display_nhwindow(id, TRUE);
	GTK_destroy_nhwindow(id);
    }
}

void
GTK_init_nhwindows2()
{
    if(initialized2)
	return;
#ifdef JNETHACK
    nh_menu_sensitive("/ゲーム/遊ぶ", FALSE);
    nh_menu_sensitive("/ゲーム/保存", TRUE);
    nh_menu_sensitive("/ゲーム/オプション", TRUE);

    nh_menu_sensitive("/移動", TRUE);
    nh_menu_sensitive("/調査", TRUE);
    nh_menu_sensitive("/装備", TRUE);
    nh_menu_sensitive("/あなた自身", TRUE);
    nh_menu_sensitive("/冒険", TRUE);
    nh_menu_sensitive("/行動", TRUE);
    nh_menu_sensitive("/信仰", TRUE);
    nh_menu_sensitive("/特殊", TRUE);
#else
    nh_menu_sensitive("/Game/Play", FALSE);
    nh_menu_sensitive("/Game/Save", TRUE);
    nh_menu_sensitive("/Game/Option", TRUE);

    nh_menu_sensitive("/Game/Save", TRUE);
    nh_menu_sensitive("/Game/Option", TRUE);
    nh_menu_sensitive("/Move", TRUE);
    nh_menu_sensitive("/Check", TRUE);
    nh_menu_sensitive("/Equip", TRUE);
    nh_menu_sensitive("/You", TRUE);
    nh_menu_sensitive("/Adventure", TRUE);
    nh_menu_sensitive("/Action", TRUE);
    nh_menu_sensitive("/Religion", TRUE);
    nh_menu_sensitive("/Special", TRUE);
#endif

    nh_option_lock();

    gtk_signal_connect(
	GTK_OBJECT(main_window), "key_press_event",
	GTK_SIGNAL_FUNC(default_key_press), NULL);

#ifdef RADAR
    gtk_signal_connect(
	GTK_OBJECT(main_radar), "key_press_event",
	GTK_SIGNAL_FUNC(default_key_press), NULL);
#endif

    initialized2 = 1;
}

winid
GTK_create_nhwindow(int type)
{
    winid	id;
    NHWindow	*w;

    switch(type){
/* 
   these windows had already created
*/
    case NHW_MESSAGE:
    case NHW_STATUS:
    case NHW_MAP:
	w = &gtkWindows[type];
	w->w = main_window;	
	return type;
	break;
/*
  create new window
*/
    case NHW_MENU:
    case NHW_TEXT:
	id = type;
	while(id < MAXWIN){
	    w = &gtkWindows[id];
	    memset(w, 0, sizeof(NHWindow));

	    return id;
	    ++id;
	}
    }
    return 0;
}

void
GTK_destroy_nhwindow(winid id)
{
/*    int i;*/
    NHWindow *w;

    if(id == NHW_MAP)
	nh_map_destroy();

    if(id == NHW_STATUS || id == NHW_MESSAGE || id == NHW_MAP)
	return;

    w = &gtkWindows[id]; 

    if(w->w){
	gtk_widget_hide_all(w->w);
	if(w->hid > 0)
	    gtk_signal_disconnect(GTK_OBJECT(w->w), w->hid);

	gtk_widget_destroy(w->w);

	memset(w, 0, sizeof(NHWindow));
    }
}

void
GTK_display_nhwindow(winid id, BOOLEAN_P blocking)
{
    NHWindow *w;

    if(id == NHW_STATUS || id == NHW_MESSAGE){
    }
    else if(id == NHW_MAP){	/* flush out */
	nh_map_flush();
    }
    else{
	w = &gtkWindows[id];

	gtk_grab_add(w->w);
	gtk_widget_show_all(w->w);
    }

    if((id != NHW_MESSAGE && blocking) || id == NHW_MENU)
	main_hook();
}

void
GTK_clear_nhwindow(winid id)
{
    if(id == NHW_MAP){
	nh_map_clear();
    }
    return;
}

/*
  ATR_ULINE
  ATR_BOLD
  ATR_BLINK
  ATR_INVERSE
 */
void
GTK_putstr(winid id, int attr, const char *str)
{
    const gchar	*text[1];
    NHWindow	*w;

    w = &gtkWindows[id]; 

    if(id == NHW_MESSAGE){
	nh_message_putstr(str);
	return;
    }
    else if(id == NHW_STATUS){
	nh_status_update();
	return;
    }
    else if(id <= 3){
	panic("bad window");
	return;
    }

    if(!w->w){
	w->w = gtk_window_new(GTK_WINDOW_DIALOG);
	gtk_widget_set_name(GTK_WIDGET(w->w), "fixed font");
	gtk_window_set_position(GTK_WINDOW(w->w), GTK_WIN_POS_MOUSE);

	gtk_signal_connect(
	    GTK_OBJECT(w->w), "key_press_event",
	    GTK_SIGNAL_FUNC(default_key_press), NULL);
	w->hid = gtk_signal_connect(
	    GTK_OBJECT(w->w), "destroy",
	    GTK_SIGNAL_FUNC(default_destroy), &w->hid);

	w->frame = nh_gtk_new_and_add(
	    gtk_frame_new(NULL), w->w, "");

	w->vbox = nh_gtk_new_and_add(
	    gtk_vbox_new(FALSE, 0), w->frame, "");

	w->clist = nh_gtk_new_and_pack(
	    gtk_clist_new(1), w->vbox, "",
	    FALSE, FALSE, NH_PAD);
	gtk_clist_set_column_auto_resize(GTK_CLIST(w->clist), 0, TRUE);

	w->hbox2 = nh_gtk_new_and_pack(
	    gtk_hbox_new(FALSE, 0), w->vbox, "",
	    FALSE, FALSE, NH_PAD);

#ifdef JNETHACK
	w->button[0] = nh_gtk_new_and_pack(
	    gtk_button_new_with_label("閉じる"), w->hbox2, "",
	    TRUE, FALSE, 0);
#else
	w->button[0] = nh_gtk_new_and_pack(
	    gtk_button_new_with_label("Close"), w->hbox2, "",
	    TRUE, FALSE, 0);
#endif
	gtk_signal_connect(
	    GTK_OBJECT(w->button[0]), "clicked",
	    GTK_SIGNAL_FUNC(default_button_press), (gpointer)'\033');
    }

    text[0] = str;
    gtk_clist_append(GTK_CLIST(w->clist), (gchar **)text);

    if(attr != 0){
	gtk_clist_set_foreground(
	    GTK_CLIST(w->clist), 
	    GTK_CLIST(w->clist)->rows - 1,
	    GTK_WIDGET(w->clist)->style->bg); 
	gtk_clist_set_background(
	    GTK_CLIST(w->clist), 
	    GTK_CLIST(w->clist)->rows - 1,
	    GTK_WIDGET(w->clist)->style->fg); 
    }
}

void
GTK_get_nh_event()
{
    return;
}

int
GTK_nhgetch(void)
{
    int key;
#ifdef RADAR
    nh_radar_update();
#endif

    keysym = 0;
    if(!keysym)
	main_hook();

    key = keysym;
    keysym = 0;

    return key;
}

int
GTK_nh_poskey(int *x, int *y, int *mod)
{
    int key;

#ifdef RADAR
    nh_radar_update();
#endif

    nh_map_click(TRUE);

    keysym = 0;
    main_hook();

    if(!keysym)
	nh_map_pos(x, y);

    nh_map_click(FALSE);

    key = keysym;
    keysym = 0;

    return key;
}

void
GTK_display_file(const char *fname, BOOLEAN_P complain)
{
    guint hid;	
    GtkWidget *w;
    GtkWidget *scrollbar;
    GtkWidget *label;
    GtkWidget *vbox;
    GtkWidget *hbox, *hbox2;
    GtkWidget *text;
    GtkWidget *button;

    FILE	*fp;
    char	buf[NH_BUFSIZ];

    fp = fopen(fname, "r");
    if(!fp)
	return;

    w = gtk_window_new(GTK_WINDOW_DIALOG);
    gtk_widget_set_name(GTK_WIDGET(w), "fixed font");

    gtk_window_set_position(GTK_WINDOW(w), GTK_WIN_POS_CENTER);
    gtk_signal_connect(
	GTK_OBJECT(w), "key_press_event",
	GTK_SIGNAL_FUNC(default_key_press), NULL);
    hid = gtk_signal_connect(
	GTK_OBJECT(w), "destroy",
	GTK_SIGNAL_FUNC(default_destroy), &hid);

    vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), w, "");

    label = nh_gtk_new_and_pack(
	gtk_label_new("HELP"), vbox, "",
	FALSE, FALSE, NH_PAD);

    hbox = nh_gtk_new_and_pack(
	gtk_hbox_new(FALSE, 0), vbox, "",
	FALSE, FALSE, NH_PAD);

    text = nh_gtk_new_and_pack(
	gtk_text_new(NULL, NULL), hbox, "",
	FALSE, FALSE, NH_PAD);

    gtk_widget_set_usize(
	GTK_WIDGET(text), 600, (root_height * 2)/3);

    scrollbar = nh_gtk_new_and_pack(
	gtk_vscrollbar_new(GTK_TEXT(text)->vadj), hbox, "",
	FALSE, FALSE, NH_PAD);

    hbox2 = nh_gtk_new_and_pack(
	gtk_hbox_new(FALSE, 0), vbox, "",
	FALSE, FALSE, NH_PAD);

#ifdef JNETHACK
    button = nh_gtk_new_and_pack(
	gtk_button_new_with_label("閉じる"), hbox2, "",
	TRUE, FALSE, NH_PAD);
#else
    button = nh_gtk_new_and_pack(
	gtk_button_new_with_label("Close"), hbox2, "",
	TRUE, FALSE, NH_PAD);
#endif
    gtk_signal_connect(
	GTK_OBJECT(button), "clicked",
	GTK_SIGNAL_FUNC(default_button_press), (gpointer)'\033');

    while(fgets(buf, NH_BUFSIZ, fp)){
	gtk_text_insert(GTK_TEXT(text), NULL, NULL, NULL, buf, strlen(buf));
    }

    gtk_widget_show_all(w);
    main_hook();

    if(hid > 0){
	gtk_signal_disconnect(GTK_OBJECT(w), hid);

	gtk_widget_destroy(button);
	gtk_widget_destroy(hbox2);
	gtk_widget_destroy(scrollbar);
	gtk_widget_destroy(text);
	gtk_widget_destroy(hbox);
	gtk_widget_destroy(label);
	gtk_widget_destroy(vbox);
	gtk_widget_destroy(w);
    }
}

void
GTK_player_selection(void)
{
    if(!pl_character[0]){
	gtk_main();
	pl_character[0] = pl_selection;
    }
}

void
GTK_wait_synch()
{
    ;
}

void
GTK_mark_synch()
{
    ;
}

int
GTK_get_ext_cmd()
{
    extern struct ext_func_tab extcmdlist[];
    int i;

    GTK_putstr(NHW_MESSAGE, 7, "#");
    main_hook();

    i = 0;
    while(extcmdlist[i].ef_txt){
	if(extcmdlist[i].ef_txt[0] == keysym){
	    GTK_putstr(NHW_MESSAGE, 7, extcmdlist[i].ef_txt);
	    return i;
	}
	++i;
    }
    
    return -1;
}

#define NAME_LINE 0		/* line # for player name */
#define GOLD_LINE 1		/* line # for amount of gold */
#define DEATH_LINE 2		/* line # for death description */
#define YEAR_LINE 6		/* line # for year */

static struct{
    GdkWChar	str[NH_BUFSIZ];
    int		len;
    int		width;
} rip_line[YEAR_LINE + 1];

void
GTK_outrip(winid id, int how)
{
    int		x, y;
    int		width;
    int		total_len, len, line;
    GtkWidget	*w;
    GtkWidget	*vbox;
    GtkWidget	*rip;
    GdkPixmap 	*rip_pixmap;
    char	mstr[NH_BUFSIZ];
    GdkWChar	*wc;
    GdkWChar	wstr[NH_BUFSIZ];
    extern const char *killed_by_prefix[];

    w = gtk_window_new(GTK_WINDOW_DIALOG);
    gtk_window_set_position(GTK_WINDOW(w), GTK_WIN_POS_CENTER);

    gtk_widget_set_events(
	w, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);

    gtk_signal_connect(
	GTK_OBJECT(w), "button_press_event",
	GTK_SIGNAL_FUNC(default_button_press), NULL);
    gtk_signal_connect(
	GTK_OBJECT(w), "key_press_event",
	GTK_SIGNAL_FUNC(default_key_press), NULL);

    gtk_widget_realize(w);

    vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), w, "");

    rip_pixmap = gdk_pixmap_create_from_xpm(
	w->window, 
	0, 0, "rip.xpm");

    rip = nh_gtk_new_and_pack(
	gtk_pixmap_new(rip_pixmap, 0), vbox, "",
	FALSE, FALSE, NH_PAD);

    Sprintf(mstr, "%s", plname);
    rip_line[NAME_LINE].len = gdk_mbstowcs(rip_line[NAME_LINE].str, mstr, NH_BUFSIZ);

    Sprintf(mstr, "%ld Au", u.ugold);
    rip_line[GOLD_LINE].len = gdk_mbstowcs(rip_line[GOLD_LINE].str, mstr, NH_BUFSIZ);

    Sprintf(mstr, "%4d", getyear());
    rip_line[YEAR_LINE].len = gdk_mbstowcs(rip_line[YEAR_LINE].str, mstr, NH_BUFSIZ);

    switch (killer_format) {
    default:
	impossible("bad killer format?");
    case KILLED_BY_AN:
#ifndef JNETHACK
	Strcpy(mstr, killed_by_prefix[how]);
	Strcat(mstr, an(killer));
#else
	Strcpy(mstr, an(killer));
	Strcat(mstr, killed_by_prefix[how]);
#endif
	break;
    case KILLED_BY:
#ifndef	JNETHACK
	Strcpy(mstr, killed_by_prefix[how]);
	Strcat(mstr, killer);
#else
	Strcpy(mstr, killer);
	Strcat(mstr, killed_by_prefix[how]);
#endif
	break;
    case NO_KILLER_PREFIX:
	Strcpy(mstr, killer);
	break;
    }

    total_len = gdk_mbstowcs(wstr, mstr, NH_BUFSIZ);
    line = DEATH_LINE;
    wc = wstr;

    while(total_len > 0 && line < YEAR_LINE){
	len = total_len;
	while(1){
	    width = gdk_text_width_wc(rip->style->font, wc, len);
	    if(width < 96)
		break;
	    --len;
	}
	memcpy(rip_line[line].str, wc, len * sizeof(GdkWChar));
	rip_line[line].len = len;
	wc += len;
	total_len -= len;

	++line;
    }

    x = 155;
    y = 78;

    {
	gint dummy;
	gint height = 0, ascent, descent;

	for(line = 0 ; line <= YEAR_LINE ; ++line){
	    gdk_text_extents_wc(
		rip->style->font,
		rip_line[line].str, rip_line[line].len,
		&dummy,
		&dummy,
		&rip_line[line].width,
		&ascent,
		&descent);
	    if(height < (ascent + descent))
		height = ascent + descent;
	}

	for(line = 0 ; line <= YEAR_LINE ; ++line){
	    gdk_draw_text_wc(
		rip_pixmap,
		rip->style->font,
		rip->style->black_gc,
		x - rip_line[line].width / 2, y,
		rip_line[line].str, rip_line[line].len);
	    y += height;
	}
    }

    gtk_widget_show_all(w);
    gtk_main();
}

void
GTK_raw_print(const char *str)
{
  /*
    if(initialized)
	GTK_putstr(NHW_MESSAGE, 0, str);
    else
  */
	tty_raw_print(str);
}

void
GTK_raw_print_bold(const char *str)
{
  /*
    if(initialized)
	GTK_putstr(NHW_MESSAGE, ATR_BOLD, str);
    else
  */
	tty_raw_print_bold(str);
}
