| version 1.1, 2004/07/14 16:01:40 | version 1.15, 2011/12/17 19:55:48 | 
| Line 1 | Line 1 | 
 | /*      $Id$    */ |  | 
 |  |  | 
 | /* | /* | 
| * Copyright (c) 2004 NONAKA Kimihiro <aw9k-nnk@asahi-net.or.jp> | * Copyright (c) 2004 NONAKA Kimihiro | 
 | * All rights reserved. | * All rights reserved. | 
 | * | * | 
 | * Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | 
| Line 12 | Line 10 | 
 | * 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright | 
 | *    notice, this list of conditions and the following disclaimer in the | *    notice, this list of conditions and the following disclaimer in the | 
 | *    documentation and/or other materials provided with the distribution. | *    documentation and/or other materials provided with the distribution. | 
 | * 3. The name of the author may not be used to endorse or promote products |  | 
 | *    derived from this software without specific prior written permission. |  | 
 | * | * | 
 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | 
 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
| Line 64 | Line 60 | 
 | | GDK_LEAVE_NOTIFY_MASK        \ | | GDK_LEAVE_NOTIFY_MASK        \ | 
 | | GDK_EXPOSURE_MASK) | | GDK_EXPOSURE_MASK) | 
 |  |  | 
|  | /* | 
|  | - Signal: gboolean GtkWidget::destroy_event (GtkWidget *widget, | 
|  | GdkEventAny *event, gpointer user_data) | 
|  | */ | 
 | static gboolean | static gboolean | 
| destroy_evhandler(GtkWidget *w) | destroy_evhandler(GtkWidget *w, GdkEventAny *ev, gpointer p) | 
 | { | { | 
 |  |  | 
 | UNUSED(w); |  | 
 |  |  | 
 | toolkit_widget_quit(); | toolkit_widget_quit(); | 
 |  |  | 
 | return TRUE; | return TRUE; | 
 | } | } | 
 |  |  | 
 | /* | /* | 
| - Signal: gboolean GtkWidget::configure_event(GtkWidget *widget, | - Signal: gboolean GtkWidget::configure_event (GtkWidget *widget, | 
 | GdkEventConfigure *event, gpointer user_data) | GdkEventConfigure *event, gpointer user_data) | 
 | */ | */ | 
 | static gboolean | static gboolean | 
| configure_evhandler(GtkWidget *w, GdkEventConfigure *ev, gpointer user_data) | configure_evhandler(GtkWidget *w, GdkEventConfigure *ev, gpointer p) | 
 | { | { | 
 |  |  | 
 | UNUSED(ev); |  | 
 | UNUSED(user_data); |  | 
 |  |  | 
 | gdk_draw_rectangle(w->window, w->style->black_gc, TRUE, | gdk_draw_rectangle(w->window, w->style->black_gc, TRUE, | 
 | 0, 0, w->allocation.width, w->allocation.height); | 0, 0, w->allocation.width, w->allocation.height); | 
 |  |  | 
 | return TRUE; | return TRUE; | 
 | } | } | 
 |  |  | 
 | /* | /* | 
| - Signal: gboolean GtkWidget::expose_event(GtkWidget *widget, | - Signal: gboolean GtkWidget::expose_event (GtkWidget *widget, | 
 | GdkEventExpose *event, gpointer user_data) | GdkEventExpose *event, gpointer user_data) | 
 | */ | */ | 
 | static gboolean | static gboolean | 
 | expose_evhandler(GtkWidget *w, GdkEventExpose *ev, gpointer p) | expose_evhandler(GtkWidget *w, GdkEventExpose *ev, gpointer p) | 
 | { | { | 
 |  |  | 
 | UNUSED(w); |  | 
 | UNUSED(p); |  | 
 |  |  | 
 | if (ev->count == 0) { | if (ev->count == 0) { | 
 | scrndraw_redraw(); | scrndraw_redraw(); | 
 | } | } | 
| Line 117  static gboolean | Line 108  static gboolean | 
 | key_press_evhandler(GtkWidget *w, GdkEventKey *ev, gpointer p) | key_press_evhandler(GtkWidget *w, GdkEventKey *ev, gpointer p) | 
 | { | { | 
 |  |  | 
| UNUSED(w); | if (ev->keyval == GDK_F11) { | 
| UNUSED(p); | if ((np2oscfg.F11KEY == 1) && (scrnmode & SCRNMODE_FULLSCREEN)) | 
|  | xmenu_toggle_menu(); | 
| if ((ev->keyval == GDK_F12) && (np2oscfg.F12KEY == 0)) | else if (np2oscfg.F11KEY == 2) | 
|  | xmenu_select_screen(scrnmode ^ SCRNMODE_FULLSCREEN); | 
|  | } else if ((ev->keyval == GDK_F12) && (np2oscfg.F12KEY == 0)) | 
 | xmenu_toggle_item(NULL, "mousemode", !np2oscfg.MOUSE_SW); | xmenu_toggle_item(NULL, "mousemode", !np2oscfg.MOUSE_SW); | 
 | else | else | 
 | gtkkbd_keydown(ev->keyval); | gtkkbd_keydown(ev->keyval); | 
| Line 135  static gboolean | Line 128  static gboolean | 
 | key_release_evhandler(GtkWidget *w, GdkEventKey *ev, gpointer p) | key_release_evhandler(GtkWidget *w, GdkEventKey *ev, gpointer p) | 
 | { | { | 
 |  |  | 
 | UNUSED(w); |  | 
 | UNUSED(p); |  | 
 |  |  | 
 | if ((ev->keyval != GDK_F12) || (np2oscfg.F12KEY != 0)) | if ((ev->keyval != GDK_F12) || (np2oscfg.F12KEY != 0)) | 
 | gtkkbd_keyup(ev->keyval); | gtkkbd_keyup(ev->keyval); | 
 | return TRUE; | return TRUE; | 
| Line 151  static gboolean | Line 141  static gboolean | 
 | button_press_evhandler(GtkWidget *w, GdkEventButton *ev, gpointer p) | button_press_evhandler(GtkWidget *w, GdkEventButton *ev, gpointer p) | 
 | { | { | 
 |  |  | 
 | UNUSED(w); |  | 
 | UNUSED(p); |  | 
 |  |  | 
 | switch (ev->button) { | switch (ev->button) { | 
 | case 1: | case 1: | 
 | mouse_btn(MOUSE_LEFTDOWN); | mouse_btn(MOUSE_LEFTDOWN); | 
| Line 178  static gboolean | Line 165  static gboolean | 
 | button_release_evhandler(GtkWidget *w, GdkEventButton *ev, gpointer p) | button_release_evhandler(GtkWidget *w, GdkEventButton *ev, gpointer p) | 
 | { | { | 
 |  |  | 
 | UNUSED(w); |  | 
 | UNUSED(p); |  | 
 |  |  | 
 | switch (ev->button) { | switch (ev->button) { | 
 | case 1: | case 1: | 
 | mouse_btn(MOUSE_LEFTUP); | mouse_btn(MOUSE_LEFTUP); | 
| Line 196  button_release_evhandler(GtkWidget *w, G | Line 180  button_release_evhandler(GtkWidget *w, G | 
 | return TRUE; | return TRUE; | 
 | } | } | 
 |  |  | 
 |  | /* | 
 |  | - Signal: gboolean GtkWidget::motion_notify_event (GtkWidget *widget, | 
 |  | GdkEventMotion *event, gpointer user_data) | 
 |  | */ | 
 |  | static gboolean | 
 |  | motion_notify_evhandler(GtkWidget *w, GdkEventMotion *ev, gpointer p) | 
 |  | { | 
 |  |  | 
 |  | if ((scrnmode & SCRNMODE_FULLSCREEN) && (ev->y < 8.0)) | 
 |  | xmenu_show(); | 
 |  |  | 
 |  | return TRUE; | 
 |  | } | 
 |  |  | 
 |  |  | 
 | /* | /* | 
 | * misc | * misc | 
 | */ | */ | 
 |  | static gint | 
 |  | main_loop_quit(gpointer p) | 
 |  | { | 
 |  |  | 
 |  | scrnmng_fullscreen(0); | 
 |  |  | 
 |  | return 0; | 
 |  | } | 
 |  |  | 
 | static void | static void | 
 | set_icon_bitmap(GtkWidget *w) | set_icon_bitmap(GtkWidget *w) | 
 | { | { | 
| Line 215  set_icon_bitmap(GtkWidget *w) | Line 222  set_icon_bitmap(GtkWidget *w) | 
 | /* | /* | 
 | * idle process | * idle process | 
 | */ | */ | 
| static int install_count = 0; | static volatile int install_count = 0; | 
 | static guint idle_id; | static guint idle_id; | 
 |  |  | 
 | void | void | 
| Line 223  install_idle_process(void) | Line 230  install_idle_process(void) | 
 | { | { | 
 |  |  | 
 | if (install_count++ == 0) { | if (install_count++ == 0) { | 
| idle_id = g_idle_add((GSourceFunc)mainloop, 0); | idle_id = g_idle_add((GSourceFunc)mainloop, NULL); | 
 | soundmng_play(); | soundmng_play(); | 
 | } | } | 
 | } | } | 
| Line 242  uninstall_idle_process(void) | Line 249  uninstall_idle_process(void) | 
 | /* | /* | 
 | * toolkit | * toolkit | 
 | */ | */ | 
 | const char * |  | 
 | gui_gtk_get_toolkit(void) |  | 
 | { |  | 
 |  |  | 
 | return "gtk"; |  | 
 | } |  | 
 |  |  | 
 | BOOL | BOOL | 
 | gui_gtk_arginit(int *argcp, char ***argvp) | gui_gtk_arginit(int *argcp, char ***argvp) | 
 | { | { | 
| Line 277  gui_gtk_widget_create(void) | Line 277  gui_gtk_widget_create(void) | 
 | GtkWidget *main_vbox; | GtkWidget *main_vbox; | 
 | GtkWidget *menubar; | GtkWidget *menubar; | 
 | gchar *accel = NULL; | gchar *accel = NULL; | 
 |  | gint root_x, root_y; | 
 |  |  | 
 | main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | 
| gtk_widget_set_double_buffered(GTK_WIDGET(main_window), FALSE); | //      gtk_widget_set_double_buffered(GTK_WIDGET(main_window), FALSE); | 
 | gtk_window_set_resizable(GTK_WINDOW(main_window), FALSE); | gtk_window_set_resizable(GTK_WINDOW(main_window), FALSE); | 
 | gtk_window_set_title(GTK_WINDOW(main_window), np2oscfg.titles); | gtk_window_set_title(GTK_WINDOW(main_window), np2oscfg.titles); | 
 | gtk_widget_add_events(main_window, EVENT_MASK); | gtk_widget_add_events(main_window, EVENT_MASK); | 
| Line 293  gui_gtk_widget_create(void) | Line 294  gui_gtk_widget_create(void) | 
 | gtk_widget_show(menubar); | gtk_widget_show(menubar); | 
 |  |  | 
 | drawarea = gtk_drawing_area_new(); | drawarea = gtk_drawing_area_new(); | 
| gtk_widget_set_double_buffered(GTK_WIDGET(drawarea), FALSE); | //      gtk_widget_set_double_buffered(GTK_WIDGET(drawarea), FALSE); | 
 | gtk_widget_set_size_request(GTK_WIDGET(drawarea), 640, 400); | gtk_widget_set_size_request(GTK_WIDGET(drawarea), 640, 400); | 
 | gtk_box_pack_end(GTK_BOX(main_vbox), drawarea, FALSE, TRUE, 0); | gtk_box_pack_end(GTK_BOX(main_vbox), drawarea, FALSE, TRUE, 0); | 
 | gtk_widget_show(drawarea); | gtk_widget_show(drawarea); | 
| Line 307  gui_gtk_widget_create(void) | Line 308  gui_gtk_widget_create(void) | 
 | } | } | 
 |  |  | 
 | gtk_widget_realize(main_window); | gtk_widget_realize(main_window); | 
 |  | gdk_window_get_origin(main_window->window, &root_x, &root_y); | 
 |  | gdk_window_reparent(main_window->window, NULL, root_x, root_y); | 
 | set_icon_bitmap(main_window); | set_icon_bitmap(main_window); | 
 |  |  | 
 | g_signal_connect(GTK_OBJECT(main_window), "destroy", | g_signal_connect(GTK_OBJECT(main_window), "destroy", | 
| GTK_SIGNAL_FUNC(destroy_evhandler), "WM destroy"); | G_CALLBACK(destroy_evhandler), (gpointer)"WM destroy"); | 
 | g_signal_connect(GTK_OBJECT(main_window), "key_press_event", | g_signal_connect(GTK_OBJECT(main_window), "key_press_event", | 
| GTK_SIGNAL_FUNC(key_press_evhandler), NULL); | G_CALLBACK(key_press_evhandler), NULL); | 
 | g_signal_connect(GTK_OBJECT(main_window), "key_release_event", | g_signal_connect(GTK_OBJECT(main_window), "key_release_event", | 
| GTK_SIGNAL_FUNC(key_release_evhandler), NULL); | G_CALLBACK(key_release_evhandler), NULL); | 
 | g_signal_connect(GTK_OBJECT(main_window), "button_press_event", | g_signal_connect(GTK_OBJECT(main_window), "button_press_event", | 
| GTK_SIGNAL_FUNC(button_press_evhandler), NULL); | G_CALLBACK(button_press_evhandler), NULL); | 
 | g_signal_connect(GTK_OBJECT(main_window), "button_release_event", | g_signal_connect(GTK_OBJECT(main_window), "button_release_event", | 
| GTK_SIGNAL_FUNC(button_release_evhandler), NULL); | G_CALLBACK(button_release_evhandler), NULL); | 
|  | g_signal_connect(GTK_OBJECT(main_window), "motion_notify_event", | 
|  | G_CALLBACK(motion_notify_evhandler), NULL); | 
 |  |  | 
 | g_signal_connect(GTK_OBJECT(drawarea), "configure_event", | g_signal_connect(GTK_OBJECT(drawarea), "configure_event", | 
| GTK_SIGNAL_FUNC(configure_evhandler), NULL); | G_CALLBACK(configure_evhandler), NULL); | 
 | g_signal_connect(GTK_OBJECT(drawarea), "expose_event", | g_signal_connect(GTK_OBJECT(drawarea), "expose_event", | 
| GTK_SIGNAL_FUNC(expose_evhandler), NULL); | G_CALLBACK(expose_evhandler), NULL); | 
| } |  | 
|  |  | 
| static void |  | 
| gui_gtk_terminate(void) |  | 
| { |  | 
|  |  | 
| /* Nothing to do */ |  | 
 | } | } | 
 |  |  | 
 | void | void | 
| Line 344  void | Line 342  void | 
 | gui_gtk_widget_mainloop(void) | gui_gtk_widget_mainloop(void) | 
 | { | { | 
 |  |  | 
 |  |  | 
 | install_idle_process(); | install_idle_process(); | 
 |  | gtk_quit_add(1, main_loop_quit, NULL); | 
 | gtk_main(); | gtk_main(); | 
 | uninstall_idle_process(); | uninstall_idle_process(); | 
 | } | } | 
| Line 374  gui_gtk_set_window_title(const char* str | Line 372  gui_gtk_set_window_title(const char* str | 
 | gtk_window_set_title(GTK_WINDOW(main_window), str); | gtk_window_set_title(GTK_WINDOW(main_window), str); | 
 | } | } | 
 |  |  | 
| void | int | 
| gui_gtk_messagebox(const char *title, const char *msg) | gui_gtk_msgbox(const char *title, const char *msg, UINT flags) | 
 | { | { | 
 |  | GtkWidget *dialog; | 
 |  | GtkMessageType msgtype; | 
 |  | GtkButtonsType btntype; | 
 |  | int retval; | 
 |  | int rv; | 
 |  |  | 
| g_message("%s:\n%s", title, msg); | uninstall_idle_process(); | 
| } |  | 
|  | switch (flags & TK_MB_BTN_MASK) { | 
|  | default: | 
|  | btntype = GTK_BUTTONS_OK; | 
|  | break; | 
|  |  | 
|  | case TK_MB_OK: | 
|  | btntype = GTK_BUTTONS_OK; | 
|  | break; | 
|  |  | 
|  | case TK_MB_CANCEL: | 
|  | btntype = GTK_BUTTONS_CANCEL; | 
|  | break; | 
|  |  | 
|  | case TK_MB_OKCANCEL: | 
|  | btntype = GTK_BUTTONS_OK_CANCEL; | 
|  | break; | 
|  |  | 
|  | case TK_MB_YESNO: | 
|  | btntype = GTK_BUTTONS_YES_NO; | 
|  | break; | 
|  | } | 
 |  |  | 
| /* toolkit data */ | if (flags & TK_MB_ICON_INFO) { | 
| gui_toolkit_t gtk_toolkit = { | msgtype = GTK_MESSAGE_INFO; | 
| gui_gtk_get_toolkit, | } else if (flags & TK_MB_ICON_WARNING) { | 
| gui_gtk_arginit, | msgtype = GTK_MESSAGE_WARNING; | 
| gui_gtk_terminate, | } else if (flags & TK_MB_ICON_ERROR) { | 
| gui_gtk_widget_create, | msgtype = GTK_MESSAGE_ERROR; | 
| gui_gtk_widget_show, | } else if (flags & TK_MB_ICON_QUESTION) { | 
| gui_gtk_widget_mainloop, | msgtype = GTK_MESSAGE_QUESTION; | 
| gui_gtk_widget_quit, | } else { | 
| gui_gtk_event_process, | msgtype = GTK_MESSAGE_OTHER; | 
| gui_gtk_set_window_title, | } | 
| gui_gtk_messagebox, |  | 
| }; | dialog = gtk_message_dialog_new(GTK_WINDOW(main_window), | 
|  | GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_MODAL, | 
|  | msgtype, btntype, msg); | 
|  | gtk_window_set_title(GTK_WINDOW(dialog), title); | 
|  |  | 
|  | gtk_widget_show_all(dialog); | 
|  |  | 
|  | rv = gtk_dialog_run(GTK_DIALOG(dialog)); | 
|  | switch (rv) { | 
|  | case GTK_RESPONSE_OK: | 
|  | retval = TK_MB_OK; | 
|  | break; | 
|  |  | 
|  | case GTK_RESPONSE_CANCEL: | 
|  | retval = TK_MB_CANCEL; | 
|  | break; | 
|  |  | 
|  | case GTK_RESPONSE_YES: | 
|  | retval = TK_MB_YES; | 
|  | break; | 
|  |  | 
|  | case GTK_RESPONSE_NO: | 
|  | retval = TK_MB_NO; | 
|  | break; | 
|  |  | 
|  | default: | 
|  | retval = 0;     /* XXX */ | 
|  | break; | 
|  | } | 
|  |  | 
|  | gtk_widget_destroy(dialog); | 
|  | install_idle_process(); | 
|  |  | 
|  | return retval; | 
|  | } |