Control: retitle 994092 gkbd-capplet: keyboard layout display garbled for RTL 
(e.g., Hebrew and Arabic) layouts
Control: forwarded 994092 https://gitlab.gnome.org/GNOME/libgnomekbd/-/issues/8
Control: tags 994092 + patch

On Sat 2021-09-11 16:01:58 +0100, Toni Mueller wrote:
> I have added Hebrew keyboard layouts and then tried to see the layout
> via gkbd-keyboard-display. For Hebrew layouts - I tried 'Hebrew' and
> 'Hebrew (Bibilical)', the display is a bit garbled, showing dotted
> circles instead of the glyphs, although I have installed every font
> containing Hebrew that I could find, using 'apt'. Using the Hebrew
> script in eg. LibreOffice Writer is perfectly possible, it's just this
> program that does not tell me what the keyboard layout actually is.

I ran into the same problem with Arabic layouts.  I reported it upstream
at the URL above, and the attached patch (also forwarded upstream at
https://gitlab.gnome.org/GNOME/libgnomekbd/-/merge_requests/9) solves
the problem.

        --dkg

diff --git a/libgnomekbd/gkbd-keyboard-drawing.c b/libgnomekbd/gkbd-keyboard-drawing.c
index da526d2..b5888ee 100644
--- a/libgnomekbd/gkbd-keyboard-drawing.c
+++ b/libgnomekbd/gkbd-keyboard-drawing.c
@@ -666,12 +666,13 @@ set_markup (GkbdKeyboardDrawingRenderContext * context, gchar * txt)
 	}
 }
 
-static void
+static PangoDirection
 set_key_label_in_layout (GkbdKeyboardDrawingRenderContext * context,
 			 guint keyval)
 {
 	gchar buf[5];
 	gunichar uc;
+	PangoDirection dir = PANGO_DIRECTION_LTR;
 
 	switch (keyval) {
 	case GDK_KEY_Scroll_Lock:
@@ -825,6 +826,7 @@ set_key_label_in_layout (GkbdKeyboardDrawingRenderContext * context,
 	default:
 		uc = gdk_keyval_to_unicode (keyval);
 		if (uc != 0 && g_unichar_isgraph (uc)) {
+			dir = pango_unichar_direction (uc);
 			buf[g_unichar_to_utf8 (uc, buf)] = '\0';
 			set_markup (context, buf);
 		} else {
@@ -846,6 +848,7 @@ set_key_label_in_layout (GkbdKeyboardDrawingRenderContext * context,
 				set_markup (context, "");
 		}
 	}
+	return dir;
 }
 
 
@@ -927,6 +930,8 @@ draw_key_label_helper (GkbdKeyboardDrawingRenderContext * context,
 		       gboolean is_pressed)
 {
 	gint label_x, label_y, label_max_width, ycell;
+	PangoAlignment align;
+	PangoDirection dir;
 
 	if (keysym == 0)
 		return;
@@ -935,46 +940,36 @@ draw_key_label_helper (GkbdKeyboardDrawingRenderContext * context,
 		(unsigned) keysym, (char) keysym, (int) glp);
 #endif
 
+	ycell = ((glp == GKBD_KEYBOARD_DRAWING_POS_BOTTOMLEFT) ||
+		 (glp == GKBD_KEYBOARD_DRAWING_POS_BOTTOMRIGHT));
+	rotate_coordinate (x, y, x + padding,
+			   y + padding + (height -
+					  2 * padding) *
+			   ycell * 4 / 7, angle, &label_x,
+			   &label_y);
+	label_max_width = PANGO_SCALE * (width - 2 * padding);
+	dir = set_key_label_in_layout (context, keysym);
+
 	switch (glp) {
 	case GKBD_KEYBOARD_DRAWING_POS_TOPLEFT:
 	case GKBD_KEYBOARD_DRAWING_POS_BOTTOMLEFT:
-		{
-			ycell =
-			    glp == GKBD_KEYBOARD_DRAWING_POS_BOTTOMLEFT;
-
-			rotate_coordinate (x, y, x + padding,
-					   y + padding + (height -
-							  2 * padding) *
-					   ycell * 4 / 7, angle, &label_x,
-					   &label_y);
-			label_max_width =
-			    PANGO_SCALE * (width - 2 * padding);
-			break;
-		}
+		if (dir == PANGO_DIRECTION_RTL)
+			align = PANGO_ALIGN_RIGHT;
+		else
+			align = PANGO_ALIGN_LEFT;
+		break;
 	case GKBD_KEYBOARD_DRAWING_POS_TOPRIGHT:
 	case GKBD_KEYBOARD_DRAWING_POS_BOTTOMRIGHT:
-		{
-			ycell =
-			    glp == GKBD_KEYBOARD_DRAWING_POS_BOTTOMRIGHT;
-
-			rotate_coordinate (x, y,
-					   x + padding + (width -
-							  2 * padding) *
-					   4 / 7,
-					   y + padding + (height -
-							  2 * padding) *
-					   ycell * 4 / 7, angle, &label_x,
-					   &label_y);
-			label_max_width =
-			    PANGO_SCALE * ((width - 2 * padding) -
-					   (width - 2 * padding) * 4 / 7);
-			break;
-		}
+		if (dir == PANGO_DIRECTION_RTL)
+			align = PANGO_ALIGN_LEFT;
+		else
+			align = PANGO_ALIGN_RIGHT;
+		break;
 	default:
 		return;
 	}
-	set_key_label_in_layout (context, keysym);
 	pango_layout_set_width (context->layout, label_max_width);
+	pango_layout_set_alignment (context->layout, align);
 	label_y -= (pango_layout_get_line_count (context->layout) - 1) *
 	    (pango_font_description_get_size (context->font_desc) /
 	     PANGO_SCALE);

Attachment: signature.asc
Description: PGP signature

Reply via email to