changeset 2360:98d0873d9c05

Rewrite the render code to use the new dw_render_redraw() to trigger expose events instead of calling the expose function directly. This is cleaner and allows GTK4 and GTK3 with Wayland to draw in a single pass.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 12 Mar 2021 15:00:03 +0000
parents 707836e00e5e
children 7d54728064a3
files dwtest.c
diffstat 1 files changed, 33 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/dwtest.c	Tue Mar 09 13:14:15 2021 +0000
+++ b/dwtest.c	Fri Mar 12 15:00:03 2021 +0000
@@ -123,12 +123,15 @@
     filetoolbarbox;
 
 HMENUI mainmenubar,changeable_menu;
-#define CHECKABLE_MENUITEMID 2001
+#define CHECKABLE_MENUITEMID    2001
 #define NONCHECKABLE_MENUITEMID 2002
 
+#define SHAPES_DOUBLE_BUFFERED  0
+#define SHAPES_DIRECT           1
+#define DRAW_FILE               2
+
 void *containerinfo;
 
-
 int menu_enabled = 1;
 
 HPIXMAP text1pm,text2pm,image;
@@ -145,7 +148,7 @@
 int max_linewidth=0;
 int current_row=0,current_col=0;
 int cursor_arrow = 1;
-int render_type = 0;
+int render_type = SHAPES_DOUBLE_BUFFERED;
 
 FILE *fp=NULL;
 char **lp;
@@ -262,7 +265,7 @@
 /* This gets called when a part of the graph needs to be repainted. */
 int DWSIGNAL text_expose(HWND hwnd, DWExpose *exp, void *data)
 {
-    if(render_type != 1)
+    if(render_type != SHAPES_DIRECT)
     {
         HPIXMAP hpm;
         unsigned long width,height;
@@ -345,11 +348,6 @@
             pLine = lp[i+row];
             dw_draw_text( 0, hpm, 0, y, pLine+col );
         }
-        if(!hpma)
-        {
-            text_expose( textbox1, NULL, NULL);
-            text_expose( textbox2, NULL, NULL);
-        }
     }
 }
 
@@ -396,30 +394,39 @@
         else
             dw_pixmap_bitblt(window, pixmap, image_x, image_y, (int)DW_PIXMAP_WIDTH(image), (int)DW_PIXMAP_HEIGHT(image), 0, image, 0, 0);
     }
-
-    /* If we aren't drawing direct do a bitblt */
-    if(!direct && !hpma)
-    {
-        text_expose( textbox2, NULL, NULL);
-    }
 }
 
 void update_render(void)
 {
     switch(render_type)
     {
-        case 0:
+        case SHAPES_DOUBLE_BUFFERED:
             draw_shapes(FALSE, NULL);
             break;
-        case 1:
+        case SHAPES_DIRECT:
             draw_shapes(TRUE, NULL);
             break;
-        case 2:
+        case DRAW_FILE:
             draw_file(current_row, current_col, rows, font_height, NULL);
             break;
     }
 }
 
+/* Request that the render widgets redraw...
+ * If not using direct rendering, call update_render() to
+ * redraw the in memory pixmaps. Then trigger the expose events.
+ * Expose will call update_render() to draw directly or bitblt the pixmaps.
+ */
+void render_draw(void)
+{
+    /* If we are double buffered, draw to the pixmaps */
+    if(render_type != SHAPES_DIRECT)
+        update_render();
+    /* Trigger expose event */
+    dw_render_redraw(textbox1);
+    dw_render_redraw(textbox2);
+}
+
 int DWSIGNAL draw_page(HPRINT print, HPIXMAP pixmap, int page_num, void *data)
 {
    dw_pixmap_set_font(pixmap, FIXEDFONT);
@@ -472,7 +479,7 @@
 
 int DWSIGNAL refresh_callback(HWND window, void *data)
 {
-    update_render();
+    render_draw();
     return FALSE;
 }
 
@@ -480,7 +487,7 @@
 {
     if(index != render_type)
     {
-        if(index == 2)
+        if(index == DRAW_FILE)
         {
             dw_scrollbar_set_range(hscrollbar, max_linewidth, cols);
             dw_scrollbar_set_pos(hscrollbar, 0);
@@ -496,7 +503,7 @@
             dw_scrollbar_set_pos(vscrollbar, 0);
         }
         render_type = index;
-        update_render();
+        render_draw();
     }
     return FALSE;
 }
@@ -611,7 +618,7 @@
         dw_window_set_text( entryfield, current_file );
         read_file();
         current_col = current_row = 0;
-        update_render();
+        render_draw();
         dw_signal_connect(notification, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(notification_clicked_callback), NULL);
         dw_notification_send(notification);
     }
@@ -696,6 +703,7 @@
     {
         HWND stext = (HWND)data;
         char tmpbuf[100];
+
         if ( hwnd == vscrollbar )
         {
             current_row = value;
@@ -706,7 +714,7 @@
         }
         sprintf(tmpbuf, "Row:%d Col:%d Lines:%d Cols:%d", current_row,current_col,num_lines,max_linewidth);
         dw_window_set_text(stext, tmpbuf);
-        update_render();
+        render_draw();
     }
 }
 
@@ -747,8 +755,8 @@
     dw_scrollbar_set_range(hscrollbar, max_linewidth, cols);
     dw_scrollbar_set_range(vscrollbar, num_lines, rows);
 
-    /* Redraw the window */
-    update_render();
+    /* Redraw the render widgets */
+    render_draw();
     return TRUE;
 }