+2021-06-04  Hannes Domani  <ssbssa@yahoo.de>
+
+       * ser-mingw.c (console_select_thread): Handle MOUSE_EVENT.
+       * tui/tui-data.h (struct tui_win_info): Add click function.
+       * tui/tui-io.c (tui_prep_terminal): Enable mouse events.
+       (tui_deprep_terminal): Disable mouse events.
+       (tui_dispatch_ctrl_char): Handle KEY_MOUSE.
+       * tui/tui.c (tui_disable): Disable mouse events.
+
 2021-06-03  Magne Hov  <mhov@undo.io>
 
        PR python/27841
 
                  break;
                }
            }
+         else if (record.EventType == MOUSE_EVENT)
+           {
+             SetEvent (state->read_event);
+             break;
+           }
 
          /* Otherwise discard it and wait again.  */
          ReadConsoleInput (h, &record, 1, &n_records);
 
     return true;
   }
 
+  /* Called for each mouse click inside this window.  Coordinates MOUSE_X
+     and MOUSE_Y are 0-based relative to the window, and MOUSE_BUTTON can
+     be 1 (left), 2 (middle), or 3 (right).  */
+  virtual void click (int mouse_x, int mouse_y, int mouse_button)
+  {
+  }
+
   void check_and_display_highlight_if_needed ();
 
   /* Window handle.  */
 
 static void
 tui_prep_terminal (int notused1)
 {
+#ifdef NCURSES_MOUSE_VERSION
+  mousemask (ALL_MOUSE_EVENTS, NULL);
+#endif
 }
 
 /* Readline callback to restore the terminal.  It is called once each
 static void
 tui_deprep_terminal (void)
 {
+#ifdef NCURSES_MOUSE_VERSION
+  mousemask (0, NULL);
+#endif
 }
 
 #ifdef TUI_USE_PIPE_FOR_READLINE
     case KEY_LEFT:
       win_info->right_scroll (1);
       break;
+#ifdef NCURSES_MOUSE_VERSION
+    case KEY_MOUSE:
+       {
+         MEVENT mev;
+         if (getmouse (&mev) != OK)
+           break;
+
+         for (tui_win_info *wi : all_tui_windows ())
+           if (mev.x > wi->x && mev.x < wi->x + wi->width - 1
+               && mev.y > wi->y && mev.y < wi->y + wi->height - 1)
+             {
+               if ((mev.bstate & BUTTON1_CLICKED) != 0
+                   || (mev.bstate & BUTTON2_CLICKED) != 0
+                   || (mev.bstate & BUTTON3_CLICKED) != 0)
+                 {
+                   int button = (mev.bstate & BUTTON1_CLICKED) != 0 ? 1
+                     :         ((mev.bstate & BUTTON2_CLICKED) != 0 ? 2
+                                : 3);
+                   wi->click (mev.x - wi->x - 1, mev.y - wi->y - 1, button);
+                 }
+#ifdef BUTTON5_PRESSED
+               else if ((mev.bstate & BUTTON4_PRESSED) != 0)
+                 wi->backward_scroll (3);
+               else if ((mev.bstate & BUTTON5_PRESSED) != 0)
+                 wi->forward_scroll (3);
+#endif
+               break;
+             }
+       }
+      break;
+#endif
     case '\f':
       break;
     default: