Fix issue with expose on GTK+ 3.
This commit is contained in:
parent
5e6b9f068a
commit
bd59b4e9ac
@ -108,15 +108,7 @@ S9xGTKDisplayDriver::output (void *src,
|
||||
height,
|
||||
24);
|
||||
|
||||
#ifndef USE_GTK3
|
||||
cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (drawing_area));
|
||||
#else
|
||||
cairo_rectangle_int_t rect = { x, y, dst_width, dst_height };
|
||||
cairo_region_t *region = cairo_region_create_rectangle (&rect);
|
||||
GdkDrawingContext *context = gdk_window_begin_draw_frame (gtk_widget_get_window (drawing_area),
|
||||
region);
|
||||
cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
|
||||
#endif
|
||||
cairo_t *cr = window->get_cairo ();
|
||||
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, x, y);
|
||||
|
||||
@ -140,13 +132,7 @@ S9xGTKDisplayDriver::output (void *src,
|
||||
cairo_rectangle (cr, x, y, dst_width, dst_height);
|
||||
cairo_fill (cr);
|
||||
|
||||
#ifndef USE_GTK3
|
||||
cairo_destroy (cr);
|
||||
#else
|
||||
gdk_window_end_draw_frame (gtk_widget_get_window (drawing_area), context);
|
||||
cairo_region_destroy (region);
|
||||
#endif
|
||||
|
||||
window->release_cairo ();
|
||||
window->set_mouseable_area (x, y, width, height);
|
||||
|
||||
return;
|
||||
@ -219,22 +205,14 @@ S9xGTKDisplayDriver::clear (void)
|
||||
width = allocation.width;
|
||||
height = allocation.height;
|
||||
|
||||
#ifndef USE_GTK3
|
||||
cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (drawing_area));
|
||||
#else
|
||||
cairo_rectangle_int_t rect = { 0, 0, width, height };
|
||||
cairo_region_t *region = cairo_region_create_rectangle (&rect);
|
||||
GdkDrawingContext *context = gdk_window_begin_draw_frame (gtk_widget_get_window (drawing_area),
|
||||
region);
|
||||
cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
|
||||
#endif
|
||||
cairo_t *cr = window->get_cairo ();
|
||||
|
||||
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
|
||||
|
||||
if (window->last_width <= 0 || window->last_height <= 0)
|
||||
{
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
window->release_cairo ();
|
||||
|
||||
return;
|
||||
}
|
||||
@ -265,12 +243,7 @@ S9xGTKDisplayDriver::clear (void)
|
||||
|
||||
cairo_fill (cr);
|
||||
|
||||
#ifndef USE_GTK3
|
||||
cairo_destroy (cr);
|
||||
#else
|
||||
gdk_window_end_draw_frame (gtk_widget_get_window (drawing_area), context);
|
||||
cairo_region_destroy (region);
|
||||
#endif
|
||||
window->release_cairo ();
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -139,11 +139,14 @@ event_drawingarea_draw (GtkWidget *widget,
|
||||
cairo_t *cr,
|
||||
gpointer data)
|
||||
{
|
||||
((Snes9xWindow *) data)->expose ();
|
||||
Snes9xWindow *window = (Snes9xWindow *) data;
|
||||
window->cr = cr;
|
||||
window->cairo_owned = FALSE;
|
||||
window->expose ();
|
||||
window->cr = NULL;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef USE_GTK3
|
||||
@ -600,6 +603,8 @@ Snes9xWindow::Snes9xWindow (Snes9xConfig *config) :
|
||||
maximized_state = 0;
|
||||
focused = 1;
|
||||
paused_from_focus_loss = 0;
|
||||
cr = NULL;
|
||||
cairo_owned = 0;
|
||||
|
||||
if (gtk_icon_theme_has_icon (gtk_icon_theme_get_default (), "snes9x"))
|
||||
{
|
||||
@ -1952,3 +1957,44 @@ Snes9xWindow::resize_to_multiple (int factor)
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
cairo_t *
|
||||
Snes9xWindow::get_cairo (void)
|
||||
{
|
||||
if (cr)
|
||||
return cr;
|
||||
|
||||
GtkWidget *drawing_area = GTK_WIDGET (this->drawing_area);
|
||||
|
||||
#ifndef USE_GTK3
|
||||
cr = gdk_cairo_create (gtk_widget_get_window (drawing_area));
|
||||
#else
|
||||
GtkAllocation allocation;
|
||||
gtk_widget_get_allocation (drawing_area, &allocation);
|
||||
|
||||
cairo_rectangle_int_t rect = { 0, 0, allocation.width, allocation.height };
|
||||
cairo_region = cairo_region_create_rectangle (&rect);
|
||||
gdk_drawing_context = gdk_window_begin_draw_frame (gtk_widget_get_window (drawing_area),
|
||||
cairo_region);
|
||||
cr = gdk_drawing_context_get_cairo_context (gdk_drawing_context);
|
||||
#endif
|
||||
|
||||
cairo_owned = TRUE;
|
||||
return cr;
|
||||
}
|
||||
|
||||
void
|
||||
Snes9xWindow::release_cairo (void)
|
||||
{
|
||||
if (cairo_owned)
|
||||
{
|
||||
#ifndef USE_GTK3
|
||||
cairo_destroy (cr);
|
||||
#else
|
||||
gdk_window_end_draw_frame (gtk_widget_get_window (GTK_WIDGET (drawing_area)), gdk_drawing_context);
|
||||
cairo_region_destroy (cairo_region);
|
||||
#endif
|
||||
cairo_owned = FALSE;
|
||||
cr = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -62,6 +62,9 @@ class Snes9xWindow : public GtkBuilderWindow
|
||||
void resize_viewport (int width, int height);
|
||||
void expose (void);
|
||||
|
||||
cairo_t *get_cairo (void);
|
||||
void release_cairo (void);
|
||||
|
||||
Snes9xConfig *config;
|
||||
int user_pause, sys_pause;
|
||||
int user_rewind;
|
||||
@ -78,6 +81,12 @@ class Snes9xWindow : public GtkBuilderWindow
|
||||
GdkCursor *default_cursor, *empty_cursor;
|
||||
GtkDrawingArea *drawing_area;
|
||||
GtkWidget *recent_menu;
|
||||
cairo_t *cr;
|
||||
int cairo_owned;
|
||||
#ifdef USE_GTK3
|
||||
GdkDrawingContext *gdk_drawing_context;
|
||||
cairo_region_t *cairo_region;
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct gtk_splash_t {
|
||||
|
Loading…
Reference in New Issue
Block a user