GtkWidget *cfgbox;
};
+void get_random_seed(void **randseed, int *randseedsize)
+{
+ time_t *tp = snew(time_t);
+ time(tp);
+ *randseed = (void *)tp;
+ *randseedsize = sizeof(time_t);
+}
+
void frontend_default_colour(frontend *fe, float *output)
{
GdkColor col = fe->window->style->bg[GTK_STATE_NORMAL];
static void destroy(GtkWidget *widget, gpointer data)
{
+ frontend *fe = (frontend *)data;
+ deactivate_timer(fe);
gtk_main_quit();
}
if (!fe->pixmap)
return TRUE;
- if (event->type != GDK_BUTTON_PRESS)
+ if (event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE)
return TRUE;
if (event->button == 2 || (event->state & GDK_SHIFT_MASK))
else
return FALSE; /* don't even know what button! */
+ if (event->type == GDK_BUTTON_RELEASE)
+ button += LEFT_RELEASE - LEFT_BUTTON;
+
+ if (!midend_process_key(fe->me, event->x, event->y, button))
+ gtk_widget_destroy(fe->window);
+
+ return TRUE;
+}
+
+static gint motion_event(GtkWidget *widget, GdkEventMotion *event,
+ gpointer data)
+{
+ frontend *fe = (frontend *)data;
+ int button;
+
+ if (!fe->pixmap)
+ return TRUE;
+
+ if (event->state & (GDK_BUTTON2_MASK | GDK_SHIFT_MASK))
+ button = MIDDLE_DRAG;
+ else if (event->state & GDK_BUTTON1_MASK)
+ button = LEFT_DRAG;
+ else if (event->state & GDK_BUTTON3_MASK)
+ button = RIGHT_DRAG;
+ else
+ return FALSE; /* don't even know what button! */
+
if (!midend_process_key(fe->me, event->x, event->y, button))
gtk_widget_destroy(fe->window);
gtk_window_set_default(GTK_WINDOW(window), ok);
gtk_signal_connect(GTK_OBJECT(ok), "clicked",
GTK_SIGNAL_FUNC(errmsg_button_clicked), window);
+ gtk_signal_connect(GTK_OBJECT(window), "destroy",
+ GTK_SIGNAL_FUNC(window_destroy), NULL);
gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
GTK_SIGNAL_FUNC(win_key_press), ok);
gtk_window_set_modal(GTK_WINDOW(window), TRUE);
gtk_widget_show(menuitem);
}
-static frontend *new_window(void)
+static frontend *new_window(char *game_id, char **error)
{
frontend *fe;
GtkBox *vbox;
GtkWidget *menubar, *menu, *menuitem;
int x, y, n;
- time_t t;
fe = snew(frontend);
- time(&t);
- fe->me = midend_new(fe, &t, sizeof(t));
+ fe->me = midend_new(fe, &thegame);
+ if (game_id) {
+ *error = midend_game_id(fe->me, game_id, FALSE);
+ if (*error) {
+ midend_free(fe->me);
+ sfree(fe);
+ return NULL;
+ }
+ }
midend_new_game(fe->me);
fe->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(fe->window), game_name);
+ gtk_window_set_title(GTK_WINDOW(fe->window), thegame.name);
#if 0
gtk_window_set_resizable(GTK_WINDOW(fe->window), FALSE);
#else
GTK_SIGNAL_FUNC(menu_config_event), fe);
gtk_widget_show(menuitem);
- if ((n = midend_num_presets(fe->me)) > 0 || game_can_configure) {
+ if ((n = midend_num_presets(fe->me)) > 0 || thegame.can_configure) {
GtkWidget *submenu;
int i;
gtk_widget_show(menuitem);
}
- if (game_can_configure) {
+ if (thegame.can_configure) {
menuitem = gtk_menu_item_new_with_label("Custom...");
gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
GPOINTER_TO_INT(CFG_SETTINGS));
#if 0
/* For GTK 2.0, should we be using gtk_widget_set_size_request? */
#endif
- gtk_widget_set_usize(viewport, x, req.height);
+ gtk_widget_set_usize(viewport, -1, req.height);
} else
fe->statusbar = NULL;
GTK_SIGNAL_FUNC(key_event), fe);
gtk_signal_connect(GTK_OBJECT(fe->area), "button_press_event",
GTK_SIGNAL_FUNC(button_event), fe);
+ gtk_signal_connect(GTK_OBJECT(fe->area), "button_release_event",
+ GTK_SIGNAL_FUNC(button_event), fe);
+ gtk_signal_connect(GTK_OBJECT(fe->area), "motion_notify_event",
+ GTK_SIGNAL_FUNC(motion_event), fe);
gtk_signal_connect(GTK_OBJECT(fe->area), "expose_event",
GTK_SIGNAL_FUNC(expose_area), fe);
gtk_signal_connect(GTK_OBJECT(fe->window), "map_event",
gtk_signal_connect(GTK_OBJECT(fe->area), "configure_event",
GTK_SIGNAL_FUNC(configure_area), fe);
- gtk_widget_add_events(GTK_WIDGET(fe->area), GDK_BUTTON_PRESS_MASK);
+ gtk_widget_add_events(GTK_WIDGET(fe->area),
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_BUTTON_MOTION_MASK);
gtk_widget_show(fe->area);
gtk_widget_show(fe->window);
int main(int argc, char **argv)
{
+ char *pname = argv[0];
+ char *error;
+
gtk_init(&argc, &argv);
- (void) new_window();
+
+ if (!new_window(argc > 1 ? argv[1] : NULL, &error)) {
+ fprintf(stderr, "%s: %s\n", pname, error);
+ return 1;
+ }
+
gtk_main();
return 0;