mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
Implemented Cube, in a sufficiently general way that it also handles
the tetrahedron, octahedron and icosahedron. [originally from svn r4151]
This commit is contained in:
4
Recipe
4
Recipe
@ -15,7 +15,7 @@ COMMON = midend malloc
|
|||||||
NET = net random tree234
|
NET = net random tree234
|
||||||
|
|
||||||
net : [X] gtk COMMON NET
|
net : [X] gtk COMMON NET
|
||||||
#cube : [X] gtk COMMON CUBE
|
cube : [X] gtk COMMON cube
|
||||||
|
|
||||||
#net : [G] windows COMMON NET
|
#net : [G] windows COMMON NET
|
||||||
#cube : [G] windows COMMON CUBE
|
#cube : [G] windows COMMON cube
|
||||||
|
19
gtk.c
19
gtk.c
@ -12,6 +12,7 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
|
||||||
#include "puzzles.h"
|
#include "puzzles.h"
|
||||||
|
|
||||||
@ -135,12 +136,26 @@ static void destroy(GtkWidget *widget, gpointer data)
|
|||||||
static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||||
{
|
{
|
||||||
frontend *fe = (frontend *)data;
|
frontend *fe = (frontend *)data;
|
||||||
|
int keyval;
|
||||||
|
|
||||||
if (!fe->pixmap)
|
if (!fe->pixmap)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (event->string[0] && !event->string[1] &&
|
if (event->string[0] && !event->string[1])
|
||||||
!midend_process_key(fe->me, 0, 0, event->string[0]))
|
keyval = (unsigned char)event->string[0];
|
||||||
|
else if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up)
|
||||||
|
keyval = CURSOR_UP;
|
||||||
|
else if (event->keyval == GDK_Down || event->keyval == GDK_KP_Down)
|
||||||
|
keyval = CURSOR_DOWN;
|
||||||
|
else if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left)
|
||||||
|
keyval = CURSOR_LEFT;
|
||||||
|
else if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right)
|
||||||
|
keyval = CURSOR_RIGHT;
|
||||||
|
else
|
||||||
|
keyval = -1;
|
||||||
|
|
||||||
|
if (keyval >= 0 &&
|
||||||
|
!midend_process_key(fe->me, 0, 0, keyval))
|
||||||
gtk_widget_destroy(fe->window);
|
gtk_widget_destroy(fe->window);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
20
midend.c
20
midend.c
@ -91,16 +91,22 @@ void midend_restart_game(midend_data *me)
|
|||||||
me->statepos = me->nstates;
|
me->statepos = me->nstates;
|
||||||
}
|
}
|
||||||
|
|
||||||
void midend_undo(midend_data *me)
|
static int midend_undo(midend_data *me)
|
||||||
{
|
{
|
||||||
if (me->statepos > 1)
|
if (me->statepos > 1) {
|
||||||
me->statepos--;
|
me->statepos--;
|
||||||
|
return 1;
|
||||||
|
} else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void midend_redo(midend_data *me)
|
static int midend_redo(midend_data *me)
|
||||||
{
|
{
|
||||||
if (me->statepos < me->nstates)
|
if (me->statepos < me->nstates) {
|
||||||
me->statepos++;
|
me->statepos++;
|
||||||
|
return 1;
|
||||||
|
} else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int midend_process_key(midend_data *me, int x, int y, int button)
|
int midend_process_key(midend_data *me, int x, int y, int button)
|
||||||
@ -127,9 +133,11 @@ int midend_process_key(midend_data *me, int x, int y, int button)
|
|||||||
return 1; /* never animate */
|
return 1; /* never animate */
|
||||||
} else if (button == 'u' || button == 'u' ||
|
} else if (button == 'u' || button == 'u' ||
|
||||||
button == '\x1A' || button == '\x1F') {
|
button == '\x1A' || button == '\x1F') {
|
||||||
midend_undo(me);
|
if (!midend_undo(me))
|
||||||
|
return 1;
|
||||||
} else if (button == '\x12') {
|
} else if (button == '\x12') {
|
||||||
midend_redo(me);
|
if (!midend_redo(me))
|
||||||
|
return 1;
|
||||||
} else if (button == 'q' || button == 'Q' || button == '\x11') {
|
} else if (button == 'q' || button == 'Q' || button == '\x11') {
|
||||||
free_game(oldstate);
|
free_game(oldstate);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -17,7 +17,11 @@
|
|||||||
enum {
|
enum {
|
||||||
LEFT_BUTTON = 0x1000,
|
LEFT_BUTTON = 0x1000,
|
||||||
MIDDLE_BUTTON,
|
MIDDLE_BUTTON,
|
||||||
RIGHT_BUTTON
|
RIGHT_BUTTON,
|
||||||
|
CURSOR_UP,
|
||||||
|
CURSOR_DOWN,
|
||||||
|
CURSOR_LEFT,
|
||||||
|
CURSOR_RIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IGNORE(x) ( (x) = (x) )
|
#define IGNORE(x) ( (x) = (x) )
|
||||||
@ -53,8 +57,6 @@ void midend_set_params(midend_data *me, game_params *params);
|
|||||||
void midend_size(midend_data *me, int *x, int *y);
|
void midend_size(midend_data *me, int *x, int *y);
|
||||||
void midend_new_game(midend_data *me, char *seed);
|
void midend_new_game(midend_data *me, char *seed);
|
||||||
void midend_restart_game(midend_data *me);
|
void midend_restart_game(midend_data *me);
|
||||||
void midend_undo(midend_data *me);
|
|
||||||
void midend_redo(midend_data *me);
|
|
||||||
int midend_process_key(midend_data *me, int x, int y, int button);
|
int midend_process_key(midend_data *me, int x, int y, int button);
|
||||||
void midend_redraw(midend_data *me);
|
void midend_redraw(midend_data *me);
|
||||||
float *midend_colours(midend_data *me, int *ncolours);
|
float *midend_colours(midend_data *me, int *ncolours);
|
||||||
|
Reference in New Issue
Block a user