comparison gtk3/dw.c @ 1930:fe04bcfd5b65

GTK3: Need to use cairo region in that new code or else drawing functions crash.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 02 Jun 2017 23:25:15 +0000
parents 25da63f0eddc
children 3a5571255ee6
comparison
equal deleted inserted replaced
1929:25da63f0eddc 1930:fe04bcfd5b65
7170 { 7170 {
7171 int _locked_by_me = FALSE; 7171 int _locked_by_me = FALSE;
7172 cairo_t *cr = NULL; 7172 cairo_t *cr = NULL;
7173 #if GTK_CHECK_VERSION(3,22,0) 7173 #if GTK_CHECK_VERSION(3,22,0)
7174 GdkDrawingContext *dc = NULL; 7174 GdkDrawingContext *dc = NULL;
7175 cairo_region_t *clip = NULL;
7175 #endif 7176 #endif
7176 7177
7177 DW_MUTEX_LOCK; 7178 DW_MUTEX_LOCK;
7178 if(handle) 7179 if(handle)
7179 { 7180 {
7183 { 7184 {
7184 DW_MUTEX_UNLOCK; 7185 DW_MUTEX_UNLOCK;
7185 return; 7186 return;
7186 } 7187 }
7187 #if GTK_CHECK_VERSION(3,22,0) 7188 #if GTK_CHECK_VERSION(3,22,0)
7188 dc = gdk_window_begin_draw_frame(window, NULL); 7189 clip = gdk_window_get_clip_region(window);
7190 dc = gdk_window_begin_draw_frame(window, clip);
7189 cr = gdk_drawing_context_get_cairo_context(dc); 7191 cr = gdk_drawing_context_get_cairo_context(dc);
7190 #else 7192 #else
7191 cr = gdk_cairo_create(window); 7193 cr = gdk_cairo_create(window);
7192 #endif 7194 #endif
7193 } 7195 }
7200 gdk_cairo_set_source_rgba(cr, foreground); 7202 gdk_cairo_set_source_rgba(cr, foreground);
7201 cairo_set_line_width(cr, 1); 7203 cairo_set_line_width(cr, 1);
7202 cairo_move_to(cr, x, y); 7204 cairo_move_to(cr, x, y);
7203 cairo_stroke(cr); 7205 cairo_stroke(cr);
7204 #if GTK_CHECK_VERSION(3,22,0) 7206 #if GTK_CHECK_VERSION(3,22,0)
7207 if(clip)
7208 cairo_region_destroy(clip);
7205 /* If we are using a drawing context... 7209 /* If we are using a drawing context...
7206 * we don't own the cairo context so don't destroy it. 7210 * we don't own the cairo context so don't destroy it.
7207 */ 7211 */
7208 if(!dc) 7212 if(dc)
7213 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc);
7214 else
7209 #endif 7215 #endif
7210 cairo_destroy(cr); 7216 cairo_destroy(cr);
7211 } 7217 }
7212 DW_MUTEX_UNLOCK; 7218 DW_MUTEX_UNLOCK;
7213 } 7219 }
7225 { 7231 {
7226 int _locked_by_me = FALSE; 7232 int _locked_by_me = FALSE;
7227 cairo_t *cr = NULL; 7233 cairo_t *cr = NULL;
7228 #if GTK_CHECK_VERSION(3,22,0) 7234 #if GTK_CHECK_VERSION(3,22,0)
7229 GdkDrawingContext *dc = NULL; 7235 GdkDrawingContext *dc = NULL;
7236 cairo_region_t *clip = NULL;
7230 #endif 7237 #endif
7231 7238
7232 DW_MUTEX_LOCK; 7239 DW_MUTEX_LOCK;
7233 if(handle) 7240 if(handle)
7234 { 7241 {
7238 { 7245 {
7239 DW_MUTEX_UNLOCK; 7246 DW_MUTEX_UNLOCK;
7240 return; 7247 return;
7241 } 7248 }
7242 #if GTK_CHECK_VERSION(3,22,0) 7249 #if GTK_CHECK_VERSION(3,22,0)
7243 dc = gdk_window_begin_draw_frame(window, NULL); 7250 clip = gdk_window_get_clip_region(window);
7251 dc = gdk_window_begin_draw_frame(window, clip);
7244 cr = gdk_drawing_context_get_cairo_context(dc); 7252 cr = gdk_drawing_context_get_cairo_context(dc);
7245 #else 7253 #else
7246 cr = gdk_cairo_create(window); 7254 cr = gdk_cairo_create(window);
7247 #endif 7255 #endif
7248 } 7256 }
7256 cairo_set_line_width(cr, 1); 7264 cairo_set_line_width(cr, 1);
7257 cairo_move_to(cr, x1, y1); 7265 cairo_move_to(cr, x1, y1);
7258 cairo_line_to(cr, x2, y2); 7266 cairo_line_to(cr, x2, y2);
7259 cairo_stroke(cr); 7267 cairo_stroke(cr);
7260 #if GTK_CHECK_VERSION(3,22,0) 7268 #if GTK_CHECK_VERSION(3,22,0)
7269 if(clip)
7270 cairo_region_destroy(clip);
7261 /* If we are using a drawing context... 7271 /* If we are using a drawing context...
7262 * we don't own the cairo context so don't destroy it. 7272 * we don't own the cairo context so don't destroy it.
7263 */ 7273 */
7264 if(!dc) 7274 if(dc)
7275 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc);
7276 else
7265 #endif 7277 #endif
7266 cairo_destroy(cr); 7278 cairo_destroy(cr);
7267 } 7279 }
7268 DW_MUTEX_UNLOCK; 7280 DW_MUTEX_UNLOCK;
7269 } 7281 }
7282 int _locked_by_me = FALSE; 7294 int _locked_by_me = FALSE;
7283 cairo_t *cr = NULL; 7295 cairo_t *cr = NULL;
7284 int z; 7296 int z;
7285 #if GTK_CHECK_VERSION(3,22,0) 7297 #if GTK_CHECK_VERSION(3,22,0)
7286 GdkDrawingContext *dc = NULL; 7298 GdkDrawingContext *dc = NULL;
7299 cairo_region_t *clip = NULL;
7287 #endif 7300 #endif
7288 7301
7289 DW_MUTEX_LOCK; 7302 DW_MUTEX_LOCK;
7290 if(handle) 7303 if(handle)
7291 { 7304 {
7295 { 7308 {
7296 DW_MUTEX_UNLOCK; 7309 DW_MUTEX_UNLOCK;
7297 return; 7310 return;
7298 } 7311 }
7299 #if GTK_CHECK_VERSION(3,22,0) 7312 #if GTK_CHECK_VERSION(3,22,0)
7300 dc = gdk_window_begin_draw_frame(window, NULL); 7313 clip = gdk_window_get_clip_region(window);
7314 dc = gdk_window_begin_draw_frame(window, clip);
7301 cr = gdk_drawing_context_get_cairo_context(dc); 7315 cr = gdk_drawing_context_get_cairo_context(dc);
7302 #else 7316 #else
7303 cr = gdk_cairo_create(window); 7317 cr = gdk_cairo_create(window);
7304 #endif 7318 #endif
7305 } 7319 }
7321 } 7335 }
7322 if(flags & DW_DRAW_FILL) 7336 if(flags & DW_DRAW_FILL)
7323 cairo_fill(cr); 7337 cairo_fill(cr);
7324 cairo_stroke(cr); 7338 cairo_stroke(cr);
7325 #if GTK_CHECK_VERSION(3,22,0) 7339 #if GTK_CHECK_VERSION(3,22,0)
7340 if(clip)
7341 cairo_region_destroy(clip);
7326 /* If we are using a drawing context... 7342 /* If we are using a drawing context...
7327 * we don't own the cairo context so don't destroy it. 7343 * we don't own the cairo context so don't destroy it.
7328 */ 7344 */
7329 if(!dc) 7345 if(dc)
7346 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc);
7347 else
7330 #endif 7348 #endif
7331 cairo_destroy(cr); 7349 cairo_destroy(cr);
7332 } 7350 }
7333 DW_MUTEX_UNLOCK; 7351 DW_MUTEX_UNLOCK;
7334 } 7352 }
7347 { 7365 {
7348 int _locked_by_me = FALSE; 7366 int _locked_by_me = FALSE;
7349 cairo_t *cr = NULL; 7367 cairo_t *cr = NULL;
7350 #if GTK_CHECK_VERSION(3,22,0) 7368 #if GTK_CHECK_VERSION(3,22,0)
7351 GdkDrawingContext *dc = NULL; 7369 GdkDrawingContext *dc = NULL;
7370 cairo_region_t *clip = NULL;
7352 #endif 7371 #endif
7353 7372
7354 DW_MUTEX_LOCK; 7373 DW_MUTEX_LOCK;
7355 if(handle) 7374 if(handle)
7356 { 7375 {
7360 { 7379 {
7361 DW_MUTEX_UNLOCK; 7380 DW_MUTEX_UNLOCK;
7362 return; 7381 return;
7363 } 7382 }
7364 #if GTK_CHECK_VERSION(3,22,0) 7383 #if GTK_CHECK_VERSION(3,22,0)
7365 dc = gdk_window_begin_draw_frame(window, NULL); 7384 clip = gdk_window_get_clip_region(window);
7385 dc = gdk_window_begin_draw_frame(window, clip);
7366 cr = gdk_drawing_context_get_cairo_context(dc); 7386 cr = gdk_drawing_context_get_cairo_context(dc);
7367 #else 7387 #else
7368 cr = gdk_cairo_create(window); 7388 cr = gdk_cairo_create(window);
7369 #endif 7389 #endif
7370 } 7390 }
7385 cairo_line_to(cr, x + width, y); 7405 cairo_line_to(cr, x + width, y);
7386 if(flags & DW_DRAW_FILL) 7406 if(flags & DW_DRAW_FILL)
7387 cairo_fill(cr); 7407 cairo_fill(cr);
7388 cairo_stroke(cr); 7408 cairo_stroke(cr);
7389 #if GTK_CHECK_VERSION(3,22,0) 7409 #if GTK_CHECK_VERSION(3,22,0)
7410 if(clip)
7411 cairo_region_destroy(clip);
7390 /* If we are using a drawing context... 7412 /* If we are using a drawing context...
7391 * we don't own the cairo context so don't destroy it. 7413 * we don't own the cairo context so don't destroy it.
7392 */ 7414 */
7393 if(!dc) 7415 if(dc)
7416 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc);
7417 else
7394 #endif 7418 #endif
7395 cairo_destroy(cr); 7419 cairo_destroy(cr);
7396 } 7420 }
7397 DW_MUTEX_UNLOCK; 7421 DW_MUTEX_UNLOCK;
7398 } 7422 }
7414 { 7438 {
7415 int _locked_by_me = FALSE; 7439 int _locked_by_me = FALSE;
7416 cairo_t *cr = NULL; 7440 cairo_t *cr = NULL;
7417 #if GTK_CHECK_VERSION(3,22,0) 7441 #if GTK_CHECK_VERSION(3,22,0)
7418 GdkDrawingContext *dc = NULL; 7442 GdkDrawingContext *dc = NULL;
7443 cairo_region_t *clip = NULL;
7419 #endif 7444 #endif
7420 7445
7421 DW_MUTEX_LOCK; 7446 DW_MUTEX_LOCK;
7422 if(handle) 7447 if(handle)
7423 { 7448 {
7427 { 7452 {
7428 DW_MUTEX_UNLOCK; 7453 DW_MUTEX_UNLOCK;
7429 return; 7454 return;
7430 } 7455 }
7431 #if GTK_CHECK_VERSION(3,22,0) 7456 #if GTK_CHECK_VERSION(3,22,0)
7432 dc = gdk_window_begin_draw_frame(window, NULL); 7457 clip = gdk_window_get_clip_region(window);
7458 dc = gdk_window_begin_draw_frame(window, clip);
7433 cr = gdk_drawing_context_get_cairo_context(dc); 7459 cr = gdk_drawing_context_get_cairo_context(dc);
7434 #else 7460 #else
7435 cr = gdk_cairo_create(window); 7461 cr = gdk_cairo_create(window);
7436 #endif 7462 #endif
7437 } 7463 }
7464 } 7490 }
7465 if(flags & DW_DRAW_FILL) 7491 if(flags & DW_DRAW_FILL)
7466 cairo_fill(cr); 7492 cairo_fill(cr);
7467 cairo_stroke(cr); 7493 cairo_stroke(cr);
7468 #if GTK_CHECK_VERSION(3,22,0) 7494 #if GTK_CHECK_VERSION(3,22,0)
7495 if(clip)
7496 cairo_region_destroy(clip);
7469 /* If we are using a drawing context... 7497 /* If we are using a drawing context...
7470 * we don't own the cairo context so don't destroy it. 7498 * we don't own the cairo context so don't destroy it.
7471 */ 7499 */
7472 if(!dc) 7500 if(dc)
7501 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc);
7502 else
7473 #endif 7503 #endif
7474 cairo_destroy(cr); 7504 cairo_destroy(cr);
7475 } 7505 }
7476 DW_MUTEX_UNLOCK; 7506 DW_MUTEX_UNLOCK;
7477 } 7507 }
7490 cairo_t *cr = NULL; 7520 cairo_t *cr = NULL;
7491 PangoFontDescription *font; 7521 PangoFontDescription *font;
7492 char *tmpname, *fontname = "monospace 10"; 7522 char *tmpname, *fontname = "monospace 10";
7493 #if GTK_CHECK_VERSION(3,22,0) 7523 #if GTK_CHECK_VERSION(3,22,0)
7494 GdkDrawingContext *dc = NULL; 7524 GdkDrawingContext *dc = NULL;
7525 cairo_region_t *clip = NULL;
7495 #endif 7526 #endif
7496 7527
7497 if(!text) 7528 if(!text)
7498 return; 7529 return;
7499 7530
7506 { 7537 {
7507 DW_MUTEX_UNLOCK; 7538 DW_MUTEX_UNLOCK;
7508 return; 7539 return;
7509 } 7540 }
7510 #if GTK_CHECK_VERSION(3,22,0) 7541 #if GTK_CHECK_VERSION(3,22,0)
7511 dc = gdk_window_begin_draw_frame(window, NULL); 7542 clip = gdk_window_get_clip_region(window);
7543 dc = gdk_window_begin_draw_frame(window, clip);
7512 cr = gdk_drawing_context_get_cairo_context(dc); 7544 cr = gdk_drawing_context_get_cairo_context(dc);
7513 #else 7545 #else
7514 cr = gdk_cairo_create(window); 7546 cr = gdk_cairo_create(window);
7515 #endif 7547 #endif
7516 if((tmpname = (char *)g_object_get_data(G_OBJECT(handle), "_dw_fontname"))) 7548 if((tmpname = (char *)g_object_get_data(G_OBJECT(handle), "_dw_fontname")))
7567 g_object_unref(context); 7599 g_object_unref(context);
7568 } 7600 }
7569 pango_font_description_free(font); 7601 pango_font_description_free(font);
7570 } 7602 }
7571 #if GTK_CHECK_VERSION(3,22,0) 7603 #if GTK_CHECK_VERSION(3,22,0)
7604 if(clip)
7605 cairo_region_destroy(clip);
7572 /* If we are using a drawing context... 7606 /* If we are using a drawing context...
7573 * we don't own the cairo context so don't destroy it. 7607 * we don't own the cairo context so don't destroy it.
7574 */ 7608 */
7575 if(!dc) 7609 if(dc)
7610 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc);
7611 else
7576 #endif 7612 #endif
7577 cairo_destroy(cr); 7613 cairo_destroy(cr);
7578 } 7614 }
7579 DW_MUTEX_UNLOCK; 7615 DW_MUTEX_UNLOCK;
7580 } 7616 }
7916 int _locked_by_me = FALSE; 7952 int _locked_by_me = FALSE;
7917 cairo_t *cr = NULL; 7953 cairo_t *cr = NULL;
7918 int retval = DW_ERROR_GENERAL; 7954 int retval = DW_ERROR_GENERAL;
7919 #if GTK_CHECK_VERSION(3,22,0) 7955 #if GTK_CHECK_VERSION(3,22,0)
7920 GdkDrawingContext *dc = NULL; 7956 GdkDrawingContext *dc = NULL;
7957 cairo_region_t *clip = NULL;
7921 #endif 7958 #endif
7922 7959
7923 if((!dest && (!destp || !destp->image)) || (!src && (!srcp || !srcp->image))) 7960 if((!dest && (!destp || !destp->image)) || (!src && (!srcp || !srcp->image)))
7924 return retval; 7961 return retval;
7925 7962
7932 { 7969 {
7933 DW_MUTEX_UNLOCK; 7970 DW_MUTEX_UNLOCK;
7934 return retval; 7971 return retval;
7935 } 7972 }
7936 #if GTK_CHECK_VERSION(3,22,0) 7973 #if GTK_CHECK_VERSION(3,22,0)
7937 dc = gdk_window_begin_draw_frame(window, NULL); 7974 clip = gdk_window_get_clip_region(window);
7975 dc = gdk_window_begin_draw_frame(window, clip);
7938 cr = gdk_drawing_context_get_cairo_context(dc); 7976 cr = gdk_drawing_context_get_cairo_context(dc);
7939 #else 7977 #else
7940 cr = gdk_cairo_create(window); 7978 cr = gdk_cairo_create(window);
7941 #endif 7979 #endif
7942 } 7980 }
7960 cairo_set_source_surface (cr, srcp->image, (xdest + xsrc) / xscale, (ydest + ysrc) / yscale); 7998 cairo_set_source_surface (cr, srcp->image, (xdest + xsrc) / xscale, (ydest + ysrc) / yscale);
7961 7999
7962 cairo_rectangle(cr, xdest / xscale, ydest / yscale, width, height); 8000 cairo_rectangle(cr, xdest / xscale, ydest / yscale, width, height);
7963 cairo_fill(cr); 8001 cairo_fill(cr);
7964 #if GTK_CHECK_VERSION(3,22,0) 8002 #if GTK_CHECK_VERSION(3,22,0)
8003 if(clip)
8004 cairo_region_destroy(clip);
7965 /* If we are using a drawing context... 8005 /* If we are using a drawing context...
7966 * we don't own the cairo context so don't destroy it. 8006 * we don't own the cairo context so don't destroy it.
7967 */ 8007 */
7968 if(!dc) 8008 if(dc)
8009 gdk_window_end_draw_frame(gtk_widget_get_window(dest), dc);
8010 else
7969 #endif 8011 #endif
7970 cairo_destroy(cr); 8012 cairo_destroy(cr);
7971 retval = DW_ERROR_NONE; 8013 retval = DW_ERROR_NONE;
7972 } 8014 }
7973 DW_MUTEX_UNLOCK; 8015 DW_MUTEX_UNLOCK;