奇怪的标签关闭行为

  • 本文关键字:标签 iup
  • 更新时间 :
  • 英文 :


我试图创建一个简单的文本编辑器与IUP使用IupTabsIupScintilla。然而,当在Linux上运行时,我遇到了一个奇怪的选项卡关闭行为,我似乎无法解决。

当有多个选项卡存在时,并且第一个被删除(通过SHOWCLOSE按钮或通过我的回调close_cb),剩下的单个选项卡保持空白。我已经尝试了IupUpdateIupRedrawIupRefreshIupRefreshChildren的所有组合,似乎没有任何东西强制标签正确绘制。

我甚至深入到IUP源中,并在iupgtk_tabs.c(第307行)中找到gtkTabsCloseButtonClicked函数,以验证使用以下代码删除选项卡,以便我的回调close_cb至少执行相同的操作。

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

我将这个问题提炼成下面的示例代码。我在Lubuntu 12.04 x86-64上运行这个。IUP版本为 IUP -3.16 _linux32_64_lib ,从Sourceforge下载。这个问题只发生在GTK上,而不是Windows上。我不确定这是否是一个错误,或者如果我只是做错了什么。如果它是一个bug,我不确定它是否与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

这是IUP中的一个bug。它现在在SVN中被修复了。因为今天。

相关内容

  • 没有找到相关文章

最新更新