summaryrefslogtreecommitdiff
path: root/itches/emacs
diff options
context:
space:
mode:
authorKévin Le Gouguec <kevin.legouguec@gmail.com>2023-07-02 16:40:21 +0200
committerKévin Le Gouguec <kevin.legouguec@gmail.com>2023-07-02 16:40:21 +0200
commit26dd17feaa66b942fd2f1f582615041197c5e105 (patch)
treea66707713215fe66907cf4bb13bf6ddc49f7fa87 /itches/emacs
parent763bcd72998d58e69afaa25e231e807882f356ec (diff)
downloadmemory-leaks-26dd17feaa66b942fd2f1f582615041197c5e105.tar.xz
Add notes on the PGTK S-SPC vs SPC confusion
Diffstat (limited to 'itches/emacs')
-rw-r--r--itches/emacs/pgtk-shift-space.c82
-rw-r--r--itches/emacs/tracker.org36
2 files changed, 118 insertions, 0 deletions
diff --git a/itches/emacs/pgtk-shift-space.c b/itches/emacs/pgtk-shift-space.c
new file mode 100644
index 0000000..dcfef21
--- /dev/null
+++ b/itches/emacs/pgtk-shift-space.c
@@ -0,0 +1,82 @@
+#include <stdio.h>
+
+#include <gtk/gtk.h>
+
+static gboolean show_key (
+ GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer data
+) {
+ int mods[] = {GDK_SHIFT_MASK, GDK_CONTROL_MASK, GDK_MOD1_MASK};
+ char* mods_names[] = {"shift", "control", "alt"};
+ char mods_desc[64] = {'\0'};
+
+ for (size_t i=0; i<sizeof(mods)/sizeof(mods[0]); i++)
+ {
+ if (! (event->state & mods[i]))
+ continue;
+
+ if (mods_desc[0])
+ strcat(mods_desc, ":");
+
+ strcat(mods_desc, mods_names[i]);
+ }
+ if (! mods_desc[0])
+ strcpy(mods_desc, "∅");
+
+ fprintf(stderr, "key pressed: '%d' (mods: %s)\n", event->keyval, mods_desc);
+
+ if (gtk_im_context_filter_keypress ((GtkIMContext*)data, event))
+ fprintf(stderr, "\t(handled by gtkim)\n");
+
+ return TRUE;
+}
+
+static void show_commit (
+ GtkIMContext *ctx,
+ gchar *str,
+ gpointer data
+) {
+ fprintf(stderr, "\tcommitting: \"%s\"\n", str);
+}
+
+static void
+activate (GtkApplication* app,
+ gpointer user_data)
+{
+ GtkWidget *window;
+
+ window = gtk_application_window_new (app);
+ gtk_window_set_title (GTK_WINDOW (window), "Window");
+ gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
+ gtk_widget_show_all (window);
+
+ GtkIMContext *im_context = gtk_im_context_simple_new();
+ gtk_im_context_set_client_window(
+ im_context, gtk_widget_get_window(window)
+ );
+
+ gtk_widget_add_events (window, GDK_KEY_PRESS_MASK);
+
+ g_signal_connect (
+ G_OBJECT (window), "key_press_event", G_CALLBACK (show_key), im_context
+ );
+ g_signal_connect (
+ im_context, "commit", G_CALLBACK (show_commit), NULL
+ );
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ GtkApplication *app;
+ int status;
+
+ app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
+ g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
+ status = g_application_run (G_APPLICATION (app), argc, argv);
+ g_object_unref (app);
+
+ return status;
+}
diff --git a/itches/emacs/tracker.org b/itches/emacs/tracker.org
index 122c311..96c6bc7 100644
--- a/itches/emacs/tracker.org
+++ b/itches/emacs/tracker.org
@@ -63,6 +63,42 @@ when ranking fonts; it'd be nice if Emacs's ~find-font~ did so too.
:Role: author
:PatchApplied: t
:END:
+***** TODO [[bug:56653]] =S-SPC= recognized as =SPC=
+Reported multiple times; see merged bug reports. Something in the
+bowels of =GtkIMContext=. Emacs's PGTK code does this:
+
+#+begin_src c
+/* pgtkterm.c: key_press_event */
+ if (pgtk_im_filter_keypress (f, &event->key))
+ return TRUE;
+ /* else keep processing */
+#+end_src
+
+Input methods seem to accept =S-SPC= and call
+=pgtkim.c:im_context_commit_cb= with the string =" "=, thereby losing
+the information that we have a shift modifier.
+
+Debugging notes on Debian 11 (GTK 3.24.24) using [[./pgtk-shift-space.c][this small
+reproducer]]:
+
+#+begin_src sh
+gcc -g $(pkg-config --cflags gtk+-3.0) pgtk-shift-space.c $(pkg-config --libs gtk+-3.0)
+export DEBUGINFOD_URLS=https://debuginfod.debian.net
+#+end_src
+
+Then break on =show_commit=, and help GDB find GTK code with
+~directory […gtk-3.24.24 checkout…]/gtk~.
+
+=gtkimcontextsimple.c:no_sequence_matches= is the last frame to know
+about the =GdkEventKey= event that includes the shift modifier; so
+presumably that function should refrain from calling
+=gtkimcontextsimple.c:gtk_im_context_simple_commit_char= if it sees
+modifiers?
+
+Or =pgtkim.c:im_context_commit_cb= should check its context and
+refrain from enqueueing =" "=; there is no straightforward way for
+that function to signal =pgtkterm.c:key_press_event= that the IM
+commit was "aborted" though…
**** DONE [[bug:41584]] org-indent-mode's line-prefix text property flickers near overlays
:PROPERTIES:
:Role: author