Merge branch '3011_mc_gpm_and_xterm'

* 3011_mc_gpm_and_xterm:
  Ticket #3011: mc under x11 problems with mouse or hang due gpm
This commit is contained in:
Slava Zanko 2013-06-11 12:10:58 +03:00
commit fef50bf629
4 changed files with 105 additions and 31 deletions

View File

@ -1326,7 +1326,7 @@ init_key (void)
|| (term != NULL || (term != NULL
&& (strncmp (term, "iris-ansi", 9) == 0 && (strncmp (term, "iris-ansi", 9) == 0
|| strncmp (term, "xterm", 5) == 0 || strncmp (term, "xterm", 5) == 0
|| strncmp (term, "rxvt", 4) == 0 || strcmp (term, "screen") == 0))) || strncmp (term, "rxvt", 4) == 0 || strncmp (term, "screen", 6) == 0)))
define_sequences (xterm_key_defines); define_sequences (xterm_key_defines);
/* load some additional keys (e.g. direct Alt-? support) */ /* load some additional keys (e.g. direct Alt-? support) */
@ -1708,23 +1708,41 @@ define_sequence (int code, const char *seq, int action)
gboolean gboolean
is_idle (void) is_idle (void)
{ {
int maxfdp; int nfd;
fd_set select_set; fd_set select_set;
struct timeval time_out; struct timeval time_out;
FD_ZERO (&select_set); FD_ZERO (&select_set);
FD_SET (input_fd, &select_set); FD_SET (input_fd, &select_set);
maxfdp = input_fd; nfd = max (0, input_fd) + 1;
#ifdef HAVE_LIBGPM
if (mouse_enabled && (use_mouse_p == MOUSE_GPM) && (gpm_fd > 0))
{
FD_SET (gpm_fd, &select_set);
maxfdp = max (maxfdp, gpm_fd);
}
#endif
time_out.tv_sec = 0; time_out.tv_sec = 0;
time_out.tv_usec = 0; time_out.tv_usec = 0;
return (select (maxfdp + 1, &select_set, 0, 0, &time_out) <= 0); #ifdef HAVE_LIBGPM
if (mouse_enabled && use_mouse_p == MOUSE_GPM)
{
if (gpm_fd >= 0)
{
FD_SET (gpm_fd, &select_set);
nfd = max (nfd, gpm_fd + 1);
}
else
{
if (mouse_fd >= 0) /* error indicative */
{
if (FD_ISSET (mouse_fd, &select_set))
FD_CLR (mouse_fd, &select_set);
mouse_fd = gpm_fd;
}
/* gpm_fd == -2 means under some X terminal */
if (gpm_fd == -1)
{
mouse_enabled = FALSE;
use_mouse_p = MOUSE_NONE;
}
}
}
#endif
return (select (nfd, &select_set, 0, 0, &time_out) <= 0);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -1969,26 +1987,37 @@ tty_get_event (struct Gpm_Event *event, gboolean redo_event, gboolean block)
/* Repeat if using mouse */ /* Repeat if using mouse */
while (pending_keys == NULL) while (pending_keys == NULL)
{ {
int maxfdp; int nfd;
fd_set select_set; fd_set select_set;
FD_ZERO (&select_set); FD_ZERO (&select_set);
FD_SET (input_fd, &select_set); FD_SET (input_fd, &select_set);
maxfdp = max (add_selects (&select_set), input_fd); nfd = max (add_selects (&select_set), max (0, input_fd)) + 1;
#ifdef HAVE_LIBGPM #ifdef HAVE_LIBGPM
if (mouse_enabled && (use_mouse_p == MOUSE_GPM)) if (mouse_enabled && (use_mouse_p == MOUSE_GPM))
{ {
if (gpm_fd < 0) if (gpm_fd >= 0)
{
FD_SET (gpm_fd, &select_set);
nfd = max (nfd, gpm_fd + 1);
}
else
{
if (mouse_fd >= 0) /* error indicative */
{
if (FD_ISSET (mouse_fd, &select_set))
FD_CLR (mouse_fd, &select_set);
mouse_fd = gpm_fd;
}
/* gpm_fd == -2 means under some X terminal */
if (gpm_fd == -1)
{ {
/* Connection to gpm broken, possibly gpm has died */
mouse_enabled = FALSE; mouse_enabled = FALSE;
use_mouse_p = MOUSE_NONE; use_mouse_p = MOUSE_NONE;
}
break; break;
} }
FD_SET (gpm_fd, &select_set);
maxfdp = max (maxfdp, gpm_fd);
} }
#endif #endif
@ -2027,7 +2056,7 @@ tty_get_event (struct Gpm_Event *event, gboolean redo_event, gboolean block)
} }
tty_enable_interrupt_key (); tty_enable_interrupt_key ();
flag = select (maxfdp + 1, &select_set, NULL, NULL, time_addr); flag = select (nfd, &select_set, NULL, NULL, time_addr);
tty_disable_interrupt_key (); tty_disable_interrupt_key ();
/* select timed out: it could be for any of the following reasons: /* select timed out: it could be for any of the following reasons:
@ -2051,14 +2080,49 @@ tty_get_event (struct Gpm_Event *event, gboolean redo_event, gboolean block)
if (FD_ISSET (input_fd, &select_set)) if (FD_ISSET (input_fd, &select_set))
break; break;
#ifdef HAVE_LIBGPM #ifdef HAVE_LIBGPM
if (mouse_enabled && use_mouse_p == MOUSE_GPM if (mouse_enabled && use_mouse_p == MOUSE_GPM)
&& gpm_fd > 0 && FD_ISSET (gpm_fd, &select_set)) {
if (gpm_fd >= 0)
{
if (FD_ISSET (gpm_fd, &select_set))
{
int status;
status = Gpm_GetEvent (&ev);
if (status == 1) /* success */
{ {
Gpm_GetEvent (&ev);
Gpm_FitEvent (&ev); Gpm_FitEvent (&ev);
*event = ev; *event = ev;
return EV_MOUSE; return EV_MOUSE;
} }
else if (status == 0) /* connection closed; -1 == error */
{
if (mouse_fd >= 0 && FD_ISSET (mouse_fd, &select_set))
FD_CLR (mouse_fd, &select_set);
/* Try to reopen gpm_mouse connection */
disable_mouse ();
enable_mouse ();
}
}
}
else
{
if (mouse_fd >= 0) /* error indicative */
{
if (FD_ISSET (mouse_fd, &select_set))
FD_CLR (mouse_fd, &select_set);
mouse_fd = gpm_fd;
}
/* gpm_fd == -2 means under some X terminal */
if (gpm_fd == -1)
{
mouse_enabled = FALSE;
use_mouse_p = MOUSE_NONE;
}
break;
}
}
#endif /* !HAVE_LIBGPM */ #endif /* !HAVE_LIBGPM */
} }

View File

@ -47,6 +47,7 @@
Mouse_Type use_mouse_p = MOUSE_NONE; Mouse_Type use_mouse_p = MOUSE_NONE;
gboolean mouse_enabled = FALSE; gboolean mouse_enabled = FALSE;
int mouse_fd = -1; /* for when gpm_fd changes to < 0 and the old one must be cleared from select_set */
const char *xmouse_seq; const char *xmouse_seq;
const char *xmouse_extended_seq; const char *xmouse_extended_seq;
@ -114,7 +115,6 @@ enable_mouse (void)
#ifdef HAVE_LIBGPM #ifdef HAVE_LIBGPM
case MOUSE_GPM: case MOUSE_GPM:
{ {
int mouse_d;
Gpm_Connect conn; Gpm_Connect conn;
conn.eventMask = ~GPM_MOVE; conn.eventMask = ~GPM_MOVE;
@ -122,8 +122,8 @@ enable_mouse (void)
conn.minMod = 0; conn.minMod = 0;
conn.maxMod = 0; conn.maxMod = 0;
mouse_d = Gpm_Open (&conn, 0); mouse_fd = Gpm_Open (&conn, 0);
if (mouse_d == -1) if (mouse_fd == -1)
{ {
use_mouse_p = MOUSE_NONE; use_mouse_p = MOUSE_NONE;
return; return;

View File

@ -97,6 +97,9 @@ typedef int (*mouse_h) (Gpm_Event *, void *);
/* Type of the currently used mouse */ /* Type of the currently used mouse */
extern Mouse_Type use_mouse_p; extern Mouse_Type use_mouse_p;
/* To be used when gpm_fd were initially >= 0 */
extern int mouse_fd;
/* String indicating that a mouse event has occurred, usually "\E[M" */ /* String indicating that a mouse event has occurred, usually "\E[M" */
extern const char *xmouse_seq; extern const char *xmouse_seq;

View File

@ -90,6 +90,7 @@ gboolean
tty_check_term (gboolean force_xterm) tty_check_term (gboolean force_xterm)
{ {
const char *termvalue; const char *termvalue;
const char *xdisplay;
termvalue = getenv ("TERM"); termvalue = getenv ("TERM");
if (termvalue == NULL || *termvalue == '\0') if (termvalue == NULL || *termvalue == '\0')
@ -98,10 +99,16 @@ tty_check_term (gboolean force_xterm)
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
xdisplay = getenv ("DISPLAY");
if (xdisplay != NULL && *xdisplay == '\0')
xdisplay = NULL;
return force_xterm || strncmp (termvalue, "xterm", 5) == 0 return force_xterm || strncmp (termvalue, "xterm", 5) == 0
|| strncmp (termvalue, "konsole", 7) == 0 || strncmp (termvalue, "konsole", 7) == 0
|| strncmp (termvalue, "rxvt", 4) == 0 || strncmp (termvalue, "rxvt", 4) == 0
|| strcmp (termvalue, "Eterm") == 0 || strcmp (termvalue, "dtterm") == 0; || strcmp (termvalue, "Eterm") == 0
|| strcmp (termvalue, "dtterm") == 0
|| (strncmp (termvalue, "screen", 6) == 0 && xdisplay != NULL);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */