📄 screenhack.c
字号:
break; default: break; case ClientMessage: { if (event->xclient.message_type != XA_WM_PROTOCOLS) { char *s = XGetAtomName(dpy, event->xclient.message_type); if (!s) s = "(null)"; fprintf (stderr, "%s: unknown ClientMessage %s received!\n", progname, s); } else if (event->xclient.data.l[0] != (int)XA_WM_DELETE_WINDOW) { char *s1 = XGetAtomName(dpy, event->xclient.message_type); char *s2 = XGetAtomName(dpy, event->xclient.data.l[0]); if (!s1) s1 = "(null)"; if (!s2) s2 = "(null)"; fprintf (stderr, "%s: unknown ClientMessage %s[%s] received!\n", progname, s1, s2); } else { exit (0); } } break; } return key;}int screenhack_handle_events(bool *release, bool *repeat){ int key=0; if(XPending(dpy)) { XEvent event; XNextEvent(dpy, &event); key=screenhack_handle_event(dpy, &event, release, repeat); } return key;}static Visual *pick_visual (Screen *screen){#ifdef USE_GL /* If we're linking against GL (that is, this is the version of screenhack.o that the GL hacks will use, which is different from the one that the non-GL hacks will use) then try to pick the "best" visual by interrogating the GL library instead of by asking Xlib. GL knows better. */ Visual *v = 0; char *string = get_string_resource ("visualID", "VisualID"); char *s; if (string) for (s = string; *s; s++) if (isupper (*s)) *s = _tolower (*s); if (!string || !*string || !strcmp (string, "gl") || !strcmp (string, "best") || !strcmp (string, "color") || !strcmp (string, "default")) v = get_gl_visual (screen); /* from ../utils/visual-gl.c */ if (string) free (string); if (v) return v;#endif /* USE_GL */ return get_visual_resource (screen, "visualID", "VisualID", False);}int main (int argc, char **argv){ Widget toplevel; Display *dpy; Window window; Screen *screen; Visual *visual; Colormap cmap; XEvent event; char version[255]; sprintf(version,"rockboxui %s",ROCKBOXUI_VERSION);#ifdef HAVE_LCD_BITMAP display_zoom=2; { char *env=getenv("RECORDER_ZOOM"); if (env) { display_zoom=atoi(env); } }#else display_zoom=1; { char *env=getenv("PLAYER_ZOOM"); if (env) { display_zoom=atoi(env); } }#endif if (argc > 1) { int x; for (x=1; x<argc; x++) { if (!strcmp("--old_lcd", argv[x])) { having_new_lcd=FALSE; printf("Using old LCD layout.\n"); } else if (!strcmp("--recorder_zoom", argv[x])) { x++;#ifdef HAVE_LCD_BITMAP display_zoom=atoi(argv[x]); printf("Window zoom is %d\n", display_zoom);#endif } else if (!strcmp("--player_zoom", argv[x])) { x++;#ifndef HAVE_LCD_BITMAP display_zoom=atoi(argv[x]); printf("Window zoom is %d\n", display_zoom);#endif } else { printf("rockboxui\n"); printf("Arguments:\n"); printf(" --old_lcd \t [Player] simulate old playermodel (ROM version<4.51)\n"); printf(" --player_zoom \t [Player] window zoom\n"); printf(" --recorder_zoom \t [Recorder] window zoom\n"); printf(KEYBOARD_GENERIC KEYBOARD_SPECIFIC); exit(0); } } } { static char geometry[40];#ifdef HAVE_LCD_BITMAP snprintf(geometry, 40, "*geometry: %dx%d", 120*display_zoom, 68*display_zoom);#else snprintf(geometry, 40, "*geometry: %dx%d", 280*display_zoom, 132*display_zoom);#endif default_defaults[GEOMETRY_POSITION]=geometry; } printf(KEYBOARD_GENERIC KEYBOARD_SPECIFIC); merge_options ();#ifdef __sgi /* We have to do this on SGI to prevent the background color from being overridden by the current desktop color scheme (we'd like our backgrounds to be black, thanks.) This should be the same as setting the "*useSchemes: none" resource, but it's not -- if that resource is present in the `default_defaults' above, it doesn't work, though it does work when passed as an -xrm arg on the command line. So screw it, turn them off from C instead. */ SgiUseSchemes ("none"); #endif /* __sgi */ toplevel = XtAppInitialize (&app, progclass, merged_options, merged_options_size, &argc, argv, merged_defaults, 0, 0); dpy = XtDisplay (toplevel); screen = XtScreen (toplevel); db = XtDatabase (dpy); XtGetApplicationNameAndClass (dpy, &progname, &progclass); /* half-assed way of avoiding buffer-overrun attacks. */ if (strlen (progname) >= 100) progname[100] = 0; XSetErrorHandler (screenhack_ehandler); XA_WM_PROTOCOLS = XInternAtom (dpy, "WM_PROTOCOLS", False); XA_WM_DELETE_WINDOW = XInternAtom (dpy, "WM_DELETE_WINDOW", False); if (CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2) mono_p = True; { Boolean def_visual_p; visual = pick_visual (screen); if (toplevel->core.width <= 0) toplevel->core.width = 600; if (toplevel->core.height <= 0) toplevel->core.height = 480; def_visual_p = (visual == DefaultVisualOfScreen (screen)); if (!def_visual_p) { unsigned int bg, bd; Widget new; cmap = XCreateColormap (dpy, RootWindowOfScreen(screen), visual, AllocNone); bg = get_pixel_resource ("background", "Background", dpy, cmap); bd = get_pixel_resource ("borderColor", "Foreground", dpy, cmap); new = XtVaAppCreateShell (progname, progclass, topLevelShellWidgetClass, dpy, XtNmappedWhenManaged, False, XtNvisual, visual, XtNdepth, visual_depth (screen, visual), XtNwidth, toplevel->core.width, XtNheight, toplevel->core.height, XtNcolormap, cmap, XtNbackground, (Pixel) bg, XtNborderColor, (Pixel) bd, XtNinput, True, /* for WM_HINTS */ 0); XtDestroyWidget (toplevel); toplevel = new; XtRealizeWidget (toplevel); window = XtWindow (toplevel); } else { XtVaSetValues (toplevel, XtNmappedWhenManaged, False, XtNinput, True, /* for WM_HINTS */ 0); XtRealizeWidget (toplevel); window = XtWindow (toplevel); if (get_boolean_resource ("installColormap", "InstallColormap")) { cmap = XCreateColormap (dpy, window, DefaultVisualOfScreen (XtScreen (toplevel)), AllocNone); XSetWindowColormap (dpy, window, cmap); } else { cmap = DefaultColormap (dpy, DefaultScreen (dpy)); } } XtPopup (toplevel, XtGrabNone); XtVaSetValues(toplevel, XtNtitle, version, 0); /* For screenhack_handle_events(): select KeyPress, and announce that we accept WM_DELETE_WINDOW. */ { XWindowAttributes xgwa; XGetWindowAttributes (dpy, window, &xgwa); XSelectInput (dpy, window, xgwa.your_event_mask | KeyPressMask | KeyRelease | ButtonPressMask | ExposureMask); XChangeProperty (dpy, window, XA_WM_PROTOCOLS, XA_ATOM, 32, PropModeReplace, (unsigned char *) &XA_WM_DELETE_WINDOW, 1); } } XSetWindowBackground (dpy, window, get_pixel_resource ("background", "Background", dpy, cmap)); XClearWindow (dpy, window); /* wait for it to be mapped */ XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window); XSync (dpy, False); screenhack (dpy, window); /* doesn't return */ return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -