예제 #1
0
void QUimInputContext::updatePreedit()
{
    QString newString = getPreeditString();
    int cursor = getPreeditCursorPosition();
    int selLength = getPreeditSelectionLength();

    if ( newString.isEmpty() && ! isComposing() )
        return ;

    // Activating the IM
    if ( ! newString.isEmpty() && ! isComposing() )
        sendIMEvent( QEvent::IMStart );

    if ( ! newString.isEmpty() )
    {
#ifdef ENABLE_DEBUG
        qDebug( "cursor = %d, length = %d", cursor, newString.length() );
#endif
        sendIMEvent( QEvent::IMCompose, newString, cursor, selLength );
    }

    // Preedit's length is Zero, we should deactivate IM and
    // cancel the inputting, that is, sending IMEnd event with
    // empty string.
    if ( newString.isEmpty() && isComposing() )
        sendIMEvent( QEvent::IMEnd );
}
예제 #2
0
/*
   Filters key events from qwsServer.  Returns FALSE if event should be
   sent on as is, otherwise returns FALSE.

   \a unicode is the text of the event. \a keycode is the Qt Key for the event
   as described in qnamespace.h. \a modifiers is a combination of zero or
   more of the following OR'ed together: Qt::ShiftButton, Qt::ControlButton
   and Qt::AltButton. If used, \a autoRepeat would be FALSE if the event
   comes from the intial press of the button, and TRUE if it comes from event
   generated from holding the button down for a period of time.
*/
bool ComposeIM::filter(int unicode, int keycode, int modifiers, 
  bool isPress, bool /*autoRepeat*/)
{
    if ( isPress && keycode == Qt::Key_Space && 
	 modifiers & Qt::ShiftButton ) {
	//switch to opposite state
	if ( state == On ) {
	    sendIMEvent( QWSServer::IMEnd, QString::null, 0 );
	    composed = "";
	    state = Off; //reset and remove text
	} else {
	    state = On;
	}
	return TRUE; //block event
    } else if ( state == On ) {
	if ( isPress ) {
	    if ( keycode == Qt::Key_Return ) {
		//accept text and remain active
		sendIMEvent( QWSServer::IMEnd, composed, composed.length() );
		composed = "";
	    } else if ( keycode == Qt::Key_Backspace ) {
		if ( composed.length() > 0 )
		    composed = composed.left( composed.length() - 1 );
		sendIMEvent( QWSServer::IMCompose, composed, composed.length(), 0 );
	    } else if ( unicode > 0 && unicode < 0xffff) {
		composed += QChar( unicode );
		compose( composed );
		sendIMEvent( QWSServer::IMCompose, composed, composed.length(), 0 );
	    }
	}
	return TRUE; //block event
    }  
    return FALSE; //pass keystroke normally.
}
예제 #3
0
void QUimInputContext::commitString( const QString& str )
{
    if ( !isComposing() )
    {
        sendIMEvent( QEvent::IMStart );
    }

    sendIMEvent( QEvent::IMEnd, str );
}
예제 #4
0
/*
   Confirms current input, then resets ComposeIM and sets state to Off
*/
void ComposeIM::reset()
{
    if ( state == On ) {
	state = Off;
	sendIMEvent( QWSServer::IMEnd, composed, 0 );
	composed = "";
    }
}
예제 #5
0
bool QGCINInputContext::x11FilterEvent( QWidget *keywidget, XEvent *event )
{
#ifndef QT_NO_GCIN
    KeySym keysym;
    char static_buffer[256];
    char *buffer = static_buffer;
    int buffer_size = sizeof(static_buffer) - 1;

    if (event->type != KeyPress && event->type != KeyRelease)
        return TRUE;

    XKeyEvent *keve = (XKeyEvent *) event;

    XLookupString (keve, buffer, buffer_size, &keysym, NULL);
    int result;
    char *rstr = NULL;
    unsigned int state = keve->state;


    if (event->type == KeyPress) {
        result = gcin_im_client_forward_key_press(gcin_ch,
          keysym, state, &rstr);

        if (rstr) {
            QString inputText = QString::fromUtf8(rstr);

            sendIMEvent( QEvent::IMStart );
            sendIMEvent( QEvent::IMEnd, inputText );
        }
    } else {
       result = gcin_im_client_forward_key_release(gcin_ch,
         keysym, state, &rstr);
    }


    if (rstr)
        free(rstr);

    return result;
}
예제 #6
0
void QUimInputContext::saveContext()
{
    // just send IMEnd and keep preedit string
    if ( isComposing() )
        sendIMEvent( QEvent::IMEnd );
}