x11 implementation
This commit is contained in:
		
							parent
							
								
									a514f7e9a2
								
							
						
					
					
						commit
						77f36a1f8e
					
				@ -586,6 +586,11 @@ endif
 | 
			
		||||
ifeq ($(API),win32)
 | 
			
		||||
  APIOBJ = win32screen.o
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(API),x11)
 | 
			
		||||
  APIOBJ = x11screen.o
 | 
			
		||||
  COPT += -DUSE_X11
 | 
			
		||||
  LOPT += -lX11
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
#To enable Joystick emulation of cursor, make USE_JOYSTICK=1 (for input.o)
 | 
			
		||||
#This can be necessary to test cursor code on a PC, but by default for all
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										150
									
								
								src/input.c
									
									
									
									
									
								
							
							
						
						
									
										150
									
								
								src/input.c
									
									
									
									
									
								
							@ -31,6 +31,13 @@
 | 
			
		||||
  #include <shellapi.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef USE_X11
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
#include <X11/XKBlib.h>
 | 
			
		||||
#include <X11/Xutil.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "global.h"
 | 
			
		||||
#include "keyboard.h"
 | 
			
		||||
#include "screen.h"
 | 
			
		||||
@ -41,6 +48,9 @@
 | 
			
		||||
#include "input.h"
 | 
			
		||||
#include "loadsave.h"
 | 
			
		||||
 | 
			
		||||
#ifdef USE_X11
 | 
			
		||||
extern Display * X11_display;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(USE_SDL)
 | 
			
		||||
#define RSUPER_EMULATES_META_MOD
 | 
			
		||||
@ -1215,6 +1225,146 @@ int Get_input(int sleep_time)
 | 
			
		||||
      WaitMessage();
 | 
			
		||||
      KillTimer(NULL, timerId);
 | 
			
		||||
    }
 | 
			
		||||
#elif defined(USE_X11)
 | 
			
		||||
    int user_feedback_required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
 | 
			
		||||
 | 
			
		||||
    Color_cycling();
 | 
			
		||||
    // Commit any pending screen update.
 | 
			
		||||
    // This is done in this function because it's called after reading 
 | 
			
		||||
    // some user input.
 | 
			
		||||
    Flush_update();
 | 
			
		||||
 | 
			
		||||
    Key_ANSI = 0;
 | 
			
		||||
    Key_UNICODE = 0;
 | 
			
		||||
    Key = 0;
 | 
			
		||||
    Mouse_moved=0;
 | 
			
		||||
    Input_new_mouse_X = Mouse_X;
 | 
			
		||||
    Input_new_mouse_Y = Mouse_Y;
 | 
			
		||||
    Input_new_mouse_K = Mouse_K;
 | 
			
		||||
 | 
			
		||||
    XFlush(X11_display);
 | 
			
		||||
    while(!user_feedback_required && XPending(X11_display) > 0)
 | 
			
		||||
    {
 | 
			
		||||
      word mod = 0;
 | 
			
		||||
      XEvent event;
 | 
			
		||||
      XNextEvent(X11_display, &event);
 | 
			
		||||
      switch(event.type)
 | 
			
		||||
      {
 | 
			
		||||
        case KeyPress:
 | 
			
		||||
          {
 | 
			
		||||
            KeySym sym;
 | 
			
		||||
            //printf("key code = %d state=0x%08x\n", event.xkey.keycode, event.xkey.state);
 | 
			
		||||
            // right/left window 40 Mod4Mask
 | 
			
		||||
            // left alt = 8         Mod1Mask
 | 
			
		||||
            // right alt = 80       Mod5Mask
 | 
			
		||||
            // NumLock = 10         Mod2Mask
 | 
			
		||||
            if (event.xkey.state & ShiftMask)
 | 
			
		||||
              mod |= MOD_SHIFT;
 | 
			
		||||
            if (event.xkey.state & ControlMask)
 | 
			
		||||
              mod |= MOD_CTRL;
 | 
			
		||||
            if (event.xkey.state & (Mod1Mask | Mod5Mask))
 | 
			
		||||
              mod |= MOD_ALT;
 | 
			
		||||
            if (event.xkey.state & Mod3Mask)
 | 
			
		||||
              mod |= MOD_META;
 | 
			
		||||
            //sym = XKeycodeToKeysym(X11_display, event.xkey.keycode, 0);
 | 
			
		||||
            sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, 0);
 | 
			
		||||
            //printf("sym = %04lx %s\t\tmod=%04x\n", sym, XKeysymToString(sym), mod);
 | 
			
		||||
            Key = mod | (sym & 0x0fff);
 | 
			
		||||
            //sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, event.xkey.state);
 | 
			
		||||
            if ((sym & 0xf000) != 0xf000) // test for standard key
 | 
			
		||||
            {
 | 
			
		||||
              int count;
 | 
			
		||||
              char buffer[16];
 | 
			
		||||
              static XComposeStatus status;
 | 
			
		||||
              count = XLookupString(&event.xkey, buffer, sizeof(buffer),
 | 
			
		||||
                                    &sym, &status);
 | 
			
		||||
              //printf(" sym = %04lx %s  %d %s\n", sym, XKeysymToString(sym), count, buffer);
 | 
			
		||||
              Key_UNICODE = sym;
 | 
			
		||||
              if (sym < 0x100)
 | 
			
		||||
                Key_ANSI = sym;
 | 
			
		||||
            }
 | 
			
		||||
            user_feedback_required = 1;
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case ButtonPress: // left = 1, middle = 2, right = 3, wheelup = 4, wheeldown = 5
 | 
			
		||||
          //printf("Press button = %d state = 0x%08x\n", event.xbutton.button, event.xbutton.state);
 | 
			
		||||
          if (event.xkey.state & ShiftMask)
 | 
			
		||||
            mod |= MOD_SHIFT;
 | 
			
		||||
          if (event.xkey.state & ControlMask)
 | 
			
		||||
            mod |= MOD_CTRL;
 | 
			
		||||
          if (event.xkey.state & (Mod1Mask | Mod5Mask))
 | 
			
		||||
            mod |= MOD_ALT;
 | 
			
		||||
          if (event.xkey.state & Mod3Mask)
 | 
			
		||||
            mod |= MOD_META;
 | 
			
		||||
          switch(event.xbutton.button)
 | 
			
		||||
          {
 | 
			
		||||
            case 1:
 | 
			
		||||
            case 3:
 | 
			
		||||
              {
 | 
			
		||||
                byte mask = 1;
 | 
			
		||||
                if(event.xbutton.button == 3)
 | 
			
		||||
                  mask ^= 3;
 | 
			
		||||
                if (Button_inverter)
 | 
			
		||||
                  mask ^= 3;
 | 
			
		||||
                Input_new_mouse_K |= mask;
 | 
			
		||||
                user_feedback_required = Move_cursor_with_constraints();
 | 
			
		||||
              }
 | 
			
		||||
              break;
 | 
			
		||||
            case 2:
 | 
			
		||||
              Key = KEY_MOUSEMIDDLE | mod;
 | 
			
		||||
              user_feedback_required = 1;
 | 
			
		||||
              break;
 | 
			
		||||
            case 4:
 | 
			
		||||
              Key = KEY_MOUSEWHEELUP | mod;
 | 
			
		||||
              user_feedback_required = 1;
 | 
			
		||||
              break;
 | 
			
		||||
            case 5:
 | 
			
		||||
              Key = KEY_MOUSEWHEELDOWN | mod;
 | 
			
		||||
              user_feedback_required = 1;
 | 
			
		||||
              break;
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case ButtonRelease:
 | 
			
		||||
          //printf("Release button = %d\n", event.xbutton.button);
 | 
			
		||||
          if(event.xbutton.button == 1 || event.xbutton.button == 3)
 | 
			
		||||
          {
 | 
			
		||||
            byte mask = 1;
 | 
			
		||||
            if(event.xbutton.button == 3)
 | 
			
		||||
              mask ^= 3;
 | 
			
		||||
            if (Button_inverter)
 | 
			
		||||
              mask ^= 3;
 | 
			
		||||
            Input_new_mouse_K &= ~mask;
 | 
			
		||||
            user_feedback_required = Move_cursor_with_constraints();
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case MotionNotify:
 | 
			
		||||
          //printf("mouse %dx%d\n", event.xmotion.x, event.xmotion.y);
 | 
			
		||||
          Input_new_mouse_X = (event.xmotion.x < 0) ? 0 : event.xmotion.x/Pixel_width;
 | 
			
		||||
          Input_new_mouse_Y = (event.xmotion.y < 0) ? 0 : event.xmotion.y/Pixel_height;
 | 
			
		||||
          user_feedback_required = Move_cursor_with_constraints();
 | 
			
		||||
          break;
 | 
			
		||||
        case Expose:
 | 
			
		||||
          printf("Expose (%d,%d) (%d,%d)\n", event.xexpose.x, event.xexpose.y, event.xexpose.width, event.xexpose.height);
 | 
			
		||||
          Update_rect(event.xexpose.x, event.xexpose.y,
 | 
			
		||||
                      event.xexpose.width, event.xexpose.height);
 | 
			
		||||
          break;
 | 
			
		||||
        default:
 | 
			
		||||
          printf("event.type = %d\n", event.type);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    // If the cursor was moved since last update,
 | 
			
		||||
    // it was erased, so we need to redraw it (with the preview brush)
 | 
			
		||||
    if (Mouse_moved)
 | 
			
		||||
    {
 | 
			
		||||
      Compute_paintbrush_coordinates();
 | 
			
		||||
      Display_cursor();
 | 
			
		||||
      return 1;
 | 
			
		||||
    }
 | 
			
		||||
    if (user_feedback_required)
 | 
			
		||||
      return 1;
 | 
			
		||||
    // Nothing significant happened
 | 
			
		||||
    if (sleep_time)
 | 
			
		||||
      usleep(1000 * sleep_time);
 | 
			
		||||
#endif
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -810,12 +810,14 @@ word Key_for_scancode(word scancode)
 | 
			
		||||
word Get_Key_modifiers(void)
 | 
			
		||||
{
 | 
			
		||||
  word mod = 0;
 | 
			
		||||
#if defined(WIN32)
 | 
			
		||||
  if (GetKeyState(VK_SHIFT) & 0x8000)
 | 
			
		||||
    mod |= MOD_SHIFT;
 | 
			
		||||
  if (GetKeyState(VK_CONTROL) & 0x8000)
 | 
			
		||||
    mod |= MOD_CTRL;
 | 
			
		||||
  if (GetKeyState(VK_MENU) & 0x8000)
 | 
			
		||||
    mod |= MOD_ALT;
 | 
			
		||||
#endif
 | 
			
		||||
  return mod;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										105
									
								
								src/keycodes.h
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								src/keycodes.h
									
									
									
									
									
								
							@ -26,12 +26,16 @@
 | 
			
		||||
#include <SDL.h>
 | 
			
		||||
#elif defined(WIN32)
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#elif defined(USE_X11)
 | 
			
		||||
#include <X11/keysym.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(USE_SDL)
 | 
			
		||||
#define K2K(x) (x)
 | 
			
		||||
#elif defined(USE_SDL2)
 | 
			
		||||
#define K2K(x) ((((x) & 0x40000000) >> 19) | ((x) & 0x1FF))
 | 
			
		||||
#elif defined(USE_X11)
 | 
			
		||||
#define K2K(x) ((x) & 0x0FFF)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* generated lists */
 | 
			
		||||
@ -150,6 +154,107 @@
 | 
			
		||||
#define KEY_F11          K2K(SDLK_F11)
 | 
			
		||||
#define KEY_F12          K2K(SDLK_F12)
 | 
			
		||||
// end of KEY definitions for SDL and SDL2
 | 
			
		||||
#elif defined(USE_X11)
 | 
			
		||||
// KEY definitions for x11
 | 
			
		||||
#define KEY_UNKNOWN      0
 | 
			
		||||
#define KEY_ESCAPE       K2K(XK_Escape)
 | 
			
		||||
#define KEY_RETURN       K2K(XK_Return)
 | 
			
		||||
#define KEY_BACKSPACE    K2K(XK_BackSpace)
 | 
			
		||||
#define KEY_TAB          K2K(XK_Tab)
 | 
			
		||||
#define KEY_UP           K2K(XK_Up)
 | 
			
		||||
#define KEY_DOWN         K2K(XK_Down)
 | 
			
		||||
#define KEY_LEFT         K2K(XK_Left)
 | 
			
		||||
#define KEY_RIGHT        K2K(XK_Right)
 | 
			
		||||
#define KEY_LEFTBRACKET  K2K(XK_bracketleft)
 | 
			
		||||
#define KEY_RIGHTBRACKET K2K(XK_bracketright)
 | 
			
		||||
#define KEY_INSERT       K2K(XK_Insert)
 | 
			
		||||
#define KEY_DELETE       K2K(XK_Delete)
 | 
			
		||||
#define KEY_COMMA        K2K(XK_comma)
 | 
			
		||||
#define KEY_BACKQUOTE    K2K(XK_grave)
 | 
			
		||||
#define KEY_PAGEUP       K2K(XK_Page_Up)
 | 
			
		||||
#define KEY_PAGEDOWN     K2K(XK_Page_Down)
 | 
			
		||||
#define KEY_HOME         K2K(XK_Home)
 | 
			
		||||
#define KEY_END          K2K(XK_End)
 | 
			
		||||
#define KEY_KP_PLUS      K2K(XK_KP_Add)
 | 
			
		||||
#define KEY_KP_MINUS     K2K(XK_KP_Subtract)
 | 
			
		||||
#define KEY_KP_MULTIPLY  K2K(XK_KP_Multiply)
 | 
			
		||||
#define KEY_KP_ENTER     K2K(XK_KP_Enter)
 | 
			
		||||
#define KEY_KP_DIVIDE    K2K(XK_KP_Divide)
 | 
			
		||||
#define KEY_KP_PERIOD    K2K(XK_KP_Decimal)
 | 
			
		||||
#define KEY_KP_EQUALS    K2K(XK_KP_Equal)
 | 
			
		||||
#define KEY_EQUALS       K2K(XK_equal)
 | 
			
		||||
#define KEY_MINUS        K2K(XK_minus)
 | 
			
		||||
#define KEY_PERIOD       K2K(XK_period)
 | 
			
		||||
#define KEY_CAPSLOCK     K2K(XK_Caps_Lock)
 | 
			
		||||
#define KEY_CLEAR        K2K(XK_Clear)
 | 
			
		||||
#define KEY_SPACE        K2K(XK_space)
 | 
			
		||||
#define KEY_PAUSE        K2K(XK_Pause)
 | 
			
		||||
#define KEY_LSHIFT       K2K(XK_Shift_L)
 | 
			
		||||
#define KEY_RSHIFT       K2K(XK_Shift_R)
 | 
			
		||||
#define KEY_LCTRL        K2K(XK_Control_L)
 | 
			
		||||
#define KEY_RCTRL        K2K(XK_Control_R)
 | 
			
		||||
#define KEY_LALT         K2K(XK_Alt_L)
 | 
			
		||||
#define KEY_RALT         K2K(XK_Alt_R)
 | 
			
		||||
#define KEY_0            K2K(XK_0)
 | 
			
		||||
#define KEY_1            K2K(XK_1)
 | 
			
		||||
#define KEY_2            K2K(XK_2)
 | 
			
		||||
#define KEY_3            K2K(XK_3)
 | 
			
		||||
#define KEY_4            K2K(XK_4)
 | 
			
		||||
#define KEY_5            K2K(XK_5)
 | 
			
		||||
#define KEY_6            K2K(XK_6)
 | 
			
		||||
#define KEY_7            K2K(XK_7)
 | 
			
		||||
#define KEY_8            K2K(XK_8)
 | 
			
		||||
#define KEY_9            K2K(XK_9)
 | 
			
		||||
#define KEY_a            K2K(XK_a)
 | 
			
		||||
#define KEY_b            K2K(XK_b)
 | 
			
		||||
#define KEY_c            K2K(XK_c)
 | 
			
		||||
#define KEY_d            K2K(XK_d)
 | 
			
		||||
#define KEY_e            K2K(XK_e)
 | 
			
		||||
#define KEY_f            K2K(XK_f)
 | 
			
		||||
#define KEY_g            K2K(XK_g)
 | 
			
		||||
#define KEY_h            K2K(XK_h)
 | 
			
		||||
#define KEY_i            K2K(XK_i)
 | 
			
		||||
#define KEY_j            K2K(XK_j)
 | 
			
		||||
#define KEY_k            K2K(XK_k)
 | 
			
		||||
#define KEY_l            K2K(XK_l)
 | 
			
		||||
#define KEY_m            K2K(XK_m)
 | 
			
		||||
#define KEY_n            K2K(XK_n)
 | 
			
		||||
#define KEY_o            K2K(XK_o)
 | 
			
		||||
#define KEY_p            K2K(XK_p)
 | 
			
		||||
#define KEY_q            K2K(XK_q)
 | 
			
		||||
#define KEY_r            K2K(XK_r)
 | 
			
		||||
#define KEY_s            K2K(XK_s)
 | 
			
		||||
#define KEY_t            K2K(XK_t)
 | 
			
		||||
#define KEY_u            K2K(XK_u)
 | 
			
		||||
#define KEY_v            K2K(XK_v)
 | 
			
		||||
#define KEY_w            K2K(XK_w)
 | 
			
		||||
#define KEY_x            K2K(XK_x)
 | 
			
		||||
#define KEY_y            K2K(XK_y)
 | 
			
		||||
#define KEY_z            K2K(XK_z)
 | 
			
		||||
#define KEY_KP0          K2K(XK_KP_0)
 | 
			
		||||
#define KEY_KP1          K2K(XK_KP_1)
 | 
			
		||||
#define KEY_KP2          K2K(XK_KP_2)
 | 
			
		||||
#define KEY_KP3          K2K(XK_KP_3)
 | 
			
		||||
#define KEY_KP4          K2K(XK_KP_4)
 | 
			
		||||
#define KEY_KP5          K2K(XK_KP_5)
 | 
			
		||||
#define KEY_KP6          K2K(XK_KP_6)
 | 
			
		||||
#define KEY_KP7          K2K(XK_KP_7)
 | 
			
		||||
#define KEY_KP8          K2K(XK_KP_8)
 | 
			
		||||
#define KEY_KP9          K2K(XK_KP_9)
 | 
			
		||||
#define KEY_SCROLLOCK    K2K(XK_Scroll_Lock)
 | 
			
		||||
#define KEY_F1           K2K(XK_F1)
 | 
			
		||||
#define KEY_F2           K2K(XK_F2)
 | 
			
		||||
#define KEY_F3           K2K(XK_F3)
 | 
			
		||||
#define KEY_F4           K2K(XK_F4)
 | 
			
		||||
#define KEY_F5           K2K(XK_F5)
 | 
			
		||||
#define KEY_F6           K2K(XK_F6)
 | 
			
		||||
#define KEY_F7           K2K(XK_F7)
 | 
			
		||||
#define KEY_F8           K2K(XK_F8)
 | 
			
		||||
#define KEY_F9           K2K(XK_F9)
 | 
			
		||||
#define KEY_F10          K2K(XK_F10)
 | 
			
		||||
#define KEY_F11          K2K(XK_F11)
 | 
			
		||||
#define KEY_F12          K2K(XK_F12)
 | 
			
		||||
// end of KEY definitions for x11
 | 
			
		||||
#elif defined(WIN32)
 | 
			
		||||
// KEY definitions for win32
 | 
			
		||||
#define KEY_UNKNOWN      0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										256
									
								
								src/x11screen.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								src/x11screen.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,256 @@
 | 
			
		||||
/* vim:expandtab:ts=2 sw=2:
 | 
			
		||||
*/
 | 
			
		||||
/*  Grafx2 - The Ultimate 256-color bitmap paint program
 | 
			
		||||
 | 
			
		||||
    Copyright 2018 Thomas Bernard
 | 
			
		||||
    Copyright 2008 Yves Rizoud
 | 
			
		||||
    Copyright 2007 Adrien Destugues
 | 
			
		||||
    Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
 | 
			
		||||
 | 
			
		||||
    Grafx2 is free software; you can redistribute it and/or
 | 
			
		||||
    modify it under the terms of the GNU General Public License
 | 
			
		||||
    as published by the Free Software Foundation; version 2
 | 
			
		||||
    of the License.
 | 
			
		||||
 | 
			
		||||
    Grafx2 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 General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License
 | 
			
		||||
    along with Grafx2; if not, see <http://www.gnu.org/licenses/>
 | 
			
		||||
*/
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
#include <X11/Xutil.h>
 | 
			
		||||
#include "screen.h"
 | 
			
		||||
#include "gfx2surface.h"
 | 
			
		||||
 | 
			
		||||
Display * X11_display = NULL;
 | 
			
		||||
static Window X11_window = 0;
 | 
			
		||||
static XImage * X11_image = NULL;
 | 
			
		||||
static char * image_pixels = NULL;
 | 
			
		||||
static XTextProperty windowName;
 | 
			
		||||
static GC X11_gc = 0;
 | 
			
		||||
static T_GFX2_Surface * screen = NULL;
 | 
			
		||||
 | 
			
		||||
void GFX2_Set_mode(int *width, int *height, int fullscreen)
 | 
			
		||||
{
 | 
			
		||||
  int s;
 | 
			
		||||
  int depth;
 | 
			
		||||
  unsigned long white, black;
 | 
			
		||||
  char * winName[] = { "GrafX2" };
 | 
			
		||||
  Visual * visual;
 | 
			
		||||
  const char blank_data[1] = { 0 };
 | 
			
		||||
  Pixmap blank;
 | 
			
		||||
  Cursor cursor;
 | 
			
		||||
  XColor dummy;
 | 
			
		||||
 | 
			
		||||
  if (X11_display == NULL)
 | 
			
		||||
    X11_display = XOpenDisplay(NULL);//getenv("DISPLAY")
 | 
			
		||||
  if (X11_display == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    fprintf(stderr, "X11: cannot open display\n");
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
  s = DefaultScreen(X11_display);
 | 
			
		||||
  black = BlackPixel(X11_display, s);
 | 
			
		||||
  white = WhitePixel(X11_display, s);
 | 
			
		||||
  visual = DefaultVisual(X11_display, s);
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    int i;
 | 
			
		||||
    int count = 0;
 | 
			
		||||
    int * depths = XListDepths(X11_display, s, &count);
 | 
			
		||||
    printf("DefaultDepth = %d, DisplayPlanes = %d\n", DefaultDepth(X11_display, s), DisplayPlanes(X11_display, s));
 | 
			
		||||
    if (depths != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      for (i = 0; i < count; i++)
 | 
			
		||||
        printf(" %d", depths[i]);
 | 
			
		||||
      printf("\n");
 | 
			
		||||
      XFree(depths);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  depth = DisplayPlanes(X11_display, s);
 | 
			
		||||
 | 
			
		||||
  X11_window = XCreateSimpleWindow(X11_display, RootWindow(X11_display, s),
 | 
			
		||||
                                   0, 0, *width, *height, 0, white, black);
 | 
			
		||||
 | 
			
		||||
  // create blank 1x1 pixmap to make a 1x1 transparent cursor
 | 
			
		||||
  blank = XCreateBitmapFromData(X11_display, X11_window, blank_data, 1, 1);
 | 
			
		||||
  cursor = XCreatePixmapCursor(X11_display, blank, blank, &dummy, &dummy, 0, 0);
 | 
			
		||||
  //cursor = XCreateFontCursor(X11_display, 130 /*XC_tcross*/);
 | 
			
		||||
  XDefineCursor(X11_display, X11_window, cursor);
 | 
			
		||||
  XFreePixmap(X11_display, blank);
 | 
			
		||||
  XFreeCursor(X11_display, cursor);
 | 
			
		||||
 | 
			
		||||
  X11_gc = XCreateGC(X11_display, X11_window, 0, NULL);
 | 
			
		||||
  XSetFunction(X11_display, X11_gc, GXcopy);
 | 
			
		||||
 | 
			
		||||
  XStringListToTextProperty(winName, 1, &windowName);
 | 
			
		||||
  XSetWMName(X11_display, X11_window, &windowName);
 | 
			
		||||
  // TODO : set icon
 | 
			
		||||
 | 
			
		||||
  screen = New_GFX2_Surface(*width, *height);
 | 
			
		||||
  memset(screen->pixels, 0, *width * *height);
 | 
			
		||||
 | 
			
		||||
  image_pixels = malloc(*height * *width * 4);
 | 
			
		||||
  memset(image_pixels, 64, *height * *width * 4);
 | 
			
		||||
#if 0
 | 
			
		||||
{
 | 
			
		||||
int i;
 | 
			
		||||
for (i= 3*8; i < (*height * *width * 4); i += *width * 4)
 | 
			
		||||
{
 | 
			
		||||
image_pixels[i+0] = 0;  // B
 | 
			
		||||
image_pixels[i+1] = 0;  // G
 | 
			
		||||
image_pixels[i+2] = 0;  // R
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
  X11_image = XCreateImage(X11_display, visual, depth,
 | 
			
		||||
                           ZPixmap, 0, image_pixels, *width, *height,
 | 
			
		||||
                           32, 0/**width * 4*/);
 | 
			
		||||
  if(X11_image == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    fprintf(stderr, "XCreateImage failed\n");
 | 
			
		||||
    exit(1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  XSelectInput(X11_display, X11_window,
 | 
			
		||||
               PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | ExposureMask | StructureNotifyMask);
 | 
			
		||||
 | 
			
		||||
  XMapWindow(X11_display, X11_window);
 | 
			
		||||
  XFlush(X11_display);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
byte Get_Screen_pixel(int x, int y)
 | 
			
		||||
{
 | 
			
		||||
  if(screen == NULL) return 0;
 | 
			
		||||
  return screen->pixels[x + y * screen->w];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Set_Screen_pixel(int x, int y, byte value)
 | 
			
		||||
{
 | 
			
		||||
  if(screen == NULL) return;
 | 
			
		||||
  screen->pixels[x + y * screen->w] = value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
byte* Get_Screen_pixel_ptr(int x, int y)
 | 
			
		||||
{
 | 
			
		||||
  if(screen == NULL) return NULL;
 | 
			
		||||
  return screen->pixels + x + y * screen->w;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Screen_FillRect(int x, int y, int w, int h, byte color)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  byte * ptr;
 | 
			
		||||
 | 
			
		||||
  if (x < 0)
 | 
			
		||||
  {
 | 
			
		||||
    w += x;
 | 
			
		||||
    x = 0;
 | 
			
		||||
  }
 | 
			
		||||
  if (y < 0)
 | 
			
		||||
  {
 | 
			
		||||
    h += y;
 | 
			
		||||
    y = 0;
 | 
			
		||||
  }
 | 
			
		||||
  if (x > screen->w || y > screen->h)
 | 
			
		||||
    return;
 | 
			
		||||
  if ((x + w) > screen->w)
 | 
			
		||||
    w = screen->w - x;
 | 
			
		||||
  if ((y + h) > screen->h)
 | 
			
		||||
    h = screen->h - y;
 | 
			
		||||
  if (w <= 0 || h <= 0)
 | 
			
		||||
    return;
 | 
			
		||||
  for (i = 0; i < h; i++)
 | 
			
		||||
  {
 | 
			
		||||
    ptr = Get_Screen_pixel_ptr(x, y + i);
 | 
			
		||||
    memset(ptr, color, w);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SetPalette(const T_Components * colors, int firstcolor, int ncolors)
 | 
			
		||||
{
 | 
			
		||||
  if (screen == NULL) return 0;
 | 
			
		||||
  memcpy(screen->palette + firstcolor, colors, ncolors * sizeof(T_Components));
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Update_rect(short x, short y, unsigned short width, unsigned short height)
 | 
			
		||||
{
 | 
			
		||||
  int line, i;
 | 
			
		||||
  if (screen == NULL || X11_image == NULL) return;
 | 
			
		||||
  x *= Pixel_width;
 | 
			
		||||
  width *= Pixel_width;
 | 
			
		||||
  y *= Pixel_height;
 | 
			
		||||
  height *= Pixel_height;
 | 
			
		||||
//printf("Update_rect(%d %d %d %d) %d %d\n", x, y, width, height, screen->w, screen->h);
 | 
			
		||||
  if (y >= screen->h || x >= screen->w) return;
 | 
			
		||||
  if (y + height > screen->h)
 | 
			
		||||
    height = screen->h - y;
 | 
			
		||||
  if (x + width > screen->w)
 | 
			
		||||
    width = screen->w - x;
 | 
			
		||||
  for (line = y; line < y + height; line++)
 | 
			
		||||
  {
 | 
			
		||||
#if 0
 | 
			
		||||
    const byte * src = Get_Screen_pixel_ptr(x, line);
 | 
			
		||||
    byte * dest = image_pixels + line * X11_image->bytes_per_line + x * 4,
 | 
			
		||||
    i = width;
 | 
			
		||||
    do
 | 
			
		||||
    {
 | 
			
		||||
      dest[0] = screen->palette[*src].B;
 | 
			
		||||
      dest[1] = screen->palette[*src].G;
 | 
			
		||||
      dest[2] = screen->palette[*src].R;
 | 
			
		||||
      dest[3] = 0;
 | 
			
		||||
      src++;
 | 
			
		||||
      dest += 4;
 | 
			
		||||
    }
 | 
			
		||||
    while(--i > 0);
 | 
			
		||||
#else
 | 
			
		||||
    for (i = 0; i < width; i++)
 | 
			
		||||
    {
 | 
			
		||||
      byte v = Get_Screen_pixel(x + i, line);
 | 
			
		||||
      XPutPixel(X11_image, x + i, line,
 | 
			
		||||
                (unsigned)screen->palette[v].R << 16 | (unsigned)screen->palette[v].G << 8 | (unsigned)screen->palette[v].B);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
  XPutImage(X11_display, X11_window, X11_gc, X11_image,
 | 
			
		||||
            x, y, x, y, width, height);
 | 
			
		||||
  //XPutImage(X11_display, X11_window, X11_gc, X11_image,
 | 
			
		||||
  //          0, 0, 0, 0, X11_image->width, X11_image->height);
 | 
			
		||||
  //XSync(X11_display, False);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Flush_update(void)
 | 
			
		||||
{
 | 
			
		||||
  if (X11_display != NULL)
 | 
			
		||||
    XFlush(X11_display);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Update_status_line(short char_pos, short width)
 | 
			
		||||
{
 | 
			
		||||
  Update_rect((18+char_pos*8)*Menu_factor_X*Pixel_width, Menu_status_Y*Pixel_height,
 | 
			
		||||
              width*8*Menu_factor_X*Pixel_width, 8*Menu_factor_Y*Pixel_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Clear_border(byte color)
 | 
			
		||||
{
 | 
			
		||||
(void)color;//TODO
 | 
			
		||||
}
 | 
			
		||||
  
 | 
			
		||||
volatile int Allow_colorcycling = 0;
 | 
			
		||||
 | 
			
		||||
/// Activates or desactivates file drag-dropping in program window.
 | 
			
		||||
void Allow_drag_and_drop(int flag)
 | 
			
		||||
{
 | 
			
		||||
(void)flag;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Define_icon(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
@ -42,6 +42,31 @@ win32vk = {
 | 
			
		||||
'RALT': 'RMENU',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
x11xk = {
 | 
			
		||||
'BACKSPACE': 'BackSpace',
 | 
			
		||||
'CAPSLOCK': 'Caps_Lock',
 | 
			
		||||
'PAGEUP': 'Page_Up',
 | 
			
		||||
'PAGEDOWN': 'Page_Down',
 | 
			
		||||
'BACKQUOTE': 'grave',
 | 
			
		||||
'KP_PLUS': 'KP_Add',
 | 
			
		||||
'KP_MINUS': 'KP_Subtract',
 | 
			
		||||
'KP_EQUALS': 'KP_Equal',
 | 
			
		||||
'KP_PERIOD': 'KP_Decimal',
 | 
			
		||||
'COMMA': 'comma',
 | 
			
		||||
'SPACE': 'space',
 | 
			
		||||
'EQUALS': 'equal',
 | 
			
		||||
'MINUS': 'minus',
 | 
			
		||||
'PERIOD': 'period',
 | 
			
		||||
'LEFTBRACKET': 'bracketleft',
 | 
			
		||||
'RIGHTBRACKET': 'bracketright',
 | 
			
		||||
'LCTRL': 'Control_L',
 | 
			
		||||
'RCTRL': 'Control_R',
 | 
			
		||||
'LALT': 'Alt_L',
 | 
			
		||||
'RALT': 'Alt_R',
 | 
			
		||||
'LSHIFT': 'Shift_L',
 | 
			
		||||
'RSHIFT': 'Shift_R',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
def keycode_def(section, key, index, native_key=None):
 | 
			
		||||
	if native_key is None:
 | 
			
		||||
		native_key = key
 | 
			
		||||
@ -56,6 +81,13 @@ def keycode_def(section, key, index, native_key=None):
 | 
			
		||||
			return '#define KEY_%-12s 0\n' % (key)
 | 
			
		||||
		else:
 | 
			
		||||
			return '#define KEY_%-12s VK_%s\n' % (key, native_key)
 | 
			
		||||
	elif section == 'x11':
 | 
			
		||||
		if native_key[0:3] == 'Kp_':
 | 
			
		||||
			native_key = 'KP_' + native_key[3:]
 | 
			
		||||
		if key == 'UNKNOWN':
 | 
			
		||||
			return '#define KEY_%-12s 0\n' % (key)
 | 
			
		||||
		else:
 | 
			
		||||
			return '#define KEY_%-12s K2K(XK_%s)\n' % (key, native_key)
 | 
			
		||||
	else:
 | 
			
		||||
		return '#define KEY_%-12s %d\n' % (key, index)
 | 
			
		||||
 | 
			
		||||
@ -65,6 +97,11 @@ def add_keycodes_defs(section, lines):
 | 
			
		||||
	for key in keys:
 | 
			
		||||
		if section == 'win32' and key in win32vk:
 | 
			
		||||
			lines.append(keycode_def(section, key, i, win32vk[key]))
 | 
			
		||||
		elif section == 'x11':
 | 
			
		||||
			if key in x11xk:
 | 
			
		||||
				lines.append(keycode_def(section, key, i, x11xk[key]))
 | 
			
		||||
			else:
 | 
			
		||||
				lines.append(keycode_def(section, key, i, key.title()))
 | 
			
		||||
		else:
 | 
			
		||||
			lines.append(keycode_def(section, key, i))
 | 
			
		||||
		i = i + 1
 | 
			
		||||
@ -80,11 +117,15 @@ def add_keycodes_defs(section, lines):
 | 
			
		||||
		key = "KP%d" % (j)
 | 
			
		||||
		if section == 'win32':
 | 
			
		||||
			lines.append(keycode_def(section, key, i, "NUMPAD%d" % (j)))
 | 
			
		||||
		elif section == 'x11':
 | 
			
		||||
			lines.append(keycode_def(section, key, i, "KP_%d" % (j)))
 | 
			
		||||
		else:
 | 
			
		||||
			lines.append(keycode_def(section, key, i))
 | 
			
		||||
		i = i + 1
 | 
			
		||||
	if section == 'win32':
 | 
			
		||||
		lines.append(keycode_def(section, 'SCROLLOCK', i, 'SCROLL'))
 | 
			
		||||
	elif section == 'x11':
 | 
			
		||||
		lines.append(keycode_def(section, 'SCROLLOCK', i, 'Scroll_Lock'))
 | 
			
		||||
	else:
 | 
			
		||||
		lines.append(keycode_def(section, 'SCROLLOCK', i))
 | 
			
		||||
	i = i + 1
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user