📄 screenhack.c
字号:
/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998 * Jamie Zawinski <jwz@jwz.org> * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. No representations are made about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * And remember: X Windows is to graphics hacking as roman numerals are to * the square root of pi. *//* This file contains simple code to open a window or draw on the root. The idea being that, when writing a graphics hack, you can just link with this .o to get all of the uninteresting junk out of the way. - create a procedure `screenhack(dpy, window)' - create a variable `char *progclass' which names this program's resource class. - create a variable `char defaults []' for the default resources, and null-terminate it. - create a variable `XrmOptionDescRec options[]' for the command-line, and null-terminate it. And that's it... */#include <stdio.h>#include <X11/Intrinsic.h>#include <X11/IntrinsicP.h>#include <X11/CoreP.h>#include <X11/Shell.h>#include <X11/StringDefs.h>#include <X11/Xutil.h>#include <X11/keysym.h>#ifdef __sgi# include <X11/SGIScheme.h> /* for SgiUseSchemes() */#endif /* __sgi */#ifdef HAVE_XMU# ifndef VMS# include <X11/Xmu/Error.h># else /* VMS */# include <Xmu/Error.h># endif#else# include "xmu.h"#endif#include "screenhack.h"#include "version.h"#include "vroot.h"#include "debug.h"#ifndef isupper# define isupper(c) ((c) >= 'A' && (c) <= 'Z')#endif#ifndef _tolower# define _tolower(c) ((c) - 'A' + 'a')#endif#define KEYBOARD_GENERIC \ "Keyboard Rockbox\n" \ "-------- --------------\n" \ "+ ON\n" \ "8 UP\n" \ "2 DOWN\n" \ "4 LEFT\n" \#ifdef HAVE_LCD_BITMAP#define KEYBOARD_SPECIFIC \ "6 RIGHT\n" \ "Enter OFF\n" \ "5 PLAY\n" \ "/ F1\n" \ "* F2\n" \ "- F3\n"#else #define KEYBOARD_SPECIFIC \ "6 RIGHT/PLAY (there's no separation between PLAY and RIGHT)\n" \ "Enter MENU\n"#endif char having_new_lcd=True;char *progname;XrmDatabase db;XtAppContext app;Bool mono_p;static XrmOptionDescRec default_options [] = { { "-root", ".root", XrmoptionNoArg, "True" }, { "-window", ".root", XrmoptionNoArg, "False" }, { "-mono", ".mono", XrmoptionNoArg, "True" }, { "-install", ".installColormap", XrmoptionNoArg, "True" }, { "-noinstall",".installColormap", XrmoptionNoArg, "False" }, { "-visual", ".visualID", XrmoptionSepArg, 0 }, { "-window-id", ".windowID", XrmoptionSepArg, 0 }, { 0, 0, 0, 0 }};static char *default_defaults[] = { ".root: false",#define GEOMETRY_POSITION 1 "*geometry: "#ifdef HAVE_LCD_BITMAP "120x68"#else "280x132" /* A bit larger that necessary */#endif , /* this should be .geometry, but nooooo... */ "*mono: false", "*installColormap: false", "*visualID: default", "*windowID: ", 0};extern Display* dpy;extern int display_zoom;static XrmOptionDescRec *merged_options;static int merged_options_size;static char **merged_defaults;static void merge_options (void){ int def_opts_size, opts_size; int def_defaults_size, defaults_size; for (def_opts_size = 0; default_options[def_opts_size].option; def_opts_size++) ; for (opts_size = 0; options[opts_size].option; opts_size++) ; merged_options_size = def_opts_size + opts_size; merged_options = (XrmOptionDescRec *) malloc ((merged_options_size + 1) * sizeof(*default_options)); memcpy (merged_options, default_options, (def_opts_size * sizeof(*default_options))); memcpy (merged_options + def_opts_size, options, ((opts_size + 1) * sizeof(*default_options))); for (def_defaults_size = 0; default_defaults[def_defaults_size]; def_defaults_size++) ; for (defaults_size = 0; defaults[defaults_size]; defaults_size++) ; merged_defaults = (char **) malloc ((def_defaults_size + defaults_size + 1) * sizeof (*defaults)); memcpy (merged_defaults, default_defaults, def_defaults_size * sizeof(*defaults)); memcpy (merged_defaults + def_defaults_size, defaults, (defaults_size + 1) * sizeof(*defaults)); /* This totally sucks. Xt should behave like this by default. If the string in `defaults' looks like ".foo", change that to "Progclass.foo". */ { char **s; for (s = merged_defaults; *s; s++) if (**s == '.') { const char *oldr = *s; char *newr = (char *) malloc(strlen(oldr) + strlen(progclass) + 3); strcpy (newr, progclass); strcat (newr, oldr); *s = newr; } }}/* Make the X errors print out the name of this program, so we have some clue which one has a bug when they die under the screensaver. */static int screenhack_ehandler (Display *dpy, XErrorEvent *error){ fprintf (stderr, "\nX error in %s:\n", progname); if (XmuPrintDefaultErrorMessage (dpy, error, stderr)) exit (-1); else fprintf (stderr, " (nonfatal.)\n"); return 0;}static Bool MapNotify_event_p (Display *dpy, XEvent *event, XPointer window){ (void)dpy; return (event->xany.type == MapNotify && event->xvisibility.window == (Window) window);}static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW;static Bool checkrepeat(time_t prev, time_t now){ if(now-prev < 50) { DEBUGF("Consider this a button repeat\n"); return true; } return false;}/* Dead-trivial event handling. Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received. */int screenhack_handle_event(Display *dpy, XEvent *event, bool *release, bool *repeat){ int key=0; static time_t lasttime; static unsigned int lastkeycode; *release = FALSE; *repeat = false; switch (event->xany.type) { case KeyPress: { KeySym keysym; unsigned char c = 0; XLookupString (&event->xkey, &c, 1, &keysym, 0); key = keysym;#if 0 DEBUGF("Got keypress: %02x %x, time %lx\n", c, event->xkey.keycode, event->xkey.time);#endif if(lastkeycode == event->xkey.keycode) *repeat = checkrepeat(lasttime, event->xkey.time); lasttime = event->xkey.time; lastkeycode = event->xkey.keycode; } break; case KeyRelease: { KeySym keysym; unsigned char c = 0; XLookupString (&event->xkey, &c, 1, &keysym, 0); key = keysym;#if 0 DEBUGF("Got keyrelease: %c (%02x) %x\n", c, c, event->xkey.keycode);#endif if(lastkeycode == event->xkey.keycode) *repeat = checkrepeat(lasttime, event->xkey.time); lasttime = event->xkey.time; lastkeycode = event->xkey.keycode; if(*repeat) return 0; /* on repeats, return nothing on release */ *release = TRUE; } break; case Expose: { screen_redraw(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -