From d575e2b4fd8249e0ae584b0b6401ff6b8dd7d2c4 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Wed, 29 Nov 2006 19:38:10 +1100 Subject: Move demo applications to twin_demos subdirectory This change moves the twin demo applications to a new subdirectory (twin_demos), and updates the auto{conf,make} setup to suit. Signed-off-by: Jeremy Kerr Signed-off-by: Benjamin Herrenschmidt --- Makefile.am | 30 +-- configure.ac | 3 +- twin_calc.c | 239 ----------------------- twin_calc.h | 32 --- twin_clock.c | 270 -------------------------- twin_clock.h | 49 ----- twin_demo.c | 453 ------------------------------------------- twin_demo.h | 30 --- twin_demoline.c | 154 --------------- twin_demoline.h | 52 ----- twin_demos/Makefile.am | 13 ++ twin_demos/twin_calc.c | 239 +++++++++++++++++++++++ twin_demos/twin_calc.h | 32 +++ twin_demos/twin_clock.c | 270 ++++++++++++++++++++++++++ twin_demos/twin_clock.h | 49 +++++ twin_demos/twin_demo.c | 453 +++++++++++++++++++++++++++++++++++++++++++ twin_demos/twin_demo.h | 30 +++ twin_demos/twin_demoline.c | 154 +++++++++++++++ twin_demos/twin_demoline.h | 52 +++++ twin_demos/twin_demospline.c | 166 ++++++++++++++++ twin_demos/twin_demospline.h | 54 ++++++ twin_demos/twin_hello.c | 72 +++++++ twin_demos/twin_hello.h | 30 +++ twin_demos/twin_text.c | 83 ++++++++ twin_demos/twin_text.h | 30 +++ twin_demospline.c | 166 ---------------- twin_demospline.h | 54 ------ twin_hello.c | 72 ------- twin_hello.h | 30 --- twin_text.c | 83 -------- twin_text.h | 30 --- 31 files changed, 1738 insertions(+), 1736 deletions(-) delete mode 100644 twin_calc.c delete mode 100644 twin_calc.h delete mode 100644 twin_clock.c delete mode 100644 twin_clock.h delete mode 100644 twin_demo.c delete mode 100644 twin_demo.h delete mode 100644 twin_demoline.c delete mode 100644 twin_demoline.h create mode 100644 twin_demos/Makefile.am create mode 100644 twin_demos/twin_calc.c create mode 100644 twin_demos/twin_calc.h create mode 100644 twin_demos/twin_clock.c create mode 100644 twin_demos/twin_clock.h create mode 100644 twin_demos/twin_demo.c create mode 100644 twin_demos/twin_demo.h create mode 100644 twin_demos/twin_demoline.c create mode 100644 twin_demos/twin_demoline.h create mode 100644 twin_demos/twin_demospline.c create mode 100644 twin_demos/twin_demospline.h create mode 100644 twin_demos/twin_hello.c create mode 100644 twin_demos/twin_hello.h create mode 100644 twin_demos/twin_text.c create mode 100644 twin_demos/twin_text.h delete mode 100644 twin_demospline.c delete mode 100644 twin_demospline.h delete mode 100644 twin_hello.c delete mode 100644 twin_hello.h delete mode 100644 twin_text.c delete mode 100644 twin_text.h diff --git a/Makefile.am b/Makefile.am index 3f25436..9de9f6d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ AM_CFLAGS = @WARN_CFLAGS@ AM_LDFLAGS = -version-info @LIB_VERSION@ -SUBDIRS=twin_ttf +SUBDIRS=twin_ttf twin_demos EXTRA_PROGRAMS = xtwin ftwin @@ -59,29 +59,17 @@ libtwin_mouse_la_LDFLAGS = -version-info=@PACKAGE_VERSION@ libtwin_mouse_la_SOURCES = twin_linux_mouse.c \ twin_linux_mouse.h -demo_sources = twin_demo.c \ - twin_demo.h \ - twin_hello.c \ - twin_hello.h \ - twin_demoline.c \ - twin_demoline.h \ - twin_demospline.c \ - twin_demospline.h \ - twin_clock.c \ - twin_clock.h \ - twin_calc.c \ - twin_calc.h \ - twin_text.c \ - twin_text.h - libtwin_x11_la_SOURCES = twin_x11.c twin_x11.h libtwin_x11_la_CPPFLAGS = @X_CFLAGS@ -xtwin_SOURCES = xtwin.c $(demo_sources) -xtwin_CPPFLAGS = @X_CFLAGS@ -xtwin_LDADD = libtwin.la libtwin-x11.la @X_LIBS@ -lm +xtwin_SOURCES = xtwin.c +xtwin_CPPFLAGS = @X_CFLAGS@ -I$(top_srcdir)/twin_demos +xtwin_LDADD = twin_demos/libtwin_demos.a \ + libtwin.la libtwin-x11.la @X_LIBS@ -lm libtwin_fbdev_la_SOURCES = twin_fbdev.c twin_fbdev.h -ftwin_SOURCES = ftwin.c $(demo_sources) -ftwin_LDADD = libtwin.la libtwin-fbdev.la libtwin-mouse.la -lm +ftwin_SOURCES = ftwin.c +ftwin_CPPFLAGS = -I$(top_srcdir)/twin_demos +ftwin_LDADD = twin_demos/libtwin_demos.a \ + libtwin.la libtwin-fbdev.la libtwin-mouse.la -lm diff --git a/configure.ac b/configure.ac index 006c7f2..f2f227a 100644 --- a/configure.ac +++ b/configure.ac @@ -80,4 +80,5 @@ AC_MSG_NOTICE([linux mouse: $twin_mouse]) AC_OUTPUT([Makefile twin.pc - twin_ttf/Makefile]) + twin_ttf/Makefile + twin_demos/Makefile]) diff --git a/twin_calc.c b/twin_calc.c deleted file mode 100644 index 6b49621..0000000 --- a/twin_calc.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "twin_calc.h" -#include - -#define TWIN_CALC_STACK 5 -#define TWIN_CALC_ZERO 0 -#define TWIN_CALC_ONE 1 -#define TWIN_CALC_TWO 2 -#define TWIN_CALC_THREE 3 -#define TWIN_CALC_FOUR 4 -#define TWIN_CALC_FIVE 5 -#define TWIN_CALC_SIX 6 -#define TWIN_CALC_SEVEN 7 -#define TWIN_CALC_EIGHT 8 -#define TWIN_CALC_NINE 9 -#define TWIN_CALC_PLUS 10 -#define TWIN_CALC_MINUS 11 -#define TWIN_CALC_TIMES 12 -#define TWIN_CALC_DIVIDE 13 -#define TWIN_CALC_EQUAL 14 -#define TWIN_CALC_CLEAR 15 -#define TWIN_CALC_NBUTTON 16 - -/* - * Layout: - * - * display - * - * 7 8 9 + - * 4 5 6 - - * 1 2 3 * - * 0 clr = ÷ - */ -#define TWIN_CALC_COLS 4 -#define TWIN_CALC_ROWS 4 - -const static int calc_layout[TWIN_CALC_ROWS][TWIN_CALC_COLS] = { - { TWIN_CALC_SEVEN, TWIN_CALC_EIGHT, TWIN_CALC_NINE, TWIN_CALC_PLUS }, - { TWIN_CALC_FOUR, TWIN_CALC_FIVE, TWIN_CALC_SIX, TWIN_CALC_MINUS }, - { TWIN_CALC_ONE, TWIN_CALC_TWO, TWIN_CALC_THREE, TWIN_CALC_TIMES }, - { TWIN_CALC_ZERO, TWIN_CALC_CLEAR, TWIN_CALC_EQUAL, TWIN_CALC_DIVIDE }, -}; - -typedef struct _twin_calc { - int stack[TWIN_CALC_STACK]; - int pending_op; - twin_bool_t pending_delete; - twin_window_t *window; - twin_toplevel_t *toplevel; - twin_box_t *keys; - twin_box_t *cols[4]; - twin_label_t *display; - twin_button_t *buttons[TWIN_CALC_NBUTTON]; -} twin_calc_t; - -static const char *twin_calc_labels[] = { - "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", - "+", "-", "*", "/", "=", "CLR" -}; - -#define TWIN_CALC_VALUE_SIZE twin_int_to_fixed(29) -#define TWIN_CALC_VALUE_STYLE TWIN_TEXT_ROMAN -#define TWIN_CALC_VALUE_FG 0xff000000 -#define TWIN_CALC_VALUE_BG 0x80808080 -#define TWIN_CALC_BUTTON_SIZE twin_int_to_fixed(15) -#define TWIN_CALC_BUTTON_STYLE TWIN_TEXT_BOLD -#define TWIN_CALC_BUTTON_FG 0xff000000 -#define TWIN_CALC_BUTTON_BG 0xc0808080 - -static int -_twin_calc_button_to_id (twin_calc_t *calc, twin_button_t *button) -{ - int i; - - for (i = 0; i < TWIN_CALC_NBUTTON; i++) - if (calc->buttons[i] == button) - return i; - return -1; -} - -static void -_twin_calc_update_value (twin_calc_t *calc) -{ - char v[20]; - - sprintf (v, "%d", calc->stack[0]); - twin_label_set (calc->display, v, TWIN_CALC_VALUE_FG, - TWIN_CALC_VALUE_SIZE, TWIN_CALC_VALUE_STYLE); -} - -static void -_twin_calc_push (twin_calc_t *calc) -{ - int i; - - for (i = 0; i < TWIN_CALC_STACK - 1; i++) - calc->stack[i+1] = calc->stack[i]; - calc->pending_delete = TWIN_TRUE; -} - -static int -_twin_calc_pop (twin_calc_t *calc) -{ - int i; - int v = calc->stack[0]; - for (i = 0; i < TWIN_CALC_STACK - 1; i++) - calc->stack[i] = calc->stack[i+1]; - return v; -} - -static void -_twin_calc_digit (twin_calc_t *calc, int digit) -{ - if (calc->pending_delete) - { - calc->stack[0] = 0; - calc->pending_delete = TWIN_FALSE; - } - calc->stack[0] = calc->stack[0] * 10 + digit; - _twin_calc_update_value (calc); -} - -static void -_twin_calc_button_signal (twin_button_t *button, - twin_button_signal_t signal, - void *closure) -{ - twin_calc_t *calc = closure; - int i; - int a, b; - - if (signal != TwinButtonSignalDown) return; - i = _twin_calc_button_to_id (calc, button); - if (i < 0) return; - switch (i) { - case TWIN_CALC_PLUS: - case TWIN_CALC_MINUS: - case TWIN_CALC_TIMES: - case TWIN_CALC_DIVIDE: - calc->pending_op = i; - _twin_calc_push (calc); - break; - case TWIN_CALC_EQUAL: - if (calc->pending_op != 0) - { - b = _twin_calc_pop (calc); - a = _twin_calc_pop (calc); - switch (calc->pending_op) { - case TWIN_CALC_PLUS: a = a + b; break; - case TWIN_CALC_MINUS: a = a - b; break; - case TWIN_CALC_TIMES: a = a * b; break; - case TWIN_CALC_DIVIDE: if (!b) a = 0; else a = a / b; break; - } - _twin_calc_push (calc); - calc->stack[0] = a; - _twin_calc_update_value (calc); - calc->pending_op = 0; - } - calc->pending_delete = TWIN_TRUE; - break; - case TWIN_CALC_CLEAR: - for (i = 0; i < TWIN_CALC_STACK; i++) - calc->stack[i] = 0; - calc->pending_op = 0; - calc->pending_delete = TWIN_TRUE; - _twin_calc_update_value (calc); - break; - default: - _twin_calc_digit (calc, i); - break; - } -} - -void -twin_calc_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) -{ - twin_calc_t *calc = malloc (sizeof (twin_calc_t)); - int i, j; - - calc->toplevel = twin_toplevel_create (screen, - TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h, name); - calc->display = twin_label_create (&calc->toplevel->box, - "0", - TWIN_CALC_VALUE_FG, - TWIN_CALC_VALUE_SIZE, - TWIN_CALC_VALUE_STYLE); - twin_widget_set (&calc->display->widget, TWIN_CALC_VALUE_BG); - calc->display->align = TwinAlignRight; - calc->display->widget.shape = TwinShapeLozenge; - calc->keys = twin_box_create (&calc->toplevel->box, TwinBoxHorz); - for (i = 0; i < TWIN_CALC_COLS; i++) - { - calc->cols[i] = twin_box_create (calc->keys, TwinBoxVert); - for (j = 0; j < TWIN_CALC_ROWS; j++) - { - int b = calc_layout[j][i]; - calc->buttons[b] = twin_button_create (calc->cols[i], - twin_calc_labels[b], - TWIN_CALC_BUTTON_FG, - TWIN_CALC_BUTTON_SIZE, - TWIN_CALC_BUTTON_STYLE); - twin_widget_set (&calc->buttons[b]->label.widget, - TWIN_CALC_BUTTON_BG); - calc->buttons[b]->signal = _twin_calc_button_signal; - calc->buttons[b]->closure = calc; -/* calc->buttons[b]->label.widget.shape = TwinShapeLozenge; */ - if (i || j) - calc->buttons[b]->label.widget.copy_geom = &calc->buttons[calc_layout[0][0]]->label.widget; - } - } - - for (i = 0; i < TWIN_CALC_STACK; i++) - calc->stack[i] = 0; - calc->pending_delete = TWIN_TRUE; - calc->pending_op = 0; - twin_toplevel_show (calc->toplevel); -} diff --git a/twin_calc.h b/twin_calc.h deleted file mode 100644 index 6fbb2f1..0000000 --- a/twin_calc.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include - -#ifndef _TWIN_CALC_H_ -#define _TWIN_CALC_H_ - -#include - -void -twin_calc_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); - -#endif /* _TWIN_CALC_H_ */ diff --git a/twin_clock.c b/twin_clock.c deleted file mode 100644 index 039ae05..0000000 --- a/twin_clock.c +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include -#include -#include - -#define D(x) twin_double_to_fixed(x) - -#define TWIN_CLOCK_BACKGROUND 0xff3b80ae -#define TWIN_CLOCK_HOUR 0x80808080 -#define TWIN_CLOCK_HOUR_OUT 0x30000000 -#define TWIN_CLOCK_MINUTE 0x80808080 -#define TWIN_CLOCK_MINUTE_OUT 0x30000000 -#define TWIN_CLOCK_SECOND 0x80808080 -#define TWIN_CLOCK_SECOND_OUT 0x30000000 -#define TWIN_CLOCK_TIC 0xffbababa -#define TWIN_CLOCK_NUMBERS 0xffdedede -#define TWIN_CLOCK_WATER 0x60200000 -#define TWIN_CLOCK_WATER_OUT 0x40404040 -#define TWIN_CLOCK_WATER_UNDER 0x60400000 -#define TWIN_CLOCK_BORDER 0xffbababa -#define TWIN_CLOCK_BORDER_WIDTH D(0.01) - -#define _twin_clock_pixmap(clock) ((clock)->widget.window->pixmap) - -static void -twin_clock_set_transform (twin_clock_t *clock, - twin_path_t *path) -{ - twin_fixed_t scale; - - scale = (TWIN_FIXED_ONE - TWIN_CLOCK_BORDER_WIDTH * 3) / 2; - twin_path_scale (path, _twin_widget_width (clock) * scale, - _twin_widget_height (clock) * scale); - - twin_path_translate (path, - TWIN_FIXED_ONE + TWIN_CLOCK_BORDER_WIDTH * 3, - TWIN_FIXED_ONE + TWIN_CLOCK_BORDER_WIDTH * 3); - - twin_path_rotate (path, -TWIN_ANGLE_90); -} - -static void -twin_clock_hand (twin_clock_t *clock, - twin_angle_t angle, - twin_fixed_t len, - twin_fixed_t fill_width, - twin_fixed_t out_width, - twin_argb32_t fill_pixel, - twin_argb32_t out_pixel) -{ - twin_path_t *stroke = twin_path_create (); - twin_path_t *pen = twin_path_create (); - twin_path_t *path = twin_path_create (); - twin_matrix_t m; - - twin_clock_set_transform (clock, stroke); - - twin_path_rotate (stroke, angle); - twin_path_move (stroke, D(0), D(0)); - twin_path_draw (stroke, len, D(0)); - - m = twin_path_current_matrix (stroke); - m.m[2][0] = 0; - m.m[2][1] = 0; - twin_path_set_matrix (pen, m); - twin_path_set_matrix (path, m); - twin_path_circle (pen, 0, 0, fill_width); - twin_path_convolve (path, stroke, pen); - - twin_paint_path (_twin_clock_pixmap(clock), fill_pixel, path); - - twin_paint_stroke (_twin_clock_pixmap(clock), out_pixel, path, out_width); - - twin_path_destroy (path); - twin_path_destroy (pen); - twin_path_destroy (stroke); -} - -static twin_angle_t -twin_clock_minute_angle (int min) -{ - return min * TWIN_ANGLE_360 / 60; -} - -static void -_twin_clock_face (twin_clock_t *clock) -{ - twin_path_t *path = twin_path_create (); - int m; - - twin_clock_set_transform (clock, path); - - twin_path_circle (path, 0, 0, TWIN_FIXED_ONE); - - twin_paint_path (_twin_clock_pixmap(clock), TWIN_CLOCK_BACKGROUND, path); - - twin_paint_stroke (_twin_clock_pixmap(clock), TWIN_CLOCK_BORDER, path, TWIN_CLOCK_BORDER_WIDTH); - - { - twin_state_t state = twin_path_save (path); - twin_text_metrics_t metrics; - twin_fixed_t height, width; - static char *label = "twin"; - - twin_path_empty (path); - twin_path_rotate (path, twin_degrees_to_angle (-11) + TWIN_ANGLE_90); - twin_path_set_font_size (path, D(0.5)); - twin_path_set_font_style (path, TWIN_TEXT_UNHINTED|TWIN_TEXT_OBLIQUE); - twin_text_metrics_utf8 (path, label, &metrics); - height = metrics.ascent + metrics.descent; - width = metrics.right_side_bearing - metrics.left_side_bearing; - - twin_path_move (path, -width / 2, metrics.ascent - height/2 + D(0.01)); - twin_path_draw (path, width / 2, metrics.ascent - height/2 + D(0.01)); - twin_paint_stroke (_twin_clock_pixmap(clock), TWIN_CLOCK_WATER_UNDER, path, D(0.02)); - twin_path_empty (path); - - twin_path_move (path, -width / 2 - metrics.left_side_bearing, metrics.ascent - height/2); - twin_path_utf8 (path, label); - twin_paint_path (_twin_clock_pixmap(clock), TWIN_CLOCK_WATER, path); - twin_path_restore (path, &state); - } - - twin_path_set_font_size (path, D(0.2)); - twin_path_set_font_style (path, TWIN_TEXT_UNHINTED); - - for (m = 1; m <= 60; m++) - { - twin_state_t state = twin_path_save (path); - twin_path_rotate (path, twin_clock_minute_angle (m) + TWIN_ANGLE_90); - twin_path_empty (path); - if (m % 5 != 0) - { - twin_path_move (path, 0, -TWIN_FIXED_ONE); - twin_path_draw (path, 0, -D(0.9)); - twin_paint_stroke (_twin_clock_pixmap(clock), TWIN_CLOCK_TIC, path, D(0.01)); - } - else - { - char hour[3]; - twin_text_metrics_t metrics; - twin_fixed_t width; - twin_fixed_t left; - - sprintf (hour, "%d", m / 5); - twin_text_metrics_utf8 (path, hour, &metrics); - width = metrics.right_side_bearing - metrics.left_side_bearing; - left = -width / 2 - metrics.left_side_bearing; - twin_path_move (path, left, -D(0.98) + metrics.ascent); - twin_path_utf8 (path, hour); - twin_paint_path (_twin_clock_pixmap(clock), TWIN_CLOCK_NUMBERS, path); - } - twin_path_restore (path, &state); - } - - twin_path_destroy (path); -} - -static twin_time_t -_twin_clock_interval (void) -{ - struct timeval tv; - gettimeofday (&tv, NULL); - - return 1000 - (tv.tv_usec / 1000); -} - -void -_twin_clock_paint (twin_clock_t *clock) -{ - struct timeval tv; - twin_angle_t second_angle, minute_angle, hour_angle; - struct tm t; - - gettimeofday (&tv, NULL); - - localtime_r(&tv.tv_sec, &t); - - _twin_clock_face (clock); - - second_angle = ((t.tm_sec * 100 + tv.tv_usec / 10000) * - TWIN_ANGLE_360) / 6000; - minute_angle = twin_clock_minute_angle (t.tm_min) + second_angle / 60; - hour_angle = (t.tm_hour * TWIN_ANGLE_360 + minute_angle) / 12; - twin_clock_hand (clock, hour_angle, D(0.4), D(0.07), D(0.01), - TWIN_CLOCK_HOUR, TWIN_CLOCK_HOUR_OUT); - twin_clock_hand (clock, minute_angle, D(0.8), D(0.05), D(0.01), - TWIN_CLOCK_MINUTE, TWIN_CLOCK_MINUTE_OUT); - twin_clock_hand (clock, second_angle, D(0.9), D(0.01), D(0.01), - TWIN_CLOCK_SECOND, TWIN_CLOCK_SECOND_OUT); -} - -static twin_time_t -_twin_clock_timeout (twin_time_t now, void *closure) -{ - twin_clock_t *clock = closure; - _twin_widget_queue_paint (&clock->widget); - return _twin_clock_interval (); -} - -twin_dispatch_result_t -_twin_clock_dispatch (twin_widget_t *widget, twin_event_t *event) -{ - twin_clock_t *clock = (twin_clock_t *) widget; - - if (_twin_widget_dispatch (widget, event) == TwinDispatchDone) - return TwinDispatchDone; - switch (event->kind) { - case TwinEventPaint: - _twin_clock_paint (clock); - break; - default: - break; - } - return TwinDispatchContinue; -} - -void -_twin_clock_init (twin_clock_t *clock, - twin_box_t *parent, - twin_dispatch_proc_t dispatch) -{ - static const twin_widget_layout_t preferred = { 0, 0, 1, 1 }; - _twin_widget_init (&clock->widget, parent, 0, preferred, dispatch); - clock->timeout = twin_set_timeout (_twin_clock_timeout, - _twin_clock_interval(), - clock); -} - -twin_clock_t * -twin_clock_create (twin_box_t *parent) -{ - twin_clock_t *clock = malloc (sizeof (twin_clock_t)); - - _twin_clock_init(clock, parent, _twin_clock_dispatch); - return clock; -} - -void -twin_clock_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) -{ - twin_toplevel_t *toplevel = twin_toplevel_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h, name); - twin_clock_t *clock = twin_clock_create (&toplevel->box); - (void) clock; - twin_toplevel_show (toplevel); -} diff --git a/twin_clock.h b/twin_clock.h deleted file mode 100644 index 2259c29..0000000 --- a/twin_clock.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef _TWIN_CLOCK_H_ -#define _TWIN_CLOCK_H_ - -#include - -typedef struct _twin_clock { - twin_widget_t widget; - twin_timeout_t *timeout; -} twin_clock_t; - -void -_twin_clock_paint (twin_clock_t *clock); - -twin_dispatch_result_t -_twin_clock_dispatch (twin_widget_t *widget, twin_event_t *event); - -void -_twin_clock_init (twin_clock_t *clock, - twin_box_t *parent, - twin_dispatch_proc_t dispatch); - -twin_clock_t * -twin_clock_create (twin_box_t *parent); - -void -twin_clock_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); - -#endif /* _TWIN_CLOCK_H_ */ diff --git a/twin_demo.c b/twin_demo.c deleted file mode 100644 index f93e9f4..0000000 --- a/twin_demo.c +++ /dev/null @@ -1,453 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include - -#define D(x) twin_double_to_fixed(x) - -#if 0 -static int styles[] = { - TWIN_TEXT_ROMAN, - TWIN_TEXT_OBLIQUE, - TWIN_TEXT_BOLD, - TWIN_TEXT_BOLD|TWIN_TEXT_OBLIQUE -}; -#endif - -#if 0 -static void -twin_example_start (twin_screen_t *screen, int x, int y, int w, int h) -{ - twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h); - int wid = window->client.right - window->client.left; - int hei = window->client.bottom - window->client.top; - twin_pixmap_t *pixmap = window->pixmap; - twin_path_t *path = twin_path_create (); - twin_path_t *pen = twin_path_create (); - twin_pixmap_t *alpha = twin_pixmap_create (TWIN_A8, w, h); - twin_operand_t source, mask; - - twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, 0, 0, wid, hei); - - twin_window_set_name (window, "example"); - - twin_path_circle (pen, D (1)); - - /* graphics here in path */ - - twin_fill_path (alpha, path, 0, 0); - twin_path_destroy (path); - twin_path_destroy (pen); - source.source_kind = TWIN_SOLID; - source.u.argb = 0xff000000; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (pixmap, 0, 0, - &source, 0, 0, &mask, 0, 0, TWIN_OVER, w, h); - twin_pixmap_destroy (alpha); - twin_window_show (window); -} -#endif - -static void -twin_line_start (twin_screen_t *screen, int x, int y, int w, int h) -{ - twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h); - twin_pixmap_t *pixmap = window->pixmap; - twin_path_t *stroke = twin_path_create (); - twin_fixed_t fy; - - twin_path_translate (stroke, D(200), D(200)); - twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, - 0, 0, w, h); - - twin_window_set_name (window, "line"); - - for (fy = 0; fy < 150; fy += 40) - { - twin_path_move (stroke, D(-150), -D(fy)); - twin_path_draw (stroke, D(150), D(fy)); - } - twin_path_set_cap_style (stroke, TwinCapProjecting); - twin_paint_stroke (pixmap, 0xff000000, stroke, D(10)); - twin_path_destroy (stroke); - twin_window_show (window); -} - -static void -twin_circletext_start (twin_screen_t *screen, int x, int y, int w, int h) -{ - twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h); - int wid = window->client.right - window->client.left; - int hei = window->client.bottom - window->client.top; - twin_pixmap_t *pixmap = window->pixmap; - twin_path_t *path = twin_path_create (); - twin_path_t *pen = twin_path_create (); - twin_pixmap_t *alpha = twin_pixmap_create (TWIN_A8, wid, hei); - int s; - twin_operand_t source, mask; - - twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, - 0, 0, wid, hei); - twin_window_set_name (window, "circletext"); - - twin_path_set_font_style (path, TWIN_TEXT_UNHINTED); - twin_path_circle (pen, 0, 0, D (1)); - - twin_path_translate (path, D(200), D(200)); - twin_path_set_font_size (path, D(15)); - for (s = 0; s < 41; s++) - { - twin_state_t state = twin_path_save (path); - twin_path_rotate (path, twin_degrees_to_angle (9 * s)); - twin_path_move (path, D(100), D(0)); - twin_path_utf8 (path, "Hello, world!"); - twin_path_restore (path, &state); - } - twin_fill_path (alpha, path, 0, 0); - twin_path_destroy (path); - twin_path_destroy (pen); - source.source_kind = TWIN_SOLID; - source.u.argb = 0xff000000; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (pixmap, 0, 0, - &source, 0, 0, &mask, 0, 0, TWIN_OVER, wid, hei); - twin_pixmap_destroy (alpha); - twin_window_show (window); -} - -static void -twin_quickbrown_start (twin_screen_t *screen, int x, int y, int w, int h) -{ - twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h); - int wid = window->client.right - window->client.left; - int hei = window->client.bottom - window->client.top; - twin_pixmap_t *pixmap = window->pixmap; - twin_path_t *path = twin_path_create (); - twin_path_t *pen = twin_path_create (); - twin_pixmap_t *alpha = twin_pixmap_create (TWIN_A8, wid, hei); - twin_operand_t source, mask; - twin_fixed_t fx, fy; - int s; - - twin_window_set_name (window, "Quick Brown"); - - twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, - 0, 0, wid, hei); - - twin_path_circle (pen, 0, 0, D (1)); - - fx = D(3); - fy = D(8); - for (s = 6; s < 36; s++) - { - twin_path_move (path, fx, fy); - twin_path_set_font_size (path, D(s)); - twin_path_utf8 (path, - "the quick brown fox jumps over the lazy dog."); - twin_path_utf8 (path, - "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG."); - fy += D(s); - } - - twin_fill_path (alpha, path, 0, 0); - twin_path_destroy (path); - twin_path_destroy (pen); - source.source_kind = TWIN_SOLID; - source.u.argb = 0xff000000; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (pixmap, 0, 0, - &source, 0, 0, &mask, 0, 0, TWIN_OVER, wid, hei); - twin_pixmap_destroy (alpha); - twin_window_show (window); -} - -static void -twin_ascii_start (twin_screen_t *screen, int x, int y, int w, int h) -{ - twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h); - int wid = window->client.right - window->client.left; - int hei = window->client.bottom - window->client.top; - twin_pixmap_t *pixmap = window->pixmap; - twin_path_t *path = twin_path_create (); - twin_path_t *pen = twin_path_create (); - twin_pixmap_t *alpha = twin_pixmap_create (TWIN_A8, wid, hei); - twin_operand_t source, mask; - twin_fixed_t fx, fy; - int s; - - twin_window_set_name (window, "ASCII"); - - twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, 0, 0, wid, hei); - twin_path_circle (pen, 0, 0, D (1)); - - fx = D(3); - fy = D(8); - for (s = 6; s < 36; s += 6) - { - twin_path_set_font_size (path, D(s)); - fy += D(s+2); - twin_path_move (path, fx, fy); - twin_path_utf8 (path, - " !\"#$%&'()*+,-./0123456789:;<=>?"); - fy += D(s+2); - twin_path_move (path, fx, fy); - twin_path_utf8 (path, - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"); - fy += D(s+2); - twin_path_move (path, fx, fy); - twin_path_utf8 (path, - "`abcdefghijklmnopqrstuvwxyz{|}~"); - fy += D(s+2); - } - - twin_fill_path (alpha, path, 0, 0); - twin_path_destroy (path); - twin_path_destroy (pen); - source.source_kind = TWIN_SOLID; - source.u.argb = 0xff000000; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (pixmap, 0, 0, - &source, 0, 0, &mask, 0, 0, TWIN_OVER, wid, hei); - twin_pixmap_destroy (alpha); - twin_window_show (window); -} - -static void -twin_jelly_start (twin_screen_t *screen, int x, int y, int w, int h) -{ - twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h); - int wid = window->client.right - window->client.left; - int hei = window->client.bottom - window->client.top; - twin_pixmap_t *pixmap = window->pixmap; - twin_path_t *path = twin_path_create (); - twin_fixed_t fx, fy; - int s; - - twin_window_set_name (window, "Jelly"); - - twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, - 0, 0, wid, hei); - - fx = D(3); - fy = D(8); - for (s = 6; s < 36; s += 2) - { - twin_path_set_font_size (path, D(s)); - fy += D(s + 2); - twin_path_move (path, fx, fy); -#define TEXT "jelly text" -/* twin_path_set_font_style (path, TWIN_TEXT_UNHINTED); */ - twin_path_utf8 (path, TEXT); - twin_paint_path (pixmap, 0xff000000, path); - twin_path_empty (path); - { - twin_text_metrics_t m; - twin_path_t *stroke = twin_path_create (); - twin_path_set_matrix (stroke, twin_path_current_matrix (path)); - twin_text_metrics_utf8 (path, TEXT, &m); - twin_path_translate (stroke, TWIN_FIXED_HALF, TWIN_FIXED_HALF); - twin_path_move (stroke, fx, fy); - twin_path_draw (stroke, fx + m.width, fy); - twin_paint_stroke (pixmap, 0xffff0000, stroke, D(1)); - twin_path_empty (stroke); - twin_path_move (stroke, - fx + m.left_side_bearing, fy - m.ascent); - twin_path_draw (stroke, - fx + m.right_side_bearing, fy - m.ascent); - twin_path_draw (stroke, - fx + m.right_side_bearing, fy + m.descent); - twin_path_draw (stroke, - fx + m.left_side_bearing, fy + m.descent); - twin_path_draw (stroke, - fx + m.left_side_bearing, fy - m.ascent); - twin_paint_stroke (pixmap, 0xff00ff00, stroke, D(1)); - twin_path_destroy (stroke); - } - } - twin_window_show (window); -} - -void -twin_demo_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) -{ -#if 0 - twin_circletext_start (screen, x, y, w, h); -#endif - twin_line_start (screen, x += 20, y += 20, w, h); -#if 0 - twin_quickbrown_start (screen, x += 20, y += 20, w, h); - twin_ascii_start (screen, x += 20, y += 20, w, h); - twin_jelly_start (screen, x += 20, y += 20, w, h); -#endif -#if 0 - -#if 0 - path = twin_path_create (); - - twin_path_rotate (path, -TWIN_ANGLE_45); - twin_path_translate (path, D(10), D(2)); - for (s = 0; s < 40; s++) - { - twin_path_rotate (path, TWIN_ANGLE_11_25 / 16); - twin_path_scale (path, D(1.125), D(1.125)); - twin_path_move (path, D(0), D(0)); - twin_path_draw (path, D(1), D(0)); - twin_path_draw (path, D(1), D(1)); - twin_path_draw (path, D(0), D(1)); - } - - twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); - twin_fill_path (alpha, path); - - source.source_kind = TWIN_SOLID; - source.u.argb = 0xffff0000; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, - w, h); -#endif - -#if 0 - path = twin_path_create (); - stroke = twin_path_create (); - - twin_path_translate (stroke, D(62), D(62)); - twin_path_scale (stroke,D(60),D(60)); - for (s = 0; s < 60; s++) - { - twin_state_t save = twin_path_save (stroke); - twin_angle_t a = s * TWIN_ANGLE_90 / 15; - - twin_path_rotate (stroke, a); - twin_path_move (stroke, D(1), 0); - if (s % 5 == 0) - twin_path_draw (stroke, D(0.85), 0); - else - twin_path_draw (stroke, D(.98), 0); - twin_path_restore (stroke, &save); - } - twin_path_convolve (path, stroke, pen); - twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); - twin_fill_path (alpha, path); - - source.source_kind = TWIN_SOLID; - source.u.argb = 0xffff0000; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, - w, h); -#endif - -#if 0 - path = twin_path_create (); - stroke = twin_path_create (); - - twin_path_translate (stroke, D(100), D(100)); - twin_path_scale (stroke, D(10), D(10)); - twin_path_move (stroke, D(0), D(0)); - twin_path_draw (stroke, D(10), D(0)); - twin_path_convolve (path, stroke, pen); - - twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); - twin_fill_path (alpha, path); - - source.source_kind = TWIN_SOLID; - source.u.argb = 0xffff0000; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, - w, h); -#endif - -#if 1 - path = twin_path_create (); - - stroke = twin_path_create (); - - twin_path_move (stroke, D (10), D (40)); - twin_path_draw (stroke, D (40), D (40)); - twin_path_draw (stroke, D (10), D (10)); - twin_path_move (stroke, D (10), D (50)); - twin_path_draw (stroke, D (40), D (50)); - - twin_path_convolve (path, stroke, pen); - twin_path_destroy (stroke); - - twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); - twin_fill_path (alpha, path, 0, 0); - source.source_kind = TWIN_SOLID; - source.u.argb = 0xff00ff00; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, - 100, 100); - - twin_path_destroy (path); - - path = twin_path_create (); - stroke = twin_path_create (); - - twin_path_move (stroke, D (50), D (50)); - twin_path_curve (stroke, D (70), D (70), D (80), D (70), D (100), D (50)); - - twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); - twin_fill_path (alpha, stroke, 0, 0); - - source.source_kind = TWIN_SOLID; - source.u.argb = 0xffff0000; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, - 100, 100); - - twin_path_convolve (path, stroke, pen); - - twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); - twin_fill_path (alpha, path, 0, 0); - - source.source_kind = TWIN_SOLID; - source.u.argb = 0xff0000ff; - mask.source_kind = TWIN_PIXMAP; - mask.u.pixmap = alpha; - twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, - 100, 100); -#endif - - twin_window_show (redw); - twin_window_show (bluew); -#endif -} diff --git a/twin_demo.h b/twin_demo.h deleted file mode 100644 index ee4d03c..0000000 --- a/twin_demo.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef _TWIN_DEMO_H_ -#define _TWIN_DEMO_H_ - -#include - -void -twin_demo_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); - -#endif /* _TWIN_DEMO_H_ */ diff --git a/twin_demoline.c b/twin_demoline.c deleted file mode 100644 index 245caa7..0000000 --- a/twin_demoline.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include - -#define D(x) twin_double_to_fixed(x) - -#define TWIN_CLOCK_BACKGROUND 0xff3b80ae -#define TWIN_CLOCK_HOUR 0x80808080 -#define TWIN_CLOCK_HOUR_OUT 0x30000000 -#define TWIN_CLOCK_MINUTE 0x80808080 -#define TWIN_CLOCK_MINUTE_OUT 0x30000000 -#define TWIN_CLOCK_SECOND 0x80808080 -#define TWIN_CLOCK_SECOND_OUT 0x30000000 -#define TWIN_CLOCK_TIC 0xffbababa -#define TWIN_CLOCK_NUMBERS 0xffdedede -#define TWIN_CLOCK_WATER 0x60200000 -#define TWIN_CLOCK_WATER_OUT 0x40404040 -#define TWIN_CLOCK_WATER_UNDER 0x60400000 -#define TWIN_CLOCK_BORDER 0xffbababa -#define TWIN_CLOCK_BORDER_WIDTH D(0.01) - -#define _twin_demoline_pixmap(demoline) ((demoline)->widget.window->pixmap) - -void -_twin_demoline_paint (twin_demoline_t *demoline) -{ - twin_path_t *path; - - path = twin_path_create (); - twin_path_set_cap_style (path, demoline->cap_style); - twin_path_move (path, demoline->points[0].x, demoline->points[0].y); - twin_path_draw (path, demoline->points[1].x, demoline->points[1].y); - twin_paint_stroke (_twin_demoline_pixmap(demoline), 0xff000000, path, - demoline->line_width); - twin_path_set_cap_style (path, TwinCapButt); - twin_paint_stroke (_twin_demoline_pixmap(demoline), 0xffff0000, path, - twin_int_to_fixed (2)); - twin_path_destroy (path); -} - -static twin_dispatch_result_t -_twin_demoline_update_pos (twin_demoline_t *demoline, twin_event_t *event) -{ - if (demoline->which < 0) - return TwinDispatchContinue; - demoline->points[demoline->which].x = twin_int_to_fixed (event->u.pointer.x); - demoline->points[demoline->which].y = twin_int_to_fixed (event->u.pointer.y); - _twin_widget_queue_paint (&demoline->widget); - return TwinDispatchDone; -} - -#define twin_fixed_abs(f) ((f) < 0 ? -(f) : (f)) - -static int -_twin_demoline_hit (twin_demoline_t *demoline, twin_fixed_t x, twin_fixed_t y) -{ - int i; - - for (i = 0; i < 2; i++) - if (twin_fixed_abs (x - demoline->points[i].x) < demoline->line_width / 2 && - twin_fixed_abs (y - demoline->points[i].y) < demoline->line_width / 2) - return i; - return -1; -} - -twin_dispatch_result_t -_twin_demoline_dispatch (twin_widget_t *widget, twin_event_t *event) -{ - twin_demoline_t *demoline = (twin_demoline_t *) widget; - - if (_twin_widget_dispatch (widget, event) == TwinDispatchDone) - return TwinDispatchDone; - switch (event->kind) { - case TwinEventPaint: - _twin_demoline_paint (demoline); - break; - case TwinEventButtonDown: - demoline->which = _twin_demoline_hit (demoline, - twin_int_to_fixed (event->u.pointer.x), - twin_int_to_fixed (event->u.pointer.y)); - return _twin_demoline_update_pos (demoline, event); - break; - case TwinEventMotion: - return _twin_demoline_update_pos (demoline, event); - break; - case TwinEventButtonUp: - if (demoline->which < 0) - return TwinDispatchContinue; - _twin_demoline_update_pos (demoline, event); - demoline->which = -1; - return TwinDispatchDone; - break; - default: - break; - } - return TwinDispatchContinue; -} - -void -_twin_demoline_init (twin_demoline_t *demoline, - twin_box_t *parent, - twin_dispatch_proc_t dispatch) -{ - static const twin_widget_layout_t preferred = { 0, 0, 1, 1 }; - _twin_widget_init (&demoline->widget, parent, 0, preferred, dispatch); - twin_widget_set (&demoline->widget, 0xffffffff); - demoline->line_width = twin_int_to_fixed (30); - demoline->cap_style = TwinCapProjecting; - demoline->points[0].x = twin_int_to_fixed (50); - demoline->points[0].y = twin_int_to_fixed (50); - demoline->points[1].x = twin_int_to_fixed (100); - demoline->points[1].y = twin_int_to_fixed (100); -} - -twin_demoline_t * -twin_demoline_create (twin_box_t *parent) -{ - twin_demoline_t *demoline = malloc (sizeof (twin_demoline_t)); - - _twin_demoline_init(demoline, parent, _twin_demoline_dispatch); - return demoline; -} - -void -twin_demoline_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) -{ - twin_toplevel_t *toplevel = twin_toplevel_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h, name); - twin_demoline_t *demoline = twin_demoline_create (&toplevel->box); - (void) demoline; - twin_toplevel_show (toplevel); -} diff --git a/twin_demoline.h b/twin_demoline.h deleted file mode 100644 index 10dee67..0000000 --- a/twin_demoline.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef _TWIN_DEMOLINE_H_ -#define _TWIN_DEMOLINE_H_ - -#include - -typedef struct _twin_demoline { - twin_widget_t widget; - twin_point_t points[2]; - int which; - twin_fixed_t line_width; - twin_cap_t cap_style; -} twin_demoline_t; - -void -_twin_demoline_paint (twin_demoline_t *demoline); - -twin_dispatch_result_t -_twin_demoline_dispatch (twin_widget_t *widget, twin_event_t *event); - -void -_twin_demoline_init (twin_demoline_t *demoline, - twin_box_t *parent, - twin_dispatch_proc_t dispatch); - -twin_demoline_t * -twin_demoline_create (twin_box_t *parent); - -void -twin_demoline_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); - -#endif /* _TWIN_DEMOLINE_H_ */ diff --git a/twin_demos/Makefile.am b/twin_demos/Makefile.am new file mode 100644 index 0000000..b4020c9 --- /dev/null +++ b/twin_demos/Makefile.am @@ -0,0 +1,13 @@ + +noinst_LIBRARIES = libtwin_demos.a + +libtwin_demos_a_CFLAGS = @WARN_CFLAGS@ +libtwin_demos_a_CPPFLAGS = -I$(top_srcdir) +libtwin_demos_a_SOURCES = twin_calc.c twin_calc.h \ + twin_clock.c twin_clock.h \ + twin_demo.c twin_demo.h \ + twin_demoline.c twin_demoline.h \ + twin_demospline.c twin_demospline.h \ + twin_hello.c twin_hello.h \ + twin_text.c twin_text.h + diff --git a/twin_demos/twin_calc.c b/twin_demos/twin_calc.c new file mode 100644 index 0000000..6b49621 --- /dev/null +++ b/twin_demos/twin_calc.c @@ -0,0 +1,239 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "twin_calc.h" +#include + +#define TWIN_CALC_STACK 5 +#define TWIN_CALC_ZERO 0 +#define TWIN_CALC_ONE 1 +#define TWIN_CALC_TWO 2 +#define TWIN_CALC_THREE 3 +#define TWIN_CALC_FOUR 4 +#define TWIN_CALC_FIVE 5 +#define TWIN_CALC_SIX 6 +#define TWIN_CALC_SEVEN 7 +#define TWIN_CALC_EIGHT 8 +#define TWIN_CALC_NINE 9 +#define TWIN_CALC_PLUS 10 +#define TWIN_CALC_MINUS 11 +#define TWIN_CALC_TIMES 12 +#define TWIN_CALC_DIVIDE 13 +#define TWIN_CALC_EQUAL 14 +#define TWIN_CALC_CLEAR 15 +#define TWIN_CALC_NBUTTON 16 + +/* + * Layout: + * + * display + * + * 7 8 9 + + * 4 5 6 - + * 1 2 3 * + * 0 clr = ÷ + */ +#define TWIN_CALC_COLS 4 +#define TWIN_CALC_ROWS 4 + +const static int calc_layout[TWIN_CALC_ROWS][TWIN_CALC_COLS] = { + { TWIN_CALC_SEVEN, TWIN_CALC_EIGHT, TWIN_CALC_NINE, TWIN_CALC_PLUS }, + { TWIN_CALC_FOUR, TWIN_CALC_FIVE, TWIN_CALC_SIX, TWIN_CALC_MINUS }, + { TWIN_CALC_ONE, TWIN_CALC_TWO, TWIN_CALC_THREE, TWIN_CALC_TIMES }, + { TWIN_CALC_ZERO, TWIN_CALC_CLEAR, TWIN_CALC_EQUAL, TWIN_CALC_DIVIDE }, +}; + +typedef struct _twin_calc { + int stack[TWIN_CALC_STACK]; + int pending_op; + twin_bool_t pending_delete; + twin_window_t *window; + twin_toplevel_t *toplevel; + twin_box_t *keys; + twin_box_t *cols[4]; + twin_label_t *display; + twin_button_t *buttons[TWIN_CALC_NBUTTON]; +} twin_calc_t; + +static const char *twin_calc_labels[] = { + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "+", "-", "*", "/", "=", "CLR" +}; + +#define TWIN_CALC_VALUE_SIZE twin_int_to_fixed(29) +#define TWIN_CALC_VALUE_STYLE TWIN_TEXT_ROMAN +#define TWIN_CALC_VALUE_FG 0xff000000 +#define TWIN_CALC_VALUE_BG 0x80808080 +#define TWIN_CALC_BUTTON_SIZE twin_int_to_fixed(15) +#define TWIN_CALC_BUTTON_STYLE TWIN_TEXT_BOLD +#define TWIN_CALC_BUTTON_FG 0xff000000 +#define TWIN_CALC_BUTTON_BG 0xc0808080 + +static int +_twin_calc_button_to_id (twin_calc_t *calc, twin_button_t *button) +{ + int i; + + for (i = 0; i < TWIN_CALC_NBUTTON; i++) + if (calc->buttons[i] == button) + return i; + return -1; +} + +static void +_twin_calc_update_value (twin_calc_t *calc) +{ + char v[20]; + + sprintf (v, "%d", calc->stack[0]); + twin_label_set (calc->display, v, TWIN_CALC_VALUE_FG, + TWIN_CALC_VALUE_SIZE, TWIN_CALC_VALUE_STYLE); +} + +static void +_twin_calc_push (twin_calc_t *calc) +{ + int i; + + for (i = 0; i < TWIN_CALC_STACK - 1; i++) + calc->stack[i+1] = calc->stack[i]; + calc->pending_delete = TWIN_TRUE; +} + +static int +_twin_calc_pop (twin_calc_t *calc) +{ + int i; + int v = calc->stack[0]; + for (i = 0; i < TWIN_CALC_STACK - 1; i++) + calc->stack[i] = calc->stack[i+1]; + return v; +} + +static void +_twin_calc_digit (twin_calc_t *calc, int digit) +{ + if (calc->pending_delete) + { + calc->stack[0] = 0; + calc->pending_delete = TWIN_FALSE; + } + calc->stack[0] = calc->stack[0] * 10 + digit; + _twin_calc_update_value (calc); +} + +static void +_twin_calc_button_signal (twin_button_t *button, + twin_button_signal_t signal, + void *closure) +{ + twin_calc_t *calc = closure; + int i; + int a, b; + + if (signal != TwinButtonSignalDown) return; + i = _twin_calc_button_to_id (calc, button); + if (i < 0) return; + switch (i) { + case TWIN_CALC_PLUS: + case TWIN_CALC_MINUS: + case TWIN_CALC_TIMES: + case TWIN_CALC_DIVIDE: + calc->pending_op = i; + _twin_calc_push (calc); + break; + case TWIN_CALC_EQUAL: + if (calc->pending_op != 0) + { + b = _twin_calc_pop (calc); + a = _twin_calc_pop (calc); + switch (calc->pending_op) { + case TWIN_CALC_PLUS: a = a + b; break; + case TWIN_CALC_MINUS: a = a - b; break; + case TWIN_CALC_TIMES: a = a * b; break; + case TWIN_CALC_DIVIDE: if (!b) a = 0; else a = a / b; break; + } + _twin_calc_push (calc); + calc->stack[0] = a; + _twin_calc_update_value (calc); + calc->pending_op = 0; + } + calc->pending_delete = TWIN_TRUE; + break; + case TWIN_CALC_CLEAR: + for (i = 0; i < TWIN_CALC_STACK; i++) + calc->stack[i] = 0; + calc->pending_op = 0; + calc->pending_delete = TWIN_TRUE; + _twin_calc_update_value (calc); + break; + default: + _twin_calc_digit (calc, i); + break; + } +} + +void +twin_calc_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) +{ + twin_calc_t *calc = malloc (sizeof (twin_calc_t)); + int i, j; + + calc->toplevel = twin_toplevel_create (screen, + TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h, name); + calc->display = twin_label_create (&calc->toplevel->box, + "0", + TWIN_CALC_VALUE_FG, + TWIN_CALC_VALUE_SIZE, + TWIN_CALC_VALUE_STYLE); + twin_widget_set (&calc->display->widget, TWIN_CALC_VALUE_BG); + calc->display->align = TwinAlignRight; + calc->display->widget.shape = TwinShapeLozenge; + calc->keys = twin_box_create (&calc->toplevel->box, TwinBoxHorz); + for (i = 0; i < TWIN_CALC_COLS; i++) + { + calc->cols[i] = twin_box_create (calc->keys, TwinBoxVert); + for (j = 0; j < TWIN_CALC_ROWS; j++) + { + int b = calc_layout[j][i]; + calc->buttons[b] = twin_button_create (calc->cols[i], + twin_calc_labels[b], + TWIN_CALC_BUTTON_FG, + TWIN_CALC_BUTTON_SIZE, + TWIN_CALC_BUTTON_STYLE); + twin_widget_set (&calc->buttons[b]->label.widget, + TWIN_CALC_BUTTON_BG); + calc->buttons[b]->signal = _twin_calc_button_signal; + calc->buttons[b]->closure = calc; +/* calc->buttons[b]->label.widget.shape = TwinShapeLozenge; */ + if (i || j) + calc->buttons[b]->label.widget.copy_geom = &calc->buttons[calc_layout[0][0]]->label.widget; + } + } + + for (i = 0; i < TWIN_CALC_STACK; i++) + calc->stack[i] = 0; + calc->pending_delete = TWIN_TRUE; + calc->pending_op = 0; + twin_toplevel_show (calc->toplevel); +} diff --git a/twin_demos/twin_calc.h b/twin_demos/twin_calc.h new file mode 100644 index 0000000..6fbb2f1 --- /dev/null +++ b/twin_demos/twin_calc.h @@ -0,0 +1,32 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#ifndef _TWIN_CALC_H_ +#define _TWIN_CALC_H_ + +#include + +void +twin_calc_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); + +#endif /* _TWIN_CALC_H_ */ diff --git a/twin_demos/twin_clock.c b/twin_demos/twin_clock.c new file mode 100644 index 0000000..039ae05 --- /dev/null +++ b/twin_demos/twin_clock.c @@ -0,0 +1,270 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#define D(x) twin_double_to_fixed(x) + +#define TWIN_CLOCK_BACKGROUND 0xff3b80ae +#define TWIN_CLOCK_HOUR 0x80808080 +#define TWIN_CLOCK_HOUR_OUT 0x30000000 +#define TWIN_CLOCK_MINUTE 0x80808080 +#define TWIN_CLOCK_MINUTE_OUT 0x30000000 +#define TWIN_CLOCK_SECOND 0x80808080 +#define TWIN_CLOCK_SECOND_OUT 0x30000000 +#define TWIN_CLOCK_TIC 0xffbababa +#define TWIN_CLOCK_NUMBERS 0xffdedede +#define TWIN_CLOCK_WATER 0x60200000 +#define TWIN_CLOCK_WATER_OUT 0x40404040 +#define TWIN_CLOCK_WATER_UNDER 0x60400000 +#define TWIN_CLOCK_BORDER 0xffbababa +#define TWIN_CLOCK_BORDER_WIDTH D(0.01) + +#define _twin_clock_pixmap(clock) ((clock)->widget.window->pixmap) + +static void +twin_clock_set_transform (twin_clock_t *clock, + twin_path_t *path) +{ + twin_fixed_t scale; + + scale = (TWIN_FIXED_ONE - TWIN_CLOCK_BORDER_WIDTH * 3) / 2; + twin_path_scale (path, _twin_widget_width (clock) * scale, + _twin_widget_height (clock) * scale); + + twin_path_translate (path, + TWIN_FIXED_ONE + TWIN_CLOCK_BORDER_WIDTH * 3, + TWIN_FIXED_ONE + TWIN_CLOCK_BORDER_WIDTH * 3); + + twin_path_rotate (path, -TWIN_ANGLE_90); +} + +static void +twin_clock_hand (twin_clock_t *clock, + twin_angle_t angle, + twin_fixed_t len, + twin_fixed_t fill_width, + twin_fixed_t out_width, + twin_argb32_t fill_pixel, + twin_argb32_t out_pixel) +{ + twin_path_t *stroke = twin_path_create (); + twin_path_t *pen = twin_path_create (); + twin_path_t *path = twin_path_create (); + twin_matrix_t m; + + twin_clock_set_transform (clock, stroke); + + twin_path_rotate (stroke, angle); + twin_path_move (stroke, D(0), D(0)); + twin_path_draw (stroke, len, D(0)); + + m = twin_path_current_matrix (stroke); + m.m[2][0] = 0; + m.m[2][1] = 0; + twin_path_set_matrix (pen, m); + twin_path_set_matrix (path, m); + twin_path_circle (pen, 0, 0, fill_width); + twin_path_convolve (path, stroke, pen); + + twin_paint_path (_twin_clock_pixmap(clock), fill_pixel, path); + + twin_paint_stroke (_twin_clock_pixmap(clock), out_pixel, path, out_width); + + twin_path_destroy (path); + twin_path_destroy (pen); + twin_path_destroy (stroke); +} + +static twin_angle_t +twin_clock_minute_angle (int min) +{ + return min * TWIN_ANGLE_360 / 60; +} + +static void +_twin_clock_face (twin_clock_t *clock) +{ + twin_path_t *path = twin_path_create (); + int m; + + twin_clock_set_transform (clock, path); + + twin_path_circle (path, 0, 0, TWIN_FIXED_ONE); + + twin_paint_path (_twin_clock_pixmap(clock), TWIN_CLOCK_BACKGROUND, path); + + twin_paint_stroke (_twin_clock_pixmap(clock), TWIN_CLOCK_BORDER, path, TWIN_CLOCK_BORDER_WIDTH); + + { + twin_state_t state = twin_path_save (path); + twin_text_metrics_t metrics; + twin_fixed_t height, width; + static char *label = "twin"; + + twin_path_empty (path); + twin_path_rotate (path, twin_degrees_to_angle (-11) + TWIN_ANGLE_90); + twin_path_set_font_size (path, D(0.5)); + twin_path_set_font_style (path, TWIN_TEXT_UNHINTED|TWIN_TEXT_OBLIQUE); + twin_text_metrics_utf8 (path, label, &metrics); + height = metrics.ascent + metrics.descent; + width = metrics.right_side_bearing - metrics.left_side_bearing; + + twin_path_move (path, -width / 2, metrics.ascent - height/2 + D(0.01)); + twin_path_draw (path, width / 2, metrics.ascent - height/2 + D(0.01)); + twin_paint_stroke (_twin_clock_pixmap(clock), TWIN_CLOCK_WATER_UNDER, path, D(0.02)); + twin_path_empty (path); + + twin_path_move (path, -width / 2 - metrics.left_side_bearing, metrics.ascent - height/2); + twin_path_utf8 (path, label); + twin_paint_path (_twin_clock_pixmap(clock), TWIN_CLOCK_WATER, path); + twin_path_restore (path, &state); + } + + twin_path_set_font_size (path, D(0.2)); + twin_path_set_font_style (path, TWIN_TEXT_UNHINTED); + + for (m = 1; m <= 60; m++) + { + twin_state_t state = twin_path_save (path); + twin_path_rotate (path, twin_clock_minute_angle (m) + TWIN_ANGLE_90); + twin_path_empty (path); + if (m % 5 != 0) + { + twin_path_move (path, 0, -TWIN_FIXED_ONE); + twin_path_draw (path, 0, -D(0.9)); + twin_paint_stroke (_twin_clock_pixmap(clock), TWIN_CLOCK_TIC, path, D(0.01)); + } + else + { + char hour[3]; + twin_text_metrics_t metrics; + twin_fixed_t width; + twin_fixed_t left; + + sprintf (hour, "%d", m / 5); + twin_text_metrics_utf8 (path, hour, &metrics); + width = metrics.right_side_bearing - metrics.left_side_bearing; + left = -width / 2 - metrics.left_side_bearing; + twin_path_move (path, left, -D(0.98) + metrics.ascent); + twin_path_utf8 (path, hour); + twin_paint_path (_twin_clock_pixmap(clock), TWIN_CLOCK_NUMBERS, path); + } + twin_path_restore (path, &state); + } + + twin_path_destroy (path); +} + +static twin_time_t +_twin_clock_interval (void) +{ + struct timeval tv; + gettimeofday (&tv, NULL); + + return 1000 - (tv.tv_usec / 1000); +} + +void +_twin_clock_paint (twin_clock_t *clock) +{ + struct timeval tv; + twin_angle_t second_angle, minute_angle, hour_angle; + struct tm t; + + gettimeofday (&tv, NULL); + + localtime_r(&tv.tv_sec, &t); + + _twin_clock_face (clock); + + second_angle = ((t.tm_sec * 100 + tv.tv_usec / 10000) * + TWIN_ANGLE_360) / 6000; + minute_angle = twin_clock_minute_angle (t.tm_min) + second_angle / 60; + hour_angle = (t.tm_hour * TWIN_ANGLE_360 + minute_angle) / 12; + twin_clock_hand (clock, hour_angle, D(0.4), D(0.07), D(0.01), + TWIN_CLOCK_HOUR, TWIN_CLOCK_HOUR_OUT); + twin_clock_hand (clock, minute_angle, D(0.8), D(0.05), D(0.01), + TWIN_CLOCK_MINUTE, TWIN_CLOCK_MINUTE_OUT); + twin_clock_hand (clock, second_angle, D(0.9), D(0.01), D(0.01), + TWIN_CLOCK_SECOND, TWIN_CLOCK_SECOND_OUT); +} + +static twin_time_t +_twin_clock_timeout (twin_time_t now, void *closure) +{ + twin_clock_t *clock = closure; + _twin_widget_queue_paint (&clock->widget); + return _twin_clock_interval (); +} + +twin_dispatch_result_t +_twin_clock_dispatch (twin_widget_t *widget, twin_event_t *event) +{ + twin_clock_t *clock = (twin_clock_t *) widget; + + if (_twin_widget_dispatch (widget, event) == TwinDispatchDone) + return TwinDispatchDone; + switch (event->kind) { + case TwinEventPaint: + _twin_clock_paint (clock); + break; + default: + break; + } + return TwinDispatchContinue; +} + +void +_twin_clock_init (twin_clock_t *clock, + twin_box_t *parent, + twin_dispatch_proc_t dispatch) +{ + static const twin_widget_layout_t preferred = { 0, 0, 1, 1 }; + _twin_widget_init (&clock->widget, parent, 0, preferred, dispatch); + clock->timeout = twin_set_timeout (_twin_clock_timeout, + _twin_clock_interval(), + clock); +} + +twin_clock_t * +twin_clock_create (twin_box_t *parent) +{ + twin_clock_t *clock = malloc (sizeof (twin_clock_t)); + + _twin_clock_init(clock, parent, _twin_clock_dispatch); + return clock; +} + +void +twin_clock_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) +{ + twin_toplevel_t *toplevel = twin_toplevel_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h, name); + twin_clock_t *clock = twin_clock_create (&toplevel->box); + (void) clock; + twin_toplevel_show (toplevel); +} diff --git a/twin_demos/twin_clock.h b/twin_demos/twin_clock.h new file mode 100644 index 0000000..2259c29 --- /dev/null +++ b/twin_demos/twin_clock.h @@ -0,0 +1,49 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _TWIN_CLOCK_H_ +#define _TWIN_CLOCK_H_ + +#include + +typedef struct _twin_clock { + twin_widget_t widget; + twin_timeout_t *timeout; +} twin_clock_t; + +void +_twin_clock_paint (twin_clock_t *clock); + +twin_dispatch_result_t +_twin_clock_dispatch (twin_widget_t *widget, twin_event_t *event); + +void +_twin_clock_init (twin_clock_t *clock, + twin_box_t *parent, + twin_dispatch_proc_t dispatch); + +twin_clock_t * +twin_clock_create (twin_box_t *parent); + +void +twin_clock_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); + +#endif /* _TWIN_CLOCK_H_ */ diff --git a/twin_demos/twin_demo.c b/twin_demos/twin_demo.c new file mode 100644 index 0000000..f93e9f4 --- /dev/null +++ b/twin_demos/twin_demo.c @@ -0,0 +1,453 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#define D(x) twin_double_to_fixed(x) + +#if 0 +static int styles[] = { + TWIN_TEXT_ROMAN, + TWIN_TEXT_OBLIQUE, + TWIN_TEXT_BOLD, + TWIN_TEXT_BOLD|TWIN_TEXT_OBLIQUE +}; +#endif + +#if 0 +static void +twin_example_start (twin_screen_t *screen, int x, int y, int w, int h) +{ + twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h); + int wid = window->client.right - window->client.left; + int hei = window->client.bottom - window->client.top; + twin_pixmap_t *pixmap = window->pixmap; + twin_path_t *path = twin_path_create (); + twin_path_t *pen = twin_path_create (); + twin_pixmap_t *alpha = twin_pixmap_create (TWIN_A8, w, h); + twin_operand_t source, mask; + + twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, 0, 0, wid, hei); + + twin_window_set_name (window, "example"); + + twin_path_circle (pen, D (1)); + + /* graphics here in path */ + + twin_fill_path (alpha, path, 0, 0); + twin_path_destroy (path); + twin_path_destroy (pen); + source.source_kind = TWIN_SOLID; + source.u.argb = 0xff000000; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (pixmap, 0, 0, + &source, 0, 0, &mask, 0, 0, TWIN_OVER, w, h); + twin_pixmap_destroy (alpha); + twin_window_show (window); +} +#endif + +static void +twin_line_start (twin_screen_t *screen, int x, int y, int w, int h) +{ + twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h); + twin_pixmap_t *pixmap = window->pixmap; + twin_path_t *stroke = twin_path_create (); + twin_fixed_t fy; + + twin_path_translate (stroke, D(200), D(200)); + twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, + 0, 0, w, h); + + twin_window_set_name (window, "line"); + + for (fy = 0; fy < 150; fy += 40) + { + twin_path_move (stroke, D(-150), -D(fy)); + twin_path_draw (stroke, D(150), D(fy)); + } + twin_path_set_cap_style (stroke, TwinCapProjecting); + twin_paint_stroke (pixmap, 0xff000000, stroke, D(10)); + twin_path_destroy (stroke); + twin_window_show (window); +} + +static void +twin_circletext_start (twin_screen_t *screen, int x, int y, int w, int h) +{ + twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h); + int wid = window->client.right - window->client.left; + int hei = window->client.bottom - window->client.top; + twin_pixmap_t *pixmap = window->pixmap; + twin_path_t *path = twin_path_create (); + twin_path_t *pen = twin_path_create (); + twin_pixmap_t *alpha = twin_pixmap_create (TWIN_A8, wid, hei); + int s; + twin_operand_t source, mask; + + twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, + 0, 0, wid, hei); + twin_window_set_name (window, "circletext"); + + twin_path_set_font_style (path, TWIN_TEXT_UNHINTED); + twin_path_circle (pen, 0, 0, D (1)); + + twin_path_translate (path, D(200), D(200)); + twin_path_set_font_size (path, D(15)); + for (s = 0; s < 41; s++) + { + twin_state_t state = twin_path_save (path); + twin_path_rotate (path, twin_degrees_to_angle (9 * s)); + twin_path_move (path, D(100), D(0)); + twin_path_utf8 (path, "Hello, world!"); + twin_path_restore (path, &state); + } + twin_fill_path (alpha, path, 0, 0); + twin_path_destroy (path); + twin_path_destroy (pen); + source.source_kind = TWIN_SOLID; + source.u.argb = 0xff000000; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (pixmap, 0, 0, + &source, 0, 0, &mask, 0, 0, TWIN_OVER, wid, hei); + twin_pixmap_destroy (alpha); + twin_window_show (window); +} + +static void +twin_quickbrown_start (twin_screen_t *screen, int x, int y, int w, int h) +{ + twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h); + int wid = window->client.right - window->client.left; + int hei = window->client.bottom - window->client.top; + twin_pixmap_t *pixmap = window->pixmap; + twin_path_t *path = twin_path_create (); + twin_path_t *pen = twin_path_create (); + twin_pixmap_t *alpha = twin_pixmap_create (TWIN_A8, wid, hei); + twin_operand_t source, mask; + twin_fixed_t fx, fy; + int s; + + twin_window_set_name (window, "Quick Brown"); + + twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, + 0, 0, wid, hei); + + twin_path_circle (pen, 0, 0, D (1)); + + fx = D(3); + fy = D(8); + for (s = 6; s < 36; s++) + { + twin_path_move (path, fx, fy); + twin_path_set_font_size (path, D(s)); + twin_path_utf8 (path, + "the quick brown fox jumps over the lazy dog."); + twin_path_utf8 (path, + "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG."); + fy += D(s); + } + + twin_fill_path (alpha, path, 0, 0); + twin_path_destroy (path); + twin_path_destroy (pen); + source.source_kind = TWIN_SOLID; + source.u.argb = 0xff000000; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (pixmap, 0, 0, + &source, 0, 0, &mask, 0, 0, TWIN_OVER, wid, hei); + twin_pixmap_destroy (alpha); + twin_window_show (window); +} + +static void +twin_ascii_start (twin_screen_t *screen, int x, int y, int w, int h) +{ + twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h); + int wid = window->client.right - window->client.left; + int hei = window->client.bottom - window->client.top; + twin_pixmap_t *pixmap = window->pixmap; + twin_path_t *path = twin_path_create (); + twin_path_t *pen = twin_path_create (); + twin_pixmap_t *alpha = twin_pixmap_create (TWIN_A8, wid, hei); + twin_operand_t source, mask; + twin_fixed_t fx, fy; + int s; + + twin_window_set_name (window, "ASCII"); + + twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, 0, 0, wid, hei); + twin_path_circle (pen, 0, 0, D (1)); + + fx = D(3); + fy = D(8); + for (s = 6; s < 36; s += 6) + { + twin_path_set_font_size (path, D(s)); + fy += D(s+2); + twin_path_move (path, fx, fy); + twin_path_utf8 (path, + " !\"#$%&'()*+,-./0123456789:;<=>?"); + fy += D(s+2); + twin_path_move (path, fx, fy); + twin_path_utf8 (path, + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"); + fy += D(s+2); + twin_path_move (path, fx, fy); + twin_path_utf8 (path, + "`abcdefghijklmnopqrstuvwxyz{|}~"); + fy += D(s+2); + } + + twin_fill_path (alpha, path, 0, 0); + twin_path_destroy (path); + twin_path_destroy (pen); + source.source_kind = TWIN_SOLID; + source.u.argb = 0xff000000; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (pixmap, 0, 0, + &source, 0, 0, &mask, 0, 0, TWIN_OVER, wid, hei); + twin_pixmap_destroy (alpha); + twin_window_show (window); +} + +static void +twin_jelly_start (twin_screen_t *screen, int x, int y, int w, int h) +{ + twin_window_t *window = twin_window_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h); + int wid = window->client.right - window->client.left; + int hei = window->client.bottom - window->client.top; + twin_pixmap_t *pixmap = window->pixmap; + twin_path_t *path = twin_path_create (); + twin_fixed_t fx, fy; + int s; + + twin_window_set_name (window, "Jelly"); + + twin_fill (pixmap, 0xffffffff, TWIN_SOURCE, + 0, 0, wid, hei); + + fx = D(3); + fy = D(8); + for (s = 6; s < 36; s += 2) + { + twin_path_set_font_size (path, D(s)); + fy += D(s + 2); + twin_path_move (path, fx, fy); +#define TEXT "jelly text" +/* twin_path_set_font_style (path, TWIN_TEXT_UNHINTED); */ + twin_path_utf8 (path, TEXT); + twin_paint_path (pixmap, 0xff000000, path); + twin_path_empty (path); + { + twin_text_metrics_t m; + twin_path_t *stroke = twin_path_create (); + twin_path_set_matrix (stroke, twin_path_current_matrix (path)); + twin_text_metrics_utf8 (path, TEXT, &m); + twin_path_translate (stroke, TWIN_FIXED_HALF, TWIN_FIXED_HALF); + twin_path_move (stroke, fx, fy); + twin_path_draw (stroke, fx + m.width, fy); + twin_paint_stroke (pixmap, 0xffff0000, stroke, D(1)); + twin_path_empty (stroke); + twin_path_move (stroke, + fx + m.left_side_bearing, fy - m.ascent); + twin_path_draw (stroke, + fx + m.right_side_bearing, fy - m.ascent); + twin_path_draw (stroke, + fx + m.right_side_bearing, fy + m.descent); + twin_path_draw (stroke, + fx + m.left_side_bearing, fy + m.descent); + twin_path_draw (stroke, + fx + m.left_side_bearing, fy - m.ascent); + twin_paint_stroke (pixmap, 0xff00ff00, stroke, D(1)); + twin_path_destroy (stroke); + } + } + twin_window_show (window); +} + +void +twin_demo_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) +{ +#if 0 + twin_circletext_start (screen, x, y, w, h); +#endif + twin_line_start (screen, x += 20, y += 20, w, h); +#if 0 + twin_quickbrown_start (screen, x += 20, y += 20, w, h); + twin_ascii_start (screen, x += 20, y += 20, w, h); + twin_jelly_start (screen, x += 20, y += 20, w, h); +#endif +#if 0 + +#if 0 + path = twin_path_create (); + + twin_path_rotate (path, -TWIN_ANGLE_45); + twin_path_translate (path, D(10), D(2)); + for (s = 0; s < 40; s++) + { + twin_path_rotate (path, TWIN_ANGLE_11_25 / 16); + twin_path_scale (path, D(1.125), D(1.125)); + twin_path_move (path, D(0), D(0)); + twin_path_draw (path, D(1), D(0)); + twin_path_draw (path, D(1), D(1)); + twin_path_draw (path, D(0), D(1)); + } + + twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); + twin_fill_path (alpha, path); + + source.source_kind = TWIN_SOLID; + source.u.argb = 0xffff0000; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, + w, h); +#endif + +#if 0 + path = twin_path_create (); + stroke = twin_path_create (); + + twin_path_translate (stroke, D(62), D(62)); + twin_path_scale (stroke,D(60),D(60)); + for (s = 0; s < 60; s++) + { + twin_state_t save = twin_path_save (stroke); + twin_angle_t a = s * TWIN_ANGLE_90 / 15; + + twin_path_rotate (stroke, a); + twin_path_move (stroke, D(1), 0); + if (s % 5 == 0) + twin_path_draw (stroke, D(0.85), 0); + else + twin_path_draw (stroke, D(.98), 0); + twin_path_restore (stroke, &save); + } + twin_path_convolve (path, stroke, pen); + twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); + twin_fill_path (alpha, path); + + source.source_kind = TWIN_SOLID; + source.u.argb = 0xffff0000; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, + w, h); +#endif + +#if 0 + path = twin_path_create (); + stroke = twin_path_create (); + + twin_path_translate (stroke, D(100), D(100)); + twin_path_scale (stroke, D(10), D(10)); + twin_path_move (stroke, D(0), D(0)); + twin_path_draw (stroke, D(10), D(0)); + twin_path_convolve (path, stroke, pen); + + twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); + twin_fill_path (alpha, path); + + source.source_kind = TWIN_SOLID; + source.u.argb = 0xffff0000; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, + w, h); +#endif + +#if 1 + path = twin_path_create (); + + stroke = twin_path_create (); + + twin_path_move (stroke, D (10), D (40)); + twin_path_draw (stroke, D (40), D (40)); + twin_path_draw (stroke, D (10), D (10)); + twin_path_move (stroke, D (10), D (50)); + twin_path_draw (stroke, D (40), D (50)); + + twin_path_convolve (path, stroke, pen); + twin_path_destroy (stroke); + + twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); + twin_fill_path (alpha, path, 0, 0); + source.source_kind = TWIN_SOLID; + source.u.argb = 0xff00ff00; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, + 100, 100); + + twin_path_destroy (path); + + path = twin_path_create (); + stroke = twin_path_create (); + + twin_path_move (stroke, D (50), D (50)); + twin_path_curve (stroke, D (70), D (70), D (80), D (70), D (100), D (50)); + + twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); + twin_fill_path (alpha, stroke, 0, 0); + + source.source_kind = TWIN_SOLID; + source.u.argb = 0xffff0000; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, + 100, 100); + + twin_path_convolve (path, stroke, pen); + + twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); + twin_fill_path (alpha, path, 0, 0); + + source.source_kind = TWIN_SOLID; + source.u.argb = 0xff0000ff; + mask.source_kind = TWIN_PIXMAP; + mask.u.pixmap = alpha; + twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, + 100, 100); +#endif + + twin_window_show (redw); + twin_window_show (bluew); +#endif +} diff --git a/twin_demos/twin_demo.h b/twin_demos/twin_demo.h new file mode 100644 index 0000000..ee4d03c --- /dev/null +++ b/twin_demos/twin_demo.h @@ -0,0 +1,30 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _TWIN_DEMO_H_ +#define _TWIN_DEMO_H_ + +#include + +void +twin_demo_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); + +#endif /* _TWIN_DEMO_H_ */ diff --git a/twin_demos/twin_demoline.c b/twin_demos/twin_demoline.c new file mode 100644 index 0000000..245caa7 --- /dev/null +++ b/twin_demos/twin_demoline.c @@ -0,0 +1,154 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#define D(x) twin_double_to_fixed(x) + +#define TWIN_CLOCK_BACKGROUND 0xff3b80ae +#define TWIN_CLOCK_HOUR 0x80808080 +#define TWIN_CLOCK_HOUR_OUT 0x30000000 +#define TWIN_CLOCK_MINUTE 0x80808080 +#define TWIN_CLOCK_MINUTE_OUT 0x30000000 +#define TWIN_CLOCK_SECOND 0x80808080 +#define TWIN_CLOCK_SECOND_OUT 0x30000000 +#define TWIN_CLOCK_TIC 0xffbababa +#define TWIN_CLOCK_NUMBERS 0xffdedede +#define TWIN_CLOCK_WATER 0x60200000 +#define TWIN_CLOCK_WATER_OUT 0x40404040 +#define TWIN_CLOCK_WATER_UNDER 0x60400000 +#define TWIN_CLOCK_BORDER 0xffbababa +#define TWIN_CLOCK_BORDER_WIDTH D(0.01) + +#define _twin_demoline_pixmap(demoline) ((demoline)->widget.window->pixmap) + +void +_twin_demoline_paint (twin_demoline_t *demoline) +{ + twin_path_t *path; + + path = twin_path_create (); + twin_path_set_cap_style (path, demoline->cap_style); + twin_path_move (path, demoline->points[0].x, demoline->points[0].y); + twin_path_draw (path, demoline->points[1].x, demoline->points[1].y); + twin_paint_stroke (_twin_demoline_pixmap(demoline), 0xff000000, path, + demoline->line_width); + twin_path_set_cap_style (path, TwinCapButt); + twin_paint_stroke (_twin_demoline_pixmap(demoline), 0xffff0000, path, + twin_int_to_fixed (2)); + twin_path_destroy (path); +} + +static twin_dispatch_result_t +_twin_demoline_update_pos (twin_demoline_t *demoline, twin_event_t *event) +{ + if (demoline->which < 0) + return TwinDispatchContinue; + demoline->points[demoline->which].x = twin_int_to_fixed (event->u.pointer.x); + demoline->points[demoline->which].y = twin_int_to_fixed (event->u.pointer.y); + _twin_widget_queue_paint (&demoline->widget); + return TwinDispatchDone; +} + +#define twin_fixed_abs(f) ((f) < 0 ? -(f) : (f)) + +static int +_twin_demoline_hit (twin_demoline_t *demoline, twin_fixed_t x, twin_fixed_t y) +{ + int i; + + for (i = 0; i < 2; i++) + if (twin_fixed_abs (x - demoline->points[i].x) < demoline->line_width / 2 && + twin_fixed_abs (y - demoline->points[i].y) < demoline->line_width / 2) + return i; + return -1; +} + +twin_dispatch_result_t +_twin_demoline_dispatch (twin_widget_t *widget, twin_event_t *event) +{ + twin_demoline_t *demoline = (twin_demoline_t *) widget; + + if (_twin_widget_dispatch (widget, event) == TwinDispatchDone) + return TwinDispatchDone; + switch (event->kind) { + case TwinEventPaint: + _twin_demoline_paint (demoline); + break; + case TwinEventButtonDown: + demoline->which = _twin_demoline_hit (demoline, + twin_int_to_fixed (event->u.pointer.x), + twin_int_to_fixed (event->u.pointer.y)); + return _twin_demoline_update_pos (demoline, event); + break; + case TwinEventMotion: + return _twin_demoline_update_pos (demoline, event); + break; + case TwinEventButtonUp: + if (demoline->which < 0) + return TwinDispatchContinue; + _twin_demoline_update_pos (demoline, event); + demoline->which = -1; + return TwinDispatchDone; + break; + default: + break; + } + return TwinDispatchContinue; +} + +void +_twin_demoline_init (twin_demoline_t *demoline, + twin_box_t *parent, + twin_dispatch_proc_t dispatch) +{ + static const twin_widget_layout_t preferred = { 0, 0, 1, 1 }; + _twin_widget_init (&demoline->widget, parent, 0, preferred, dispatch); + twin_widget_set (&demoline->widget, 0xffffffff); + demoline->line_width = twin_int_to_fixed (30); + demoline->cap_style = TwinCapProjecting; + demoline->points[0].x = twin_int_to_fixed (50); + demoline->points[0].y = twin_int_to_fixed (50); + demoline->points[1].x = twin_int_to_fixed (100); + demoline->points[1].y = twin_int_to_fixed (100); +} + +twin_demoline_t * +twin_demoline_create (twin_box_t *parent) +{ + twin_demoline_t *demoline = malloc (sizeof (twin_demoline_t)); + + _twin_demoline_init(demoline, parent, _twin_demoline_dispatch); + return demoline; +} + +void +twin_demoline_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) +{ + twin_toplevel_t *toplevel = twin_toplevel_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h, name); + twin_demoline_t *demoline = twin_demoline_create (&toplevel->box); + (void) demoline; + twin_toplevel_show (toplevel); +} diff --git a/twin_demos/twin_demoline.h b/twin_demos/twin_demoline.h new file mode 100644 index 0000000..10dee67 --- /dev/null +++ b/twin_demos/twin_demoline.h @@ -0,0 +1,52 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _TWIN_DEMOLINE_H_ +#define _TWIN_DEMOLINE_H_ + +#include + +typedef struct _twin_demoline { + twin_widget_t widget; + twin_point_t points[2]; + int which; + twin_fixed_t line_width; + twin_cap_t cap_style; +} twin_demoline_t; + +void +_twin_demoline_paint (twin_demoline_t *demoline); + +twin_dispatch_result_t +_twin_demoline_dispatch (twin_widget_t *widget, twin_event_t *event); + +void +_twin_demoline_init (twin_demoline_t *demoline, + twin_box_t *parent, + twin_dispatch_proc_t dispatch); + +twin_demoline_t * +twin_demoline_create (twin_box_t *parent); + +void +twin_demoline_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); + +#endif /* _TWIN_DEMOLINE_H_ */ diff --git a/twin_demos/twin_demospline.c b/twin_demos/twin_demospline.c new file mode 100644 index 0000000..d425fab --- /dev/null +++ b/twin_demos/twin_demospline.c @@ -0,0 +1,166 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#define D(x) twin_double_to_fixed(x) + +#define _twin_demospline_pixmap(demospline) ((demospline)->widget.window->pixmap) + +void +_twin_demospline_paint (twin_demospline_t *demospline) +{ + twin_path_t *path; + int i; + + path = twin_path_create (); + twin_path_set_cap_style (path, demospline->cap_style); + twin_path_move (path, demospline->points[0].x, demospline->points[0].y); + twin_path_curve (path, + demospline->points[1].x, demospline->points[1].y, + demospline->points[2].x, demospline->points[2].y, + demospline->points[3].x, demospline->points[3].y); + twin_paint_stroke (_twin_demospline_pixmap(demospline), 0xff404040, path, + demospline->line_width); + twin_path_set_cap_style (path, TwinCapButt); + twin_paint_stroke (_twin_demospline_pixmap(demospline), 0xffffff00, path, + twin_int_to_fixed (2)); + + twin_path_empty (path); + twin_path_move (path, demospline->points[0].x, demospline->points[0].y); + twin_path_draw (path, demospline->points[1].x, demospline->points[1].y); + twin_paint_stroke (_twin_demospline_pixmap(demospline), 0xc08000c0, path, + twin_int_to_fixed (2)); + twin_path_empty (path); + twin_path_move (path, demospline->points[3].x, demospline->points[3].y); + twin_path_draw (path, demospline->points[2].x, demospline->points[2].y); + twin_paint_stroke (_twin_demospline_pixmap(demospline), 0xc08000c0, path, + twin_int_to_fixed (2)); + twin_path_empty (path); + for (i = 0; i < NPT; i++) + { + twin_path_empty (path); + twin_path_circle (path, demospline->points[i].x, demospline->points[i].y, + twin_int_to_fixed (10)); + twin_paint_path (_twin_demospline_pixmap(demospline), 0x40004020, path); + } + twin_path_destroy (path); +} + +static twin_dispatch_result_t +_twin_demospline_update_pos (twin_demospline_t *demospline, twin_event_t *event) +{ + if (demospline->which < 0) + return TwinDispatchContinue; + demospline->points[demospline->which].x = twin_int_to_fixed (event->u.pointer.x); + demospline->points[demospline->which].y = twin_int_to_fixed (event->u.pointer.y); + _twin_widget_queue_paint (&demospline->widget); + return TwinDispatchDone; +} + +#define twin_fixed_abs(f) ((f) < 0 ? -(f) : (f)) + +static int +_twin_demospline_hit (twin_demospline_t *demospline, twin_fixed_t x, twin_fixed_t y) +{ + int i; + + for (i = 0; i < NPT; i++) + if (twin_fixed_abs (x - demospline->points[i].x) < demospline->line_width / 2 && + twin_fixed_abs (y - demospline->points[i].y) < demospline->line_width / 2) + return i; + return -1; +} + +twin_dispatch_result_t +_twin_demospline_dispatch (twin_widget_t *widget, twin_event_t *event) +{ + twin_demospline_t *demospline = (twin_demospline_t *) widget; + + if (_twin_widget_dispatch (widget, event) == TwinDispatchDone) + return TwinDispatchDone; + switch (event->kind) { + case TwinEventPaint: + _twin_demospline_paint (demospline); + break; + case TwinEventButtonDown: + demospline->which = _twin_demospline_hit (demospline, + twin_int_to_fixed (event->u.pointer.x), + twin_int_to_fixed (event->u.pointer.y)); + return _twin_demospline_update_pos (demospline, event); + break; + case TwinEventMotion: + return _twin_demospline_update_pos (demospline, event); + break; + case TwinEventButtonUp: + if (demospline->which < 0) + return TwinDispatchContinue; + _twin_demospline_update_pos (demospline, event); + demospline->which = -1; + return TwinDispatchDone; + break; + default: + break; + } + return TwinDispatchContinue; +} + +void +_twin_demospline_init (twin_demospline_t *demospline, + twin_box_t *parent, + twin_dispatch_proc_t dispatch) +{ + static const twin_widget_layout_t preferred = { 0, 0, 1, 1 }; + _twin_widget_init (&demospline->widget, parent, 0, preferred, dispatch); + twin_widget_set (&demospline->widget, 0xffffffff); + demospline->line_width = twin_int_to_fixed (100); + demospline->cap_style = TwinCapButt; + demospline->points[0].x = twin_int_to_fixed (100); + demospline->points[0].y = twin_int_to_fixed (100); + demospline->points[1].x = twin_int_to_fixed (300); + demospline->points[1].y = twin_int_to_fixed (300); + demospline->points[2].x = twin_int_to_fixed (100); + demospline->points[2].y = twin_int_to_fixed (300); + demospline->points[3].x = twin_int_to_fixed (300); + demospline->points[3].y = twin_int_to_fixed (100); +} + +twin_demospline_t * +twin_demospline_create (twin_box_t *parent) +{ + twin_demospline_t *demospline = malloc (sizeof (twin_demospline_t)); + + _twin_demospline_init(demospline, parent, _twin_demospline_dispatch); + return demospline; +} + +void +twin_demospline_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) +{ + twin_toplevel_t *toplevel = twin_toplevel_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h, name); + twin_demospline_t *demospline = twin_demospline_create (&toplevel->box); + (void) demospline; + twin_toplevel_show (toplevel); +} diff --git a/twin_demos/twin_demospline.h b/twin_demos/twin_demospline.h new file mode 100644 index 0000000..8b72455 --- /dev/null +++ b/twin_demos/twin_demospline.h @@ -0,0 +1,54 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _TWIN_DEMOSPLINE_H_ +#define _TWIN_DEMOSPLINE_H_ + +#include + +#define NPT 4 + +typedef struct _twin_demospline { + twin_widget_t widget; + twin_point_t points[NPT]; + int which; + twin_fixed_t line_width; + twin_cap_t cap_style; +} twin_demospline_t; + +void +_twin_demospline_paint (twin_demospline_t *demospline); + +twin_dispatch_result_t +_twin_demospline_dispatch (twin_widget_t *widget, twin_event_t *event); + +void +_twin_demospline_init (twin_demospline_t *demospline, + twin_box_t *parent, + twin_dispatch_proc_t dispatch); + +twin_demospline_t * +twin_demospline_create (twin_box_t *parent); + +void +twin_demospline_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); + +#endif /* _TWIN_DEMOLINE_H_ */ diff --git a/twin_demos/twin_hello.c b/twin_demos/twin_hello.c new file mode 100644 index 0000000..09cff8d --- /dev/null +++ b/twin_demos/twin_hello.c @@ -0,0 +1,72 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "twin_hello.h" +#include +#include + +static twin_time_t +_twin_hello_timeout (twin_time_t now, void *closure) +{ + twin_label_t *labelb = closure; + time_t secs = time (0); + char *t = ctime(&secs); + + *strchr(t, '\n') = '\0'; + twin_label_set (labelb, t, + 0xff008000, + twin_int_to_fixed (12), + TWIN_TEXT_OBLIQUE); + return 1000; +} + +void +twin_hello_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) +{ + twin_toplevel_t *top = twin_toplevel_create (screen, + TWIN_ARGB32, + TwinWindowApplication, + x, y, w, h, name); + twin_label_t *labela = twin_label_create (&top->box, + name, + 0xff000080, + twin_int_to_fixed (12), + TWIN_TEXT_ROMAN); + twin_widget_t *widget = twin_widget_create (&top->box, + 0xff800000, + 1, 2, 0, 0); + twin_label_t *labelb = twin_label_create (&top->box, + name, + 0xff008000, + twin_int_to_fixed (12), + TWIN_TEXT_OBLIQUE); + twin_button_t *button = twin_button_create (&top->box, + "Button", + 0xff800000, + twin_int_to_fixed (18), + TWIN_TEXT_BOLD|TWIN_TEXT_OBLIQUE); + twin_widget_set (&labela->widget, 0xc0c0c0c0); + (void) widget; + twin_widget_set (&labelb->widget, 0xc0c0c0c0); + twin_widget_set (&button->label.widget, 0xc0808080); + twin_toplevel_show (top); + twin_set_timeout (_twin_hello_timeout, 1000, labelb); +} diff --git a/twin_demos/twin_hello.h b/twin_demos/twin_hello.h new file mode 100644 index 0000000..a4b92aa --- /dev/null +++ b/twin_demos/twin_hello.h @@ -0,0 +1,30 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _TWIN_HELLO_H_ +#define _TWIN_HELLO_H_ + +#include + +void +twin_hello_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); + +#endif /* _TWIN_HELLO_H_ */ diff --git a/twin_demos/twin_text.c b/twin_demos/twin_text.c new file mode 100644 index 0000000..93efdb4 --- /dev/null +++ b/twin_demos/twin_text.c @@ -0,0 +1,83 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#define D(x) twin_double_to_fixed(x) + +void +twin_text_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) +{ + twin_window_t *text = twin_window_create (screen, TWIN_ARGB32, + TwinWindowApplication, + x,y,w,h); + twin_fixed_t fx, fy; + static const char *lines[] = { + "Fourscore and seven years ago our fathers brought forth on", + "this continent a new nation, conceived in liberty and", + "dedicated to the proposition that all men are created equal.", + "", + "Now we are engaged in a great civil war, testing whether that", + "nation or any nation so conceived and so dedicated can long", + "endure. We are met on a great battlefield of that war. We", + "have come to dedicate a portion of it as a final resting", + "place for those who died here that the nation might live.", + "This we may, in all propriety do. But in a larger sense, we", + "cannot dedicate, we cannot consecrate, we cannot hallow this", + "ground. The brave men, living and dead who struggled here", + "have hallowed it far above our poor power to add or detract.", + "The world will little note nor long remember what we say here,", + "but it can never forget what they did here.", + "", + "It is rather for us the living, we here be dedicated to the", + "great task remaining before us--that from these honored", + "dead we take increased devotion to that cause for which they", + "here gave the last full measure of devotion--that we here", + "highly resolve that these dead shall not have died in vain, that", + "this nation shall have a new birth of freedom, and that", + "government of the people, by the people, for the people shall", + "not perish from the earth.", + 0 + }; + const char **l; + twin_path_t *path; + + twin_window_set_name(text, name); + path = twin_path_create (); +#define TEXT_SIZE 9 + twin_path_set_font_size (path, D(TEXT_SIZE)); + fx = D(3); + fy = D(10); + twin_fill (text->pixmap, 0xc0c0c0c0, TWIN_SOURCE, + 0, 0, + text->client.right - text->client.left, + text->client.bottom - text->client.top); + for (l = lines; *l; l++) + { + twin_path_move (path, fx, fy); + twin_path_utf8 (path, *l); + twin_paint_path (text->pixmap, 0xff000000, path); + twin_path_empty (path); + fy += D(TEXT_SIZE); + } + twin_window_show (text); +} + diff --git a/twin_demos/twin_text.h b/twin_demos/twin_text.h new file mode 100644 index 0000000..fe9c482 --- /dev/null +++ b/twin_demos/twin_text.h @@ -0,0 +1,30 @@ +/* + * Twin - A Tiny Window System + * Copyright © 2004 Keith Packard + * All rights reserved. + * + * This Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Twin Library; see the file COPYING. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _TWIN_TEXT_H_ +#define _TWIN_TEXT_H_ + +#include + +void +twin_text_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); + +#endif /* _TWIN_TEXT_H_ */ diff --git a/twin_demospline.c b/twin_demospline.c deleted file mode 100644 index d425fab..0000000 --- a/twin_demospline.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include - -#define D(x) twin_double_to_fixed(x) - -#define _twin_demospline_pixmap(demospline) ((demospline)->widget.window->pixmap) - -void -_twin_demospline_paint (twin_demospline_t *demospline) -{ - twin_path_t *path; - int i; - - path = twin_path_create (); - twin_path_set_cap_style (path, demospline->cap_style); - twin_path_move (path, demospline->points[0].x, demospline->points[0].y); - twin_path_curve (path, - demospline->points[1].x, demospline->points[1].y, - demospline->points[2].x, demospline->points[2].y, - demospline->points[3].x, demospline->points[3].y); - twin_paint_stroke (_twin_demospline_pixmap(demospline), 0xff404040, path, - demospline->line_width); - twin_path_set_cap_style (path, TwinCapButt); - twin_paint_stroke (_twin_demospline_pixmap(demospline), 0xffffff00, path, - twin_int_to_fixed (2)); - - twin_path_empty (path); - twin_path_move (path, demospline->points[0].x, demospline->points[0].y); - twin_path_draw (path, demospline->points[1].x, demospline->points[1].y); - twin_paint_stroke (_twin_demospline_pixmap(demospline), 0xc08000c0, path, - twin_int_to_fixed (2)); - twin_path_empty (path); - twin_path_move (path, demospline->points[3].x, demospline->points[3].y); - twin_path_draw (path, demospline->points[2].x, demospline->points[2].y); - twin_paint_stroke (_twin_demospline_pixmap(demospline), 0xc08000c0, path, - twin_int_to_fixed (2)); - twin_path_empty (path); - for (i = 0; i < NPT; i++) - { - twin_path_empty (path); - twin_path_circle (path, demospline->points[i].x, demospline->points[i].y, - twin_int_to_fixed (10)); - twin_paint_path (_twin_demospline_pixmap(demospline), 0x40004020, path); - } - twin_path_destroy (path); -} - -static twin_dispatch_result_t -_twin_demospline_update_pos (twin_demospline_t *demospline, twin_event_t *event) -{ - if (demospline->which < 0) - return TwinDispatchContinue; - demospline->points[demospline->which].x = twin_int_to_fixed (event->u.pointer.x); - demospline->points[demospline->which].y = twin_int_to_fixed (event->u.pointer.y); - _twin_widget_queue_paint (&demospline->widget); - return TwinDispatchDone; -} - -#define twin_fixed_abs(f) ((f) < 0 ? -(f) : (f)) - -static int -_twin_demospline_hit (twin_demospline_t *demospline, twin_fixed_t x, twin_fixed_t y) -{ - int i; - - for (i = 0; i < NPT; i++) - if (twin_fixed_abs (x - demospline->points[i].x) < demospline->line_width / 2 && - twin_fixed_abs (y - demospline->points[i].y) < demospline->line_width / 2) - return i; - return -1; -} - -twin_dispatch_result_t -_twin_demospline_dispatch (twin_widget_t *widget, twin_event_t *event) -{ - twin_demospline_t *demospline = (twin_demospline_t *) widget; - - if (_twin_widget_dispatch (widget, event) == TwinDispatchDone) - return TwinDispatchDone; - switch (event->kind) { - case TwinEventPaint: - _twin_demospline_paint (demospline); - break; - case TwinEventButtonDown: - demospline->which = _twin_demospline_hit (demospline, - twin_int_to_fixed (event->u.pointer.x), - twin_int_to_fixed (event->u.pointer.y)); - return _twin_demospline_update_pos (demospline, event); - break; - case TwinEventMotion: - return _twin_demospline_update_pos (demospline, event); - break; - case TwinEventButtonUp: - if (demospline->which < 0) - return TwinDispatchContinue; - _twin_demospline_update_pos (demospline, event); - demospline->which = -1; - return TwinDispatchDone; - break; - default: - break; - } - return TwinDispatchContinue; -} - -void -_twin_demospline_init (twin_demospline_t *demospline, - twin_box_t *parent, - twin_dispatch_proc_t dispatch) -{ - static const twin_widget_layout_t preferred = { 0, 0, 1, 1 }; - _twin_widget_init (&demospline->widget, parent, 0, preferred, dispatch); - twin_widget_set (&demospline->widget, 0xffffffff); - demospline->line_width = twin_int_to_fixed (100); - demospline->cap_style = TwinCapButt; - demospline->points[0].x = twin_int_to_fixed (100); - demospline->points[0].y = twin_int_to_fixed (100); - demospline->points[1].x = twin_int_to_fixed (300); - demospline->points[1].y = twin_int_to_fixed (300); - demospline->points[2].x = twin_int_to_fixed (100); - demospline->points[2].y = twin_int_to_fixed (300); - demospline->points[3].x = twin_int_to_fixed (300); - demospline->points[3].y = twin_int_to_fixed (100); -} - -twin_demospline_t * -twin_demospline_create (twin_box_t *parent) -{ - twin_demospline_t *demospline = malloc (sizeof (twin_demospline_t)); - - _twin_demospline_init(demospline, parent, _twin_demospline_dispatch); - return demospline; -} - -void -twin_demospline_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) -{ - twin_toplevel_t *toplevel = twin_toplevel_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h, name); - twin_demospline_t *demospline = twin_demospline_create (&toplevel->box); - (void) demospline; - twin_toplevel_show (toplevel); -} diff --git a/twin_demospline.h b/twin_demospline.h deleted file mode 100644 index 8b72455..0000000 --- a/twin_demospline.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef _TWIN_DEMOSPLINE_H_ -#define _TWIN_DEMOSPLINE_H_ - -#include - -#define NPT 4 - -typedef struct _twin_demospline { - twin_widget_t widget; - twin_point_t points[NPT]; - int which; - twin_fixed_t line_width; - twin_cap_t cap_style; -} twin_demospline_t; - -void -_twin_demospline_paint (twin_demospline_t *demospline); - -twin_dispatch_result_t -_twin_demospline_dispatch (twin_widget_t *widget, twin_event_t *event); - -void -_twin_demospline_init (twin_demospline_t *demospline, - twin_box_t *parent, - twin_dispatch_proc_t dispatch); - -twin_demospline_t * -twin_demospline_create (twin_box_t *parent); - -void -twin_demospline_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); - -#endif /* _TWIN_DEMOLINE_H_ */ diff --git a/twin_hello.c b/twin_hello.c deleted file mode 100644 index 09cff8d..0000000 --- a/twin_hello.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "twin_hello.h" -#include -#include - -static twin_time_t -_twin_hello_timeout (twin_time_t now, void *closure) -{ - twin_label_t *labelb = closure; - time_t secs = time (0); - char *t = ctime(&secs); - - *strchr(t, '\n') = '\0'; - twin_label_set (labelb, t, - 0xff008000, - twin_int_to_fixed (12), - TWIN_TEXT_OBLIQUE); - return 1000; -} - -void -twin_hello_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) -{ - twin_toplevel_t *top = twin_toplevel_create (screen, - TWIN_ARGB32, - TwinWindowApplication, - x, y, w, h, name); - twin_label_t *labela = twin_label_create (&top->box, - name, - 0xff000080, - twin_int_to_fixed (12), - TWIN_TEXT_ROMAN); - twin_widget_t *widget = twin_widget_create (&top->box, - 0xff800000, - 1, 2, 0, 0); - twin_label_t *labelb = twin_label_create (&top->box, - name, - 0xff008000, - twin_int_to_fixed (12), - TWIN_TEXT_OBLIQUE); - twin_button_t *button = twin_button_create (&top->box, - "Button", - 0xff800000, - twin_int_to_fixed (18), - TWIN_TEXT_BOLD|TWIN_TEXT_OBLIQUE); - twin_widget_set (&labela->widget, 0xc0c0c0c0); - (void) widget; - twin_widget_set (&labelb->widget, 0xc0c0c0c0); - twin_widget_set (&button->label.widget, 0xc0808080); - twin_toplevel_show (top); - twin_set_timeout (_twin_hello_timeout, 1000, labelb); -} diff --git a/twin_hello.h b/twin_hello.h deleted file mode 100644 index a4b92aa..0000000 --- a/twin_hello.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef _TWIN_HELLO_H_ -#define _TWIN_HELLO_H_ - -#include - -void -twin_hello_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); - -#endif /* _TWIN_HELLO_H_ */ diff --git a/twin_text.c b/twin_text.c deleted file mode 100644 index 93efdb4..0000000 --- a/twin_text.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include - -#define D(x) twin_double_to_fixed(x) - -void -twin_text_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) -{ - twin_window_t *text = twin_window_create (screen, TWIN_ARGB32, - TwinWindowApplication, - x,y,w,h); - twin_fixed_t fx, fy; - static const char *lines[] = { - "Fourscore and seven years ago our fathers brought forth on", - "this continent a new nation, conceived in liberty and", - "dedicated to the proposition that all men are created equal.", - "", - "Now we are engaged in a great civil war, testing whether that", - "nation or any nation so conceived and so dedicated can long", - "endure. We are met on a great battlefield of that war. We", - "have come to dedicate a portion of it as a final resting", - "place for those who died here that the nation might live.", - "This we may, in all propriety do. But in a larger sense, we", - "cannot dedicate, we cannot consecrate, we cannot hallow this", - "ground. The brave men, living and dead who struggled here", - "have hallowed it far above our poor power to add or detract.", - "The world will little note nor long remember what we say here,", - "but it can never forget what they did here.", - "", - "It is rather for us the living, we here be dedicated to the", - "great task remaining before us--that from these honored", - "dead we take increased devotion to that cause for which they", - "here gave the last full measure of devotion--that we here", - "highly resolve that these dead shall not have died in vain, that", - "this nation shall have a new birth of freedom, and that", - "government of the people, by the people, for the people shall", - "not perish from the earth.", - 0 - }; - const char **l; - twin_path_t *path; - - twin_window_set_name(text, name); - path = twin_path_create (); -#define TEXT_SIZE 9 - twin_path_set_font_size (path, D(TEXT_SIZE)); - fx = D(3); - fy = D(10); - twin_fill (text->pixmap, 0xc0c0c0c0, TWIN_SOURCE, - 0, 0, - text->client.right - text->client.left, - text->client.bottom - text->client.top); - for (l = lines; *l; l++) - { - twin_path_move (path, fx, fy); - twin_path_utf8 (path, *l); - twin_paint_path (text->pixmap, 0xff000000, path); - twin_path_empty (path); - fy += D(TEXT_SIZE); - } - twin_window_show (text); -} - diff --git a/twin_text.h b/twin_text.h deleted file mode 100644 index fe9c482..0000000 --- a/twin_text.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Twin - A Tiny Window System - * Copyright © 2004 Keith Packard - * All rights reserved. - * - * This Library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with the Twin Library; see the file COPYING. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef _TWIN_TEXT_H_ -#define _TWIN_TEXT_H_ - -#include - -void -twin_text_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h); - -#endif /* _TWIN_TEXT_H_ */ -- cgit v1.2.3