diff options
Diffstat (limited to 'itches/emacs')
| -rw-r--r-- | itches/emacs/pgtk-shift-space.c | 82 | ||||
| -rw-r--r-- | itches/emacs/tracker.org | 36 |
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 |
