You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2023/01/29 20:34:43 UTC

[nuttx] 01/02: arch: fix sim_x11events calls but sim_x11initialize() hasn't ready

This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 9e39600c8301af8b6fdb2fe5ee49faa353e88fca
Author: ligd <li...@xiaomi.com>
AuthorDate: Wed Dec 21 17:55:48 2022 +0800

    arch: fix sim_x11events calls but sim_x11initialize() hasn't ready
    
    Signed-off-by: ligd <li...@xiaomi.com>
---
 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
 }