Commit 98ba0e4797 for qemu.org

commit 98ba0e479771a391137119264156e9661508bbc7
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Fri Feb 13 01:05:51 2026 +0100

    baum: Add copy/paste bindings

    Brltty interprets

    - TL1 (i.e. Display1) + routing as clip new
    - TL2 (i.e. Display2) + routing as clip add
    - TR1 (i.e. Display4) + routing as copy line
    - TR2 (i.e. Display5) + routing as copy rect

    https://github.com/brltty/brltty/blob/master/Tables/Input/bm/routing6.kti

    - BAUM_TL1+BAUM_TL2+BAUM_TL3+BAUM_TR1 (i.e.
    Display1+Display2+Display3+Display4) as paste

    https://github.com/brltty/brltty/blob/master/Tables/Input/bm/d6.kti

    Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
    [ Marc-André - style fixes ]
    Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
    Message-ID: <20260213000551.2446777-1-samuel.thibault@ens-lyon.org>

diff --git a/chardev/baum.c b/chardev/baum.c
index 1219963656..ac1e535ba8 100644
--- a/chardev/baum.c
+++ b/chardev/baum.c
@@ -1,7 +1,7 @@
 /*
  * QEMU Baum Braille Device
  *
- * Copyright (c) 2008, 2010-2011, 2016-2017 Samuel Thibault
+ * Copyright (c) 2008, 2010-2011, 2016-2017, 2026 Samuel Thibault
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -561,9 +561,38 @@ static void baum_chr_read(void *opaque)
         case BRLAPI_KEY_TYPE_CMD:
             switch (code & BRLAPI_KEY_CMD_BLK_MASK) {
             case BRLAPI_KEY_CMD_ROUTE:
-                baum_send_key(baum, BAUM_RSP_RoutingKey, (code & BRLAPI_KEY_CMD_ARG_MASK)+1);
+                baum_send_key(baum, BAUM_RSP_RoutingKey,
+                              (code & BRLAPI_KEY_CMD_ARG_MASK) + 1);
                 baum_send_key(baum, BAUM_RSP_RoutingKey, 0);
                 break;
+            case BRLAPI_KEY_CMD_CLIP_NEW:
+                baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL1);
+                baum_send_key(baum, BAUM_RSP_RoutingKey,
+                              (code & BRLAPI_KEY_CMD_ARG_MASK) + 1);
+                baum_send_key(baum, BAUM_RSP_RoutingKey, 0);
+                baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                break;
+            case BRLAPI_KEY_CMD_CLIP_ADD:
+                baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2);
+                baum_send_key(baum, BAUM_RSP_RoutingKey,
+                              (code & BRLAPI_KEY_CMD_ARG_MASK) + 1);
+                baum_send_key(baum, BAUM_RSP_RoutingKey, 0);
+                baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                break;
+            case BRLAPI_KEY_CMD_COPY_LINE:
+                baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TR1);
+                baum_send_key(baum, BAUM_RSP_RoutingKey,
+                              (code & BRLAPI_KEY_CMD_ARG_MASK) + 1);
+                baum_send_key(baum, BAUM_RSP_RoutingKey, 0);
+                baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                break;
+            case BRLAPI_KEY_CMD_COPY_RECT:
+                baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TR2);
+                baum_send_key(baum, BAUM_RSP_RoutingKey,
+                              (code & BRLAPI_KEY_CMD_ARG_MASK) + 1);
+                baum_send_key(baum, BAUM_RSP_RoutingKey, 0);
+                baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                break;
             case 0:
                 switch (code & BRLAPI_KEY_CMD_ARG_MASK) {
                 case BRLAPI_KEY_CMD_FWINLT:
@@ -606,6 +635,11 @@ static void baum_chr_read(void *opaque)
                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL1|BAUM_TL3|BAUM_TR1);
                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
                     break;
+                case BRLAPI_KEY_CMD_PASTE:
+                    baum_send_key(baum, BAUM_RSP_TopKeys,
+                                  BAUM_TL1 | BAUM_TL2 | BAUM_TL3 | BAUM_TR1);
+                    baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                    break;
                 }
             }
             break;