[gnome-builder/wip/gtk4-port: 1492/1774] libide/gtk: add accel dialog




commit b58a0a2fc27320554b84a04f379070483713710a
Author: Christian Hergert <chergert redhat com>
Date:   Tue Jun 14 00:44:41 2022 -0700

    libide/gtk: add accel dialog
    
    We need this for shortcuts, so this is a minimal port from Dazzle.

 src/libide/gtk/icons/enter-keyboard-shortcut.svg | 245 +++++++++++++
 src/libide/gtk/ide-gtk-init.c                    |   2 +
 src/libide/gtk/ide-shortcut-accel-dialog.c       | 415 +++++++++++++++++++++++
 src/libide/gtk/ide-shortcut-accel-dialog.h       |  51 +++
 src/libide/gtk/ide-shortcut-accel-dialog.ui      | 118 +++++++
 src/libide/gtk/libide-gtk.gresource.xml          |   2 +
 src/libide/gtk/libide-gtk.h                      |   1 +
 src/libide/gtk/meson.build                       |   2 +
 8 files changed, 836 insertions(+)
---
diff --git a/src/libide/gtk/icons/enter-keyboard-shortcut.svg 
b/src/libide/gtk/icons/enter-keyboard-shortcut.svg
new file mode 100644
index 000000000..b7ce2e4cc
--- /dev/null
+++ b/src/libide/gtk/icons/enter-keyboard-shortcut.svg
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="256"
+   height="72"
+   viewBox="0 0 256 72.000001"
+   id="svg3611"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="enter-keyboard-shortcut.svg">
+  <defs
+     id="defs3613" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8"
+     inkscape:cx="137.98997"
+     inkscape:cy="34.663602"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1366"
+     inkscape:window-height="704"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata3616">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Camada 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-980.36216)">
+    <g
+       id="g3715"
+       transform="translate(-503.23415,689.94658)">
+      <path
+         d="m 509.66363,325.47627 c 5.53002,1.4185 18.51389,1.4185 24.29359,0 0.80721,-0.19813 
1.43306,0.67185 1.50029,1.50028 l 1.99751,13.05863 -1.50028,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35287 
1.33167,-8.70575 1.99752,-13.05863 0.12564,-0.82161 0.69518,-1.70681 1.50028,-1.50028 z"
+         id="path27275"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 543.62146,325.47627 c 5.53,1.4185 18.51387,1.4185 24.29357,0 0.80721,-0.19813 1.43308,0.67185 
1.50029,1.50028 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35287 1.33168,-8.70575 
1.99752,-13.05863 0.12564,-0.82161 0.69518,-1.70681 1.5003,-1.50028 z"
+         id="path27277"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 577.57927,325.47627 c 5.53,1.4185 18.51387,1.4185 24.29357,0 0.80721,-0.19813 1.43308,0.67185 
1.50029,1.50028 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35287 1.33168,-8.70575 
1.99752,-13.05863 0.12564,-0.82161 0.6952,-1.70681 1.5003,-1.50028 z"
+         id="path27279"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 611.12326,325.47627 c 5.53002,1.4185 18.51389,1.4185 24.29359,0 0.80721,-0.19813 
1.43306,0.67185 1.50029,1.50028 l 1.99751,13.05863 -1.50028,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35287 
1.33167,-8.70575 1.99752,-13.05863 0.12564,-0.82161 0.69518,-1.70681 1.50028,-1.50028 z"
+         id="path5218"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 645.08109,325.47627 c 5.53,1.4185 18.51387,1.4185 24.29357,0 0.80721,-0.19813 1.43308,0.67185 
1.50029,1.50028 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35287 1.33168,-8.70575 
1.99751,-13.05863 0.12565,-0.82161 0.69519,-1.70681 1.50031,-1.50028 z"
+         id="path5220"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 679.0389,325.47627 c 5.53,1.4185 18.51387,1.4185 24.29357,0 0.80721,-0.19813 1.43308,0.67185 
1.50029,1.50028 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35287 1.33168,-8.70575 
1.99751,-13.05863 0.12565,-0.82161 0.69521,-1.70681 1.50031,-1.50028 z"
+         id="path5222"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 712.58289,325.47627 c 5.53002,1.4185 18.51389,1.4185 24.29359,0 0.80721,-0.19813 
1.43306,0.67185 1.50029,1.50028 l 1.99751,13.05863 -1.50028,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35287 
1.33167,-8.70575 1.99751,-13.05863 0.12565,-0.82161 0.69519,-1.70681 1.50029,-1.50028 z"
+         id="path4829"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.60000002;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 516.19044,335.26648 c 5.53002,1.41851 18.51389,1.41851 24.2936,0 0.8072,-0.19812 
1.43306,0.67186 1.50028,1.50029 l 1.99752,13.05863 -1.50029,0 -28.28862,0 -1.50029,0 c 0.66584,-4.35288 
1.33167,-8.70575 1.99752,-13.05863 0.12564,-0.82161 0.69518,-1.70681 1.50028,-1.50029 z"
+         id="path3662"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 550.14827,335.26648 c 5.53,1.41851 18.51387,1.41851 24.29358,0 0.8072,-0.19812 1.43307,0.67186 
1.50028,1.50029 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66584,-4.35288 1.33168,-8.70575 
1.99752,-13.05863 0.12564,-0.82161 0.69518,-1.70681 1.5003,-1.50029 z"
+         id="path3664"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 584.10608,335.26648 c 5.53,1.41851 18.51387,1.41851 24.29357,0 0.80721,-0.19812 
1.43308,0.67186 1.50029,1.50029 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66584,-4.35288 
1.33168,-8.70575 1.99752,-13.05863 0.12564,-0.82161 0.6952,-1.70681 1.5003,-1.50029 z"
+         id="path3666"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 617.65007,335.26648 c 5.53002,1.41851 18.51389,1.41851 24.29359,0 0.80721,-0.19812 
1.43306,0.67186 1.50029,1.50029 l 1.99751,13.05863 -1.50028,0 -28.28862,0 -1.50029,0 c 0.66584,-4.35288 
1.33167,-8.70575 1.99752,-13.05863 0.12564,-0.82161 0.69518,-1.70681 1.50028,-1.50029 z"
+         id="path3668"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 651.6079,335.26648 c 5.53,1.41851 18.51387,1.41851 24.29357,0 0.80721,-0.19812 1.43308,0.67186 
1.50029,1.50029 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35288 1.33168,-8.70575 
1.99752,-13.05863 0.12564,-0.82161 0.69518,-1.70681 1.5003,-1.50029 z"
+         id="path3670"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 685.56571,335.26648 c 5.53,1.41851 18.51387,1.41851 24.29357,0 0.80721,-0.19812 
1.43308,0.67186 1.50029,1.50029 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35288 
1.33168,-8.70575 1.99752,-13.05863 0.12564,-0.82161 0.6952,-1.70681 1.5003,-1.50029 z"
+         id="path3672"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 719.1097,335.26648 c 5.53002,1.41851 18.51389,1.41851 24.29359,0 0.80721,-0.19812 
1.43306,0.67186 1.50029,1.50029 l 1.99751,13.05863 -1.50028,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35288 
1.33167,-8.70575 1.99752,-13.05863 0.12564,-0.82161 0.69518,-1.70681 1.50028,-1.50029 z"
+         id="path3674"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.60000002;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 525.98066,345.0567 c 5.53002,1.4185 18.51389,1.4185 24.29359,0 0.80721,-0.19812 
1.43306,0.67185 1.50029,1.50029 l 1.99751,13.05863 -1.50028,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35288 
1.33167,-8.70576 1.99752,-13.05863 0.12564,-0.82162 0.69518,-1.70681 1.50028,-1.50029 z"
+         id="path3676"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 559.93849,345.0567 c 5.53,1.4185 18.51387,1.4185 24.29357,0 0.80721,-0.19812 1.43308,0.67185 
1.50029,1.50029 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35288 1.33168,-8.70576 
1.99751,-13.05863 0.12565,-0.82162 0.69519,-1.70681 1.50031,-1.50029 z"
+         id="path3678"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 593.8963,345.0567 c 5.53,1.4185 18.51387,1.4185 24.29357,0 0.80721,-0.19812 1.43308,0.67185 
1.50029,1.50029 l 1.99753,13.05863 -1.5003,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35288 1.33168,-8.70576 
1.99751,-13.05863 0.12565,-0.82162 0.69521,-1.70681 1.50031,-1.50029 z"
+         id="path3680"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 627.44029,345.0567 c 5.53002,1.4185 18.51389,1.4185 24.29359,0 0.80721,-0.19812 
1.43306,0.67185 1.50029,1.50029 l 1.99751,13.05863 -1.50028,0 -28.28862,0 -1.50029,0 c 0.66583,-4.35288 
1.33167,-8.70576 1.99751,-13.05863 0.12565,-0.82162 0.69519,-1.70681 1.50029,-1.50029 z"
+         id="path3682"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 661.39812,345.0567 c 5.53,1.4185 18.51387,1.4185 24.29357,0 0.80721,-0.19812 1.43308,0.67185 
1.50029,1.50029 l 1.99753,13.05863 -1.5003,0 -28.28863,0 -1.50028,0 c 0.66583,-4.35288 1.33168,-8.70576 
1.99751,-13.05863 0.12564,-0.82162 0.69519,-1.70681 1.50031,-1.50029 z"
+         id="path3684"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 695.35593,345.0567 c 5.53,1.4185 18.51387,1.4185 24.29357,0 0.8072,-0.19812 1.43308,0.67185 
1.50029,1.50029 l 1.99753,13.05863 -1.5003,0 -28.28863,0 -1.50028,0 c 0.66583,-4.35288 1.33168,-8.70576 
1.99751,-13.05863 0.12564,-0.82162 0.69521,-1.70681 1.50031,-1.50029 z"
+         id="path3686"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.59999979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 728.89992,345.0567 c 5.53002,1.4185 18.51389,1.4185 24.29359,0 0.8072,-0.19812 1.43306,0.67185 
1.50029,1.50029 l 1.99751,13.05863 -1.50028,0 -28.28863,0 -1.50028,0 c 0.66583,-4.35288 1.33166,-8.70576 
1.99751,-13.05863 0.12564,-0.82162 0.69519,-1.70681 1.50029,-1.50029 z"
+         id="path3688"
+         
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.60000002;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="sssccccss"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g3713"
+         transform="matrix(1.359752,0,0,1.359752,418.09336,-671.08525)">
+        <path
+           d="m 95.250257,715.10933 0,1.09089 c -1.31e-4,0.0113 -5.02e-4,0.0227 0,0.0341 0.01222,0.27812 
0.140266,0.55621 0.340902,0.74999 l 5.693061,5.76124 5.65897,-5.76124 c 0.20529,-0.20532 0.30681,-0.49473 
0.30681,-0.78413 l 0,-1.09089 -1.09088,0 c -0.28941,0 -0.57881,0.10156 -0.78408,0.30681 l -4.09082,4.15901 
-4.124913,-4.15901 c -0.212319,-0.22989 -0.511898,-0.33071 -0.818164,-0.30681 l -1.090886,0 z"
+           id="path3715"
+           
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale
 Mono';-inkscape-font-specification:'Andale 
Mono';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;enable-background:new"
+           inkscape:connector-curvature="0" />
+        <rect
+           height="11.999745"
+           id="rect3717"
+           rx="0"
+           ry="0"
+           
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#000100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
+           transform="scale(-1,1)"
+           width="2.1817718"
+           x="-102.34102"
+           y="708.92743" />
+      </g>
+      <g
+         id="g3740"
+         transform="matrix(1.359752,0,0,1.359752,492.12198,-661.29504)">
+        <path
+           d="m 95.250257,715.10933 0,1.09089 c -1.31e-4,0.0113 -5.02e-4,0.0227 0,0.0341 0.01222,0.27812 
0.140266,0.55621 0.340902,0.74999 l 5.693061,5.76124 5.65897,-5.76124 c 0.20529,-0.20532 0.30681,-0.49473 
0.30681,-0.78413 l 0,-1.09089 -1.09088,0 c -0.28941,0 -0.57881,0.10156 -0.78408,0.30681 l -4.09082,4.15901 
-4.124913,-4.15901 c -0.212319,-0.22989 -0.511898,-0.33071 -0.818164,-0.30681 l -1.090886,0 z"
+           id="path3742"
+           
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale
 Mono';-inkscape-font-specification:'Andale 
Mono';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;enable-background:new"
+           inkscape:connector-curvature="0" />
+        <rect
+           height="11.999745"
+           id="rect3744"
+           rx="0"
+           ry="0"
+           
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#000100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
+           transform="scale(-1,1)"
+           width="2.1817718"
+           x="-102.34102"
+           y="708.92743" />
+      </g>
+      <g
+         id="g3746"
+         transform="matrix(1.359752,0,0,1.359752,593.58161,-661.29504)">
+        <path
+           d="m 95.250257,715.10933 0,1.09089 c -1.31e-4,0.0113 -5.02e-4,0.0227 0,0.0341 0.01222,0.27812 
0.140266,0.55621 0.340902,0.74999 l 5.693061,5.76124 5.65897,-5.76124 c 0.20529,-0.20532 0.30681,-0.49473 
0.30681,-0.78413 l 0,-1.09089 -1.09088,0 c -0.28941,0 -0.57881,0.10156 -0.78408,0.30681 l -4.09082,4.15901 
-4.124913,-4.15901 c -0.212319,-0.22989 -0.511898,-0.33071 -0.818164,-0.30681 l -1.090886,0 z"
+           id="path3748"
+           
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale
 Mono';-inkscape-font-specification:'Andale 
Mono';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;enable-background:new"
+           inkscape:connector-curvature="0" />
+        <rect
+           height="11.999745"
+           id="rect3750"
+           rx="0"
+           ry="0"
+           
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#000100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
+           transform="scale(-1,1)"
+           width="2.1817718"
+           x="-102.34102"
+           y="708.92743" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/src/libide/gtk/ide-gtk-init.c b/src/libide/gtk/ide-gtk-init.c
index 950bbf4ca..5aedb6af4 100644
--- a/src/libide/gtk/ide-gtk-init.c
+++ b/src/libide/gtk/ide-gtk-init.c
@@ -34,6 +34,7 @@
 #include "ide-progress-icon.h"
 #include "ide-radio-box.h"
 #include "ide-search-entry.h"
+#include "ide-shortcut-accel-dialog.h"
 #include "ide-three-grid.h"
 #include "ide-truncate-model.h"
 
@@ -49,6 +50,7 @@ _ide_gtk_init (void)
   g_type_ensure (IDE_TYPE_PROGRESS_ICON);
   g_type_ensure (IDE_TYPE_RADIO_BOX);
   g_type_ensure (IDE_TYPE_SEARCH_ENTRY);
+  g_type_ensure (IDE_TYPE_SHORTCUT_ACCEL_DIALOG);
   g_type_ensure (IDE_TYPE_THREE_GRID);
   g_type_ensure (IDE_TYPE_TRUNCATE_MODEL);
 
diff --git a/src/libide/gtk/ide-shortcut-accel-dialog.c b/src/libide/gtk/ide-shortcut-accel-dialog.c
new file mode 100644
index 000000000..f553a436b
--- /dev/null
+++ b/src/libide/gtk/ide-shortcut-accel-dialog.c
@@ -0,0 +1,415 @@
+/* ide-shortcut-accel-dialog.c
+ *
+ * Copyright (C) 2016 Endless, Inc
+ *           (C) 2017 Christian Hergert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Georges Basile Stavracas Neto <georges stavracas gmail com>
+ *          Christian Hergert <chergert redhat com>
+ */
+
+#define G_LOG_DOMAIN "ide-shortcut-accel-dialog"
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include "ide-shortcut-accel-dialog.h"
+
+struct _IdeShortcutAccelDialog
+{
+  GtkDialog             parent_instance;
+
+  GtkStack             *stack;
+  GtkLabel             *display_label;
+  GtkShortcutLabel     *display_shortcut;
+  GtkLabel             *selection_label;
+
+  char                 *shortcut_title;
+
+  guint                 keyval;
+  GdkModifierType       modifier;
+
+  guint                 first_modifier;
+
+  guint                 editing : 1;
+};
+
+enum {
+  PROP_0,
+  PROP_ACCELERATOR,
+  PROP_SHORTCUT_TITLE,
+  N_PROPS
+};
+
+G_DEFINE_FINAL_TYPE (IdeShortcutAccelDialog, ide_shortcut_accel_dialog, GTK_TYPE_DIALOG)
+
+static GParamSpec *properties[N_PROPS];
+
+static gboolean
+ide_shortcut_accel_dialog_is_editing (IdeShortcutAccelDialog *self)
+{
+  g_assert (IDE_IS_SHORTCUT_ACCEL_DIALOG (self));
+
+  return self->editing;
+}
+
+static void
+ide_shortcut_accel_dialog_apply_state (IdeShortcutAccelDialog *self)
+{
+  g_assert (IDE_IS_SHORTCUT_ACCEL_DIALOG (self));
+
+  if (self->editing)
+    {
+      gtk_stack_set_visible_child_name (self->stack, "selection");
+      gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT, FALSE);
+    }
+  else
+    {
+      gtk_stack_set_visible_child_name (self->stack, "display");
+      gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT, TRUE);
+    }
+}
+
+static GdkModifierType
+sanitize_modifier_mask (GdkModifierType mods)
+{
+  mods &= gtk_accelerator_get_default_mod_mask ();
+  mods &= ~GDK_LOCK_MASK;
+
+  return mods;
+}
+
+static gboolean
+ide_shortcut_accel_dialog_key_pressed (GtkWidget             *widget,
+                                       guint                  keyval,
+                                       guint                  keycode,
+                                       GdkModifierType        state,
+                                       GtkEventControllerKey *controller)
+{
+  IdeShortcutAccelDialog *self = (IdeShortcutAccelDialog *)widget;
+
+  g_assert (IDE_IS_SHORTCUT_ACCEL_DIALOG (self));
+  g_assert (GTK_IS_EVENT_CONTROLLER_KEY (controller));
+
+  if (ide_shortcut_accel_dialog_is_editing (self))
+    {
+      GdkEvent *key = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (controller));
+      GdkModifierType real_mask;
+      guint keyval_lower;
+
+      if (gdk_key_event_is_modifier (key))
+        {
+          if (self->keyval == 0 && self->modifier == 0)
+            self->first_modifier = keyval;
+          return GDK_EVENT_PROPAGATE;
+        }
+
+      real_mask = state & gtk_accelerator_get_default_mod_mask ();
+      keyval_lower = gdk_keyval_to_lower (keyval);
+
+      /* Normalize <Tab> */
+      if (keyval_lower == GDK_KEY_ISO_Left_Tab)
+        keyval_lower = GDK_KEY_Tab;
+
+      /* Put shift back if it changed the case of the key */
+      if (keyval_lower != keyval)
+        real_mask |= GDK_SHIFT_MASK;
+
+      /* We don't want to use SysRq as a keybinding but we do
+       * want Alt+Print), so we avoid translation from Alt+Print to SysRq
+       */
+      if (keyval_lower == GDK_KEY_Sys_Req && (real_mask & GDK_ALT_MASK) != 0)
+        keyval_lower = GDK_KEY_Print;
+
+      /* A single Escape press cancels the editing */
+      if (!gdk_key_event_is_modifier (key) &&
+          real_mask == 0 &&
+          keyval_lower == GDK_KEY_Escape)
+        {
+          gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CANCEL);
+          return GDK_EVENT_STOP;
+        }
+
+      /* Backspace disables the current shortcut */
+      if (real_mask == 0 && keyval_lower == GDK_KEY_BackSpace)
+        {
+          ide_shortcut_accel_dialog_set_accelerator (self, NULL);
+          gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT);
+          return GDK_EVENT_STOP;
+        }
+
+      self->keyval = gdk_keyval_to_lower (keyval);
+      self->modifier = sanitize_modifier_mask (state);
+
+      if ((state & GDK_SHIFT_MASK) != 0 &&
+          self->keyval == keyval)
+        self->modifier &= ~GDK_SHIFT_MASK;
+
+      if ((state & GDK_LOCK_MASK) == 0 &&
+          self->keyval != keyval)
+        self->modifier |= GDK_SHIFT_MASK;
+
+      self->editing = FALSE;
+
+      ide_shortcut_accel_dialog_apply_state (self);
+
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACCELERATOR]);
+
+      return GDK_EVENT_STOP;
+    }
+
+  return GDK_EVENT_PROPAGATE;
+}
+
+static void
+ide_shortcut_accel_dialog_key_released (GtkWidget             *widget,
+                                        guint                  keyval,
+                                        guint                  keycode,
+                                        GdkModifierType        state,
+                                        GtkEventControllerKey *controller)
+{
+  IdeShortcutAccelDialog *self = (IdeShortcutAccelDialog *)widget;
+
+  g_assert (IDE_IS_SHORTCUT_ACCEL_DIALOG (self));
+  g_assert (GTK_IS_EVENT_CONTROLLER_KEY (controller));
+
+  if (self->editing)
+    {
+      GdkEvent *key = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (controller));
+      /*
+       * If we have a chord defined and there was no modifier,
+       * then any key release should be enough for us to cancel
+       * our grab.
+       */
+      if (self->modifier == 0)
+        {
+          self->editing = FALSE;
+          ide_shortcut_accel_dialog_apply_state (self);
+          return;
+        }
+
+      /*
+       * If we started our sequence with a modifier, we want to
+       * release our grab when that modifier has been released.
+       */
+      if (gdk_key_event_is_modifier (key) &&
+          self->keyval != 0 &&
+          self->first_modifier != 0 &&
+          self->first_modifier == keyval)
+        {
+          self->editing = FALSE;
+          self->first_modifier = 0;
+          ide_shortcut_accel_dialog_apply_state (self);
+          return;
+        }
+    }
+}
+
+static void
+ide_shortcut_accel_dialog_constructed (GObject *object)
+{
+  IdeShortcutAccelDialog *self = (IdeShortcutAccelDialog *)object;
+
+  G_OBJECT_CLASS (ide_shortcut_accel_dialog_parent_class)->constructed (object);
+
+  gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT);
+  gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT, FALSE);
+}
+
+static void
+ide_shortcut_accel_dialog_finalize (GObject *object)
+{
+  IdeShortcutAccelDialog *self = (IdeShortcutAccelDialog *)object;
+
+  g_clear_pointer (&self->shortcut_title, g_free);
+
+  G_OBJECT_CLASS (ide_shortcut_accel_dialog_parent_class)->finalize (object);
+}
+
+static void
+ide_shortcut_accel_dialog_get_property (GObject    *object,
+                                        guint       prop_id,
+                                        GValue     *value,
+                                        GParamSpec *pspec)
+{
+  IdeShortcutAccelDialog *self = IDE_SHORTCUT_ACCEL_DIALOG (object);
+
+  switch (prop_id)
+    {
+    case PROP_ACCELERATOR:
+      g_value_take_string (value, ide_shortcut_accel_dialog_get_accelerator (self));
+      break;
+
+    case PROP_SHORTCUT_TITLE:
+      g_value_set_string (value, ide_shortcut_accel_dialog_get_shortcut_title (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+ide_shortcut_accel_dialog_set_property (GObject      *object,
+                                        guint         prop_id,
+                                        const GValue *value,
+                                        GParamSpec   *pspec)
+{
+  IdeShortcutAccelDialog *self = IDE_SHORTCUT_ACCEL_DIALOG (object);
+
+  switch (prop_id)
+    {
+    case PROP_ACCELERATOR:
+      ide_shortcut_accel_dialog_set_accelerator (self, g_value_get_string (value));
+      break;
+
+    case PROP_SHORTCUT_TITLE:
+      ide_shortcut_accel_dialog_set_shortcut_title (self, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+ide_shortcut_accel_dialog_class_init (IdeShortcutAccelDialogClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->constructed = ide_shortcut_accel_dialog_constructed;
+  object_class->finalize = ide_shortcut_accel_dialog_finalize;
+  object_class->get_property = ide_shortcut_accel_dialog_get_property;
+  object_class->set_property = ide_shortcut_accel_dialog_set_property;
+
+  properties [PROP_ACCELERATOR] =
+    g_param_spec_string ("accelerator",
+                         "Accelerator",
+                         "Accelerator",
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  properties [PROP_SHORTCUT_TITLE] =
+    g_param_spec_string ("shortcut-title",
+                         "Title",
+                         "Title",
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/libide-gtk/ide-shortcut-accel-dialog.ui");
+
+  gtk_widget_class_bind_template_child (widget_class, IdeShortcutAccelDialog, stack);
+  gtk_widget_class_bind_template_child (widget_class, IdeShortcutAccelDialog, selection_label);
+  gtk_widget_class_bind_template_child (widget_class, IdeShortcutAccelDialog, display_label);
+  gtk_widget_class_bind_template_child (widget_class, IdeShortcutAccelDialog, display_shortcut);
+  gtk_widget_class_bind_template_callback (widget_class, ide_shortcut_accel_dialog_key_pressed);
+  gtk_widget_class_bind_template_callback (widget_class, ide_shortcut_accel_dialog_key_released);
+}
+
+static void
+ide_shortcut_accel_dialog_init (IdeShortcutAccelDialog *self)
+{
+  self->editing = TRUE;
+
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+  g_object_bind_property (self, "accelerator",
+                          self->display_shortcut, "accelerator",
+                          G_BINDING_SYNC_CREATE);
+}
+
+gchar *
+ide_shortcut_accel_dialog_get_accelerator (IdeShortcutAccelDialog *self)
+{
+  g_return_val_if_fail (IDE_IS_SHORTCUT_ACCEL_DIALOG (self), NULL);
+
+  if (self->keyval == 0)
+    return NULL;
+
+  return gtk_accelerator_name (self->keyval, self->modifier);
+}
+
+void
+ide_shortcut_accel_dialog_set_accelerator (IdeShortcutAccelDialog *self,
+                                           const gchar            *accelerator)
+{
+  guint keyval;
+  GdkModifierType state;
+
+  g_return_if_fail (IDE_IS_SHORTCUT_ACCEL_DIALOG (self));
+
+  if (accelerator == NULL)
+    {
+      if (self->keyval != 0 || self->modifier != 0)
+        {
+          self->keyval = 0;
+          self->modifier = 0;
+          g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACCELERATOR]);
+        }
+    }
+  else if (gtk_accelerator_parse (accelerator, &keyval, &state))
+    {
+      if (keyval != self->keyval || state != self->modifier)
+        {
+          self->keyval = keyval;
+          self->modifier = state;
+          g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACCELERATOR]);
+        }
+    }
+}
+
+void
+ide_shortcut_accel_dialog_set_shortcut_title (IdeShortcutAccelDialog *self,
+                                              const gchar            *shortcut_title)
+{
+  g_return_if_fail (IDE_IS_SHORTCUT_ACCEL_DIALOG (self));
+
+  if (g_strcmp0 (shortcut_title, self->shortcut_title) != 0)
+    {
+      g_autofree gchar *label = NULL;
+
+      if (shortcut_title != NULL)
+        {
+          /* Translators: <b>%s</b> is used to show the provided text in bold */
+          label = g_strdup_printf (_("Enter new shortcut to change <b>%s</b>."), shortcut_title);
+        }
+
+      gtk_label_set_label (self->selection_label, label);
+      gtk_label_set_label (self->display_label, label);
+
+      g_free (self->shortcut_title);
+      self->shortcut_title = g_strdup (shortcut_title);
+
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SHORTCUT_TITLE]);
+    }
+}
+
+const gchar *
+ide_shortcut_accel_dialog_get_shortcut_title (IdeShortcutAccelDialog *self)
+{
+  g_return_val_if_fail (IDE_IS_SHORTCUT_ACCEL_DIALOG (self), NULL);
+
+  return self->shortcut_title;
+}
+
+GtkWidget *
+ide_shortcut_accel_dialog_new (void)
+{
+  return g_object_new (IDE_TYPE_SHORTCUT_ACCEL_DIALOG, NULL);
+}
diff --git a/src/libide/gtk/ide-shortcut-accel-dialog.h b/src/libide/gtk/ide-shortcut-accel-dialog.h
new file mode 100644
index 000000000..2503eb95e
--- /dev/null
+++ b/src/libide/gtk/ide-shortcut-accel-dialog.h
@@ -0,0 +1,51 @@
+/* ide-shortcut-accel-dialog.h
+ *
+ * Copyright 2017-2022 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#if !defined (IDE_GTK_INSIDE) && !defined (IDE_GTK_COMPILATION)
+# error "Only <libide-gtk.h> can be included directly."
+#endif
+
+#include <gtk/gtk.h>
+
+#include <libide-core.h>
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_SHORTCUT_ACCEL_DIALOG (ide_shortcut_accel_dialog_get_type())
+
+IDE_AVAILABLE_IN_ALL
+G_DECLARE_FINAL_TYPE (IdeShortcutAccelDialog, ide_shortcut_accel_dialog, IDE, SHORTCUT_ACCEL_DIALOG, 
GtkDialog)
+
+IDE_AVAILABLE_IN_ALL
+GtkWidget              *ide_shortcut_accel_dialog_new                (void);
+IDE_AVAILABLE_IN_ALL
+char                   *ide_shortcut_accel_dialog_get_accelerator    (IdeShortcutAccelDialog *self);
+IDE_AVAILABLE_IN_ALL
+void                    ide_shortcut_accel_dialog_set_accelerator    (IdeShortcutAccelDialog *self,
+                                                                      const char             *accelerator);
+IDE_AVAILABLE_IN_ALL
+const char             *ide_shortcut_accel_dialog_get_shortcut_title (IdeShortcutAccelDialog *self);
+IDE_AVAILABLE_IN_ALL
+void                    ide_shortcut_accel_dialog_set_shortcut_title (IdeShortcutAccelDialog *self,
+                                                                      const char             *title);
+
+G_END_DECLS
diff --git a/src/libide/gtk/ide-shortcut-accel-dialog.ui b/src/libide/gtk/ide-shortcut-accel-dialog.ui
new file mode 100644
index 000000000..1fe3a3d0d
--- /dev/null
+++ b/src/libide/gtk/ide-shortcut-accel-dialog.ui
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk" version="4.0"/>
+  <template class="IdeShortcutAccelDialog" parent="GtkDialog">
+    <property name="resizable">false</property>
+    <property name="modal">true</property>
+    <property name="width-request">400</property>
+    <property name="height-request">300</property>
+    <child>
+      <object class="GtkEventControllerKey">
+        <property name="propagation-phase">capture</property>
+        <signal name="key-pressed" handler="ide_shortcut_accel_dialog_key_pressed" swapped="true" 
object="IdeShortcutAccelDialog"/>
+        <signal name="key-released" handler="ide_shortcut_accel_dialog_key_released" swapped="true" 
object="IdeShortcutAccelDialog"/>
+      </object>
+    </child>
+    <child type="titlebar">
+      <object class="GtkHeaderBar">
+        <property name="show-title-buttons">false</property>
+        <child type="start">
+          <object class="GtkButton" id="cancel_button">
+            <property name="label" translatable="yes">_Cancel</property>
+            <property name="use-underline">true</property>
+          </object>
+        </child>
+        <child type="end">
+          <object class="GtkButton" id="accept_button">
+            <property name="label" translatable="yes">_Set</property>
+            <property name="use-underline">true</property>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child internal-child="content_area">
+      <object class="GtkBox">
+        <property name="orientation">vertical</property>
+        <property name="vexpand">true</property>
+        <child>
+          <object class="GtkStack" id="stack">
+            <property name="hhomogeneous">true</property>
+            <property name="vhomogeneous">true</property>
+            <property name="margin-top">24</property>
+            <property name="margin-bottom">24</property>
+            <property name="margin-start">24</property>
+            <property name="margin-end">24</property>
+            <child>
+              <object class="GtkStackPage">
+                <property name="name">selection</property>
+                <property name="child">
+                  <object class="GtkBox">
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">18</property>
+                    <child>
+                      <object class="GtkLabel" id="selection_label">
+                        <property name="xalign">0.5</property>
+                        <property name="use-markup">true</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkImage">
+                        <property 
name="resource">/org/gnome/libide-gtk/icons/enter-keyboard-shortcut.svg</property>
+                        <property name="hexpand">true</property>
+                        <property name="vexpand">true</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="xalign">0.5</property>
+                        <property name="label" translatable="yes">Press Escape to cancel or Backspace to 
disable.</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
+                  </object>
+                </property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkStackPage">
+                <property name="name">display</property>
+                <property name="child">
+                  <object class="GtkBox">
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">18</property>
+                    <child>
+                      <object class="GtkLabel" id="display_label">
+                        <property name="xalign">0.5</property>
+                        <property name="use-markup">true</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkShortcutLabel" id="display_shortcut">
+                        <property name="halign">center</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
+                  </object>
+                </property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="cancel">cancel_button</action-widget>
+      <action-widget response="accept">accept_button</action-widget>
+    </action-widgets>
+  </template>
+  <object class="GtkSizeGroup">
+    <widgets>
+      <widget name="cancel_button"/>
+      <widget name="accept_button"/>
+    </widgets>
+  </object>
+</interface>
diff --git a/src/libide/gtk/libide-gtk.gresource.xml b/src/libide/gtk/libide-gtk.gresource.xml
index 8fd8a7c16..167fa8a18 100644
--- a/src/libide/gtk/libide-gtk.gresource.xml
+++ b/src/libide/gtk/libide-gtk.gresource.xml
@@ -3,5 +3,7 @@
   <gresource prefix="/org/gnome/libide-gtk">
     <file preprocess="xml-stripblanks">ide-entry-popover.ui</file>
     <file preprocess="xml-stripblanks">ide-search-entry.ui</file>
+    <file preprocess="xml-stripblanks">ide-shortcut-accel-dialog.ui</file>
+    <file preprocess="xml-stripblanks">icons/enter-keyboard-shortcut.svg</file>
   </gresource>
 </gresources>
diff --git a/src/libide/gtk/libide-gtk.h b/src/libide/gtk/libide-gtk.h
index a1b13df38..0f0904871 100644
--- a/src/libide/gtk/libide-gtk.h
+++ b/src/libide/gtk/libide-gtk.h
@@ -36,6 +36,7 @@
 # include "ide-progress-icon.h"
 # include "ide-radio-box.h"
 # include "ide-search-entry.h"
+# include "ide-shortcut-accel-dialog.h"
 # include "ide-three-grid.h"
 # include "ide-truncate-model.h"
 #undef IDE_GTK_INSIDE
diff --git a/src/libide/gtk/meson.build b/src/libide/gtk/meson.build
index 67b72df22..f034bdb70 100644
--- a/src/libide/gtk/meson.build
+++ b/src/libide/gtk/meson.build
@@ -21,6 +21,7 @@ libide_gtk_public_headers = [
   'ide-progress-icon.h',
   'ide-radio-box.h',
   'ide-search-entry.h',
+  'ide-shortcut-accel-dialog.h',
   'ide-three-grid.h',
   'ide-truncate-model.h',
   'libide-gtk.h',
@@ -52,6 +53,7 @@ libide_gtk_public_sources = [
   'ide-progress-icon.c',
   'ide-radio-box.c',
   'ide-search-entry.c',
+  'ide-shortcut-accel-dialog.c',
   'ide-three-grid.c',
   'ide-truncate-model.c',
 ]


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]