Add support for Gtk+ 3

This commit is contained in:
Pierre Pronchery 2015-10-28 00:56:26 +01:00
parent 236029429e
commit 5d95180dd6

View File

@ -108,14 +108,19 @@ struct _Camera
GtkWidget * widget; GtkWidget * widget;
GtkWidget * window; GtkWidget * window;
PangoFontDescription * bold; PangoFontDescription * bold;
#if !GTK_CHECK_VERSION(3, 0, 0)
GdkGC * gc; GdkGC * gc;
#endif
#if GTK_CHECK_VERSION(2, 18, 0) #if GTK_CHECK_VERSION(2, 18, 0)
GtkWidget * infobar; GtkWidget * infobar;
GtkWidget * infobar_label; GtkWidget * infobar_label;
#endif #endif
GtkWidget * area; GtkWidget * area;
GtkAllocation area_allocation; GtkAllocation area_allocation;
GdkPixbuf * pixbuf;
#if !GTK_CHECK_VERSION(3, 0, 0)
GdkPixmap * pixmap; GdkPixmap * pixmap;
#endif
/* preferences */ /* preferences */
GtkWidget * pr_window; GtkWidget * pr_window;
GtkWidget * pr_hflip; GtkWidget * pr_hflip;
@ -143,10 +148,17 @@ static gboolean _camera_on_can_mmap(GIOChannel * channel,
GIOCondition condition, gpointer data); GIOCondition condition, gpointer data);
static gboolean _camera_on_can_read(GIOChannel * channel, static gboolean _camera_on_can_read(GIOChannel * channel,
GIOCondition condition, gpointer data); GIOCondition condition, gpointer data);
#if GTK_CHECK_VERSION(3, 0, 0)
static gboolean _camera_on_drawing_area_draw(GtkWidget * widget, cairo_t * cr,
gpointer data);
static void _camera_on_drawing_area_size_allocate(GtkWidget * widget,
GdkRectangle * allocation, gpointer data);
#else
static gboolean _camera_on_drawing_area_configure(GtkWidget * widget, static gboolean _camera_on_drawing_area_configure(GtkWidget * widget,
GdkEventConfigure * event, gpointer data); GdkEventConfigure * event, gpointer data);
static gboolean _camera_on_drawing_area_expose(GtkWidget * widget, static gboolean _camera_on_drawing_area_expose(GtkWidget * widget,
GdkEventExpose * event, gpointer data); GdkEventExpose * event, gpointer data);
#endif
static void _camera_on_fullscreen(gpointer data); static void _camera_on_fullscreen(gpointer data);
static void _camera_on_gallery(gpointer data); static void _camera_on_gallery(gpointer data);
static gboolean _camera_on_open(gpointer data); static gboolean _camera_on_open(gpointer data);
@ -220,7 +232,9 @@ Camera * camera_new(GtkWidget * window, GtkAccelGroup * group,
camera->widget = NULL; camera->widget = NULL;
camera->window = window; camera->window = window;
camera->bold = NULL; camera->bold = NULL;
#if !GTK_CHECK_VERSION(3, 0, 0)
camera->gc = NULL; camera->gc = NULL;
#endif
camera->pr_window = NULL; camera->pr_window = NULL;
camera->pp_window = NULL; camera->pp_window = NULL;
/* check for errors */ /* check for errors */
@ -232,7 +246,9 @@ Camera * camera_new(GtkWidget * window, GtkAccelGroup * group,
/* create the window */ /* create the window */
camera->bold = pango_font_description_new(); camera->bold = pango_font_description_new();
pango_font_description_set_weight(camera->bold, PANGO_WEIGHT_BOLD); pango_font_description_set_weight(camera->bold, PANGO_WEIGHT_BOLD);
#if !GTK_CHECK_VERSION(3, 0, 0)
camera->gc = gdk_gc_new(window->window); /* XXX */ camera->gc = gdk_gc_new(window->window); /* XXX */
#endif
camera->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); camera->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
vbox = camera->widget; vbox = camera->widget;
/* toolbar */ /* toolbar */
@ -264,11 +280,21 @@ Camera * camera_new(GtkWidget * window, GtkAccelGroup * group,
gtk_box_pack_start(GTK_BOX(vbox), camera->infobar, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), camera->infobar, FALSE, TRUE, 0);
#endif #endif
camera->area = gtk_drawing_area_new(); camera->area = gtk_drawing_area_new();
camera->pixbuf = NULL;
#if !GTK_CHECK_VERSION(3, 0, 0)
camera->pixmap = NULL; camera->pixmap = NULL;
#endif
#if GTK_CHECK_VERSION(3, 0, 0)
g_signal_connect(camera->area, "draw", G_CALLBACK(
_camera_on_drawing_area_draw), camera);
g_signal_connect(camera->area, "size-allocate", G_CALLBACK(
_camera_on_drawing_area_size_allocate), camera);
#else
g_signal_connect(camera->area, "configure-event", G_CALLBACK( g_signal_connect(camera->area, "configure-event", G_CALLBACK(
_camera_on_drawing_area_configure), camera); _camera_on_drawing_area_configure), camera);
g_signal_connect(camera->area, "expose-event", G_CALLBACK( g_signal_connect(camera->area, "expose-event", G_CALLBACK(
_camera_on_drawing_area_expose), camera); _camera_on_drawing_area_expose), camera);
#endif
gtk_box_pack_start(GTK_BOX(vbox), camera->area, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), camera->area, TRUE, TRUE, 0);
gtk_widget_show_all(vbox); gtk_widget_show_all(vbox);
camera_start(camera); camera_start(camera);
@ -295,10 +321,14 @@ void camera_delete(Camera * camera)
g_io_channel_shutdown(camera->channel, TRUE, NULL); g_io_channel_shutdown(camera->channel, TRUE, NULL);
g_io_channel_unref(camera->channel); g_io_channel_unref(camera->channel);
} }
if(camera->pixbuf != NULL)
g_object_unref(camera->pixbuf);
#if !GTK_CHECK_VERSION(3, 0, 0)
if(camera->pixmap != NULL) if(camera->pixmap != NULL)
g_object_unref(camera->pixmap); g_object_unref(camera->pixmap);
if(camera->gc != NULL) if(camera->gc != NULL)
g_object_unref(camera->gc); g_object_unref(camera->gc);
#endif
if(camera->bold != NULL) if(camera->bold != NULL)
pango_font_description_free(camera->bold); pango_font_description_free(camera->bold);
if(camera->fd >= 0) if(camera->fd >= 0)
@ -1205,6 +1235,35 @@ static gboolean _camera_on_can_read(GIOChannel * channel,
} }
#if GTK_CHECK_VERSION(3, 0, 0)
/* camera_on_drawing_area_draw */
static gboolean _camera_on_drawing_area_draw(GtkWidget * widget, cairo_t * cr,
gpointer data)
{
Camera * camera = data;
(void) widget;
if(camera->pixbuf != NULL)
{
gdk_cairo_set_source_pixbuf(cr, camera->pixbuf, 0, 0);
cairo_paint(cr);
}
return TRUE;
}
/* camera_on_drawing_area_size_allocate */
static void _camera_on_drawing_area_size_allocate(GtkWidget * widget,
GdkRectangle * allocation, gpointer data)
{
Camera * camera = data;
(void) widget;
camera->area_allocation = *allocation;
}
#else
/* camera_on_drawing_area_configure */ /* camera_on_drawing_area_configure */
static gboolean _camera_on_drawing_area_configure(GtkWidget * widget, static gboolean _camera_on_drawing_area_configure(GtkWidget * widget,
GdkEventConfigure * event, gpointer data) GdkEventConfigure * event, gpointer data)
@ -1243,6 +1302,7 @@ static gboolean _camera_on_drawing_area_expose(GtkWidget * widget,
event->area.width, event->area.height); event->area.width, event->area.height);
return FALSE; return FALSE;
} }
#endif
/* camera_on_fullscreen */ /* camera_on_fullscreen */
@ -1490,16 +1550,18 @@ static void _refresh_vflip(Camera * camera, GdkPixbuf ** pixbuf);
static gboolean _camera_on_refresh(gpointer data) static gboolean _camera_on_refresh(gpointer data)
{ {
Camera * camera = data; Camera * camera = data;
#if !GTK_CHECK_VERSION(3, 0, 0)
GtkAllocation * allocation = &camera->area_allocation; GtkAllocation * allocation = &camera->area_allocation;
#endif
int width = camera->format.fmt.pix.width; int width = camera->format.fmt.pix.width;
int height = camera->format.fmt.pix.height; int height = camera->format.fmt.pix.height;
GdkPixbuf * pixbuf;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s() 0x%x\n", __func__, fprintf(stderr, "DEBUG: %s() 0x%x\n", __func__,
camera->format.fmt.pix.pixelformat); camera->format.fmt.pix.pixelformat);
#endif #endif
_refresh_convert(camera); _refresh_convert(camera);
#if !GTK_CHECK_VERSION(3, 0, 0)
if(camera->hflip == FALSE if(camera->hflip == FALSE
&& camera->vflip == FALSE && camera->vflip == FALSE
&& width == allocation->width && width == allocation->width
@ -1510,19 +1572,23 @@ static gboolean _camera_on_refresh(gpointer data)
width, height, GDK_RGB_DITHER_NORMAL, width, height, GDK_RGB_DITHER_NORMAL,
camera->rgb_buffer, width * 3); camera->rgb_buffer, width * 3);
else else
#endif
{ {
if(camera->pixbuf != NULL)
g_object_unref(camera->pixbuf);
/* render after scaling */ /* render after scaling */
pixbuf = gdk_pixbuf_new_from_data(camera->rgb_buffer, camera->pixbuf = gdk_pixbuf_new_from_data(camera->rgb_buffer,
GDK_COLORSPACE_RGB, FALSE, 8, width, height, GDK_COLORSPACE_RGB, FALSE, 8, width, height,
width * 3, NULL, NULL); width * 3, NULL, NULL);
_refresh_hflip(camera, &pixbuf); _refresh_hflip(camera, &camera->pixbuf);
_refresh_vflip(camera, &pixbuf); _refresh_vflip(camera, &camera->pixbuf);
_refresh_scale(camera, &pixbuf); _refresh_scale(camera, &camera->pixbuf);
_refresh_overlays(camera, pixbuf); _refresh_overlays(camera, camera->pixbuf);
gdk_pixbuf_render_to_drawable(pixbuf, camera->pixmap, #if !GTK_CHECK_VERSION(3, 0, 0)
gdk_pixbuf_render_to_drawable(camera->pixbuf, camera->pixmap,
camera->gc, 0, 0, 0, 0, -1, -1, camera->gc, 0, 0, 0, 0, -1, -1,
GDK_RGB_DITHER_NORMAL, 0, 0); GDK_RGB_DITHER_NORMAL, 0, 0);
g_object_unref(pixbuf); #endif
} }
/* force a refresh */ /* force a refresh */
gtk_widget_queue_draw(camera->area); gtk_widget_queue_draw(camera->area);