Буфер обмена, работа с DIK_CLIPBOARD_PASTE [rev.400+]

Автор темы #1
Дата рег
14 Сен 2016
Сообщения
3
Симпатии
1
Собственно, "400: Для обработки ввода была добавлена константа DIK_CLIPBOARD_PASTE, событие которой означает вставку текста с буфера обмена".

Кто-нибудь работал с буфером обмена, как с ним вообще сообщаться?

В key_down DIK_CLIPBOARD_PASTE сам по себе не приходит никогда, хоткеев на вставку судя по всему тоже не забинжено (в коде следов не нашел, танцы на клавиатуре по всем кнопкам также не помогли, попытки послать DIK_CLIPBOARD_PASTE в KeyboardPress провалились с тем же результатом)... Можно впилить dllкой, но может есть решение попроще?

PS. На хардкоднутых экранах работает только копирование/вырезка.

UPD. Ебааааа, сурсы ревизии. 476 на 7c33f046cc079df72aedb35aee348c9f6a120fbb где-то. Ушел экспериментировать...
C++:
     // Clipboard.cpp : 137
    else if( CtrlDwn && !ShiftDwn && str_len > 0 && ( dik == DIK_C || dik == DIK_X ) )
    {
        SDL_SetClipboardText( str );
        if( dik == DIK_X )
        {
            *str = '\0';
            pos = 0;
        }
    }
    else if( CtrlDwn && !ShiftDwn && dik == DIK_V )
    {
        const char* cb_text = SDL_GetClipboardText();
        MainWindowKeyboardEvents.push_back( SDL_KEYDOWN );
        MainWindowKeyboardEvents.push_back( 511 );
        MainWindowKeyboardEventsText.push_back( cb_text );
        MainWindowKeyboardEvents.push_back( SDL_KEYUP );
        MainWindowKeyboardEvents.push_back( 511 );
        MainWindowKeyboardEventsText.push_back( cb_text );
    }
    else if( dik == DIK_CLIPBOARD_PASTE )
    {
        char* text = Str::Duplicate( dik_text );
        EraseInvalidChars( text, flags );
        uint  text_len = Str::Length( text );
        if( text_len != 0 )
        {
            uint text_len_utf8 = Str::LengthUTF8( text );
            uint erase_len_utf8 = 0;
            if( str_len_utf8 + text_len_utf8 > max )
                erase_len_utf8 = str_len_utf8 + text_len_utf8 - max;

            uint text_pos = text_len;
            while( erase_len_utf8 )
            {
                text_pos--;
                while( text_pos && ( text[ text_pos ] & 0xC0 ) == 0x80 )
                    text_pos--;
                erase_len_utf8--;
            }
            text[ text_pos ] = '\0';

            Str::Insert( &str[ pos ], text );
            pos += Str::Length( text );
        }
        delete[] text;
    }
UPD x2. Насколько я понимаю, при движковом вызове Ctrl+V (в смысле - находясь в хардкоднутом экране) даже приходит DIK_CLIPBOARD_PASTE с аргументом "текст из буфера обмена"... Только вот в нём при приеме в key_down всё ещё string@ text is null.
 
Последнее редактирование:
Автор темы #2
Дата рег
14 Сен 2016
Сообщения
3
Симпатии
1
Посидели с Vice Dice, походу вместо "dikdw == DIK_TEXT" должно было быть "dikdw == DIK_TEXT || dikdw == DIK_CLIPBOARD_PASTE"... Клиент вместо содержимого буфера обмена в DIK_CLIPBOARD_PASTE пихает null.
C++:
        // Client.cpp: Key script event
        if( dikdw && Script::PrepareContext( ClientFunctions.KeyDown, _FUNC_, "Game" ) )
        {
            ScriptString* event_text_script = NULL;
            if( dikdw == DIK_TEXT )
                event_text_script = ScriptString::Create( event_text );
            Script::SetArgUChar( dikdw );
            Script::SetArgObject( event_text_script );
            Script::RunPrepared();
            if( event_text_script )
                event_text_script->Release();
        }
 
Последнее редактирование: