a4b3ac5
From 5d519fb7a798e252dc28665694d53b0773542584 Mon Sep 17 00:00:00 2001
a4b3ac5
From: fujiwarat <takao.fujiwara1@gmail.com>
a4b3ac5
Date: Thu, 20 Oct 2011 11:00:23 +0900
a4b3ac5
Subject: [PATCH] Fix previous_engine without global engine.
a4b3ac5
a4b3ac5
---
a4b3ac5
 bus/ibusimpl.c |   31 +++++++++++++++++++------------
a4b3ac5
 1 files changed, 19 insertions(+), 12 deletions(-)
a4b3ac5
a4b3ac5
diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
a4b3ac5
index 1494f5f..0a4f3fb 100644
a4b3ac5
--- a/bus/ibusimpl.c
a4b3ac5
+++ b/bus/ibusimpl.c
a4b3ac5
@@ -1044,13 +1044,14 @@ bus_ibus_impl_get_engine_desc (BusIBusImpl *ibus,
a4b3ac5
 }
a4b3ac5
 
a4b3ac5
 /**
a4b3ac5
- * bus_ibus_impl_context_request_next_engine_in_menu:
a4b3ac5
+ * bus_ibus_impl_context_request_rotate_engine_in_menu:
a4b3ac5
  *
a4b3ac5
- * Process the "next_engine_in_menu" hotkey.
a4b3ac5
+ * Process the "next_engine_in_menu" or "previous_engine" hotkey.
a4b3ac5
  */
a4b3ac5
 static void
a4b3ac5
-bus_ibus_impl_context_request_next_engine_in_menu (BusIBusImpl     *ibus,
a4b3ac5
-                                                   BusInputContext *context)
a4b3ac5
+bus_ibus_impl_context_request_rotate_engine_in_menu (BusIBusImpl     *ibus,
a4b3ac5
+                                                     BusInputContext *context,
a4b3ac5
+                                                     gboolean         is_next)
a4b3ac5
 {
a4b3ac5
     BusEngineProxy *engine;
a4b3ac5
     IBusEngineDesc *desc;
a4b3ac5
@@ -1071,12 +1072,20 @@ bus_ibus_impl_context_request_next_engine_in_menu (BusIBusImpl     *ibus,
a4b3ac5
 
a4b3ac5
     p = g_list_find (ibus->register_engine_list, desc);
a4b3ac5
     if (p != NULL) {
a4b3ac5
-        p = p->next;
a4b3ac5
+        if (is_next) {
a4b3ac5
+            p = p->next;
a4b3ac5
+        } else if (p->prev) {
a4b3ac5
+            p = p->prev;
a4b3ac5
+        }
a4b3ac5
     }
a4b3ac5
     if (p == NULL) {
a4b3ac5
         p = g_list_find (ibus->engine_list, desc);
a4b3ac5
         if (p != NULL) {
a4b3ac5
-            p = p->next;
a4b3ac5
+            if (is_next) {
a4b3ac5
+                p = p->next;
a4b3ac5
+            } else if (p->prev) {
a4b3ac5
+                p = p->prev;
a4b3ac5
+            }
a4b3ac5
         }
a4b3ac5
     }
a4b3ac5
 
a4b3ac5
@@ -1126,12 +1135,9 @@ bus_ibus_impl_context_request_previous_engine (BusIBusImpl     *ibus,
a4b3ac5
         }
a4b3ac5
     }
a4b3ac5
 
a4b3ac5
-    /*
a4b3ac5
-     * If the previous engine name is not found, switch to the next engine
a4b3ac5
-     * in the menu. This behavior is better than doing nothing.
a4b3ac5
-     */
a4b3ac5
     if (!engine_name) {
a4b3ac5
-        bus_ibus_impl_context_request_next_engine_in_menu (ibus, context);
a4b3ac5
+        bus_ibus_impl_context_request_rotate_engine_in_menu (ibus, context,
a4b3ac5
+                                                             FALSE);
a4b3ac5
         return;
a4b3ac5
     }
a4b3ac5
 
a4b3ac5
@@ -2084,7 +2090,8 @@ bus_ibus_impl_filter_keyboard_shortcuts (BusIBusImpl     *ibus,
a4b3ac5
     }
a4b3ac5
     if (event == next) {
a4b3ac5
         if (bus_input_context_is_enabled (context)) {
a4b3ac5
-            bus_ibus_impl_context_request_next_engine_in_menu (ibus, context);
a4b3ac5
+            bus_ibus_impl_context_request_rotate_engine_in_menu (ibus, context,
a4b3ac5
+                                                                 TRUE);
a4b3ac5
         }
a4b3ac5
         else {
a4b3ac5
             bus_input_context_enable (context);
a4b3ac5
-- 
a4b3ac5
1.7.6.4
5fabd65