freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2-demos] master af72932 2/2: [graph] Rework GDI message handlin


From: Alexei Podtelezhnikov
Subject: [freetype2-demos] master af72932 2/2: [graph] Rework GDI message handling.
Date: Tue, 26 May 2020 23:10:26 -0400 (EDT)

branch: master
commit af72932907e2e6738581f035eea14f058a31b233
Author: Alexei Podtelezhnikov <address@hidden>
Commit: Alexei Podtelezhnikov <address@hidden>

    [graph] Rework GDI message handling.
    
    * graph/win32/grwin32.c (WM_RESIZE): New custom message.
    (gr_win32_surface_listen_event): Simplify and handle keystroke events
    and window resizing here.
    (grWin32Surface): Remove no longer neccessary fields.
    (Message_Process): Handle WM_PAINT and post WN_RESIZE as needed.
---
 ChangeLog             |  10 +++
 graph/win32/grwin32.c | 188 +++++++++++++++++++++-----------------------------
 2 files changed, 88 insertions(+), 110 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2645460..933c211 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2020-05-26  Alexei Podtelezhnikov  <address@hidden>
 
+       [graph] Rework GDI message handling.
+
+       * graph/win32/grwin32.c (WM_RESIZE): New custom message.
+       (gr_win32_surface_listen_event): Simplify and handle keystroke events
+       and window resizing here.
+       (grWin32Surface): Remove no longer neccessary fields.
+       (Message_Process): Handle WM_PAINT and post WN_RESIZE as needed.
+
+2020-05-26  Alexei Podtelezhnikov  <address@hidden>
+
        * graph/grevents.c (grKey): Utilize some ASCII control codes.
 
 2020-05-26  Alexei Podtelezhnikov  <address@hidden>
diff --git a/graph/win32/grwin32.c b/graph/win32/grwin32.c
index 4e27232..a85b182 100644
--- a/graph/win32/grwin32.c
+++ b/graph/win32/grwin32.c
@@ -58,9 +58,8 @@
 #endif
 /*-------------------*/
 
-/*  Size of the window. */
-#define WIN_WIDTH   640u
-#define WIN_HEIGHT  450u
+/*  Custom messages. */
+#define WM_RESIZE  WM_USER+517
 
 /* These values can be changed, but WIN_WIDTH should remain for now a  */
 /* multiple of 32 to avoid padding issues.                             */
@@ -101,12 +100,6 @@
     { VK_F12,       grKeyF12       }
   };
 
-  static
-  Translator  syskey_translators[] =
-  {
-    { VK_F10,       grKeyF10       }
-  };
-
   static ATOM  ourAtom;
 
   typedef struct grWin32SurfaceRec_
@@ -115,12 +108,9 @@
     HWND          window;
     int           window_width;
     int           window_height;
-    int           title_set;
     const char*   the_title;
     LPBITMAPINFO  pbmi;
     char          bmi[ sizeof(BITMAPINFO) + 256*sizeof(RGBQUAD) ];
-    grEvent       ourevent;
-    int           eventToProcess;
     grBitmap      bgrBitmap;  /* windows wants data in BGR format !! */
 #ifdef SWIZZLE
     grBitmap      swizzle_bitmap;
@@ -154,7 +144,6 @@ gr_win32_surface_refresh_rectangle(
          int              w,
          int              h )
 {
-  HDC           hDC;
   int           row_bytes, delta;
   LPBITMAPINFO  pbmi   = surface->pbmi;
   HANDLE        window = surface->window;
@@ -273,37 +262,9 @@ gr_win32_surface_set_title( grWin32Surface*  surface,
 {
   /* the title will be set on the next listen_event, just */
   /* record it there..                                    */
-  surface->title_set = 0;
   surface->the_title = title;
 }
 
-static void
-gr_win32_surface_listen_event( grWin32Surface*  surface,
-                               int              event_mask,
-                               grEvent*         grevent )
-{
-  MSG     msg;
-  HANDLE  window = surface->window;
-
-  event_mask=event_mask;  /* unused parameter */
-
-  if ( window && !surface->title_set )
-  {
-    SetWindowText( window, surface->the_title );
-    surface->title_set = 1;
-  }
-
-  surface->eventToProcess = 0;
-  while (GetMessage( &msg, 0, 0, 0 ) > 0)
-  {
-    TranslateMessage( &msg );
-    DispatchMessage( &msg );
-    if (surface->eventToProcess)
-      break;
-  }
-
-  *grevent = surface->ourevent;
-}
 
 /*
  * set graphics mode
@@ -360,6 +321,72 @@ gr_win32_surface_resize( grWin32Surface*  surface,
   return surface;
 }
 
+static void
+gr_win32_surface_listen_event( grWin32Surface*  surface,
+                               int              event_mask,
+                               grEvent*         grevent )
+{
+  MSG     msg;
+  HANDLE  window = surface->window;
+
+  event_mask=event_mask;  /* unused parameter */
+
+  if ( window && surface->the_title )
+  {
+    SetWindowText( window, surface->the_title );
+    surface->the_title = NULL;
+  }
+
+  while (GetMessage( &msg, 0, 0, 0 ) > 0)
+  {
+    switch ( msg.message )
+    {
+    case WM_RESIZE:
+      {
+        int  width  = LOWORD(msg.lParam);
+        int  height = HIWORD(msg.lParam);
+
+
+        if ( gr_win32_surface_resize( surface, width, height ) )
+        {
+          grevent->type  = gr_event_resize;
+          grevent->x     = width;
+          grevent->y     = height;
+          return;
+        }
+      }
+      break;
+
+    case WM_KEYDOWN:
+    case WM_SYSKEYDOWN:
+      {
+        Translator*  trans = key_translators;
+        Translator*  limit = trans + sizeof( key_translators ) /
+                                    sizeof( key_translators[0] );
+        for ( ; trans < limit; trans++ )
+          if ( msg.wParam == trans->winkey )
+          {
+            grevent->type = gr_event_key;
+            grevent->key  = trans->grkey;
+            return;
+          }
+      }
+      break;
+
+    case WM_CHAR:
+      {
+        grevent->type = gr_event_key;
+        grevent->key  = msg.wParam;
+        return;
+      }
+      break;
+    }
+
+    TranslateMessage( &msg );
+    DispatchMessage( &msg );
+  }
+}
+
 static grWin32Surface*
 gr_win32_surface_init( grWin32Surface*  surface,
                        grBitmap*        bitmap )
@@ -530,29 +557,24 @@ LRESULT CALLBACK Message_Process( HWND handle, UINT mess,
 
     switch( mess )
     {
-    case WM_DESTROY:
+    case WM_CLOSE:
         /* warn the main thread to quit if it didn't know */
-      surface->ourevent.type  = gr_event_key;
-      surface->ourevent.key   = grKeyEsc;
-      surface->eventToProcess = 1;
       surface->window         = 0;
-      PostQuitMessage ( 0 );
+      PostMessage( handle, WM_CHAR, (WPARAM)grKeyEsc, 0 );
       return 0;
 
     case WM_SIZE:
       if ( wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED )
-      {
-        int  width  = LOWORD(lParam);
-        int  height = HIWORD(lParam);
+        PostMessage( handle, WM_RESIZE, wParam, lParam );
+      break;
 
+    case WM_EXITSIZEMOVE:
+      {
+        RECT  WndRect;
 
-        if ( gr_win32_surface_resize( surface, width, height ) )
-        {
-          surface->ourevent.type  = gr_event_resize;
-          surface->ourevent.x     = width;
-          surface->ourevent.y     = height;
-          surface->eventToProcess = 1;
-        }
+        GetClientRect( handle, &WndRect );
+        PostMessage( handle, WM_RESIZE, SIZE_RESTORED,
+                     MAKELPARAM( WndRect.right, WndRect.bottom ) );
       }
       break;
 
@@ -578,60 +600,6 @@ LRESULT CALLBACK Message_Process( HWND handle, UINT mess,
       return 0;
       }
 
-    case WM_SYSKEYDOWN:
-      {
-        int          count = sizeof( syskey_translators )/sizeof( 
syskey_translators[0] );
-        Translator*  trans = syskey_translators;
-        Translator*  limit = trans + count;
-        for ( ; trans < limit; trans++ )
-          if ( wParam == trans->winkey )
-          {
-            surface->ourevent.key = trans->grkey;
-            goto Do_Key_Event;
-          }
-        return DefWindowProc( handle, mess, wParam, lParam );
-      }
-
-
-    case WM_KEYDOWN:
-      switch ( wParam )
-      {
-      case VK_ESCAPE:
-        surface->ourevent.type  = gr_event_key;
-        surface->ourevent.key   = grKeyEsc;
-        surface->eventToProcess = 1;
-        PostQuitMessage ( 0 );
-        return 0;
-
-      default:
-        /* lookup list of translated keys */
-        {
-          int          count = sizeof( key_translators )/sizeof( 
key_translators[0] );
-          Translator*  trans = key_translators;
-          Translator*  limit = trans + count;
-          for ( ; trans < limit; trans++ )
-            if ( wParam == trans->winkey )
-            {
-              surface->ourevent.key = trans->grkey;
-              goto Do_Key_Event;
-            }
-        }
-
-        /* the key isn't found, default processing               */
-        /* return DefWindowProc( handle, mess, wParam, lParam ); */
-        return DefWindowProc( handle, mess, wParam, lParam );
-    }
-
-    case WM_CHAR:
-      {
-        surface->ourevent.key = wParam;
-
-    Do_Key_Event:
-        surface->ourevent.type  = gr_event_key;
-        surface->eventToProcess = 1;
-      }
-      break;
-
     default:
        return DefWindowProc( handle, mess, wParam, lParam );
     }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]