Merge branch 'gtk3' of ssh://git.stderr.nl/projects/chimara/chimara into gtk3
authorMarijn van Vliet <w.m.vanvliet@gmail.com>
Sun, 16 Sep 2012 15:50:59 +0000 (17:50 +0200)
committerMarijn van Vliet <w.m.vanvliet@gmail.com>
Sun, 16 Sep 2012 15:50:59 +0000 (17:50 +0200)
67 files changed:
interpreters/frotz/buffer.c
interpreters/frotz/err.c
interpreters/frotz/fastmem.c
interpreters/frotz/files.c
interpreters/frotz/glkmisc.c
interpreters/frotz/glkscreen.c
interpreters/frotz/input.c
interpreters/frotz/main.c
interpreters/frotz/math.c
interpreters/frotz/object.c
interpreters/frotz/process.c
interpreters/frotz/quetzal.c
interpreters/frotz/random.c
interpreters/frotz/redirect.c
interpreters/frotz/sound.c
interpreters/frotz/stream.c
interpreters/frotz/table.c
interpreters/frotz/text.c
interpreters/frotz/variable.c
interpreters/git/Makefile.am
interpreters/git/README.txt
interpreters/git/git.h
interpreters/git/glkop.c
interpreters/git/terp.c
interpreters/git/version.h
interpreters/glulxe/unixstrt.c
interpreters/nitfol/automap.c
interpreters/nitfol/debug.c
interpreters/nitfol/decode.c
interpreters/nitfol/errmesg.c
interpreters/nitfol/globals.c
interpreters/nitfol/iff.c
interpreters/nitfol/infix.c
interpreters/nitfol/init.c
interpreters/nitfol/io.c
interpreters/nitfol/linkevil.h
interpreters/nitfol/main.c
interpreters/nitfol/nitfol.h
interpreters/nitfol/objects.c
interpreters/nitfol/op_call.c
interpreters/nitfol/op_jmp.c
interpreters/nitfol/op_math.c
interpreters/nitfol/op_save.c
interpreters/nitfol/op_table.c
interpreters/nitfol/op_v6.c
interpreters/nitfol/oplist.c
interpreters/nitfol/opt2glkc.pl
interpreters/nitfol/portfunc.c
interpreters/nitfol/quetzal.c
interpreters/nitfol/solve.c
interpreters/nitfol/sound.c
interpreters/nitfol/stack.c
interpreters/nitfol/struct.c
interpreters/nitfol/tokenise.c
interpreters/nitfol/undo.c
interpreters/nitfol/z_io.c
interpreters/nitfol/zscii.c
libchimara/chimara-glk-private.h
libchimara/chimara-glk.c
libchimara/pager.c
libchimara/pager.h
libchimara/style.c
libchimara/style.h
libchimara/window.c
libchimara/window.h
player/preferences.c
player/style.css

index bff9572ffd8c677aac651ceaef53751ebd624c8a..f454f726acf7f2db471c6af5a4de78c226a784a0 100644 (file)
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index ffb5168aea400d58e1b200824b1499655e460a81..81f2f14b2db1f736c9b7c804602b8803188054b8 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index cb4a20e6d2ba5ff6bb8b2953098254918499cd52..2e99d8dafcc8062341ca95966cf7544d8c264928 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 /*
index f40739593b664e8f6ddb7f097a4f4981d1e79d1a..5804d7f4758e936a5747b9693627e49714fe9732 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index c5598180b354ea091ba2fb82e20377f798ca7538..85b13c9d2e17693ec93b168682a21f9f26b68017 100644 (file)
@@ -189,53 +189,45 @@ void os_init_screen(void)
        glk_stylehint_set(wintype_AllTypes,   style_Preformatted, stylehint_Proportional, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Preformatted, stylehint_Weight, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Preformatted, stylehint_Oblique, 0);
-       glk_stylehint_set(wintype_TextGrid,   style_Preformatted, stylehint_ReverseColor, 1);
 
        /* monob */
        glk_stylehint_set(wintype_AllTypes,   style_Subheader,    stylehint_Proportional, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Subheader,    stylehint_Weight, 1);
        glk_stylehint_set(wintype_AllTypes,   style_Subheader,    stylehint_Oblique, 0);
-       glk_stylehint_set(wintype_TextGrid,   style_Subheader,    stylehint_ReverseColor, 1);
 
        /* monoi */
        glk_stylehint_set(wintype_AllTypes,   style_Alert,        stylehint_Proportional, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Alert,        stylehint_Weight, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Alert,        stylehint_Oblique, 1);
-       glk_stylehint_set(wintype_TextGrid,   style_Alert,        stylehint_ReverseColor, 1);
 
        /* monoz */
        glk_stylehint_set(wintype_AllTypes,   style_BlockQuote,   stylehint_Proportional, 0);
        glk_stylehint_set(wintype_AllTypes,   style_BlockQuote,   stylehint_Weight, 1);
        glk_stylehint_set(wintype_AllTypes,   style_BlockQuote,   stylehint_Oblique, 1);
-       glk_stylehint_set(wintype_TextGrid,   style_BlockQuote,   stylehint_ReverseColor, 1);
 
        /* propr */
        glk_stylehint_set(wintype_TextBuffer, style_Normal,       stylehint_Proportional, 1);
        glk_stylehint_set(wintype_TextGrid,   style_Normal,       stylehint_Proportional, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Normal,       stylehint_Weight, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Normal,       stylehint_Oblique, 0);
-       glk_stylehint_set(wintype_TextGrid,   style_Normal,       stylehint_ReverseColor, 1);
 
        /* propb */
        glk_stylehint_set(wintype_TextBuffer, style_Header,       stylehint_Proportional, 1);
        glk_stylehint_set(wintype_TextGrid,   style_Header,       stylehint_Proportional, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Header,       stylehint_Weight, 1);
        glk_stylehint_set(wintype_AllTypes,   style_Header,       stylehint_Oblique, 0);
-       glk_stylehint_set(wintype_TextGrid,   style_Header,       stylehint_ReverseColor, 1);
 
        /* propi */
        glk_stylehint_set(wintype_TextBuffer, style_Emphasized,   stylehint_Proportional, 1);
        glk_stylehint_set(wintype_TextGrid,   style_Emphasized,   stylehint_Proportional, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Emphasized,   stylehint_Weight, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Emphasized,   stylehint_Oblique, 1);
-       glk_stylehint_set(wintype_TextGrid,   style_Emphasized,   stylehint_ReverseColor, 1);
 
        /* propi */
        glk_stylehint_set(wintype_TextBuffer, style_Note,         stylehint_Proportional, 1);
        glk_stylehint_set(wintype_TextGrid,   style_Note,         stylehint_Proportional, 0);
        glk_stylehint_set(wintype_AllTypes,   style_Note,         stylehint_Weight, 1);
        glk_stylehint_set(wintype_AllTypes,   style_Note,         stylehint_Oblique, 1);
-       glk_stylehint_set(wintype_TextGrid,   style_Note,         stylehint_ReverseColor, 1);
 
        gos_lower = glk_window_open(0, 0, 0, wintype_TextGrid, 0);
        if (!gos_lower)
index 079373bed1162d9b13cbd4a5bfd2e097196e900f..2d72bfdd11ae8f66b690df268ec0b04d26821bfd 100644 (file)
@@ -896,6 +896,10 @@ void z_show_status (void)
        glk_set_window(gos_upper);
        gos_curwin = gos_upper;
 
+#ifdef GARGLK
+       garglk_set_reversevideo(TRUE);
+#endif /* GARGLK */
+
        curx = cury = 1;
        glk_window_move_cursor(gos_upper, 0, 0);
 
index f17ec66a80f1f5e7e15aebdfcd5febbe036a10e6..ced562f2b76e6c3e5a9849156d8160c500e0ee79 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index 4fbbd1e0036590bdc31ff5e23892df384b9dc3ce..671184b54f863e27512088d5f88cf708cba5c64b 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 /*
index 5ff5163230bd4680e55b438dc6168b2c37eb2312..944710f044b7f435874dfb338b3169b40f6f369e 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index a1e86e4570da57861f3f0fe5a4ec4001ba9349ea..ed2108788d8ba830010337a4f5dffdb0f698db74 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index 58c86078b0c10547c6180833451ce6babf17833b..4d9687abc997656975e47281e0a4b77e37c95e99 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index e41a57b577a759238a23ce2fb75bb2ca77661d90..d48a9734041f994818309d35c016b97e9cc8529b 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index 6ea14d89c999abd0648a8b043c5eb29a18c850fe..7eed57a3c370d4e0e52cc9739949fbbd95c5c40f 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index 239e9c43dfa29f378e586364f20c573029c5ae42..6b0703c8928b6b3704c6dcf8d57635da2d1175b6 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index 9c4d63ad5d14a427c795e07ea6ad4948badf8172..0a29d0b5b55372af73eb09b8424791bcb4b563b8 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index 54cef78c60a9f6ad078b31ced9e61e94e6d35593..69e67644db0a465ae09d7a869f53d09c4b45b51d 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index eb3a16366d2d75dca7e7c42c47a6f2f91d15023f..9ec990c48acbdc806f7908cd86a02fb28ae57086 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index 9cccc2c1cb0be5813b07872fa80095f8eabbb50a..fd07b2c14da48cfb1378c48e8cec2ec1f8952c71 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index 3e5c6e0c0980cfb6e39d133093f1a0a057257f43..98356f5d1b44f0410592da1b5a906536d97552c1 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "frotz.h"
index bbed8c42cbe4ee7c7b2f58d5b11d2c25ad72603d..f025600644845224b72869f21d35875083566ae7 100644 (file)
@@ -1,7 +1,7 @@
 # Automatically generate version.h
 MAJOR = 1
 MINOR = 2
-PATCH = 8
+PATCH = 9
 version.h: Makefile.am
        $(AM_V_GEN)echo "// Automatically generated file -- do not edit!" > version.h
        $(AM_V_at)echo "#define GIT_MAJOR" $(MAJOR) >> version.h
index 2462bcf28ee94272e465de7468b7de6dd0a3393d..4161fdd488b6cfcdda821b540f44e134e4681c3b 100644 (file)
@@ -1,6 +1,6 @@
 Git is an interpreter for the Glulx virtual machine. Its homepage is here:\r
 \r
-  http://diden.net/if/git\r
+http://ifarchive.org/indexes/if-archiveXprogrammingXglulxXinterpretersXgit.html\r
 \r
 Git's main goal in life is to be fast. It's about five times faster than Glulxe,\r
 and about twice as fast as Frotz (using the same Inform source compiled for the\r
@@ -14,9 +14,12 @@ between each prompt.
 \r
 Have fun, and let me know what you think!\r
 \r
-  Iain Merrick\r
+  Iain Merrick (Original author)\r
   iain@diden.net\r
 \r
+  David Kinder (Current maintainer)\r
+  davidk.kinder@virgin.net\r
+\r
 --------------------------------------------------------------------------------\r
 \r
 * Building and installing Git\r
@@ -31,7 +34,8 @@ hard, depending on what kind of computer you're using and whether you want Git
 to be able to display graphics and play sounds. To find a suitable Glk library,\r
 look here:\r
 \r
-  http://eblong.com/zarf/glk\r
+http://eblong.com/zarf/glk/\r
+http://ifarchive.org/indexes/if-archiveXprogrammingXglkXimplementations.html\r
 \r
 Exactly how you build and link everything depends on what platform you're on and\r
 which Glk library you're using. The supplied Makefile should work on any Unix\r
@@ -46,8 +50,8 @@ respectively, but I can't guarantee that they're fully up-to-date.
 \r
 It should be possible to build Git with any C compiler, but it works best with\r
 GCC, because that has a non-standard extension that Git can use for a big speed\r
-boost. GCC 2.95 actually generates faster code than GCC 3, so if you have a\r
-choice, use the former. (On OS X, this means compiling with 'gcc2'.)\r
+boost. GCC 2.95 actually generates faster code than later versions, so if you\r
+have a choice, use the former. (On OS X, this means compiling with 'gcc2'.)\r
 \r
 --------------------------------------------------------------------------------\r
 \r
@@ -116,12 +120,9 @@ KB. 256KB is usually enough to store dozens of moves.
 \r
 GCC 3 has bigger problems than I thought. On PowerPC, the direct threading\r
 option results in much slower code; and on x86, terp.c crashes GCC itself if\r
-direct threading is used. Therefore, I recommend that you use GCC 2.95 if\r
-possible. If you only have GCC 3, don't define USE_DIRECT_THREADING, at least\r
-until the compiler bug is fixed.\r
-\r
-Since the previous update, GCC 4 has been released, but I haven't evaluated it\r
-yet. If you want to give it a try, let me know how you get on!\r
+direct threading is used. GCC 4 seems to work, given some very limited testing,\r
+but still results in slow code. Therefore, I recommend that you use GCC 2.95 if\r
+possible. If you only have GCC 3, don't define USE_DIRECT_THREADING.\r
 \r
 Some Glk libraries, such as xglk, can't deal with memory-mapped files. You can\r
 tell that this is happening if Git can open .ulx files, but complains that .blb\r
@@ -130,9 +131,9 @@ your startup file, and make sure you're giving it a file stream rather than a
 memory stream. If you're using the git_unix.c startup file, just make sure\r
 USE_MMAP isn't defined.\r
 \r
-1-byte and 2-byte local variables are not implemented yet. This means git can't\r
-currently play games created with the Superglus system. This will be fixed at\r
-some point.\r
+1-byte and 2-byte local variables are not implemented. This means git can't\r
+play games created with old versions of the Superglus system. As these small\r
+local variables now deprecated, it is unlikely that this will be fixed.\r
 \r
 In the search opcodes, direct keys don't work unless they're exactly 4 bytes\r
 long.\r
@@ -191,6 +192,12 @@ also to Eliuk Blau for tracking down bugs in the memory management opcodes.
 \r
 * Version History\r
 \r
+1.2.9 2011-08-28  Fixed a bug in glkop.c dispatching, to do with optional\r
+                  array arguments, following a similar fix in Glulxe.\r
+                  Glk array and string operations are now checked for memory\r
+                  overflows (though not for ROM writing), following a similar\r
+                  fix in Glulxe.\r
+\r
 1.2.8 2010-08-25  Fixed a problem with 'undo' when compiled as 64 bit,\r
                   contributed by Ben Cressey.\r
                   Fixed a sign problem for the @fceil opcode, following a\r
@@ -267,3 +274,4 @@ also to Eliuk Blau for tracking down bugs in the memory management opcodes.
                   Added gitWithStream() as a workaround for xglk\r
 \r
 1.0   2003-10-18  First public release\r
+\r
index cd1f90e09c4ce2e8a2ac156b4ae7fefaadf91e97..cfb0a9407003d8c3fa6d535411a7b487e80b0947 100644 (file)
@@ -124,6 +124,7 @@ extern void startProgram (size_t cacheSize, enum IOMode ioMode);
 extern int git_init_dispatch();
 extern glui32 git_perform_glk(glui32 funcnum, glui32 numargs, glui32 *arglist);
 extern strid_t git_find_stream_by_id(glui32 id);
+extern glui32 git_find_id_for_stream(strid_t str);
 
 // git_search.c
 
index f8c7ff08f696b734075ce8aeb67d2ee6f0d450bb..fa5b0299888a93a246e2656e7890da97c98b59c0 100644 (file)
@@ -277,6 +277,16 @@ glui32 git_perform_glk(glui32 funcnum, glui32 numargs, glui32 *arglist)
        directly -- instead of bothering with the whole prototype 
        mess. */
 
+  case 0x0047: /* stream_set_current */
+    if (numargs != 1)
+      goto WrongArgNum;
+    glk_stream_set_current(git_find_stream_by_id(arglist[0]));
+    break;
+  case 0x0048: /* stream_get_current */
+    if (numargs != 0)
+      goto WrongArgNum;
+    retval = git_find_id_for_stream(glk_stream_get_current());
+    break;
   case 0x0080: /* put_char */
     if (numargs != 1)
       goto WrongArgNum;
@@ -297,6 +307,16 @@ glui32 git_perform_glk(glui32 funcnum, glui32 numargs, glui32 *arglist)
       goto WrongArgNum;
     retval = glk_char_to_upper(arglist[0] & 0xFF);
     break;
+  case 0x0128: /* put_char_uni */
+    if (numargs != 1)
+      goto WrongArgNum;
+    glk_put_char_uni(arglist[0]);
+    break;
+  case 0x012B: /* put_char_stream_uni */
+    if (numargs != 2)
+      goto WrongArgNum;
+    glk_put_char_stream_uni(git_find_stream_by_id(arglist[0]), arglist[1]);
+    break;
 
   WrongArgNum:
     fatalError("Wrong number of arguments to Glk function.");
@@ -306,7 +326,7 @@ glui32 git_perform_glk(glui32 funcnum, glui32 numargs, glui32 *arglist)
     /* Go through the full dispatcher prototype foo. */
     char *proto, *cx;
     dispatch_splot_t splot;
-    int argnum;
+    int argnum, argnum2;
 
     /* Grab the string. */
     proto = gidispatch_prototype(funcnum);
@@ -335,9 +355,11 @@ glui32 git_perform_glk(glui32 funcnum, glui32 numargs, glui32 *arglist)
     gidispatch_call(funcnum, argnum, splot.garglist);
 
     /* Phase 3. */
-    argnum = 0;
+    argnum2 = 0;
     cx = proto;
-    unparse_glk_args(&splot, &cx, 0, &argnum, 0, 0);
+    unparse_glk_args(&splot, &cx, 0, &argnum2, 0, 0);
+    if (argnum != argnum2)
+      fatalError("Argument counts did not match.");
 
     break;
   }
@@ -560,6 +582,12 @@ static void parse_glk_args(dispatch_splot_t *splot, char **proto, int depth,
 
         switch (typeclass) {
         case 'C':
+          /* This test checks for a giant array length, and cuts it down to
+             something reasonable. Future releases of this interpreter may
+             treat this case as a fatal error. */
+          if (varglist[ix+1] > gEndMem || varglist[ix]+varglist[ix+1] > gEndMem)
+            varglist[ix+1] = gEndMem - varglist[ix];
+
           garglist[gargnum].array = (void*) AddressOfArray(varglist[ix]);
           gargnum++;
           ix++;
@@ -568,6 +596,10 @@ static void parse_glk_args(dispatch_splot_t *splot, char **proto, int depth,
           cx++;
           break;
         case 'I':
+          /* See comment above. */
+          if (varglist[ix+1] > gEndMem/4 || varglist[ix+1] > (gEndMem-varglist[ix])/4)
+              varglist[ix+1] = (gEndMem - varglist[ix]) / 4;
+
           garglist[gargnum].array = CaptureIArray(varglist[ix], varglist[ix+1], passin);
           gargnum++;
           ix++;
@@ -679,6 +711,8 @@ static void parse_glk_args(dispatch_splot_t *splot, char **proto, int depth,
       }
       else {
         cx++;
+        if (isarray)
+          ix++;
       }
     }    
   }
@@ -885,6 +919,8 @@ static void unparse_glk_args(dispatch_splot_t *splot, char **proto, int depth,
       }
       else {
         cx++;
+        if (isarray)
+          ix++;
       }
     }    
   }
@@ -916,6 +952,21 @@ strid_t git_find_stream_by_id(glui32 objid)
   return classes_get(1, objid);
 }
 
+/* find_id_for_stream():
+   The converse of find_stream_by_id(). 
+   This is only needed in this file, so it's static.
+*/
+glui32 git_find_id_for_stream(strid_t str)
+{
+  gidispatch_rock_t objrock;
+
+  if (!str)
+    return 0;
+
+  objrock = gidispatch_get_objrock(str, 1);
+  return ((classref_t *)objrock.ptr)->id;
+}
+
 /* Build a hash table to hold a set of Glk objects. */
 static classtable_t *new_classtable(glui32 firstid)
 {
index 870b4f11fef8d9cde3683bde5bf1a3c5db533ae6..d157826ce309290fcbcc9e026e17dcbf7f4f28d2 100644 (file)
@@ -38,29 +38,29 @@ Opcode* gOpcodeTable;
 
 int floatCompare(git_sint32 L1, git_sint32 L2, git_sint32 L3)
 {
-  git_float F1, F2;\r
-\r
-  if (((L3 & 0x7F800000) == 0x7F800000) && ((L3 & 0x007FFFFF) != 0))\r
-    return 0;\r
-  if ((L1 == 0x7F800000 || L1 == 0xFF800000) && (L2 == 0x7F800000 || L2 == 0xFF800000))\r
-    return (L1 == L2);\r
-\r
-  F1 = DECODE_FLOAT(L2) - DECODE_FLOAT(L1);\r
-  F2 = fabs(DECODE_FLOAT(L3));\r
-  return ((F1 <= F2) && (F1 >= -F2));\r
+  git_float F1, F2;
+
+  if (((L3 & 0x7F800000) == 0x7F800000) && ((L3 & 0x007FFFFF) != 0))
+    return 0;
+  if ((L1 == 0x7F800000 || L1 == 0xFF800000) && (L2 == 0x7F800000 || L2 == 0xFF800000))
+    return (L1 == L2);
+
+  F1 = DECODE_FLOAT(L2) - DECODE_FLOAT(L1);
+  F2 = fabs(DECODE_FLOAT(L3));
+  return ((F1 <= F2) && (F1 >= -F2));
 }
 
-#ifdef USE_OWN_POWF\r
-float git_powf(float x, float y)\r
-{\r
-  if (x == 1.0f)\r
-    return 1.0f;\r
-  else if ((y == 0.0f) || (y == -0.0f))\r
-    return 1.0f;\r
-  else if ((x == -1.0f) && isinf(y))\r
-    return 1.0f;\r
-  return powf(x,y);\r
-}\r
+#ifdef USE_OWN_POWF
+float git_powf(float x, float y)
+{
+  if (x == 1.0f)
+    return 1.0f;
+  else if ((y == 0.0f) || (y == -0.0f))
+    return 1.0f;
+  else if ((x == -1.0f) && isinf(y))
+    return 1.0f;
+  return powf(x,y);
+}
 #endif
 
 // -------------------------------------------------------------
@@ -231,7 +231,12 @@ do_enter_function_L1: // Arg count is in L2.
         L6 = memRead8(L1++); // LocalType
         L5 = memRead8(L1++); // LocalCount
         if (L6 != 4 && L6 != 0) // We only support 4-byte locals.
-            fatalError("Local variable wasn't 4 bytes wide");
+        {
+            if (L6 == 1 || L6 == 2)
+                fatalError("Short local variables are not supported, use Glulxe");
+            else
+                fatalError("Local variable wasn't 4 bytes wide");
+        }
         L4 += L5; // Cumulative local count.
     }
     while (L5 != 0);
@@ -330,7 +335,7 @@ do_enter_function_L1: // Arg count is in L2.
     PEEPHOLE_STORE(fadd,    F1 = DECODE_FLOAT(L1) + DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1));
     PEEPHOLE_STORE(fsub,    F1 = DECODE_FLOAT(L1) - DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1));
     PEEPHOLE_STORE(fmul,    F1 = DECODE_FLOAT(L1) * DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1));
-    PEEPHOLE_STORE(fdiv,    F1 = DECODE_FLOAT(L1) / DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1));\r
+    PEEPHOLE_STORE(fdiv,    F1 = DECODE_FLOAT(L1) / DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1));
 
 #define PEEPHOLE_LOAD(tag,reg) \
     do_ ## tag ## _ ## reg ## _const: reg = READ_PC; goto do_ ## tag; \
@@ -1323,124 +1328,124 @@ do_tailcall:
         
     // Floating point (new with glulx spec 3.1.2)
 
-    do_numtof:\r
-        F1 = (git_float) L1;\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_ftonumz:\r
-        F1 = DECODE_FLOAT(L1);\r
-        if (!signbit(F1)) {\r
-          if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0))\r
-            S1 = 0x7FFFFFFF;\r
-          else\r
-            S1 = (git_sint32) truncf(F1);\r
-        } else {\r
-          if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0))\r
-            S1 = 0x80000000;\r
-          else\r
-            S1 = (git_sint32) truncf(F1);\r
-        }\r
-        NEXT;\r
-\r
-    do_ftonumn:\r
-        F1 = DECODE_FLOAT(L1);\r
-        if (!signbit(F1)) {\r
-          if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0))\r
-            S1 = 0x7FFFFFFF;\r
-          else\r
-            S1 = (git_sint32) roundf(F1);\r
-        } else {\r
-          if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0))\r
-            S1 = 0x80000000;\r
-          else\r
-            S1 = (git_sint32) roundf(F1);\r
-        }\r
-        NEXT;\r
-\r
-    do_ceil:\r
-        F1 = ceilf(DECODE_FLOAT(L1));\r
-        L2 = ENCODE_FLOAT(F1);\r
-        if ((L2 == 0x0) || (L2 == 0x80000000))\r
-          L2 = L1 & 0x80000000;\r
-        S1 = L2;\r
-        NEXT;\r
-\r
-    do_floor:\r
-        F1 = floorf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_sqrt:\r
-        F1 = sqrtf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_exp:\r
-        F1 = expf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_log:\r
-        F1 = logf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_pow:\r
-#ifdef USE_OWN_POWF\r
-        F1 = git_powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
-#else\r
-        F1 = powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
-#endif\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_atan2:\r
-        F1 = atan2f(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_fmod:\r
-        F1 = DECODE_FLOAT(L1);\r
-        F2 = DECODE_FLOAT(L2);\r
-        F3 = fmodf(F1, F2);\r
-        F4 = (F1 - F3) / F2;\r
-        L4 = ENCODE_FLOAT(F4);\r
-        if ((L4 == 0) || (L4 == 0x80000000))\r
-          L4 = (L1 ^ L2) & 0x80000000;\r
-        S1 = ENCODE_FLOAT(F3);\r
-        S2 = L4;\r
-        NEXT;\r
-\r
-    do_sin:\r
-        F1 = sinf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_cos:\r
-        F1 = cosf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_tan:\r
-        F1 = tanf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_asin:\r
-        F1 = asinf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_acos:\r
-        F1 = acosf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
-\r
-    do_atan:\r
-        F1 = atanf(DECODE_FLOAT(L1));\r
-        S1 = ENCODE_FLOAT(F1);\r
-        NEXT;\r
+    do_numtof:
+        F1 = (git_float) L1;
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_ftonumz:
+        F1 = DECODE_FLOAT(L1);
+        if (!signbit(F1)) {
+          if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0))
+            S1 = 0x7FFFFFFF;
+          else
+            S1 = (git_sint32) truncf(F1);
+        } else {
+          if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0))
+            S1 = 0x80000000;
+          else
+            S1 = (git_sint32) truncf(F1);
+        }
+        NEXT;
+
+    do_ftonumn:
+        F1 = DECODE_FLOAT(L1);
+        if (!signbit(F1)) {
+          if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0))
+            S1 = 0x7FFFFFFF;
+          else
+            S1 = (git_sint32) roundf(F1);
+        } else {
+          if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0))
+            S1 = 0x80000000;
+          else
+            S1 = (git_sint32) roundf(F1);
+        }
+        NEXT;
+
+    do_ceil:
+        F1 = ceilf(DECODE_FLOAT(L1));
+        L2 = ENCODE_FLOAT(F1);
+        if ((L2 == 0x0) || (L2 == 0x80000000))
+          L2 = L1 & 0x80000000;
+        S1 = L2;
+        NEXT;
+
+    do_floor:
+        F1 = floorf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_sqrt:
+        F1 = sqrtf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_exp:
+        F1 = expf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_log:
+        F1 = logf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_pow:
+#ifdef USE_OWN_POWF
+        F1 = git_powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2));
+#else
+        F1 = powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2));
+#endif
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_atan2:
+        F1 = atan2f(DECODE_FLOAT(L1), DECODE_FLOAT(L2));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_fmod:
+        F1 = DECODE_FLOAT(L1);
+        F2 = DECODE_FLOAT(L2);
+        F3 = fmodf(F1, F2);
+        F4 = (F1 - F3) / F2;
+        L4 = ENCODE_FLOAT(F4);
+        if ((L4 == 0) || (L4 == 0x80000000))
+          L4 = (L1 ^ L2) & 0x80000000;
+        S1 = ENCODE_FLOAT(F3);
+        S2 = L4;
+        NEXT;
+
+    do_sin:
+        F1 = sinf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_cos:
+        F1 = cosf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_tan:
+        F1 = tanf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_asin:
+        F1 = asinf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_acos:
+        F1 = acosf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
+
+    do_atan:
+        F1 = atanf(DECODE_FLOAT(L1));
+        S1 = ENCODE_FLOAT(F1);
+        NEXT;
 
     // Special Git opcodes
     
index ed0e7aba6278e921e7423a9be42aa8a2267dc43c..184ed51d876ce44d592475aa1c7666ef56115238 100644 (file)
@@ -1,4 +1,4 @@
 // Automatically generated file -- do not edit!
 #define GIT_MAJOR 1
 #define GIT_MINOR 2
-#define GIT_PATCH 8
+#define GIT_PATCH 9
index 38779a2d788443d4e8eb1bed9c4cfbad0ea201d5..f4fa2057990fb35aa8eb5fe237d21e70ea990026 100644 (file)
@@ -3,22 +3,14 @@
     http://eblong.com/zarf/glulx/index.html
 */
 
-#include <string.h>
 #include "glk.h"
 #include "glulxe.h"
 #include "glkstart.h" /* This comes with the Glk library. */
+#include <string.h>
 
-/* The only command-line argument is the filename. And the profiling switch,
-   if that's compiled in. The only *two* command-line arguments are... 
-*/
+/* The only command-line argument is the filename. */
 glkunix_argumentlist_t glkunix_arguments[] = {
-
-#if VM_PROFILING
-  { "--profile", glkunix_arg_ValueFollows, "Generate profiling information to a file." },
-#endif /* VM_PROFILING */
-
   { "", glkunix_arg_ValueFollows, "filename: The game file to load." },
-
   { NULL, glkunix_arg_End, NULL }
 };
 
@@ -26,64 +18,35 @@ int glkunix_startup_code(glkunix_startup_t *data)
 {
   /* It turns out to be more convenient if we return TRUE from here, even 
      when an error occurs, and display an error in glk_main(). */
-  int ix;
-  char *filename = NULL;
+  char *cx;
   unsigned char buf[12];
   int res;
 
 #ifdef GARGLK
-  char *cx;
   garglk_set_program_name("Glulxe 0.4.7");
   garglk_set_program_info("Glulxe 0.4.7 by Andrew Plotkin");
 #endif
 
-  /* Parse out the arguments. They've already been checked for validity,
-     and the library-specific ones stripped out.
-     As usual for Unix, the zeroth argument is the executable name. */
-  for (ix=1; ix<data->argc; ix++) {
-
-#if VM_PROFILING
-    if (!strcmp(data->argv[ix], "--profile")) {
-      ix++;
-      if (ix<data->argc) {
-        strid_t profstr = glkunix_stream_open_pathname_gen(data->argv[ix], TRUE, FALSE, 1);
-        if (!profstr) {
-          init_err = "Unable to open profile output file.";
-          init_err2 = data->argv[ix];
-          return TRUE;
-        }
-        setup_profile(profstr, NULL);
-      }
-      continue;
-    }
-#endif /* VM_PROFILING */
-
-    if (filename) {
-      init_err = "You must supply exactly one game file.";
-      return TRUE;
-    }
-    filename = data->argv[ix];
-  }
-
-  if (!filename) {
+  if (data->argc <= 1) {
     init_err = "You must supply the name of a game file.";
 #ifdef GARGLK
     return TRUE; /* Hack! but I want error message in glk window */
 #endif
        return FALSE;
   }
+  cx = data->argv[1];
     
-  gamefile = glkunix_stream_open_pathname(filename, FALSE, 1);
+  gamefile = glkunix_stream_open_pathname(cx, FALSE, 1);
   if (!gamefile) {
     init_err = "The game file could not be opened.";
-    init_err2 = filename;
+    init_err2 = cx;
     return TRUE;
   }
 
 #ifdef GARGLK
-  cx = strrchr(filename, '/');
-  if (!cx) cx = strrchr(filename, '\\');
-  garglk_set_story_name(cx ? cx + 1 : filename);
+  cx = strrchr(data->argv[1], '/');
+  if (!cx) cx = strrchr(data->argv[1], '\\');
+  garglk_set_story_name(cx ? cx + 1 : data->argv[1]);
 #endif
 
   /* Now we have to check to see if it's a Blorb file. */
index b2647b901050487f1414155b1f90740cc430106d..bb5c83210901312cb6a940f8efb4939b4646e2b0 100644 (file)
@@ -14,7 +14,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 2163a762c784441ea7437ad703186abb7008e16f..ea980eef588340e8f67337ed3b6523402f3a5b2c 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 7f31eacdf3ce183b00a632fae00451f4d7791770..2c9eb3bf6975d3d85bc98654c4e9b84ef94e226d 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index a49332e48f7cfb4fa9b83294723a4859f7417534..d69fefacdd00784707dc0af0abca7bc9a62ba3a7 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index fa85d2bb755dd69abd173d851448193e6783b692..3e332210d304c04ac09030f6a822655a89d52b1d 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 4fcfe41547abaf4acd10864299b16109f22fc6ae..dc0ba817eb6b5bced08e448cf9b4930af8f2143f 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 47b208d9664ce5550970aa11c6b38d2a465495aa..f31da359deca4d8be1a5f3c9bfa31d5401efb2b8 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 6196d408b0e1978c52e5df74a5ab2f1720047942..23b94ac21c5381fd9fee9b454ab192ac916b72ca 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index ee297990d92fe0317514dbce72c0bfd11fde64da..41d62f335a32a2e580cb6678dfd7d9e069ed4a14 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index df65116218995d53e74ac05599aaefd1db47abaf..6ba1aa816a9af377094d7ff0a5efd1d109dece5f 100644 (file)
@@ -14,7 +14,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at ecr+@andrew.cmu.edu
 */
index ce0ceacc949528b71c544b761238486f31363cf0..79e42bd0273ad0b8b69748649f7962c50b087113 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 319a5360c0787652354f0f9418fc5172f9c0ef1d..1b753cb5d6947679ffd70680a90c44e56ff2d62f 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 185a7810500c431e27ce5d4d75ee283cdfbadddf..1ae964b8161978d031aa629dbd9e20d509cbffcb 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index ebedf4f452f7eb432dfb84a51b66c2131eb6774a..d6db12dcdd8978063df7f8e1cb5a78779c0cc07b 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 9da59de4a85ff7504a636f3896b35506fcdc1bb1..4a36996760a1bfa968cb377d758e7cae62ad7943 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 923bcde0d887a8a092037cdb1a84c94bc9ed371a..b2fb4d23da155a1750b5c296da116c1b2e3abde2 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 1ccef3274af3e10f87b0ddcffc390d7d91551c42..573334d6a9fb52d0b40d64e6262225e0bcdee314 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 9c2e54ccbb9041853914bf81610b855daf097da0..aa0d722401d645b10ffdc5dde829fc0250f5f0f3 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index b641c3af6485db5da9ffcca2410c796acd27edb7..fbecba834e8b2659e3ed282454ac978e3056ac08 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 454e02adc6f9c8ab05b4bb13da59726d9921bfb0..4bc567600c419d7dccf3e1e77fd294b3c320dde5 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 6f60a644270b437fa54fc64553cafa7eef329307..0a5f2557efe9701b91b07d89313a1d184510c668 100644 (file)
@@ -36,7 +36,7 @@ my $configname = "configname = \"${dirsep}.${appname}rc\";";
 #
 #  You should have received a copy of the GNU General Public License
 #  along with this program; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 #
 #  The author can be reached at nitfol@my-deja.com
 
index 9c5c552da5aebd18128f92463fb923f30b660f0c..9a444b6b57fa273e51f8c899ee5e79b014b5d65f 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 0ddbf3630041b689dfb835e245514c2f6841c90b..7fd27dadaa7e8037bfcee2f624aec7e7a4290b4a 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 33a3e30799856c8528b5a9cbdac4ad5dc252fbd3..97999067dda627a74c63292c4e2b9a75e8d58fb0 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 763afcdd72c449dd0fc2819c104896af5de48d77..4d79cbfa4d6043efe2090f14a52a9d5df7465003 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 08195c2094739e0b9c70b87d301efb74c19dad8e..3b9320997cec700d77910653d8ec4819b99cbe42 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index c0a58cfd5dda1bda3d817f2444e5d44995803bc1..6108b471d81bb52f61b47e20e84ac94ac010d7e4 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 7db9db658db18629cf2d41b04b0cf0b405b95469..e32387b9e4e6045d36a76e62ca0af5769f6e60cc 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 3f2cb225a92069f1ef6ca8b723ce386685407d31..5a98da95540fe99c41f9a55b7a08078b394c69a1 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index a06fb5afb7e0c97f68b32717a219cc0397480fea..f7bcbbf3546e99c60990370c63e9f4d70f205998 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index f7c12d49f5f295963bb36e4eee463d5f54aab7ae..0beb9bf349dc8d337dc0b00f120b4a3fdcf4be40 100644 (file)
@@ -13,7 +13,7 @@
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
     The author can be reached at nitfol@deja.com
 */
index 0469b8da33ac313bacaf97e64c697630ed2f3fc7..01b4a256ddfdc731d7e0fd8ee8a99545a30dbb75 100644 (file)
@@ -30,7 +30,6 @@ struct _ChimaraGlkPrivate {
        /* Hashtable containing the current styles set by CSS and GLK */
        struct StyleSet *styles;
        struct StyleSet *glk_styles;
-       PangoAttrList *pager_attr_list;
        /* Final message displayed when game exits */
        gchar *final_message;
        /* Image cache */
index ef8e6d5896c2bb367e916fe9224315fe1a24a2b1..0683572628ef4210e2cb31ccaa83096d3b030e28 100644 (file)
@@ -161,7 +161,6 @@ chimara_glk_init(ChimaraGlk *self)
     priv->protect = FALSE;
        priv->styles = g_new0(StyleSet,1);
        priv->glk_styles = g_new0(StyleSet,1);
-       priv->pager_attr_list = pango_attr_list_new();
        priv->final_message = g_strdup("[ The game has finished ]");
        priv->running = FALSE;
     priv->program = NULL;
@@ -270,8 +269,7 @@ chimara_glk_finalize(GObject *object)
        g_hash_table_destroy(priv->styles->text_grid);
        g_hash_table_destroy(priv->glk_styles->text_buffer);
        g_hash_table_destroy(priv->glk_styles->text_grid);
-       pango_attr_list_unref(priv->pager_attr_list);
-       
+
     /* Free the event queue */
     g_mutex_lock(priv->event_lock);
        g_queue_foreach(priv->event_queue, (GFunc)g_free, NULL);
@@ -1525,28 +1523,6 @@ chimara_glk_get_tag_names(ChimaraGlk *glk, unsigned int *num_tags)
        return style_get_tag_names();
 }
 
-/**
- * chimara_glk_update_style:
- * @glk: a #ChimaraGlk widget
- *
- * Processes style updates and updates the widget to reflect the new style.
- * Call this every time you change a property of a #GtkTextTag retrieved by
- * chimara_glk_get_tag().
- */
-void
-chimara_glk_update_style(ChimaraGlk *glk)
-{
-       CHIMARA_GLK_USE_PRIVATE(glk, priv);
-       style_update(glk);
-
-       /* Schedule a redraw */
-       g_mutex_lock(priv->arrange_lock);
-       priv->needs_rearrange = TRUE;
-       priv->ignore_next_arrange_event = TRUE;
-       g_mutex_unlock(priv->arrange_lock);
-       gtk_widget_queue_resize( GTK_WIDGET(priv->self) );
-}
-
 /**
  * chimara_glk_set_resource_load_callback:
  * @glk: a #ChimaraGlk widget
index efb941b46f39bb945e82292539e89c5371d09f02..c36edc79cdde8a9ad02501a1c029dc036fd06783 100644 (file)
@@ -2,6 +2,10 @@
 
 #include "pager.h"
 
+/* Not sure if necessary, but this is the margin within which the pager will
+stop paging if it's close to the end of the text buffer */
+#define PAGER_FUZZINESS 1.0
+
 /* Helper function: move the pager to the last visible position in the buffer,
  and return the distance between the pager and the end of the buffer in buffer
  coordinates */
@@ -32,11 +36,6 @@ move_pager_and_get_scroll_distance(GtkTextView *textview, gint *view_height, gin
        gtk_text_view_get_iter_location(textview, &newpager, &pagerpos);
        gtk_text_view_get_iter_location(textview, &end, &endpos);
 
-       /*
-       g_printerr("View height = %d\n", visiblerect.height);
-       g_printerr("End - Pager = %d - %d = %d\n", endpos.y, pagerpos.y, endpos.y - pagerpos.y);
-       */
-       
        *view_height = visiblerect.height;
        *scroll_distance = endpos.y - pagerpos.y;
 }
@@ -46,7 +45,7 @@ static void
 start_paging(winid_t win)
 {
        win->currently_paging = TRUE;
-       g_signal_handler_unblock(win->widget, win->pager_expose_handler);
+       gtk_widget_show(win->pager);
        g_signal_handler_unblock(win->widget, win->pager_keypress_handler);
 }
 
@@ -55,10 +54,35 @@ static void
 stop_paging(winid_t win)
 {
        win->currently_paging = FALSE;
-       g_signal_handler_block(win->widget, win->pager_expose_handler);
+       gtk_widget_hide(win->pager);
        g_signal_handler_block(win->widget, win->pager_keypress_handler);
 }
 
+/* Helper function: If the adjustment is at its maximum value, stop paging */
+static void
+check_paging(GtkAdjustment *adj, winid_t win)
+{
+       double page_size, upper, value;
+       g_object_get(adj,
+               "page-size", &page_size,
+               "upper", &upper,
+               "value", &value,
+               NULL);
+       if(value + PAGER_FUZZINESS >= upper - page_size && win->currently_paging)
+               stop_paging(win);
+}
+
+void
+pager_on_clicked(GtkButton *pager, winid_t win)
+{
+       GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment( GTK_SCROLLED_WINDOW(win->scrolledwindow) );
+       double upper = gtk_adjustment_get_upper(adj);
+       gtk_adjustment_set_value(adj, upper);
+       check_paging(adj, win);
+       /* Give the focus back to the text view */
+       gtk_widget_grab_focus(win->widget);
+}
+
 /* When the user scrolls up in a textbuffer, start paging. */
 void
 pager_after_adjustment_changed(GtkAdjustment *adj, winid_t win)
@@ -68,19 +92,24 @@ pager_after_adjustment_changed(GtkAdjustment *adj, winid_t win)
        move_pager_and_get_scroll_distance( GTK_TEXT_VIEW(win->widget), &view_height, &scroll_distance, TRUE );
 
        if(scroll_distance > 0 && !win->currently_paging)
+       {
                start_paging(win);
+               return;
+       }
        else if(scroll_distance == 0 && win->currently_paging)
+       {
                stop_paging(win);
-       
-       /* Refresh the widget so that any extra "more" prompts disappear */
-       gtk_widget_queue_draw(win->widget);
+               return;
+       }
+
+       check_paging(adj, win);
 }
 
 /* Handle key press events in the textview while paging is active */
 gboolean
 pager_on_key_press_event(GtkTextView *textview, GdkEventKey *event, winid_t win)
 {
-       GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment( GTK_SCROLLED_WINDOW(win->frame) );
+       GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment( GTK_SCROLLED_WINDOW(win->scrolledwindow) );
        gdouble page_size, upper, lower, value;
        g_object_get(adj, 
                "page-size", &page_size,
@@ -94,9 +123,15 @@ pager_on_key_press_event(GtkTextView *textview, GdkEventKey *event, winid_t win)
                case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down:
                case GDK_KEY_Return: case GDK_KEY_KP_Enter:
                        gtk_adjustment_set_value(adj, CLAMP(value + page_size, lower, upper - page_size));
+                       check_paging(adj, win);
                        return TRUE;
                case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up:
                        gtk_adjustment_set_value(adj, CLAMP(value - page_size, lower, upper - page_size));
+                       check_paging(adj, win);
+                       return TRUE;
+               case GDK_KEY_End: case GDK_KEY_KP_End:
+                       gtk_adjustment_set_value(adj, upper - page_size);
+                       check_paging(adj, win);
                        return TRUE;
                        /* don't handle "up" and "down", they're used for input history */
        }
@@ -104,24 +139,6 @@ pager_on_key_press_event(GtkTextView *textview, GdkEventKey *event, winid_t win)
        return FALSE; /* if the key wasn't handled here, pass it to other handlers */
 }
 
-/* Draw the "more" prompt on top of the buffer, after the regular draw event has run */
-gboolean
-pager_on_draw(GtkTextView *textview, cairo_t *cr, winid_t win)
-{
-       /* Calculate the position of the 'more' tag */
-       gint promptwidth, promptheight;
-       pango_layout_get_pixel_size(win->pager_layout, &promptwidth, &promptheight);
-
-       int winwidth = gtk_widget_get_allocated_width( GTK_WIDGET(textview) );
-       int winheight = gtk_widget_get_allocated_height( GTK_WIDGET(textview) );
-
-       /* Draw the 'more' tag */
-       cairo_move_to(cr, winwidth - promptwidth, winheight - promptheight);
-       pango_cairo_show_layout(cr, win->pager_layout);
-
-       return FALSE; /* Propagate event further */
-}
-
 /* Check whether paging should be done. This function is called after the
  * textview has finished validating text positions. */
 void 
@@ -147,7 +164,7 @@ pager_after_size_allocate(GtkTextView *textview, GdkRectangle *allocation, winid
        
        /* Scroll past text already read by user. This is automatic scrolling, so disable the pager_ajustment_handler
         * first, that acts on the belief the scolling is performed by the user. */
-       GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(win->frame));
+       GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(win->scrolledwindow));
        g_signal_handler_block(adj, win->pager_adjustment_handler);
        GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(win->widget));
        GtkTextMark *pager_position = gtk_text_buffer_get_mark(buffer, "pager_position");
index 9bcbb6344c6ec22d466cead72f935972016b9197..4e7bbf0cfa1b9ec1d1d7f9189d45ab6609db635e 100644 (file)
@@ -5,7 +5,7 @@
 #include "glk.h"
 #include "window.h"
 
-G_GNUC_INTERNAL gboolean pager_on_draw(GtkTextView *textview, cairo_t *cr, winid_t win);
+G_GNUC_INTERNAL void pager_on_clicked(GtkButton *pager, winid_t win);
 G_GNUC_INTERNAL gboolean pager_on_key_press_event(GtkTextView *textview, GdkEventKey *event, winid_t win);
 G_GNUC_INTERNAL void pager_after_adjustment_changed(GtkAdjustment *adj, winid_t win);
 G_GNUC_INTERNAL void pager_after_size_allocate(GtkTextView *textview, GdkRectangle *allocation, winid_t win);
index a17a23659d8427c661d1e735162cb66a6a33a103..406a8848969f6d4cce70a9533694bac5401b374e 100644 (file)
@@ -53,7 +53,6 @@ static const gchar* TAG_NAMES[] = {
        "user1",
        "user2",
        "hyperlink",
-       "pager",
        "default"
 };
 
@@ -123,16 +122,6 @@ glk_set_style_stream(strid_t str, glui32 styl) {
        str->glk_style = (gchar*) get_glk_tag_name(styl);
 }
 
-/* Internal function: call this to initialize the layout of the 'more' prompt. */
-void
-style_init_more_prompt(winid_t win)
-{
-       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-
-       win->pager_layout = gtk_widget_create_pango_layout(win->widget, "More");
-       pango_layout_set_attributes(win->pager_layout, glk_data->pager_attr_list);
-}
-
 /* Internal function: call this to initialize the default styles to a textbuffer. */
 void
 style_init_textbuffer(GtkTextBuffer *buffer)
@@ -343,15 +332,9 @@ style_init(ChimaraGlk *glk)
        g_object_set(tag, "foreground", "#0000ff", "foreground-set", TRUE, "underline", PANGO_UNDERLINE_SINGLE, "underline-set", TRUE, NULL);
        g_hash_table_insert(default_text_buffer_styles, "hyperlink", tag);
 
-       GtkTextTag *pager_tag = gtk_text_tag_new("pager");
-       g_object_set(pager_tag, "family", "Monospace", "family-set", TRUE, "foreground", "#ffffff", "foreground-set", TRUE, "background", "#000000", "background-set", TRUE, NULL);
-       g_hash_table_insert(default_text_buffer_styles, "pager", pager_tag);
-       text_tag_to_attr_list(pager_tag, priv->pager_attr_list);
-
        priv->styles->text_grid = default_text_grid_styles;
        priv->styles->text_buffer = default_text_buffer_styles;
 
-
        /* Initialize the GLK styles to empty tags */
        int i;
        for(i=0; i<style_NUMSTYLES; i++) {
@@ -396,9 +379,6 @@ scan_css_file(GScanner *scanner, ChimaraGlk *glk)
        }
 
        g_scanner_destroy(scanner);
-
-       /* Update the pager prompt to the new style */
-       style_update(glk);
 }
 
 /* Internal function: parses a token */
@@ -1206,16 +1186,6 @@ text_tag_to_attr_list(GtkTextTag *tag, PangoAttrList *list)
        }
 }
 
-/* Update pager tag */
-void
-style_update(ChimaraGlk *glk)
-{
-       CHIMARA_GLK_USE_PRIVATE(glk, priv);
-
-       GtkTextTag *pager_tag = GTK_TEXT_TAG( g_hash_table_lookup(priv->styles->text_buffer, "pager") );
-       text_tag_to_attr_list(pager_tag, priv->pager_attr_list);
-}
-
 /* Determine the current colors used to render the text for a given stream. 
  * This can be set in a number of places */
 static void
index ba9939a1f3218eb22bd5aa6949e1a1fdddbbd488..ee456d88c8ab3dab868009f3f8570b647a708021 100644 (file)
@@ -9,9 +9,7 @@
 
 G_GNUC_INTERNAL void style_init_textbuffer(GtkTextBuffer *buffer);
 G_GNUC_INTERNAL void style_init_textgrid(GtkTextBuffer *buffer);
-G_GNUC_INTERNAL void style_init_more_prompt(winid_t win);
 G_GNUC_INTERNAL void style_init(ChimaraGlk *glk);
-G_GNUC_INTERNAL void style_update(ChimaraGlk *glk);
 G_GNUC_INTERNAL const gchar** style_get_tag_names();
 G_GNUC_INTERNAL void reset_default_styles(ChimaraGlk *glk);
 G_GNUC_INTERNAL GScanner *create_css_file_scanner(void);
@@ -29,7 +27,7 @@ typedef struct StyleSet {
        GHashTable *text_buffer;
 } StyleSet;
 
-#define CHIMARA_NUM_STYLES 13
+#define CHIMARA_NUM_STYLES 12
 
 //#define DEBUG_STYLES
 
index 85348f54502ce02de90a88b2406eb363b547cc5e..9ebde933fe10e9e21d47e3a0d0225aab508cecdb 100644 (file)
@@ -74,8 +74,6 @@ window_close_common(winid_t win, gboolean destroy_node)
        g_hash_table_destroy(win->hyperlinks);
        g_free(win->current_hyperlink);
 
-       if(win->pager_layout)
-               g_object_unref(win->pager_layout);
        if(win->backing_store)
                cairo_surface_destroy(win->backing_store);
 
@@ -535,12 +533,20 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype,
                
                case wintype_TextBuffer:
                {
+                       GtkWidget *overlay = gtk_overlay_new();
                        GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
                        GtkWidget *textview = gtk_text_view_new();
+                       GtkWidget *pager = gtk_button_new_with_label("More");
+                       GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_BUTTON);
                        GtkTextBuffer *textbuffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(textview) );
 
                        gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC );
-                       
+
+                       gtk_button_set_image( GTK_BUTTON(pager), image );
+                       gtk_widget_set_halign(pager, GTK_ALIGN_END);
+                       gtk_widget_set_valign(pager, GTK_ALIGN_END);
+                       gtk_widget_set_no_show_all(pager, TRUE);
+
                        gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW(textview), GTK_WRAP_WORD_CHAR );
                        gtk_text_view_set_editable( GTK_TEXT_VIEW(textview), FALSE );
                        gtk_text_view_set_pixels_inside_wrap( GTK_TEXT_VIEW(textview), 3 );
@@ -548,16 +554,19 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype,
                        gtk_text_view_set_right_margin( GTK_TEXT_VIEW(textview), 20 );
 
                        gtk_container_add( GTK_CONTAINER(scrolledwindow), textview );
-                       gtk_widget_show_all(scrolledwindow);
+                       gtk_container_add( GTK_CONTAINER(overlay), scrolledwindow );
+                       gtk_overlay_add_overlay( GTK_OVERLAY(overlay), pager );
+                       gtk_widget_show_all(overlay);
 
                        win->widget = textview;
-                       win->frame = scrolledwindow;
-                       
+                       win->scrolledwindow = scrolledwindow;
+                       win->pager = pager;
+                       win->frame = overlay;
+
                        /* Create the styles available to the window stream */
                        style_init_textbuffer(textbuffer);
-                       style_init_more_prompt(win);
                        gtk_widget_modify_font( textview, get_current_font(wintype) );
-                       
+
                        /* Determine the size of a "0" character in pixels */
                        PangoLayout *zero = gtk_widget_create_pango_layout(textview, "0");
                        pango_layout_set_font_description( zero, get_current_font(wintype) );
@@ -568,12 +577,11 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype,
                        
                        /* Pager */
                        g_signal_connect_after( textview, "size-allocate", G_CALLBACK(pager_after_size_allocate), win );
-                       win->pager_expose_handler = g_signal_connect_after( textview, "draw", G_CALLBACK(pager_on_draw), win );
-                       g_signal_handler_block(textview, win->pager_expose_handler);
                        win->pager_keypress_handler = g_signal_connect( textview, "key-press-event", G_CALLBACK(pager_on_key_press_event), win );
                        g_signal_handler_block(textview, win->pager_keypress_handler);
                        GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolledwindow));
                        win->pager_adjustment_handler = g_signal_connect_after(adj, "value-changed", G_CALLBACK(pager_after_adjustment_changed), win);
+                       g_signal_connect(pager, "clicked", G_CALLBACK(pager_on_clicked), win);
 
                        /* Char and line input */
                        win->char_input_keypress_handler = g_signal_connect( textview, "key-press-event", G_CALLBACK(on_char_input_key_press_event), win );
index 72ee91b529c3e51ebbab3b756373c1c1fbaa678e..aa3250274a5e5e3609e12252457b587f7a61a0cf 100644 (file)
@@ -42,6 +42,10 @@ struct glk_window_struct
        /* "frame" is the widget that is the child of the ChimaraGlk container, such 
        as a scroll window. It may be the same as "widget". */
        GtkWidget *frame;
+       /* In text buffer windows, the scrolled window and the pager are extra
+       widgets that are neither "widget" nor "frame" */
+       GtkWidget *scrolledwindow;
+       GtkWidget *pager;
        /* Width and height of the window's size units, in pixels */
        int unit_width;
        int unit_height;
@@ -82,7 +86,6 @@ struct glk_window_struct
        gulong shutdown_keypress_handler;
        gulong button_press_event_handler;
        gulong size_allocate_handler;
-       gulong pager_expose_handler;
        gulong pager_keypress_handler;
        gulong pager_adjustment_handler;
        /* Window buffer */
@@ -98,7 +101,6 @@ struct glk_window_struct
        cairo_surface_t *backing_store;
        /* Pager (textbuffer only) */
        gboolean currently_paging;
-       PangoLayout *pager_layout;
 };
 
 #endif
index 9154f4e290a4299e221fe4211688e2d76cdba244..1f39927082e077073dc8b0aa978a3434521e4595 100644 (file)
@@ -252,7 +252,6 @@ on_toggle_left(GtkToggleButton *button, ChimaraGlk *glk) {
        if( !gtk_toggle_button_get_active(button) )
                return;
        g_object_set(current_tag, "justification", GTK_JUSTIFY_LEFT, "justification-set", TRUE, NULL);
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -260,7 +259,6 @@ on_toggle_center(GtkToggleButton *button, ChimaraGlk *glk) {
        if( !gtk_toggle_button_get_active(button) )
                return;
        g_object_set(current_tag, "justification", GTK_JUSTIFY_CENTER, "justification-set", TRUE, NULL);
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -268,7 +266,6 @@ on_toggle_right(GtkToggleButton *button, ChimaraGlk *glk) {
        if( !gtk_toggle_button_get_active(button) )
                return;
        g_object_set(current_tag, "justification", GTK_JUSTIFY_RIGHT, "justification-set", TRUE, NULL);
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -276,7 +273,6 @@ on_toggle_justify(GtkToggleButton *button, ChimaraGlk *glk) {
        if( !gtk_toggle_button_get_active(button) )
                return;
        g_object_set(current_tag, "justification", GTK_JUSTIFY_FILL, "justification-set", TRUE, NULL);
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -285,8 +281,6 @@ on_toggle_bold(GtkToggleButton *button, ChimaraGlk *glk) {
                g_object_set(current_tag, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL);
        else
                g_object_set(current_tag, "weight", PANGO_WEIGHT_NORMAL, "weight-set", TRUE, NULL);
-
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -295,8 +289,6 @@ on_toggle_italic(GtkToggleButton *button, ChimaraGlk *glk) {
                g_object_set(current_tag, "style", PANGO_STYLE_ITALIC, "style-set", TRUE, NULL);
        else
                g_object_set(current_tag, "style", PANGO_STYLE_NORMAL, "style-set", TRUE, NULL);
-
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -305,8 +297,6 @@ on_toggle_underline(GtkToggleButton *button, ChimaraGlk *glk) {
                g_object_set(current_tag, "underline", PANGO_UNDERLINE_SINGLE, "underline-set", TRUE, NULL);
        else
                g_object_set(current_tag, "underline", PANGO_UNDERLINE_NONE, "underline-set", TRUE, NULL);
-
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -315,7 +305,6 @@ on_foreground_color_set(GtkColorButton *button, ChimaraGlk *glk)
        GdkColor color;
     gtk_color_button_get_color(button, &color);
        g_object_set(current_tag, "foreground-gdk", &color, "foreground-set", TRUE, NULL);
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -324,7 +313,6 @@ on_background_color_set(GtkColorButton *button, ChimaraGlk *glk)
        GdkColor color;
     gtk_color_button_get_color(button, &color);
        g_object_set(current_tag, "background-gdk", &color, "background-set", TRUE, NULL);
-       chimara_glk_update_style(glk);
 }
 
 void
@@ -333,7 +321,6 @@ on_font_set(GtkFontButton *button, ChimaraGlk *glk)
        const gchar *font_name = gtk_font_button_get_font_name(button);
        PangoFontDescription *font_description = pango_font_description_from_string(font_name);
        g_object_set(current_tag, "font-desc", font_description, NULL);
-       chimara_glk_update_style(glk);
 }
 
 void
index 87f5026de5193a6acaa950dfaa5bc35190901036..37cc4346b5621763df8550365057f5b39c6ce015 100644 (file)
@@ -78,8 +78,3 @@ buffer.user1 {
 
 buffer.user2 {
 }
-
-buffer.pager {
-       color: #ffffff;
-       background-color: #303030;
-}