From 236dc96aa0b7d98dab027c931bdfd6bfdbd19b4f Mon Sep 17 00:00:00 2001
From: Ailin Nemui <ailin@esf51.localdomain>
Date: Wed, 10 Oct 2012 16:11:33 +0200
Subject: [PATCH 2/2] add mouse events

---
 src/gui/curses/gui-curses-mouse.c |   27 ++++++++++++++++++++++-----
 src/gui/gui-key.c                 |    5 +++++
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/src/gui/curses/gui-curses-mouse.c b/src/gui/curses/gui-curses-mouse.c
index 759a2a9..7326466 100644
--- a/src/gui/curses/gui-curses-mouse.c
+++ b/src/gui/curses/gui-curses-mouse.c
@@ -32,6 +32,7 @@
 #include "../../core/weechat.h"
 #include "../../core/wee-config.h"
 #include "../../core/wee-hook.h"
+#include "../../core/wee-string.h"
 #include "../../core/wee-utf8.h"
 #include "../../plugins/plugin.h"
 #include "../gui-bar.h"
@@ -314,9 +315,6 @@ gui_mouse_event_code2key (const char *code)
         }
     }
 
-    if (!MOUSE_CODE_END(code[0]))
-        return NULL;
-
     /* add name of button event */
     for (i = 0; gui_mouse_button_codes[i][0]; i++)
     {
@@ -327,6 +325,21 @@ gui_mouse_event_code2key (const char *code)
         }
     }
 
+    if (!MOUSE_CODE_END(code[0]))
+    {
+        strcat (key, "-event-");
+        if (MOUSE_CODE_MOTION(code[0])) {
+            strcat (key, "drag");
+        }
+        else
+        {
+            gui_mouse_event_x[1] = gui_mouse_event_x[0];
+            gui_mouse_event_y[1] = gui_mouse_event_y[0];
+            strcat (key, "down");
+        }
+        return key;
+    }
+
     /*
      * Mouse gesture: if (x,y) on release is different from (x,y) on click,
      * compute distance and angle between 2 points.
@@ -412,6 +425,7 @@ void
 gui_mouse_event_end ()
 {
     const char *mouse_key;
+    int bare_event;
 
     gui_mouse_event_pending = 0;
 
@@ -426,9 +440,11 @@ gui_mouse_event_end ()
     mouse_key = gui_mouse_event_code2key (gui_key_combo_buffer);
     if (mouse_key && mouse_key[0])
     {
+        bare_event = string_match (mouse_key, "*-event-*", 1);
         if (gui_mouse_grab)
         {
-            gui_mouse_grab_end (mouse_key);
+            if (!bare_event)
+                gui_mouse_grab_end (mouse_key);
         }
         else
         {
@@ -436,7 +452,8 @@ gui_mouse_event_end ()
             (void) gui_key_focus (mouse_key,
                                   GUI_KEY_CONTEXT_MOUSE);
         }
-        gui_mouse_event_reset ();
+        if (!bare_event)
+            gui_mouse_event_reset ();
     }
 
     gui_key_combo_buffer[0] = '\0';
diff --git a/src/gui/gui-key.c b/src/gui/gui-key.c
index 492e0d9..27a6707 100644
--- a/src/gui/gui-key.c
+++ b/src/gui/gui-key.c
@@ -986,6 +986,11 @@ gui_key_focus_command (const char *key, int context,
         if (gui_key_cmp (key, ptr_key->area_key, context) != 0)
             continue;
 
+        /* ignore mouse event if not explicit requested */
+        if ((context == GUI_KEY_CONTEXT_MOUSE) &&
+            (string_match (key, "*-event*", 1) != string_match (ptr_key->area_key, "*-event*", 1)))
+            continue;
+        
         /* check if focus is matching with key */
         matching = gui_key_focus_matching (ptr_key, hashtable_focus);
         if (!matching)
-- 
1.7.3.4

