0

IupTabsIupScintillaを使用して、IUP でシンプルなテキスト エディターを作成しようとしています。ただし、Linux で実行すると、タブを閉じるという奇妙な動作が発生し、解決できないようです。

複数のタブが存在し、最初のタブが削除された場合 (SHOWCLOSEボタンまたは callback を使用してclose_cb、残りの 1 つのタブは空白のままになります。IupUpdateIupRedrawIupRefresh、およびIupRefreshChildrenのすべての組み合わせを試しましたが、強制的にタブが正しく描画されるようにします。

IUP ソースに飛び込んでiupgtk_tabs.cgtkTabsCloseButtonClicked (307 行目) に関数を配置し、次のコードでタブが削除されていることを確認して、コールバックが少なくとも同じアクションを実行するようにしました。close_cb

if (ret == IUP_CONTINUE) /* destroy tab and children */
{
  IupDestroy(child);
  IupRefreshChildren(ih);
}

問題を以下のサンプル コードに絞り込みました。これを Lubuntu 12.04 x86-64 で実行しています。IUP のバージョンは、Sourceforge からダウンロードしたiup-3.16_Linux32_64_libです。この問題は GTK でのみ発生し、Windows では発生しません。これがバグなのか、それとも何か間違ったことをしているだけなのかはわかりません。バグだとしたらGTK関連なのかIUP関連なのかわかりません。

#include <iup.h>
#include <iup_scintilla.h>
#include <stdlib.h>

int new_cb( Ihandle* self )
{
    // create a new Scintilla control
    Ihandle* sci = IupScintilla();
    IupSetAttributes( sci, "TABSIZE=4, EXPAND=YES, VISIBLE=YES, "
        "TABTITLE=Untitled, TABIMAGE=IUP_FileSave" );

    // add the Scintilla to the tabs
    Ihandle* tabs = IupGetHandle( "tabs" );
    IupAppend( tabs, sci );
    IupMap( sci );
    IupSetAttributeHandle( tabs, "VALUE", sci );
    IupSetFocus( sci );
    IupRefresh( tabs );

    return IUP_IGNORE;
}

int close_cb( Ihandle* self )
{
    Ihandle* tabs = IupGetHandle( "tabs" );

    int old_count = IupGetChildCount( tabs );
    if ( old_count == 0 ) return IUP_IGNORE;

    // remove the current tab
    Ihandle* old_tab = IupGetAttributeHandle( tabs, "VALUE" );

    // see iupgtk_tabs.c:307
    IupDestroy( old_tab );
    IupRefreshChildren( tabs );

    int new_count = IupGetChildCount( tabs );
    if ( new_count == 0 ) return IUP_IGNORE;

    // set focus to the new tab
    Ihandle* new_tab = IupGetAttributeHandle( tabs, "VALUE" );
    IupSetFocus( new_tab );

    return IUP_IGNORE;
}

int tabchange_cb( Ihandle* self, Ihandle* old_tab, Ihandle* new_tab )
{
    // set focus to the new tab
    IupSetFocus( new_tab );
    return IUP_CONTINUE;
}

int tabclose_cb( Ihandle* self, int pos )
{
    // allow the old tab to be removed
    return IUP_CONTINUE;
}

int main( int argc, char** argv )
{
    IupOpen( &argc, &argv );
    IupScintillaOpen();
    IupImageLibOpen();

    Ihandle* tabs = IupTabs( NULL );
    IupSetAttribute( tabs, "SHOWCLOSE", "YES" );
    IupSetCallback( tabs, "TABCHANGE_CB", (Icallback)tabchange_cb );
    IupSetCallback( tabs, "TABCLOSE_CB", (Icallback)tabclose_cb );
    IupSetHandle( "tabs", tabs );

    Ihandle* dialog = IupDialog( tabs );
    IupSetAttribute( dialog, "SIZE", "HALFxHALF" );
    IupSetAttribute( dialog, "TITLE", "Tabs Demo" );
    IupSetHandle( "dialog", dialog );

    // Ctrl+N opens a new tab    
    IupSetCallback( dialog, "K_cN", (Icallback)new_cb );

    // Ctrl+W closes the current tab
    IupSetCallback( dialog, "K_cW", (Icallback)close_cb );

    IupShowXY( dialog, IUP_CENTER, IUP_CENTER );

    // add a new tab by default
    new_cb( NULL );

    IupMainLoop();

    IupClose();

    return EXIT_SUCCESS;
}

スクリーンショット: tabsdemo.png

4

1 に答える 1

1

それは IUP のバグでした。現在、SVN で修正されています。今日から。

于 2015-10-30T15:58:10.207 に答える