From bed95813a8517e53597affe65bfed6f115dfce39 Mon Sep 17 00:00:00 2001
From: Antoine Fontaine <antoine.fontaine@epfl.ch>
Date: Sun, 16 Jun 2019 22:11:46 +0200
Subject: [PATCH] Added keybindings: ctrl-begin/end to switch to first or last
 course

---
 src/gui-window.c | 63 ++++++++++++++++++++++++++++++++++--------------
 1 file changed, 45 insertions(+), 18 deletions(-)

diff --git a/src/gui-window.c b/src/gui-window.c
index 1bbafb4..4ade00a 100644
--- a/src/gui-window.c
+++ b/src/gui-window.c
@@ -117,39 +117,66 @@ gui_window_key_pressed_cb (GtkWidget   *sender,
 
   case GDK_CONTROL_MASK:
     switch (keyval) {
+
+    // quit
     case GDK_KEY_q:
       gtk_widget_destroy (GTK_WIDGET (self));
       break;
+
+    // go to first course
+    case GDK_KEY_Begin:
+    case GDK_KEY_KP_Begin:
+    case GDK_KEY_Home:
+    case GDK_KEY_KP_Home:
+      if (self->course_count > 0) {
+        const gchar *name = self->courses[0].name;
+        gtk_stack_set_visible_child_name (self->stack, name);
+      }
+      break;
+
+    // go to last course
+    case GDK_KEY_End:
+    case GDK_KEY_KP_End:
+      if (self->course_count > 0) {
+        const gchar *name = self->courses[self->course_count-1].name;
+        gtk_stack_set_visible_child_name (self->stack, name);
+      }
+      break;
+
+    // go to previous course
     case GDK_KEY_Page_Up:
     case GDK_KEY_KP_Page_Up:
-      { // that's a little hackish, but works well enough
-      const gchar *name = gtk_stack_get_visible_child_name (self->stack);
-      for (guint i=0; i<self->course_count; i++) {
-        if (!g_strcmp0 (name, self->courses[i].name)) {
-          if (i!=0) {
-            const gchar *target_name = self->courses[i-1].name;
-            gtk_stack_set_visible_child_name (self->stack, target_name);
+      if (self->course_count > 1) { // that's a little hackish, but works well enough
+        const gchar *name = gtk_stack_get_visible_child_name (self->stack);
+        for (guint i=0; i<self->course_count; i++) {
+          if (!g_strcmp0 (name, self->courses[i].name)) {
+            if (i > 0) { // we don't go before the first element
+              const gchar *target_name = self->courses[i-1].name;
+              gtk_stack_set_visible_child_name (self->stack, target_name);
+            }
+            break;
           }
-          break;
         }
       }
-      }
       break;
+
+    // go to next course
     case GDK_KEY_Page_Down:
     case GDK_KEY_KP_Page_Down:
-      {
-      const gchar *name = gtk_stack_get_visible_child_name (self->stack);
-      for (guint i=0; i<self->course_count; i++) {
-        if (!g_strcmp0 (name, self->courses[i].name)) {
-          if (i!=self->course_count-1) {
-            const gchar *target_name = self->courses[i+1].name;
-            gtk_stack_set_visible_child_name (self->stack, target_name);
+      if (self->course_count > 1) { // that's a little hackish, but works well enough
+        const gchar *name = gtk_stack_get_visible_child_name (self->stack);
+        for (guint i=0; i<self->course_count; i++) {
+          if (!g_strcmp0 (name, self->courses[i].name)) {
+            if (i < self->course_count-1) { // we don't go past the last
+              const gchar *target_name = self->courses[i+1].name;
+              gtk_stack_set_visible_child_name (self->stack, target_name);
+            }
+            break;
           }
-          break;
         }
       }
-      }
       break;
+
     default:
       return FALSE;
     }
-- 
GitLab