]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/base/lib_mouse.c
ncurses 5.9 - patch 20130112
[ncurses.git] / ncurses / base / lib_mouse.c
index 0b5dd9e7189a392cd6a6176b40c8197c3ef8729a..e84a964c1ccd63b8920518a3abf472b8ceb9cc9a 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -84,7 +84,7 @@
 #define CUR SP_TERMTYPE
 #endif
 
-MODULE_ID("$Id: lib_mouse.c,v 1.134 2012/01/21 19:21:29 KO.Myung-Hun Exp $")
+MODULE_ID("$Id: lib_mouse.c,v 1.140 2013/01/12 16:35:34 tom Exp $")
 
 #include <tic.h>
 
@@ -225,7 +225,7 @@ write_event(SCREEN *sp, int down, int button, int x, int y)
     char buf[6];
     unsigned long ignore;
 
-    strncpy(buf, key_mouse, 3);        /* should be "\033[M" */
+    strcpy(buf, "\033[M");     /* should be the same as key_mouse */
     buf[3] = ' ' + (button - 1) + (down ? 0 : 0x40);
     buf[4] = ' ' + x - LEFT_COL + 1;
     buf[5] = ' ' + y - TOP_ROW + 1;
@@ -263,7 +263,8 @@ mouse_server(unsigned long param)
                /* sit and wait on the event queue */
                rc = MouReadEventQue(&mouev, &fWait, hmou);
                if (rc) {
-                   sprintf(err, "Error reading mouse queue, rc=%lu.\r\n", rc);
+                   _nc_SPRINTF(err, _nc_SLIMIT(sizeof(err))
+                               "Error reading mouse queue, rc=%lu.\r\n", rc);
                    break;
                }
                if (!sp->_emxmouse_activated)
@@ -289,9 +290,11 @@ mouse_server(unsigned long param)
              finish:
                oldstate = mouev.fs;
            }
-       } else
-           sprintf(err, "Error setting event mask, buttons=%d, rc=%lu.\r\n",
-                   nbuttons, rc);
+       } else {
+           _nc_SPRINTF(err, _nc_SLIMIT(sizeof(err))
+                       "Error setting event mask, buttons=%d, rc=%lu.\r\n",
+                       nbuttons, rc);
+       }
 
        DosWrite(2, err, strlen(err), &rc);
        MouClose(hmou);
@@ -385,20 +388,26 @@ enable_xterm_mouse(SCREEN *sp, int enable)
 #if USE_EMX_MOUSE
     sp->_emxmouse_activated = enable;
 #else
-    NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx
-                              "xterm-mouse",
-                              TPARM_1(sp->_mouse_xtermcap, enable));
+    NCURSES_PUTP2("xterm-mouse", TPARM_1(sp->_mouse_xtermcap, enable));
 #endif
     sp->_mouse_active = enable;
 }
 
 #if USE_GPM_SUPPORT
 static bool
-allow_gpm_mouse(void)
+allow_gpm_mouse(SCREEN *sp)
 {
     bool result = FALSE;
 
-    /* GPM does printf's without checking if stdout is a terminal */
+#if USE_WEAK_SYMBOLS
+    /* Danger Robinson: do not use dlopen for libgpm if already loaded */
+    if ((Gpm_Wgetch)) {
+       if (!sp->_mouse_gpm_loaded) {
+           T(("GPM library was already dlopen'd, not by us"));
+       }
+    } else
+#endif
+       /* GPM does printf's without checking if stdout is a terminal */
     if (isatty(fileno(stdout))) {
        char *list = getenv("NCURSES_GPM_TERMS");
        char *env = getenv("TERM");
@@ -524,7 +533,7 @@ initialize_mousetype(SCREEN *sp)
 
     /* Try gpm first, because gpm may be configured to run in xterm */
 #if USE_GPM_SUPPORT
-    if (allow_gpm_mouse()) {
+    if (allow_gpm_mouse(sp)) {
        if (!sp->_mouse_gpm_loaded) {
 #ifdef HAVE_LIBDL
            load_gpm_library(sp);