summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2005-11-27 05:15:47 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>2005-11-27 05:15:47 +0000
commitf9f2de35726988a6fd9d3b226dc683c394c1d65c (patch)
tree054094fa077dba15d389e69427c1866c670de245
parent0ca7b126e76c1fe88a55ffaff7b68fd941eb0530 (diff)
Fix a resize issue with X11.
Add missing Id keywords to input_choice. Add sudoku to demo program. Add on-line help to sudoku game, and put all of the cells in the main window so that the keyboard navigation is sane. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4659 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
-rw-r--r--src/Fl_x.cxx10
-rw-r--r--test/Makefile3
-rw-r--r--test/demo.menu1
-rw-r--r--test/input_choice.cxx8
-rw-r--r--test/sudoku.cxx97
5 files changed, 92 insertions, 27 deletions
diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx
index d930c2ec7..8e93afe50 100644
--- a/src/Fl_x.cxx
+++ b/src/Fl_x.cxx
@@ -944,6 +944,7 @@ int fl_handle(const XEvent& thisevent)
// tell Fl_Window about it and set flag to prevent echoing:
resize_bug_fix = window;
+// printf("ConfigureNotify: X,Y,W,H=%d,%d,%d,%d\n", X, Y, W, H);
window->resize(X, Y, W, H);
break; // allow add_handler to do something too
}
@@ -972,6 +973,10 @@ int fl_handle(const XEvent& thisevent)
////////////////////////////////////////////////////////////////
void Fl_Window::resize(int X,int Y,int W,int H) {
+// printf("Fl_Window::resize(X=%d,Y=%d,W=%d,H=%d)\n", X, Y, W, H);
+// printf(" resize_bug_fix=%p\n", resize_bug_fix);
+// printf(" this=%p\n", this);
+
int is_a_move = (X != x() || Y != y());
int is_a_resize = (W != w() || H != h());
int resize_from_program = (this != resize_bug_fix);
@@ -989,7 +994,7 @@ void Fl_Window::resize(int X,int Y,int W,int H) {
size_range(w(), h(), w(), h());
}
- if (resize_from_program && shown()) {
+ if (shown()) {
if (is_a_resize) {
if (!resizable()) size_range(w(),h(),w(),h());
if (is_a_move) {
@@ -997,8 +1002,9 @@ void Fl_Window::resize(int X,int Y,int W,int H) {
} else {
XResizeWindow(fl_display, i->xid, W>0 ? W : 1, H>0 ? H : 1);
}
- } else
+ } else if (resize_from_program) {
XMoveWindow(fl_display, i->xid, X, Y);
+ }
}
}
diff --git a/test/Makefile b/test/Makefile
index e31c8d45a..bfd08215b 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -335,8 +335,9 @@ subwindow$(EXEEXT): subwindow.o
sudoku$(EXEEXT): sudoku.o
echo Linking $@...
- $(CXX) -I.. $(CXXFLAGS) sudoku.o -o $@ $(LINKFLTK) $(LDLIBS)
+ $(CXX) -I.. $(CXXFLAGS) sudoku.o -o $@ $(LINKFLTKIMG) $(LDLIBS)
$(CP) sudoku$(EXEEXT) sudoku.app/Contents/MacOS
+ $(POSTBUILD) $@ ../FL/mac.r
symbols$(EXEEXT): symbols.o
diff --git a/test/demo.menu b/test/demo.menu
index a8678a08b..4842d847d 100644
--- a/test/demo.menu
+++ b/test/demo.menu
@@ -59,6 +59,7 @@
@e:Fractals:fractals
@e:Puzzle:glpuzzle
@e:Checkers:checkers
+ @e:Sudoku:sudoku
@main:Other\nTests:@o
@o:Color Choosers:color_chooser r
diff --git a/test/input_choice.cxx b/test/input_choice.cxx
index 36bec9b1d..39fc40482 100644
--- a/test/input_choice.cxx
+++ b/test/input_choice.cxx
@@ -1,3 +1,6 @@
+//
+// "$Id$"
+//
// Test program for Fl_Input_Choice
//
// Copyright 1998-2005 by Bill Spitzak and others.
@@ -55,3 +58,8 @@ int main(int argc, char **argv) {
win.show(argc, argv);
return Fl::run();
}
+
+
+//
+// End of "$Id$".
+//
diff --git a/test/sudoku.cxx b/test/sudoku.cxx
index 515609352..4c2864a8b 100644
--- a/test/sudoku.cxx
+++ b/test/sudoku.cxx
@@ -32,6 +32,7 @@
#include <FL/Fl_Group.H>
#include <FL/fl_ask.H>
#include <FL/fl_draw.H>
+#include <FL/Fl_Help_Dialog.H>
#include <FL/Fl_Preferences.H>
#include <FL/Fl_Sys_Menu_Bar.H>
#include <stdio.h>
@@ -215,13 +216,14 @@ class Sudoku : public Fl_Window {
static void check_cb(Fl_Widget *widget, void *);
static void close_cb(Fl_Widget *widget, void *);
static void diff_cb(Fl_Widget *widget, void *d);
+ static void help_cb(Fl_Widget *, void *);
static void new_cb(Fl_Widget *widget, void *);
static void reset_cb(Fl_Widget *widget, void *);
void set_title();
static void solve_cb(Fl_Widget *widget, void *);
+ static Fl_Help_Dialog *help_dialog_;
static Fl_Preferences prefs_;
-
public:
Sudoku();
@@ -235,14 +237,16 @@ class Sudoku : public Fl_Window {
};
-// Preferences/saved state for game...
+// Sudoku class globals...
+Fl_Help_Dialog *Sudoku::help_dialog_ = (Fl_Help_Dialog *)0;
Fl_Preferences Sudoku::prefs_(Fl_Preferences::USER, "fltk.org", "sudoku");
+
// Create a Sudoku game window...
Sudoku::Sudoku()
: Fl_Window(GROUP_SIZE * 3, GROUP_SIZE * 3 + MENU_OFFSET, "Sudoku")
{
- int i, j, k, m;
+ int i, j;
Fl_Group *g;
SudokuCell *cell;
static Fl_Menu_Item items[] = {
@@ -258,6 +262,9 @@ Sudoku::Sudoku()
{ "&Hard", FL_COMMAND | '3', diff_cb, (void *)"2", FL_MENU_RADIO },
{ "&Impossible", FL_COMMAND | '4', diff_cb, (void *)"3", FL_MENU_RADIO },
{ 0 },
+ { "&Help", 0, 0, 0, FL_SUBMENU },
+ { "&About Sudoku", FL_F + 1, help_cb, 0, 0 },
+ { 0 },
{ 0 }
};
@@ -280,24 +287,25 @@ Sudoku::Sudoku()
GROUP_SIZE, GROUP_SIZE);
g->box(FL_BORDER_BOX);
g->color(FL_DARK3);
+ g->end();
grid_groups_[i][j] = g;
+ }
- for (k = 0; k < 3; k ++)
- for (m = 0; m < 3; m ++) {
- cell = new SudokuCell(j * GROUP_SIZE + CELL_OFFSET + m * CELL_SIZE,
- i * GROUP_SIZE + CELL_OFFSET + k * CELL_SIZE +
- MENU_OFFSET,
- CELL_SIZE, CELL_SIZE);
- cell->callback(reset_cb);
- grid_cells_[i * 3 + k][j * 3 + m] = cell;
- }
-
- g->end();
+ for (i = 0; i < 9; i ++)
+ for (j = 0; j < 9; j ++) {
+ cell = new SudokuCell(j * CELL_SIZE + CELL_OFFSET +
+ (j / 3) * (GROUP_SIZE - 3 * CELL_SIZE),
+ i * CELL_SIZE + CELL_OFFSET + MENU_OFFSET +
+ (i / 3) * (GROUP_SIZE - 3 * CELL_SIZE),
+ CELL_SIZE, CELL_SIZE);
+ cell->callback(reset_cb);
+ grid_cells_[i][j] = cell;
}
callback(close_cb);
resizable(grid_);
+ size_range(3 * GROUP_SIZE, 3 * GROUP_SIZE + MENU_OFFSET, 0, 0, 1, 1, 1);
// Restore the previous window dimensions...
int X, Y, W, H;
@@ -389,6 +397,8 @@ Sudoku::close_cb(Fl_Widget *widget, void *) {
s->save_game();
s->hide();
+
+ if (help_dialog_) help_dialog_->hide();
}
@@ -405,6 +415,54 @@ Sudoku::diff_cb(Fl_Widget *widget, void *d) {
}
+// Show the on-line help...
+void
+Sudoku::help_cb(Fl_Widget *, void *) {
+ if (!help_dialog_) {
+ help_dialog_ = new Fl_Help_Dialog();
+
+ help_dialog_->value(
+ "<HTML>\n"
+ "<HEAD>\n"
+ "<TITLE>Sudoku Help</TITLE>\n"
+ "</HEAD>\n"
+ "<BODY>\n"
+
+ "<H2>About the Game</H2>\n"
+
+ "<P>Sudoku (pronounced soo-dough-coo with the emphasis on the\n"
+ "first syllable) is a simple number-based puzzle/game played on a\n"
+ "9x9 grid that is divided into 3x3 subgrids. The goal is to enter\n"
+ "a number from 1 to 9 in each cell so that each number appears\n"
+ "only once in each column and row.</P>\n"
+
+ "<P>This version of the puzzle is Copyright 2005 by Michael R Sweet</P>\n"
+
+ "<H2>How to Play the Game</H2>\n"
+
+ "<P>At the start of a new game, Sudoku fills in a random selection\n"
+ "of cells for you - the number of cells depends on the difficulty\n"
+ "level you use. Click in any of the empty cells or use the arrow\n"
+ "keys to highlight individual cells and press a number from 1 to 9\n"
+ "to fill in the cell. To clear a cell, press 0, Delete, or\n"
+ "Backspace. As you complete each subgrid, correct subgrids are\n"
+ "highlighted in green. When you have successfully completed all\n"
+ "subgrids, the entire puzzle is highlighted until you start a new\n"
+ "game.</P>\n"
+
+ "<P>As you work to complete the puzzle, you can display possible\n"
+ "solutions inside each cell by holding the Shift key and pressing\n"
+ "each number in turn. Repeat the process to remove individual\n"
+ "numbers, or press a number without the Shift key to replace them\n"
+ "with the actual number to use.</P>\n"
+ "</BODY>\n"
+ );
+ }
+
+ help_dialog_->show();
+}
+
+
// Load the game from saved preferences...
void
Sudoku::load_game() {
@@ -453,6 +511,7 @@ Sudoku::load_game() {
// If we didn't load any values or the last game was solved, then
// create a new game automatically...
if (solved || !grid_values_[0][0]) new_game();
+ else check_game(false);
}
@@ -620,16 +679,6 @@ Sudoku::reset_cb(Fl_Widget *widget, void *) {
// Resize the window...
void
Sudoku::resize(int X, int Y, int W, int H) {
- // Force resizes to keep the proper aspect ratio...
- int M = H - MENU_OFFSET;
-
- if (M > W) M = W;
-
- if (W != M || H != (M + MENU_OFFSET)) {
- W = M;
- H = M + MENU_OFFSET;
- }
-
// Resize the window...
Fl_Window::resize(X, Y, W, H);