pidgin/pidginconversationwindow.c

changeset 41186
f8275d257afe
parent 41184
05b5c210352b
child 41252
aaa984be3a68
--- a/pidgin/pidginconversationwindow.c	Tue Dec 07 02:25:28 2021 -0600
+++ b/pidgin/pidginconversationwindow.c	Tue Dec 07 02:31:01 2021 -0600
@@ -103,6 +103,47 @@
 	return FALSE;
 }
 
+static gboolean
+pidgin_conversation_window_key_pressed_cb(GtkEventControllerKey *controller,
+                                          guint keyval,
+                                          G_GNUC_UNUSED guint keycode,
+                                          GdkModifierType state,
+                                          gpointer data)
+{
+	PidginConversationWindow *window = data;
+
+	/* If CTRL was held down... */
+	if (state & GDK_CONTROL_MASK) {
+		switch (keyval) {
+			case GDK_KEY_Page_Down:
+			case GDK_KEY_KP_Page_Down:
+			case ']':
+				pidgin_conversation_window_select_next(window);
+				return TRUE;
+				break;
+
+			case GDK_KEY_Page_Up:
+			case GDK_KEY_KP_Page_Up:
+			case '[':
+				pidgin_conversation_window_select_previous(window);
+				return TRUE;
+				break;
+		} /* End of switch */
+	}
+
+	/* If ALT (or whatever) was held down... */
+	else if (state & GDK_MOD1_MASK) {
+		if ('1' <= keyval && keyval <= '9') {
+			guint switchto = keyval - '1';
+			pidgin_conversation_window_select_nth(window, switchto);
+
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
 /******************************************************************************
  * GObjectImplementation
  *****************************************************************************/
@@ -123,6 +164,7 @@
 	GtkBuilder *builder = NULL;
 	GtkWidget *menubar = NULL;
 	GMenuModel *model = NULL;
+	GtkEventController *key = NULL;
 
 	gtk_widget_init_template(GTK_WIDGET(window));
 
@@ -139,6 +181,14 @@
 	gtk_widget_show(menubar);
 
 	g_object_unref(G_OBJECT(builder));
+
+	key = gtk_event_controller_key_new(GTK_WIDGET(window));
+	gtk_event_controller_set_propagation_phase(key, GTK_PHASE_CAPTURE);
+	g_signal_connect(G_OBJECT(key), "key-pressed",
+	                 G_CALLBACK(pidgin_conversation_window_key_pressed_cb),
+	                 window);
+	g_object_set_data_full(G_OBJECT(window), "key-press-controller", key,
+	                       g_object_unref);
 }
 
 static void

mercurial