commit ac66f86cc2920edc995e72cbcc978e7b58ebc19e
parent e1eecfd69f01deb4c423597a12bbb857783a6a52
Author: Anselm R Garbe <anselm@garbe.us>
Date: Sun, 18 Apr 2010 21:48:22 +0100
update
Diffstat:
README | | | 90 | ------------------------------------------------------------------------------- |
swk.c | | | 64 | ---------------------------------------------------------------- |
swk.h | | | 93 | ++++++++++++++++++++++++++++++++++++++++++------------------------------------- |
test.c | | | 17 | ----------------- |
4 files changed, 49 insertions(+), 215 deletions(-)
diff --git a/README b/README
@@ -1,90 +0,0 @@
-swk - the static widget toolkit
-================================
-swk is a dynamic widget toolkit that provides the ability to create
-keyboard-driven textual UIs very quickly on top of supported(*) window systems
-
-Historically the swk domain is covered by (n)curses based applications that run
-completely in text mode. But this approach has numerous disadvatages, such as
-archaic cursor handling, slow screen redraws, limitations through the use of
-just text and characters, different behaviour in different terminal modes, and
-so on.
-
-On the other hand full-featured UI toolkits like GTK or Qt are far too complex
-and bloated to be anywhere close for rapid and effecient development, or to be
-actually portable onto devices with limited memory and processing power.
-
-Design
-------
-We believe lesser choice is better.
-
-swk has a very basic set of widgets, particularly only widgets with few
-properties and function pointers to extend and override the behaviour and
-appearance of such widgets. The overall widget structure is a tree of widgets,
-where the root of the tree represents the lower-most widget which
-contains all other widgets; and where all leafs represent the
-top-most widgets.
-
-Each widget is parent relative and swk scales child widgets by maximising them
-into the available space of the surrounding parent widget, unless a child
-widget has no width or height factor specified.
-
-The layout algorithm fills child widgets horizontally until a break is inserted
-that creates a new row. The swk layout algorithm does *not* support the use of
-absolute x/y offsets or fixed width/height in order to guarantuee seamless
-scaling, this is an advantage and increases the usability and look'n'feel of
-swk user interfaces.
-
-The width/height of a widget is defined as float factor in between 0.0 and 1.0
-that is used for scaling it in a parent relative way. The sum of all widgets
-in a row until a break should not exceed 1.0, the sum of the widget with the
-greatest height in each row should not exceed 1.0 either in order that the
-layout algorithm creates useful results. If the sum is greater than 1.0 or
-negative swk will ignore all width/height factors until the developer has fixed
-his mistake.
-
-typedef void * SwkBitmap;
-typedef SwkWidget * SwkBreak;
-typedef unsigned long SwkColor;
-typedef char * SwkText;
-
-typedef struct {
- SwkText *name;
-} SwkFont;
-
-typedef struct {
- SwkColor bg;
- SwkColor text;
- SwkColor border;
- SwkFont *font;
-} SwkGC;
-
-typedef struct _SwkWidget SwkWidget;
-struct _SwkWidget {
- float w_factor;
- float h_factor;
- SwkGC gc
- SwkText *text
- SwkWidget *parent
- SwkWidget **childs
- SwkBitmap *(*draw)(Widget *w, void *userdata, SwkBitmap *current, unsigned int current_w, unsigned int current_h);
- void (*click)(Widget *w, void *userdata, unsigned int current_w, unsigned int current_h, int x, int y);
- void (*keypress)(Widget *w, void *userdata, int keycode);
- void (*focusin)(Widget *w, void *userdata);
- void (*focusout)(Widget *w, void *userdata);
-};
-
-The content of each widget is a Bitmap, which is a platform dependent
-representation of the actual content of the widget using in its current size.
-
-If you overload the draw function of a widget, it is expected that you return a
-Bitmap covering the current actual size of the widget.
-
-There are also a bunch of swk manipulation functions that help you implementing
-custom draw functions:
-
-void swk_copy_bitmap(Bitmap *target, Bitmap *source, int target_x, int target_y, int source_x, int source_y, uint source_w, uint source_h);
-void swk_draw_text(Bitmap *target, int offset_x, int offset_y, Text *text);
-
-Remarks
--------
-(*) Currently we the X Window System is the only supported environment.
diff --git a/swk.c b/swk.c
@@ -1,64 +0,0 @@
-/* Copyleft 2010 -- pancake <nopcode.org> */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "swk.h"
-
-int swkret = 0;
-SwkScene swkscene;
-
-int swk_init () {
- swkscene.window = NULL;
- swkscene.windows = NULL;
-}
-
-SwkWindow *swk_widget () {
-}
-
-SwkWindow *swk_box () {
-}
-
-SwkWindow *swk_box_add (SwkBox *box) {
-}
-
-// TODO: rename to box_layout ??
-int swk_window_layout_flow (SwkWindow *window) {
- return 0;
-}
-
-int swk_box_layout_flow (SwkBox *box) {
- return 0;
-}
-
-SwkWindow *swk_window () {
- SwkWindow *w = (SwkWindow *) malloc (sizeof (SwkWindow));
- w->next = NULL;
- if (swkscene.window) swkscene.window->next = w;
- else swkscene.windows = w;
- swkscene.window = w;
- return w;
-}
-
-int swk_window_add (SwkWindow *w) {
-}
-
-SwkWidget* swk_label () {
- /* .. */
-}
-
-int swk_window_delete (SwkWindow *w) {
- SwkWindow *iter = swkscene.window;
- // XXX
- while (iter) {
- if (iter == w)
- return 1;
- iter = iter->next;
- }
- return 0;
-}
-
-int swk_event () {
-}
-
-int swk_redraw () {
-}
diff --git a/swk.h b/swk.h
@@ -1,51 +1,56 @@
-#define TRUE 1
-#define FALSE 0
-typedef int bool_t;
-
-typedef struct swk_widget_t {
- int (*render) (struct swk_widget_t *widget, int w, int h);
- int (*activate) (struct swk_widget_t *widget, int type);
- void *user;
-} SwkWidget;
-
-typedef struct container_t {
- char *title; // nullable
- int show; // boolean
- struct SwkWidget *widget;
- struct SwkBox *next;
-} SwkBox;
-
-typedef struct swk_window_t {
- char *title;
- SwkWidget *selected;
+typedef enum { EVoid, EClick, EMotion, EKey, EExpose, ELast } SwkEventType;
+
+typedef struct SwkBox SwkBox;
+
+typedef struct {
+ int x;
+ int y;
+} Point;
+
+typedef struct {
+ int x;
+ int y;
+ int w;
+ int h;
+} Rect;
+
+typedef struct {
+ int button;
+ long modmask;
+ Point point;
+} Click;
+
+typedef struct {
+ int keycode;
+ long modmask;
+} Key;
+
+typedef struct {
+ SwkEventType type;
SwkBox *box;
+ union {
+ Click click;
+ Point motion;
+ Key key;
+ Rect expose;
+ } data;
+} SwkEvent;
+
+void (*SwkEventCallback)(SwkEvent *e);
+
+struct SwkBox {
+ Rect r;
+ SwkEventCallback *e;
+ void *data;
+};
+
+typedef struct {
+ Rect r;
SwkBox *boxes;
- int (*box_align) (struct swk_window_t *window);
- struct swk_window_t *next;
} SwkWindow;
-typedef struct scene_t {
- SwkWindow *windows;
- SwkWindow *window;
-} SwkScene;
-typedef enum {
- CLICK,
- RELEASE,
- MOUSE_OVER,
- MOUSE_OUT,
-} SwkEvent;
+void swk_init();
-int swk_widget_set_event_mask (SwkWidget *w, int evmask);
-int swk_scene_next (SwkScene *s, int dir);
-int swk_event ();
-
-void flow_layout_align (SwkScene *scene);
-
-extern SwkScene swkscene;
-extern int swkret;
-
-// uhm? not here maybe
-extern int swk_window_layout_flow (SwkWindow *window);
-extern int swk_box_layout_flow (SwkBox* box);
+void swk_deinit();
diff --git a/test.c b/test.c
@@ -1,17 +0,0 @@
-#include <swk.h>
-
-int main () {
- SwkWindow *w;
- SwkBox *c;
-
- swk_init ();
-
- w = swk_window (swk_window_layout_flow);
- c = swk_box (swk_box_layout_flow);
- swk_box_add (c, swk_label ("Hello World"));
- //swk_add_box (c);
-
- // TODO: not working with glib
- while (swk_event ());
- return swkret;
-}