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 #include #include +#include #include #include #include @@ -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( + "\n" + "\n" + "Sudoku Help\n" + "\n" + "\n" + + "

About the Game

\n" + + "

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.

\n" + + "

This version of the puzzle is Copyright 2005 by Michael R Sweet

\n" + + "

How to Play the Game

\n" + + "

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.

\n" + + "

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.

\n" + "\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);