	if (mouse_flags & MOUSE_SIM3) {
	    if (!push) {
		mevent.buttons &= 3;
		mask = real_state ^ mevent.buttons;
		if (mouse_flags & MOUSE_PEND) {
		    if (time - mouse_lasttime < 3) {
			if (mask) {	/* button change */
			    if (mevent.buttons == 3) {
				real_state = mevent.buttons;
				mevent.buttons = 4;		/* simulate 3 */
				mouse_flags |= MOUSE_DOWN;
			    } else {
				/* oh oh - must have been a down/up of
				 * one button.  We have to simulate an extra
				 * event.
				 */
				u_short save_state;
extra:
				save_state = mevent.buttons;
				mevent.buttons = real_state;
				mouseGenerateEvent(mevent, 1);
				mevent.buttons = save_state;
				real_state = mevent.buttons;
				/* now fall through */
			    }
			    mouse_flags &= ~MOUSE_PEND;
			} else
			    mevent.buttons = button_state;	/* no change */
		    } else {
			if (mask)
			    goto extra;
			/* timeout -- let real button state through */
			mouse_flags &= ~MOUSE_PEND;
		    }
		} else if (mask) {
		    /* nothing pending */
		    real_state = mevent.buttons;
		    if (mevent.buttons == 3) {
			mevent.buttons = 4;		/* simulate 3 */
			mouse_flags |= MOUSE_DOWN;
		    } else if (mouse_flags & MOUSE_DOWN) {
			if ((mevent.buttons & 3) == 0)
			    mouse_flags &= ~MOUSE_DOWN;
			else
			    mevent.buttons = button_state;
		    } else if (mevent.buttons & 3) {
			mouse_flags |= MOUSE_PEND;
			mevent.buttons = button_state;
			mouse_lasttime = time;
		    }
		}
	    }
	}
