summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey V. Udaltsov <svu@src.gnome.org>2007-12-17 21:36:06 +0000
committerSergey V. Udaltsov <svu@src.gnome.org>2007-12-17 21:36:06 +0000
commit11cf6eb73398c3f3f1cd810b44b08b52f9977f54 (patch)
treeb3f6e8f8fd5eea2963bc1215ea950f9274ba9cc6
parentfcff2e3c33dca7a73d83e82054ecdaa555a228ab (diff)
downloadlibgnomekbd-LIBGNOMEKBD_2_21_4_1.tar.gz
moving printing functions from g-c-c to libgnomekbd. fix crash on indicators. prepare 2.21.4.1LIBGNOMEKBD_2_21_4_1
svn path=/trunk/; revision=210
-rw-r--r--ChangeLog7
-rw-r--r--NEWS4
-rw-r--r--configure.in2
-rw-r--r--libgnomekbd/gkbd-keyboard-drawing.c215
-rw-r--r--libgnomekbd/gkbd-keyboard-drawing.h7
5 files changed, 176 insertions, 59 deletions
diff --git a/ChangeLog b/ChangeLog
index c7a347b..d0022ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-12-17 svu
+
+ * libgnomekbd/gkbd-keyboard-drawing.c,
+ libgnomekbd/gkbd-keyboard-drawing.h: moved printing function from
+ g-c-c
+ * configure.in, NEWS: release 2.21.4.1
+
2007-12-16 svu
* capplet/gkbd-indicator-plugins-add.c: i18n patch, no libbonobo, gi18n
diff --git a/NEWS b/NEWS
index 539239f..f97d8b9 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+2.21.4.1:
+ Fix for the indicators crash in keyboard drawing,
+ Keyboard drawing printing functions moved to libgnomekbd, from g-c-c
+
2.21.4:
Render keyboard to cairo, making printing possible.
Build tests optionally.
diff --git a/configure.in b/configure.in
index d6b9888..f335c4c 100644
--- a/configure.in
+++ b/configure.in
@@ -1,7 +1,7 @@
dnl ***************************************************************************
dnl *** configure.in for libgnomekbd ***
dnl ***************************************************************************
-AC_INIT(libgnomekbd, 2.21.4, [http://bugzilla.gnome.org/enter_bug.cgi?product=libgnomekbd])
+AC_INIT(libgnomekbd, 2.21.4.1, [http://bugzilla.gnome.org/enter_bug.cgi?product=libgnomekbd])
AC_PREREQ(2.59)
VERSION_INFO=2:0:0
diff --git a/libgnomekbd/gkbd-keyboard-drawing.c b/libgnomekbd/gkbd-keyboard-drawing.c
index 6937366..c7daa2d 100644
--- a/libgnomekbd/gkbd-keyboard-drawing.c
+++ b/libgnomekbd/gkbd-keyboard-drawing.c
@@ -26,6 +26,7 @@
#include <stdlib.h>
#include <memory.h>
#include <math.h>
+#include <glib/gi18n.h>
#include <gkbd-keyboard-drawing.h>
#include <gkbd-keyboard-drawing-marshal.h>
@@ -51,7 +52,8 @@ xkb_to_pixmap_coord (GkbdKeyboardDrawingRenderContext * context, gint n)
}
static gdouble
-xkb_to_pixmap_double (GkbdKeyboardDrawingRenderContext * context, gdouble d)
+xkb_to_pixmap_double (GkbdKeyboardDrawingRenderContext * context,
+ gdouble d)
{
return d * context->scale_numerator / context->scale_denominator;
}
@@ -352,7 +354,7 @@ curve_rectangle (cairo_t * cr,
}
static void
-draw_curve_rectangle (cairo_t *cr,
+draw_curve_rectangle (cairo_t * cr,
gboolean filled,
GdkColor * fill_color,
gint x, gint y, gint width, gint height, gint radius)
@@ -374,7 +376,7 @@ draw_rectangle (GkbdKeyboardDrawingRenderContext * context,
gint angle,
gint xkb_x, gint xkb_y, gint xkb_width, gint xkb_height,
gint radius)
-{
+{
if (angle == 0) {
gint x, y, width, height;
gboolean filled;
@@ -779,7 +781,7 @@ draw_pango_layout (GkbdKeyboardDrawingRenderContext * context,
GkbdKeyboardDrawing * drawing,
gint angle, gint x, gint y)
{
- PangoLayout * layout = context->layout;
+ PangoLayout *layout = context->layout;
GdkColor *color;
PangoLayoutLine *line;
gint x_off, y_off;
@@ -792,8 +794,8 @@ draw_pango_layout (GkbdKeyboardDrawingRenderContext * context,
if (angle != context->angle) {
PangoMatrix matrix = PANGO_MATRIX_INIT;
pango_matrix_rotate (&matrix, -angle / 10.0);
- pango_context_set_matrix (pango_layout_get_context (layout),
- &matrix);
+ pango_context_set_matrix (pango_layout_get_context
+ (layout), &matrix);
pango_layout_context_changed (layout);
context->angle = angle;
}
@@ -801,8 +803,7 @@ draw_pango_layout (GkbdKeyboardDrawingRenderContext * context,
i = 0;
y_off = 0;
for (line = pango_layout_get_line (layout, i);
- line != NULL;
- line = pango_layout_get_line (layout, ++i)) {
+ line != NULL; line = pango_layout_get_line (layout, ++i)) {
GSList *runp;
PangoRectangle line_extents;
@@ -824,7 +825,8 @@ draw_pango_layout (GkbdKeyboardDrawingRenderContext * context,
pango_layout_line_get_extents (line, NULL, &line_extents);
y_off +=
- line_extents.height + pango_layout_get_spacing (layout);
+ line_extents.height +
+ pango_layout_get_spacing (layout);
}
cairo_move_to (context->cr, x, y);
@@ -895,7 +897,7 @@ draw_key_label_helper (GkbdKeyboardDrawingRenderContext * context,
PANGO_SCALE);
cairo_save (context->cr);
cairo_rectangle (context->cr, x + padding / 2, y + padding / 2,
- width - padding, height - padding);
+ width - padding, height - padding);
cairo_clip (context->cr);
draw_pango_layout (context, drawing, angle, label_x, label_y);
cairo_restore (context->cr);
@@ -954,9 +956,9 @@ draw_key_label (GkbdKeyboardDrawingRenderContext * context,
XkbBuildCoreState
(drawing->mods, g),
&mods_rtrn, &keysym)) {
- draw_key_label_helper (context, drawing, keysym,
- angle, glp, x, y,
- width, height,
+ draw_key_label_helper (context, drawing,
+ keysym, angle, glp,
+ x, y, width, height,
padding);
/* reverse y order */
}
@@ -966,9 +968,9 @@ draw_key_label (GkbdKeyboardDrawingRenderContext * context,
keysym =
XkbKeySymEntry (drawing->xkb, keycode, l, g);
- draw_key_label_helper (context, drawing, keysym, angle,
- glp, x, y, width, height,
- padding);
+ draw_key_label_helper (context, drawing, keysym,
+ angle, glp, x, y, width,
+ height, padding);
/* reverse y order */
}
}
@@ -977,8 +979,7 @@ draw_key_label (GkbdKeyboardDrawingRenderContext * context,
/* groups are from 0-3 */
static void
draw_key (GkbdKeyboardDrawingRenderContext * context,
- GkbdKeyboardDrawing * drawing,
- GkbdKeyboardDrawingKey * key)
+ GkbdKeyboardDrawing * drawing, GkbdKeyboardDrawingKey * key)
{
XkbShapeRec *shape;
GdkColor *color;
@@ -1068,12 +1069,16 @@ invalidate_region (GkbdKeyboardDrawing * drawing,
MAX (MAX (points[0].y, points[1].y),
MAX (points[2].y, points[3].y));
- x = xkb_to_pixmap_coord (drawing->renderContext, origin_x + x_min) - 6;
- y = xkb_to_pixmap_coord (drawing->renderContext, origin_y + y_min) - 6;
- width = xkb_to_pixmap_coord (drawing->renderContext,
- x_max - x_min) + 12;
- height = xkb_to_pixmap_coord (drawing->renderContext,
- y_max - y_min) + 12;
+ x = xkb_to_pixmap_coord (drawing->renderContext,
+ origin_x + x_min) - 6;
+ y = xkb_to_pixmap_coord (drawing->renderContext,
+ origin_y + y_min) - 6;
+ width =
+ xkb_to_pixmap_coord (drawing->renderContext,
+ x_max - x_min) + 12;
+ height =
+ xkb_to_pixmap_coord (drawing->renderContext,
+ y_max - y_min) + 12;
gtk_widget_queue_draw_area (GTK_WIDGET (drawing), x, y, width,
height);
@@ -1224,43 +1229,46 @@ draw_doodad (GkbdKeyboardDrawingRenderContext * context,
}
typedef struct {
- GkbdKeyboardDrawing * drawing;
- GkbdKeyboardDrawingRenderContext * context;
+ GkbdKeyboardDrawing *drawing;
+ GkbdKeyboardDrawingRenderContext *context;
} DrawKeyboardItemData;
static void
redraw_overlapping_doodads (GkbdKeyboardDrawingRenderContext * context,
- GkbdKeyboardDrawing * drawing,
- GkbdKeyboardDrawingKey * key)
+ GkbdKeyboardDrawing * drawing,
+ GkbdKeyboardDrawingKey * key)
{
- GList *list;
- gboolean do_draw = FALSE;
+ GList *list;
+ gboolean do_draw = FALSE;
- for (list = drawing->keyboard_items; list; list = list->next)
- {
- GkbdKeyboardDrawingItem * item = list->data;
+ for (list = drawing->keyboard_items; list; list = list->next) {
+ GkbdKeyboardDrawingItem *item = list->data;
- if (do_draw && item->type == GKBD_KEYBOARD_DRAWING_ITEM_TYPE_DOODAD)
- draw_doodad (context, drawing, (GkbdKeyboardDrawingDoodad *) item);
+ if (do_draw
+ && item->type ==
+ GKBD_KEYBOARD_DRAWING_ITEM_TYPE_DOODAD)
+ draw_doodad (context, drawing,
+ (GkbdKeyboardDrawingDoodad *) item);
- if (list->data == key)
- do_draw = TRUE;
- }
+ if (list->data == key)
+ do_draw = TRUE;
+ }
}
static void
draw_keyboard_item (GkbdKeyboardDrawingItem * item,
- DrawKeyboardItemData *data)
+ DrawKeyboardItemData * data)
{
- GkbdKeyboardDrawing * drawing = data->drawing;
- GkbdKeyboardDrawingRenderContext * context = data->context;
+ GkbdKeyboardDrawing *drawing = data->drawing;
+ GkbdKeyboardDrawingRenderContext *context = data->context;
if (!drawing->xkb)
return;
switch (item->type) {
case GKBD_KEYBOARD_DRAWING_ITEM_TYPE_KEY:
- draw_key (context, drawing, (GkbdKeyboardDrawingKey *) item);
+ draw_key (context, drawing,
+ (GkbdKeyboardDrawingKey *) item);
break;
case GKBD_KEYBOARD_DRAWING_ITEM_TYPE_DOODAD:
@@ -1287,9 +1295,9 @@ create_cairo (GkbdKeyboardDrawing * drawing)
{
GtkStateType state = GTK_WIDGET_STATE (GTK_WIDGET (drawing));
drawing->renderContext->cr =
- gdk_cairo_create (GDK_DRAWABLE (drawing->pixmap));
+ gdk_cairo_create (GDK_DRAWABLE (drawing->pixmap));
drawing->renderContext->dark_color =
- &GTK_WIDGET (drawing)->style->dark[state];
+ &GTK_WIDGET (drawing)->style->dark[state];
}
static void
@@ -1328,9 +1336,9 @@ draw_keyboard (GkbdKeyboardDrawing * drawing)
static void
alloc_render_context (GkbdKeyboardDrawing * drawing)
{
- GkbdKeyboardDrawingRenderContext * context =
- drawing->renderContext =
- g_new0(GkbdKeyboardDrawingRenderContext, 1);
+ GkbdKeyboardDrawingRenderContext *context =
+ drawing->renderContext =
+ g_new0 (GkbdKeyboardDrawingRenderContext, 1);
PangoContext *pangoContext =
gtk_widget_get_pango_context (GTK_WIDGET (drawing));
@@ -1348,7 +1356,7 @@ alloc_render_context (GkbdKeyboardDrawing * drawing)
static void
free_render_context (GkbdKeyboardDrawing * drawing)
{
- GkbdKeyboardDrawingRenderContext * context = drawing->renderContext;
+ GkbdKeyboardDrawingRenderContext *context = drawing->renderContext;
g_object_unref (G_OBJECT (context->layout));
pango_font_description_free (context->font_desc);
@@ -1439,7 +1447,7 @@ static void
size_allocate (GtkWidget * widget,
GtkAllocation * allocation, GkbdKeyboardDrawing * drawing)
{
- GkbdKeyboardDrawingRenderContext * context = drawing->renderContext;
+ GkbdKeyboardDrawingRenderContext *context = drawing->renderContext;
if (drawing->pixmap) {
g_object_unref (drawing->pixmap);
@@ -1878,6 +1886,7 @@ xkb_state_notify_event_filter (GdkXEvent * gdkxev,
physical_indicators
[i]->on =
state;
+ create_cairo (drawing);
draw_doodad
(drawing->
renderContext,
@@ -1885,6 +1894,7 @@ xkb_state_notify_event_filter (GdkXEvent * gdkxev,
drawing->
physical_indicators
[i]);
+ destroy_cairo (drawing);
invalidate_indicator_doodad_region
(drawing,
drawing->
@@ -2121,7 +2131,7 @@ gkbd_keyboard_drawing_set_mods (GkbdKeyboardDrawing * drawing, guint mods)
GdkPixbuf *
gkbd_keyboard_drawing_get_pixbuf (GkbdKeyboardDrawing * drawing)
{
- GkbdKeyboardDrawingRenderContext * context = drawing->renderContext;
+ GkbdKeyboardDrawingRenderContext *context = drawing->renderContext;
if (drawing->pixmap == NULL)
draw_keyboard (drawing);
@@ -2156,12 +2166,13 @@ gkbd_keyboard_drawing_get_pixbuf (GkbdKeyboardDrawing * drawing)
*
* @returns: %TRUE on success, %FALSE on failure
*/
-gboolean gkbd_keyboard_drawing_render (GkbdKeyboardDrawing * drawing,
- cairo_t * cr,
- PangoLayout * layout,
- double x, double y,
- double width, double height,
- double dpi_x, double dpi_y)
+gboolean
+gkbd_keyboard_drawing_render (GkbdKeyboardDrawing * drawing,
+ cairo_t * cr,
+ PangoLayout * layout,
+ double x, double y,
+ double width, double height,
+ double dpi_x, double dpi_y)
{
GkbdKeyboardDrawingRenderContext context = {
cr,
@@ -2171,7 +2182,7 @@ gboolean gkbd_keyboard_drawing_render (GkbdKeyboardDrawing * drawing,
font_desc),
1, 1,
&GTK_WIDGET (drawing)->style->dark[GTK_WIDGET_STATE
- (GTK_WIDGET (drawing))]
+ (GTK_WIDGET (drawing))]
};
if (!context_setup_scaling (&context, drawing, width, height,
@@ -2331,3 +2342,93 @@ gkbd_keyboard_drawing_set_groups_levels (GkbdKeyboardDrawing * drawing,
gtk_widget_queue_draw (GTK_WIDGET (drawing));
}
+
+typedef struct {
+ GkbdKeyboardDrawing *drawing;
+ const gchar *description;
+} XkbLayoutPreviewPrintData;
+
+static void
+gkbd_keyboard_drawing_begin_print (GtkPrintOperation * operation,
+ GtkPrintContext * context,
+ XkbLayoutPreviewPrintData * data)
+{
+ /* We always print single-page documents */
+ gtk_print_operation_set_n_pages (operation, 1);
+}
+
+static void
+gkbd_keyboard_drawing_draw_page (GtkPrintOperation * operation,
+ GtkPrintContext * context,
+ gint page_nr,
+ XkbLayoutPreviewPrintData * data)
+{
+ cairo_t *cr = gtk_print_context_get_cairo_context (context);
+ PangoLayout *layout =
+ gtk_print_context_create_pango_layout (context);
+ PangoFontDescription *desc =
+ pango_font_description_from_string ("sans 8");
+ gdouble width = gtk_print_context_get_width (context);
+ gdouble height = gtk_print_context_get_height (context);
+ gdouble dpi_x = gtk_print_context_get_dpi_x (context);
+ gdouble dpi_y = gtk_print_context_get_dpi_y (context);
+ gchar *header;
+
+ gtk_print_operation_set_unit (operation, GTK_PIXELS);
+
+ header = g_strdup_printf
+ (_("%s keyboard drawn by Gnome\n"
+ "Copyright &#169; X.Org Foundation and "
+ "XKeyboardConfig contributors\n"
+ "For licensing see package metadata"), data->description);
+ pango_layout_set_markup (layout, header, -1);
+ pango_layout_set_font_description (layout, desc);
+ pango_font_description_free (desc);
+ pango_layout_set_width (layout, pango_units_from_double (width));
+ pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_move_to (cr, 0, 0);
+ pango_cairo_show_layout (cr, layout);
+
+ gkbd_keyboard_drawing_render (GKBD_KEYBOARD_DRAWING
+ (data->drawing), cr, layout, 0.0,
+ 0.0, width, height, dpi_x, dpi_y);
+
+ g_object_unref (layout);
+}
+
+void
+gkbd_keyboard_drawing_print (GkbdKeyboardDrawing * drawing,
+ GtkWindow * parent_window,
+ const gchar * description)
+{
+ GtkPrintOperation *print;
+ GtkPrintOperationResult res;
+ static GtkPrintSettings *settings = NULL;
+ XkbLayoutPreviewPrintData data = { drawing, description };
+
+ print = gtk_print_operation_new ();
+
+ if (settings != NULL)
+ gtk_print_operation_set_print_settings (print, settings);
+
+ g_signal_connect (print, "begin_print",
+ G_CALLBACK (gkbd_keyboard_drawing_begin_print),
+ &data);
+ g_signal_connect (print, "draw_page",
+ G_CALLBACK (gkbd_keyboard_drawing_draw_page),
+ &data);
+
+ res = gtk_print_operation_run (print,
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+ parent_window, NULL);
+
+ if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
+ if (settings != NULL)
+ g_object_unref (settings);
+ settings = gtk_print_operation_get_print_settings (print);
+ g_object_ref (settings);
+ }
+
+ g_object_unref (print);
+}
diff --git a/libgnomekbd/gkbd-keyboard-drawing.h b/libgnomekbd/gkbd-keyboard-drawing.h
index 8e7cf81..93f0fa7 100644
--- a/libgnomekbd/gkbd-keyboard-drawing.h
+++ b/libgnomekbd/gkbd-keyboard-drawing.h
@@ -104,7 +104,7 @@ struct _GkbdKeyboardDrawingGroupLevel {
};
struct _GkbdKeyboardDrawingRenderContext {
- cairo_t * cr;
+ cairo_t *cr;
gint angle; /* current angle pango is set to draw at, in tenths of a degree */
PangoLayout *layout;
@@ -200,5 +200,10 @@ void gkbd_keyboard_drawing_set_groups_levels (GkbdKeyboardDrawing *
GkbdKeyboardDrawingGroupLevel
* groupLevels[]);
+
+void gkbd_keyboard_drawing_print (GkbdKeyboardDrawing * drawing,
+ GtkWindow * parent_window,
+ const gchar * description);
+
G_END_DECLS
#endif /* #ifndef GKBD_KEYBOARD_DRAWING_H */