summaryrefslogtreecommitdiff
path: root/libgnomekbd
diff options
context:
space:
mode:
authorSergey V. Udaltsov <svu@src.gnome.org>2007-02-03 23:39:30 +0000
committerSergey V. Udaltsov <svu@src.gnome.org>2007-02-03 23:39:30 +0000
commit8dd1d495567e68d268c00ec0d0d2d0e77d0e2fef (patch)
treeb1caba06e150d1b0ebb65eb484d644092c135ba2 /libgnomekbd
parent75b92799019520c8603a80959e8edcb6321bfde9 (diff)
downloadlibgnomekbd-8dd1d495567e68d268c00ec0d0d2d0e77d0e2fef.tar.gz
performance fixes, b.fd.o#357872
svn path=/trunk/; revision=29
Diffstat (limited to 'libgnomekbd')
-rw-r--r--libgnomekbd/gkbd-keyboard-drawing.c65
-rw-r--r--libgnomekbd/gkbd-keyboard-drawing.h2
2 files changed, 34 insertions, 33 deletions
diff --git a/libgnomekbd/gkbd-keyboard-drawing.c b/libgnomekbd/gkbd-keyboard-drawing.c
index 1d83426..5067d24 100644
--- a/libgnomekbd/gkbd-keyboard-drawing.c
+++ b/libgnomekbd/gkbd-keyboard-drawing.c
@@ -298,25 +298,6 @@ find_keycode (GkbdKeyboardDrawing * drawing, gchar * key_name)
static void
-fit_width (GkbdKeyboardDrawing * drawing, gint width)
-{
- PangoRectangle logical_rect;
- gint old_size;
-
- pango_layout_get_extents (drawing->layout, NULL, &logical_rect);
-
- if (logical_rect.width > 0 && logical_rect.width > width) {
- old_size =
- pango_font_description_get_size (drawing->font_desc);
- pango_font_description_set_size (drawing->font_desc,
- old_size * width /
- logical_rect.width);
- pango_layout_set_font_description (drawing->layout,
- drawing->font_desc);
- }
-}
-
-static void
set_key_label_in_layout (GkbdKeyboardDrawing * drawing,
PangoLayout * layout, guint keyval)
{
@@ -554,7 +535,6 @@ draw_key_label_helper (GkbdKeyboardDrawing * drawing,
gint x,
gint y, gint width, gint height, gint padding)
{
- gint old_size;
gint label_x, label_y, label_max_width, ycell;
if (keysym == 0)
@@ -603,19 +583,10 @@ draw_key_label_helper (GkbdKeyboardDrawing * drawing,
return;
}
set_key_label_in_layout (drawing, drawing->layout, keysym);
-
- old_size = pango_font_description_get_size (drawing->font_desc);
- fit_width (drawing, label_max_width);
-
+ pango_layout_set_width (drawing->layout, label_max_width);
+ label_y -= (pango_layout_get_line_count (drawing->layout) - 1) *
+ (pango_font_description_get_size (drawing->font_desc) / PANGO_SCALE);
draw_layout (drawing, angle, label_x, label_y, drawing->layout);
-
- if (pango_font_description_get_size (drawing->font_desc) !=
- old_size) {
- pango_font_description_set_size (drawing->font_desc,
- old_size);
- pango_layout_set_font_description (drawing->layout,
- drawing->font_desc);
- }
}
static void
@@ -654,6 +625,13 @@ draw_key_label (GkbdKeyboardDrawing * drawing,
|| l >= XkbKeyGroupWidth (drawing->xkb, keycode, g))
continue;
+ /* Skip "exotic" levels like the "Ctrl" level in PC_SYSREQ */
+ if (l > 0) {
+ guint mods = XkbKeyKeyType (drawing->xkb, keycode, g)->mods.mask;
+ if ((mods & (ShiftMask | drawing->l3mod)) == 0)
+ continue;
+ }
+
if (drawing->track_modifiers) {
uint mods_rtrn;
KeySym keysym;
@@ -949,6 +927,7 @@ alloc_pango_layout (GkbdKeyboardDrawing * drawing)
PangoContext *context =
gtk_widget_get_pango_context (GTK_WIDGET (drawing));
drawing->layout = pango_layout_new (context);
+ pango_layout_set_ellipsize (drawing->layout, PANGO_ELLIPSIZE_END);
}
static void
@@ -968,7 +947,7 @@ expose_event (GtkWidget * widget,
return FALSE;
if (drawing->pixmap == NULL)
- draw_keyboard (drawing);
+ return FALSE;
gdk_draw_drawable (widget->window,
widget->style->fg_gc[state],
@@ -988,6 +967,17 @@ expose_event (GtkWidget * widget,
return FALSE;
}
+static gboolean
+idle_redraw (gpointer user_data)
+{
+ GkbdKeyboardDrawing *drawing = user_data;
+
+ drawing->idle_redraw = 0;
+ draw_keyboard (drawing);
+ gtk_widget_queue_draw (GTK_WIDGET (drawing));
+ return FALSE;
+}
+
static void
size_allocate (GtkWidget * widget,
GtkAllocation * allocation, GkbdKeyboardDrawing * drawing)
@@ -1024,6 +1014,9 @@ size_allocate (GtkWidget * widget,
drawing->scale_denominator);
pango_layout_set_font_description (drawing->layout,
drawing->font_desc);
+
+ if (!drawing->idle_redraw)
+ drawing->idle_redraw = g_idle_add (idle_redraw, drawing);
}
static gint
@@ -1488,6 +1481,10 @@ destroy (GkbdKeyboardDrawing * drawing)
g_source_remove (drawing->timeout);
drawing->timeout = 0;
}
+ if (drawing->idle_redraw > 0) {
+ g_source_remove (drawing->idle_redraw);
+ drawing->idle_redraw = 0;
+ }
g_object_unref (drawing->pixmap);
}
@@ -1558,6 +1555,8 @@ gkbd_keyboard_drawing_init (GkbdKeyboardDrawing * drawing)
}
XkbGetNames (drawing->display, XkbAllNamesMask, drawing->xkb);
+ drawing->l3mod = XkbKeysymToModifiers (drawing->display,
+ GDK_ISO_Level3_Shift);
drawing->xkbOnDisplay = TRUE;
diff --git a/libgnomekbd/gkbd-keyboard-drawing.h b/libgnomekbd/gkbd-keyboard-drawing.h
index ab58ba3..2fd4a89 100644
--- a/libgnomekbd/gkbd-keyboard-drawing.h
+++ b/libgnomekbd/gkbd-keyboard-drawing.h
@@ -109,6 +109,7 @@ struct _GkbdKeyboardDrawing {
GdkPixmap *pixmap;
XkbDescRec *xkb;
gboolean xkbOnDisplay;
+ guint l3mod;
gint angle; /* current angle pango is set to draw at, in tenths of a degree */
PangoLayout *layout;
@@ -125,6 +126,7 @@ struct _GkbdKeyboardDrawing {
GdkColor *colors;
guint timeout;
+ guint idle_redraw;
GkbdKeyboardDrawingGroupLevel **groupLevels;