Skip to content

Commit

Permalink
Fix a resize issue with X11.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
michaelrsweet committed Nov 27, 2005
1 parent 0ca7b12 commit f9f2de3
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 27 deletions.
10 changes: 8 additions & 2 deletions src/Fl_x.cxx
Expand Up @@ -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
}
Expand Down Expand Up @@ -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);
Expand All @@ -989,16 +994,17 @@ 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) {
XMoveResizeWindow(fl_display, i->xid, X, Y, W>0 ? W : 1, H>0 ? H : 1);
} 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);
}
}
}

Expand Down
3 changes: 2 additions & 1 deletion test/Makefile
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions test/demo.menu
Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions test/input_choice.cxx
@@ -1,3 +1,6 @@
//
// "$Id$"
//
// Test program for Fl_Input_Choice
//
// Copyright 1998-2005 by Bill Spitzak and others.
Expand Down Expand Up @@ -55,3 +58,8 @@ int main(int argc, char **argv) {
win.show(argc, argv);
return Fl::run();
}


//
// End of "$Id$".
//
97 changes: 73 additions & 24 deletions test/sudoku.cxx
Expand Up @@ -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>
Expand Down Expand Up @@ -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();
Expand All @@ -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[] = {
Expand All @@ -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 }
};

Expand All @@ -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;
Expand Down Expand Up @@ -389,6 +397,8 @@ Sudoku::close_cb(Fl_Widget *widget, void *) {

s->save_game();
s->hide();

if (help_dialog_) help_dialog_->hide();
}


Expand All @@ -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() {
Expand Down Expand Up @@ -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);
}


Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit f9f2de3

Please sign in to comment.