freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master fdf8913 3/3: [graph]: Implement resizable X11 w


From: Alexei Podtelezhnikov
Subject: [freetype2-demos] master fdf8913 3/3: [graph]: Implement resizable X11 windows.
Date: Tue, 19 May 2020 00:51:42 -0400 (EDT)

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

    [graph]: Implement resizable X11 windows.
    
    * graph/grevents.h (gr_event_resize): New event defined.
    * graph/x11/grx11.c (gr_x11_surface_init): Configure window.
    (gr_x11_surface_listen_event): Capture resizing events.
    (gr_x11_surface_resize): Implement resizing.
    
    * src/ftview.c (Process_Event): Redraw on resizing.
    * src/ftgrid.c (Process_Event): Ditto.
---
 ChangeLog         | 12 ++++++++++
 graph/grevents.h  |  7 +++---
 graph/x11/grx11.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/ftgrid.c      |  6 +++++
 src/ftview.c      |  6 +++++
 5 files changed, 95 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e49e4d1..fe56eb8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2020-05-19  Alexei Podtelezhnikov  <address@hidden>
+
+       [graph]: Implement resizable X11 windows.
+
+       * graph/grevents.h (gr_event_resize): New event defined.
+       * graph/x11/grx11.c (gr_x11_surface_init): Configure window.
+       (gr_x11_surface_listen_event): Capture resizing events.
+       (gr_x11_surface_resize): Implement resizing.
+
+       * src/ftview.c (Process_Event): Redraw on resizing.
+       * src/ftgrid.c (Process_Event): Ditto.
+
 2020-05-18  Alexei Podtelezhnikov  <address@hidden>
 
        * graph/grobjs.c (grNewBitmap): Implement bitmap resizing.
diff --git a/graph/grevents.h b/graph/grevents.h
index 4fa7270..fdda25e 100644
--- a/graph/grevents.h
+++ b/graph/grevents.h
@@ -16,10 +16,11 @@
 #define gr_key_up    0x80
 
 
-#define gr_event_mouse  0x3C
-#define gr_event_key    0xC0
+#define gr_event_mouse    0x3C
+#define gr_event_key      0xC0
+#define gr_event_resize  0x100
 
-#define gr_event_type  ( gr_event_mouse | gr_event_key )
+#define gr_event_type  ( gr_event_mouse | gr_event_key | gr_event_resize )
 
 
   typedef enum grKey_
diff --git a/graph/x11/grx11.c b/graph/x11/grx11.c
index 6f99a20..02b7ad3 100644
--- a/graph/x11/grx11.c
+++ b/graph/x11/grx11.c
@@ -1122,6 +1122,56 @@ typedef  unsigned long   uint32;
 
 
   static int
+  gr_x11_surface_resize( grX11Surface*  surface,
+                         int            width,
+                         int            height )
+  {
+    grBitmap*  bitmap  = &surface->root.bitmap;
+    grBitmap*  pximage = &surface->ximage_bitmap;
+    char*      buffer;
+
+
+    /* resize the bitmap */
+    if ( grNewBitmap( bitmap->mode,
+                      bitmap->grays,
+                      width,
+                      height,
+                      bitmap ) )
+      return 0;
+
+    /* reallocate surface image */
+    pximage->pitch  = width * x11dev.format->x_bits_per_pixel >> 3;
+    pximage->width  = width;
+    pximage->rows   = height;
+
+    if ( x11dev.format->x_bits_per_pixel != x11dev.scanline_pad )
+    {
+      int  bits, over;
+
+
+      bits = width * x11dev.format->x_bits_per_pixel;
+      over = bits % x11dev.scanline_pad;
+
+      if ( over )
+        pximage->pitch += ( x11dev.scanline_pad - over ) >> 3;
+    }
+
+    buffer = (char*)realloc( pximage->buffer,
+            (unsigned long)( pximage->pitch * pximage->rows ) );
+    if ( !buffer )
+      return 0;
+
+    pximage->buffer                 = (unsigned char*)buffer;
+    surface->ximage->data           = buffer;
+    surface->ximage->width          = pximage->width;
+    surface->ximage->height         = pximage->rows;
+    surface->ximage->bytes_per_line = pximage->pitch;
+
+    return 1;
+  }
+
+
+  static int
   gr_x11_surface_listen_event( grX11Surface*  surface,
                                int            event_mask,
                                grEvent*       grevent )
@@ -1173,6 +1223,22 @@ typedef  unsigned long   uint32;
         XRefreshKeyboardMapping( &x_event.xmapping );
         break;
 
+      case ConfigureNotify:
+        if ( x_event.xconfigure.width  != surface->ximage->width  ||
+             x_event.xconfigure.height != surface->ximage->height )
+        {
+          grevent->type = gr_event_resize;
+          grevent->x    = x_event.xconfigure.width;
+          grevent->y    = x_event.xconfigure.height;
+
+          gr_x11_surface_resize( surface,
+                                 x_event.xconfigure.width,
+                                 x_event.xconfigure.height );
+
+          return 1;
+        }
+        break;
+
       case Expose:
 #if 1
         /* we don't need to convert the bits on each expose! */
@@ -1313,7 +1379,7 @@ typedef  unsigned long   uint32;
 
 
       xswa.cursor     = x11dev.busy;
-      xswa.event_mask = KeyPressMask | ExposureMask;
+      xswa.event_mask = ExposureMask | KeyPressMask | StructureNotifyMask ;
 
       if ( surface->visual == DefaultVisual( display, screen ) )
         surface->colormap     = DefaultColormap( display, screen );
diff --git a/src/ftgrid.c b/src/ftgrid.c
index 6718c54..29df45f 100644
--- a/src/ftgrid.c
+++ b/src/ftgrid.c
@@ -1377,6 +1377,12 @@
     else
       grListenSurface( display->surface, 0, &event );
 
+    if ( event.type == gr_event_resize )
+    {
+      grid_status_display( &status, display );
+      return ret;
+    }
+
     status.header = NULL;
 
     switch ( event.key )
diff --git a/src/ftview.c b/src/ftview.c
index 8724973..3fc4b3e 100644
--- a/src/ftview.c
+++ b/src/ftview.c
@@ -1131,6 +1131,12 @@
     else
       grListenSurface( display->surface, 0, &event );
 
+    if ( event.type == gr_event_resize )
+    {
+       status.update = 1;
+       return ret;
+    }
+
     status.update = 0;
 
     if ( status.render_mode == (int)( event.key - '1' ) )



reply via email to

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