X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fgltext.c;h=3dd7922489892af444c8bb1a72e88083ed5f9999;hb=2d04c4f22466851aedb6ed0f2919d148f726b889;hp=bb3e9db3a9268fa5da7fc066a80002c0c6f4f9f6;hpb=2c902d6065f9856adf31e8540a94f1e42e68e905;p=xscreensaver diff --git a/hacks/glx/gltext.c b/hacks/glx/gltext.c index bb3e9db3..3dd79224 100644 --- a/hacks/glx/gltext.c +++ b/hacks/glx/gltext.c @@ -1,4 +1,4 @@ -/* gltext, Copyright (c) 2001, 2002 Jamie Zawinski +/* gltext, Copyright (c) 2001-2005 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -25,7 +25,7 @@ extern XtAppContext app; #define DEF_SPIN "XYZ" #define DEF_WANDER "True" -#define DEFAULTS "*delay: 10000 \n" \ +#define DEFAULTS "*delay: 20000 \n" \ "*showFPS: False \n" \ "*wireframe: False \n" \ "*spin: " DEF_SPIN "\n" \ @@ -54,6 +54,10 @@ extern XtAppContext app; #include #include +#ifdef HAVE_LOCALE_H +# include +#endif /* HAVE_LOCALE_H */ + #ifdef USE_GL /* whole file */ #ifdef HAVE_UNAME @@ -98,9 +102,9 @@ static XrmOptionDescRec opts[] = { }; static argtype vars[] = { - {(caddr_t *) &text_fmt, "text", "Text", DEF_TEXT, t_String}, - {(caddr_t *) &do_spin, "spin", "Spin", DEF_SPIN, t_String}, - {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool}, + {&text_fmt, "text", "Text", DEF_TEXT, t_String}, + {&do_spin, "spin", "Spin", DEF_SPIN, t_String}, + {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool}, }; ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL}; @@ -152,6 +156,32 @@ gl_init (ModeInfo *mi) } +/* The GLUT font only has ASCII characters in them, so do what we can to + convert Latin1 characters to the nearest ASCII equivalent... + */ +static void +latin1_to_ascii (char *s) +{ + unsigned char *us = (unsigned char *) s; + const unsigned char ascii[95] = { + '!', 'C', '#', '#', 'Y', '|', 'S', '_', 'C', '?', '<', '=', '-', 'R', '_', + '?', '?', '2', '3', '\'','u', 'P', '.', ',', '1', 'o', '>', '?', '?', '?', + '?', 'A', 'A', 'A', 'A', 'A', 'A', 'E', 'C', 'E', 'E', 'E', 'E', 'I', 'I', + 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'x', '0', 'U', 'U', 'U', 'U', + 'Y', 'p', 'S', 'a', 'a', 'a', 'a', 'a', 'a', 'e', 'c', 'e', 'e', 'e', 'e', + 'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 'o', '/', 'o', 'u', 'u', + 'u', 'u', 'y', 'p', 'y' }; + while (*us) + { + if (*us >= 161) + *us = ascii[*us - 161]; + else if (*us > 127) + *us = '?'; + us++; + } +} + + static void parse_text (ModeInfo *mi) { @@ -211,6 +241,8 @@ parse_text (ModeInfo *mi) if (!*tp->text) sprintf (tp->text, "strftime error:\n%s", text_fmt); } + + latin1_to_ascii (tp->text); } @@ -220,7 +252,7 @@ text_handle_event (ModeInfo *mi, XEvent *event) text_configuration *tp = &tps[MI_SCREEN(mi)]; if (event->xany.type == ButtonPress && - event->xbutton.button & Button1) + event->xbutton.button == Button1) { tp->button_down_p = True; gltrackball_start (tp->trackball, @@ -229,11 +261,19 @@ text_handle_event (ModeInfo *mi, XEvent *event) return True; } else if (event->xany.type == ButtonRelease && - event->xbutton.button & Button1) + event->xbutton.button == Button1) { tp->button_down_p = False; return True; } + else if (event->xany.type == ButtonPress && + (event->xbutton.button == Button4 || + event->xbutton.button == Button5)) + { + gltrackball_mousewheel (tp->trackball, event->xbutton.button, 10, + !!event->xbutton.state); + return True; + } else if (event->xany.type == MotionNotify && tp->button_down_p) { @@ -253,6 +293,10 @@ init_text (ModeInfo *mi) text_configuration *tp; int i; +# ifdef HAVE_SETLOCALE + setlocale (LC_TIME, ""); /* for strftime() calls */ +# endif + if (!tps) { tps = (text_configuration *) calloc (MI_NUM_SCREENS(mi), sizeof (text_configuration)); @@ -273,9 +317,9 @@ init_text (ModeInfo *mi) { Bool spinx=False, spiny=False, spinz=False; - double spin_speed = 1.0; - double wander_speed = 0.05; - double spin_accel = 1.0; + double spin_speed = 0.5; + double wander_speed = 0.02; + double spin_accel = 0.5; char *s = do_spin; while (*s) @@ -355,12 +399,12 @@ fill_character (GLUTstrokeFont font, int c, Bool wire) coord->x, coord->y, 0, tube_width, tube_width * 0.15, - TUBE_FACES, smooth, wire); + TUBE_FACES, smooth, True, wire); lx = coord->x; ly = coord->y; } } - return (int) (ch->right + tube_width/2); + return (int) (ch->right + tube_width); } return 0; } @@ -389,9 +433,9 @@ text_extents (const char *string, int *wP, int *hP) if (w > *wP) *wP = w; *hP += line_height; - s++; lines++; if (*s == 0) break; + s++; } else s++;