[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' ) )
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] master fdf8913 3/3: [graph]: Implement resizable X11 windows.,
Alexei Podtelezhnikov <=