--- uae/src/xwin.c 2018/04/24 16:44:42 1.1.1.6 +++ uae/src/xwin.c 2018/04/24 17:00:00 1.1.1.13 @@ -29,7 +29,6 @@ #include "xwin.h" #include "custom.h" #include "drawing.h" -#include "readcpu.h" #include "newcpu.h" #include "keyboard.h" #include "keybuf.h" @@ -65,7 +64,7 @@ #define DO_PUTIMAGE(IMG, SRCX, SRCY, DSTX, DSTY, WIDTH, HEIGHT) \ do { \ - if (currprefs.x11_use_mitshm) \ + if (currprefs.x11_use_mitshm && shmavail) \ XShmPutImage (display, mywin, mygc, (IMG), (SRCX), (SRCY), (DSTX), (DSTY), (WIDTH), (HEIGHT), 0); \ else \ XPutImage (display, mywin, mygc, (IMG), (SRCX), (SRCY), (DSTX), (DSTY), (WIDTH), (HEIGHT)); \ @@ -115,6 +114,7 @@ struct disp_info { static Display *display; static int screen; static Window rootwin, mywin; +static Atom delete_win; static GC mygc; static XColor black, white; @@ -170,7 +170,7 @@ static void handle_inhibit (void); static void framerate_up (void); static void framerate_down (void); - +static void handle_interpol (void); static struct uae_hotkeys hotkeys[] = { #ifdef USE_DGA_EXTENSION {{ XK_F12, XK_s, 0 }, handle_modeswitch, -1, 0 }, @@ -179,6 +179,7 @@ static struct uae_hotkeys hotkeys[] = { {{ XK_F12, XK_m, 0 }, togglemouse, -1, 0 }, {{ XK_F12, XK_g, 0 }, handle_mousegrab, -1, 0 }, {{ XK_F12, XK_i, 0 }, handle_inhibit, -1, 0 }, + {{ XK_F12, XK_p, 0 }, handle_interpol, -1, 0 }, {{ XK_F12, XK_KP_Add, 0 }, framerate_up, -1, 0 }, {{ XK_F12, XK_KP_Subtract, 0 }, framerate_down, -1, 0 }, {{ XK_Scroll_Lock, 0 }, handle_inhibit, -1, 0 }, @@ -442,12 +443,12 @@ void flush_screen (int ystart, int ystop return; #if SHM_SUPPORT_LINKS == 1 - if (currprefs.x11_use_mitshm) + if (currprefs.x11_use_mitshm && shmavail) XSync (display, 0); #endif } -static __inline__ int bitsInMask (unsigned long mask) +STATIC_INLINE int bitsInMask (unsigned long mask) { /* count bits in mask */ int n = 0; @@ -458,7 +459,7 @@ static __inline__ int bitsInMask (unsign return n; } -static __inline__ int maskShift (unsigned long mask) +STATIC_INLINE int maskShift (unsigned long mask) { /* determine how far mask is shifted */ int n = 0; @@ -717,6 +718,8 @@ static void graphics_subinit (void) { int i, j; XSetWindowAttributes wattr; + XClassHint classhint; + XWMHints *hints; unsigned long valuemask; dgamode = screen_is_picasso ? currprefs.gfx_pfullscreen : currprefs.gfx_afullscreen; @@ -739,11 +742,29 @@ static void graphics_subinit (void) wattr.event_mask = EVENTMASK; XSync (display, 0); + delete_win = XInternAtom(display, "WM_DELETE_WINDOW", False); mywin = XCreateWindow (display, rootwin, 0, 0, current_width, current_height, 0, bitdepth, InputOutput, vis, valuemask, &wattr); + XSetWMProtocols (display, mywin, &delete_win, 1); XSync (display, 0); XStoreName (display, mywin, "UAE"); + XSetIconName (display, mywin, "UAE Screen"); + + /* set class hint */ + classhint.res_name = "UAE"; + classhint.res_class = "UAEScreen"; + XSetClassHint(display, mywin, &classhint); + + hints = XAllocWMHints(); + /* Set window group leader to self to become an application + * that can be hidden by e.g. WindowMaker. + * Would be more useful if we could find out what the + * (optional) GTK+ window ID is :-/ */ + hints->window_group = mywin; + hints->flags = WindowGroupHint; + XSetWMHints(display, mywin, hints); + XMapRaised (display, mywin); XSync (display, 0); mygc = XCreateGC (display, mywin, 0, 0); @@ -1076,7 +1097,11 @@ static int kc_decode (KeySym ks) case XK_Left: return AK_LF; case XK_Right: return AK_RT; +#if 0 case XK_F11: return AK_BACKSLASH; +#else + case XK_F11: frametime = 0; timeframes = 0; bogusframe = 1; break; +#endif #ifdef XK_Page_Up /* These are missing occasionally */ case XK_Page_Up: return AK_RAMI; /* PgUp mapped to right amiga */ case XK_Page_Down: return AK_LAMI; /* PgDn mapped to left amiga */ @@ -1189,6 +1214,35 @@ static int decode_de (KeySym ks) return -1; } +static int decode_dk (KeySym ks) +{ + switch(ks) { + /* DK specific */ + case XK_A: case XK_a: return AK_A; + case XK_M: case XK_m: return AK_M; + case XK_Q: case XK_q: return AK_Q; + case XK_W: case XK_w: return AK_W; + case XK_Y: case XK_y: return AK_Y; + case XK_Z: case XK_z: return AK_Z; + case XK_AE: case XK_ae: return AK_SEMICOLON; + case XK_Ooblique: case XK_oslash: return AK_QUOTE; + case XK_Aring: case XK_aring: return AK_LBRACKET; + case XK_apostrophe: case XK_asterisk: return AK_NUMBERSIGN; + case XK_dead_diaeresis: case XK_dead_circumflex: return AK_RBRACKET; + case XK_dead_acute: case XK_dead_grave: return AK_BACKSLASH; + case XK_onehalf: case XK_section: return AK_BACKQUOTE; + case XK_comma: return AK_COMMA; + case XK_period: return AK_PERIOD; + case XK_less: case XK_greater: return AK_LTGT; + case XK_numbersign: return AK_NUMBERSIGN; + case XK_plus: return AK_MINUS; + case XK_asciicircum: return AK_BACKQUOTE; + case XK_minus: return AK_SLASH; + } + + return -1; +} + static int decode_se (KeySym ks) { switch(ks) { @@ -1323,6 +1377,10 @@ static int keycode2amiga (XKeyEvent *eve as = decode_de (ks); break; + case KBD_LANG_DK: + as = decode_dk (ks); + break; + case KBD_LANG_SE: as = decode_se (ks); break; @@ -1411,7 +1469,7 @@ void handle_events (void) lastmy += ((XMotionEvent *)&event)->y_root; } else if (grabbed) { int realmove = 0; - int tx, ty; + int tx, ty,ttx,tty; tx = ((XMotionEvent *)&event)->x; ty = ((XMotionEvent *)&event)->y; @@ -1428,17 +1486,20 @@ void handle_events (void) { #undef ABS XEvent event; - tx = current_width / 2; - ty = current_height / 2; + ttx = current_width / 2; + tty = current_height / 2; event.type = MotionNotify; event.xmotion.display = display; event.xmotion.window = mywin; - event.xmotion.x = tx; - event.xmotion.y = ty; + event.xmotion.x = ttx; + event.xmotion.y = tty; XSendEvent (display, mywin, False, PointerMotionMask, &event); - XWarpPointer (display, None, mywin, 0, 0, 0, 0, tx, ty); + XWarpPointer (display, None, mywin, 0, 0, 0, 0, ttx, tty); } + } else { + tx=event.xmotion.x; + ty=event.xmotion.y; } oldx = tx; oldy = ty; @@ -1485,6 +1546,11 @@ void handle_events (void) case Expose: refresh_necessary = 1; break; + case ClientMessage: + if (event.xclient.data.l[0]==delete_win) { + uae_quit (); + } + break; } } @@ -1572,6 +1638,9 @@ int check_prefs_changed_gfx (void) currprefs.gfx_ycenter = changed_prefs.gfx_ycenter; currprefs.gfx_afullscreen = changed_prefs.gfx_afullscreen; currprefs.gfx_pfullscreen = changed_prefs.gfx_pfullscreen; + + gui_update_gfx (); + graphics_subinit (); if (! inwindow) @@ -1592,7 +1661,7 @@ int debuggable (void) int needmousehack (void) { - if (dgamode) + if (dgamode || grabbed) return 0; else return 1; @@ -1826,16 +1895,37 @@ static void handle_inhibit (void) toggle_inhibit_frame (IHF_SCROLLLOCK); } +#include "gensound.h" +#include "sounddep/sound.h" +#include "events.h" +#include "audio.h" + +static void handle_interpol (void) +{ + if (currprefs.sound_interpol == 0) { + currprefs.sound_interpol = 1; + printf ("Interpol on: rh\n"); + } + else if (currprefs.sound_interpol == 1) { + currprefs.sound_interpol = 2; + printf ("Interpol on: crux\n"); + } + else { + currprefs.sound_interpol = 0; + printf ("Interpol off\n"); + } +} + static void framerate_up (void) { - if (currprefs.framerate < 20) - changed_prefs.framerate = currprefs.framerate + 1; + if (currprefs.gfx_framerate < 20) + changed_prefs.gfx_framerate = currprefs.gfx_framerate + 1; } static void framerate_down (void) { - if (currprefs.framerate > 1) - changed_prefs.framerate = currprefs.framerate - 1; + if (currprefs.gfx_framerate > 1) + changed_prefs.gfx_framerate = currprefs.gfx_framerate - 1; } static void handle_modeswitch (void)