IUP 奇怪的标签页关闭行为
IUP strange tab close behavior
我正在尝试使用 IupTabs 和 IupScintilla 通过 IUP 创建一个简单的文本编辑器。但是,当 运行 在 Linux 上时,我遇到了一种我似乎无法解决的奇怪的标签关闭行为。
当存在多个选项卡时,第一个 被删除(使用 SHOWCLOSE
按钮或通过我的回调 close_cb
,剩下的一个选项卡留空。我已经尝试了 IupUpdate、IupRedraw、IupRefresh 和 [= 的所有组合28=]IupRefreshChildren 似乎没有什么可以强制正确绘制选项卡。
我什至深入研究了 IUP 源代码并在 iupgtk_tabs.c 中找到了 gtkTabsCloseButtonClicked
函数(第 307 行)以验证选项卡是否被删除以下代码,以便我的回调 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 中的错误。它现在已在 SVN 中修复。从今天开始。
我正在尝试使用 IupTabs 和 IupScintilla 通过 IUP 创建一个简单的文本编辑器。但是,当 运行 在 Linux 上时,我遇到了一种我似乎无法解决的奇怪的标签关闭行为。
当存在多个选项卡时,第一个 被删除(使用 SHOWCLOSE
按钮或通过我的回调 close_cb
,剩下的一个选项卡留空。我已经尝试了 IupUpdate、IupRedraw、IupRefresh 和 [= 的所有组合28=]IupRefreshChildren 似乎没有什么可以强制正确绘制选项卡。
我什至深入研究了 IUP 源代码并在 iupgtk_tabs.c 中找到了 gtkTabsCloseButtonClicked
函数(第 307 行)以验证选项卡是否被删除以下代码,以便我的回调 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 中的错误。它现在已在 SVN 中修复。从今天开始。