From 9e39600c8301af8b6fdb2fe5ee49faa353e88fca Mon Sep 17 00:00:00 2001 From: ligd Date: Wed, 21 Dec 2022 17:55:48 +0800 Subject: [PATCH] arch: fix sim_x11events calls but sim_x11initialize() hasn't ready Signed-off-by: ligd --- arch/sim/src/sim/posix/sim_x11framebuffer.c | 86 +++++++++++++-------- arch/sim/src/sim/sim_framebuffer.c | 14 ++-- arch/sim/src/sim/sim_internal.h | 2 +- arch/sim/src/sim/sim_lcd.c | 15 ++-- 4 files changed, 67 insertions(+), 50 deletions(-) diff --git a/arch/sim/src/sim/posix/sim_x11framebuffer.c b/arch/sim/src/sim/posix/sim_x11framebuffer.c index 47d6290f31..dd63e10d0b 100644 --- a/arch/sim/src/sim/posix/sim_x11framebuffer.c +++ b/arch/sim/src/sim/posix/sim_x11framebuffer.c @@ -68,8 +68,9 @@ static int b_useshm; * Name: sim_x11createframe ****************************************************************************/ -static inline int sim_x11createframe(void) +static inline Display *sim_x11createframe(void) { + Display *display; XGCValues gcval; char *argv[2] = { @@ -82,18 +83,18 @@ static inline int sim_x11createframe(void) XTextProperty iconprop; XSizeHints hints; - g_display = XOpenDisplay(NULL); - if (g_display == NULL) + display = XOpenDisplay(NULL); + if (display == NULL) { syslog(LOG_ERR, "Unable to open display.\n"); - return -1; + return NULL; } - g_screen = DefaultScreen(g_display); - g_window = XCreateSimpleWindow(g_display, DefaultRootWindow(g_display), + g_screen = DefaultScreen(display); + g_window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0, g_fbpixelwidth, g_fbpixelheight, 2, - BlackPixel(g_display, g_screen), - BlackPixel(g_display, g_screen)); + BlackPixel(display, g_screen), + BlackPixel(display, g_screen)); XStringListToTextProperty(&winname, 1, &winprop); XStringListToTextProperty(&iconname, 1, &iconprop); @@ -102,18 +103,18 @@ static inline int sim_x11createframe(void) hints.width = hints.min_width = hints.max_width = g_fbpixelwidth; hints.height = hints.min_height = hints.max_height = g_fbpixelheight; - XSetWMProperties(g_display, g_window, &winprop, &iconprop, argv, 1, + XSetWMProperties(display, g_window, &winprop, &iconprop, argv, 1, &hints, NULL, NULL); - XMapWindow(g_display, g_window); + XMapWindow(display, g_window); /* Select window input events */ #if defined(CONFIG_SIM_AJOYSTICK) - XSelectInput(g_display, g_window, + XSelectInput(display, g_window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask); #else - XSelectInput(g_display, g_window, + XSelectInput(display, g_window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask | KeyReleaseMask); #endif @@ -122,19 +123,19 @@ static inline int sim_x11createframe(void) #if defined(CONFIG_SIM_TOUCHSCREEN) || defined(CONFIG_SIM_AJOYSTICK) || \ defined(CONFIG_SIM_BUTTONS) - XAllowEvents(g_display, AsyncBoth, CurrentTime); + XAllowEvents(display, AsyncBoth, CurrentTime); /* Grab mouse button 1, enabling mouse-related events */ - XGrabButton(g_display, Button1, AnyModifier, g_window, 1, + XGrabButton(display, Button1, AnyModifier, g_window, 1, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None); #endif gcval.graphics_exposures = 0; - g_gc = XCreateGC(g_display, g_window, GCGraphicsExposures, &gcval); + g_gc = XCreateGC(display, g_window, GCGraphicsExposures, &gcval); - return 0; + return display; } /**************************************************************************** @@ -166,9 +167,9 @@ static void sim_x11traperrors(void) ****************************************************************************/ #ifndef CONFIG_SIM_X11NOSHM -static int sim_x11untraperrors(void) +static int sim_x11untraperrors(Display *display) { - XSync(g_display, 0); + XSync(display, 0); XSetErrorHandler(NULL); return g_xerror; } @@ -180,6 +181,11 @@ static int sim_x11untraperrors(void) static void sim_x11uninit(void) { + if (g_display == NULL) + { + return; + } + #ifndef CONFIG_SIM_X11NOSHM if (g_shmcheckpoint > 4) { @@ -239,7 +245,8 @@ static void sim_x11uninitialize(void) * Name: sim_x11mapsharedmem ****************************************************************************/ -static inline int sim_x11mapsharedmem(int depth, unsigned int fblen) +static inline int sim_x11mapsharedmem(Display *display, + int depth, unsigned int fblen) { #ifndef CONFIG_SIM_X11NOSHM Status result; @@ -250,16 +257,16 @@ static inline int sim_x11mapsharedmem(int depth, unsigned int fblen) b_useshm = 0; #ifndef CONFIG_SIM_X11NOSHM - if (XShmQueryExtension(g_display)) + if (XShmQueryExtension(display)) { b_useshm = 1; sim_x11traperrors(); - g_image = XShmCreateImage(g_display, - DefaultVisual(g_display, g_screen), + g_image = XShmCreateImage(display, + DefaultVisual(display, g_screen), depth, ZPixmap, NULL, &g_xshminfo, g_fbpixelwidth, g_fbpixelheight); - if (sim_x11untraperrors()) + if (sim_x11untraperrors(display)) { sim_x11uninitialize(); goto shmerror; @@ -297,8 +304,8 @@ static inline int sim_x11mapsharedmem(int depth, unsigned int fblen) g_xshminfo.readOnly = 0; sim_x11traperrors(); - result = XShmAttach(g_display, &g_xshminfo); - if (sim_x11untraperrors() || !result) + result = XShmAttach(display, &g_xshminfo); + if (sim_x11untraperrors(display) || !result) { sim_x11uninitialize(); goto shmerror; @@ -318,7 +325,7 @@ shmerror: g_framebuffer = (unsigned char *)malloc(fblen); - g_image = XCreateImage(g_display, DefaultVisual(g_display, g_screen), + g_image = XCreateImage(display, DefaultVisual(display, g_screen), depth, ZPixmap, 0, (char *)g_framebuffer, g_fbpixelwidth, g_fbpixelheight, 8, 0); @@ -352,8 +359,8 @@ int sim_x11initialize(unsigned short width, unsigned short height, unsigned short *stride) { XWindowAttributes windowattributes; + Display *display; int depth; - int ret; /* Save inputs */ @@ -362,15 +369,15 @@ int sim_x11initialize(unsigned short width, unsigned short height, /* Create the X11 window */ - ret = sim_x11createframe(); - if (ret < 0) + display = sim_x11createframe(); + if (display == NULL) { - return ret; + return -1; } /* Determine the supported pixel bpp of the current window */ - XGetWindowAttributes(g_display, DefaultRootWindow(g_display), + XGetWindowAttributes(display, DefaultRootWindow(display), &windowattributes); /* Get the pixel depth. If the depth is 24-bits, use 32 because X expects @@ -389,9 +396,10 @@ int sim_x11initialize(unsigned short width, unsigned short height, /* Map the window to shared memory */ - sim_x11mapsharedmem(windowattributes.depth, *fblen); + sim_x11mapsharedmem(display, windowattributes.depth, *fblen); *fbmem = (void *)g_framebuffer; + g_display = display; return 0; } @@ -406,6 +414,11 @@ int sim_x11cmap(unsigned short first, unsigned short len, Colormap cmap; int ndx; + if (g_display == NULL) + { + return -1; + } + /* Convert each color to X11 scaling */ cmap = DefaultColormap(g_display, g_screen); @@ -438,8 +451,13 @@ int sim_x11cmap(unsigned short first, unsigned short len, * Name: sim_x11update ****************************************************************************/ -void sim_x11update(void) +int sim_x11update(void) { + if (g_display == NULL) + { + return -1; + } + #ifndef CONFIG_SIM_X11NOSHM if (b_useshm) { @@ -454,4 +472,6 @@ void sim_x11update(void) } XSync(g_display, 0); + + return 0; } diff --git a/arch/sim/src/sim/sim_framebuffer.c b/arch/sim/src/sim/sim_framebuffer.c index 276c0a0e6b..8de52036a8 100644 --- a/arch/sim/src/sim/sim_framebuffer.c +++ b/arch/sim/src/sim/sim_framebuffer.c @@ -343,17 +343,17 @@ static int sim_setcursor(struct fb_vtable_s *vtable, void sim_x11loop(void) { #ifdef CONFIG_SIM_X11FB - if (g_planeinfo.fbmem != NULL) - { - static clock_t last; - clock_t now = clock_systime_ticks(); + static clock_t last; + clock_t now = clock_systime_ticks(); - if (now - last >= MSEC2TICK(16)) + if (now - last >= MSEC2TICK(16)) + { + if (sim_x11update() > 0) { - sim_x11update(); fb_pollnotify(&g_fbobject); - last = now; } + + last = now; } #endif } diff --git a/arch/sim/src/sim/sim_internal.h b/arch/sim/src/sim/sim_internal.h index 13d7ec07a4..e676e8f1eb 100644 --- a/arch/sim/src/sim/sim_internal.h +++ b/arch/sim/src/sim/sim_internal.h @@ -232,7 +232,7 @@ void sim_registerblockdevice(void); int sim_x11initialize(unsigned short width, unsigned short height, void **fbmem, size_t *fblen, unsigned char *bpp, unsigned short *stride); -void sim_x11update(void); +int sim_x11update(void); #ifdef CONFIG_FB_CMAP int sim_x11cmap(unsigned short first, unsigned short len, unsigned char *red, unsigned char *green, diff --git a/arch/sim/src/sim/sim_lcd.c b/arch/sim/src/sim/sim_lcd.c index b20193f44f..81bddbed3b 100644 --- a/arch/sim/src/sim/sim_lcd.c +++ b/arch/sim/src/sim/sim_lcd.c @@ -433,16 +433,13 @@ static int sim_setcontrast(struct lcd_dev_s *dev, unsigned int contrast) void sim_x11loop(void) { #ifdef CONFIG_SIM_X11FB - if (g_planeinfo.buffer != NULL) - { - static clock_t last; - clock_t now = clock_systime_ticks(); + static clock_t last; + clock_t now = clock_systime_ticks(); - if (now - last >= MSEC2TICK(16)) - { - sim_x11update(); - last = now; - } + if (now - last >= MSEC2TICK(16)) + { + sim_x11update(); + last = now; } #endif }