Git Product home page Git Product logo

gtkglk's Introduction

GtkGlk - a Glk implementation in GTK+.  Copyright 2003-2004 Evin Robertson.
LGPL (see COPYING) except glk.h, gi_*, and glkstart.*, which are zarf.

This release seems to work pretty well, but not everything has been
fully tested.  Many things need to be cleaned up.


Implemented:
  Text Buffer          (antialiased if you set GDK_USE_XFT to 1)
  Text Grid            (mostly working, I *think*... but it's very slow)
  Graphics Window      (full alpha support, backing store)
  Sound                (AIFF/MOD/OGG/...)
  Full style hints     (distinguish is perhaps not ideal, but it works)
  Hyperlinks           (double-click on them)
  Unicode              (*_ucs4 functions - see glk-unicode.txt)
  sglk                 (see sglk.h)
  gestalt dialog       (enable/disable/pretend various capabilities)
  Glk object viewer    (examine Glk object tree and view/change stuff)
  Preferences dialogs  (styles, general UI, gestalt)

Unimplemented / Broken:
  margin images in text buffer (lacking in GTK)
  line input in a text grid
  lacks limit on scrollback
  automatic scrolling is by paragraph instead of line (bug in GTK)
  cursor is invisible on black background (bug in GTK)
  various memory leaks
  SDL_sound, aRts, jack, etc. for better sound mixing
  SONG resource support
  resources outside of blorbs like xglk does
  zarfnix startup      (ignores glkunix_arguments -- is this a bug or feature?)
  winglulxe config     (will never be supported)
  Lots of niceties     (html transcripts, etc)


Requirements:
  GTK+ 2.1 or newer      ftp://www.gtk.org/pub/gtk/v2.4/
  GConf 2                ftp://ftp.gnome.org/pub/gnome/sources/GConf/2.4/

Recommended:
  SDL-mixer 1.2.5 or newer
  libmikmod (for MOD support)

If you're using Debian, do something like:
  apt-get install libgtk2.0-dev libgconf2-dev libsdl-mixer1.2-dev libmikmod2




Notes about this Glk library:

Each of my opaque types starts with the same several items:
  glui32 magic, rock, age, type;
  GList *node;
  gidispatch_rock_t disprock;

Here's the explanation of each:
  magic:   identifies which glk type it is.  see GGLK_MAGIC_* in gglk.h
  rock:    the ubiquitous Glk rock everything hides under
  age:     useless unique number associated with each object
  type:    subtype (wintype / strtype)
  node:    used to make iterate work.
  disprock:to support dispatch layer's lack of two-way hash tables

The magic is used to do extra runtime checking.  If you pass the wrong
type of object to a function, the magic will detect this.  Deleted objects
will also be detected.  If a function only supports certain subtypes,
this is also detected.

I've tried to keep each section separate.  Except to the implementing file,
glk types are opaque everywhere.  There are a few functions to leak stuff
when necessary, but it mostly works.

The window stuff is fairly nasty (and broken in a few ways) because
the Glk window splitting ideas are completely against the GTK way.
set_arrangement might not work.  GtkGlk uses a custom paned widget,
included here, which will probably break if you use a GTK version
sufficiently different from 2.2.4 from which it was stolen.


A lot of the stuff here isn't terribly tied to GTK itself.  A nice
idea would be to separate stuff out and create a smaller, easier to
implement layer below Glk.  Maybe some other day.



GtkGlk is intended to be built as a shared library.  Thus, it contains
a few optimizations intended for such use.  When I have a task to do
with several strings, the normal technique would be something like:

static const char *strings[] = { "alpha", "beta", "gamma", NULL }
int i;
for(i = 0; strings[i]; i++) {
   do_something(strings[i]);
}

But shared objects must be position-independent.  The above would
require 3 relative relocations.  Instead I do:

static const char strings[] = "alpha" "\0" "beta" "\0" "gamma" "\0";
const char *p;
for(p = strings; *p; p += strlen(p) + 1) {
   do_something(p);
}

This is only slightly less readable, but does not require relocations
(means faster start-up time), and the data can be placed in a
read-only segment.  Doing the strlen is slightly slower, but not
significantly.


Also, all internal symbols, not intended to be used by the Glk
application, are marked PRIVATE, which is #defined in gglk.h to tell
gcc not to add them to the dynamic symbol table.

gtkglk's People

Contributors

abrobston avatar zadenikt avatar davidgriffith avatar

Watchers

James Cloos avatar  avatar Gren Drake avatar  avatar

Forkers

whitten

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.