我正在尝试用 xlib 实现一个输入框,但我找不到任何关于如何显示闪烁光标的 ifnorm。
如下所示:
如何做呢?
xlib
没有内置的动画或闪烁概念。您必须运行计时器并定期绘制和擦除光标。
我使用类似: 这是我的项目http://open.source.sveena.com的摘录 你必须完成缺失的部分。
// call this periodically
void FlipCaret()
{
if( !s_caretgc )return;
if( s_hidecaret )return;
XACCESSLOCK;
if( !s_caretgc )return;
XFillRectangle(s_caretdisplay, s_caretwindow, s_caretgc, s_caretx, s_carety, s_caretcx, s_caretcy);
XFlush(s_caretdisplay);
s_caretvisible = s_caretvisible ? 0 : 1;
}
// to create and destroy caret
static void s_DestroyCaret()
{
if( !s_caretgc )return;
XACCESSLOCK;
if( s_caretgc ){
if( s_caretvisible ){
FlipCaret();
}
XFreeGC( s_caretdisplay, s_caretgc );
XFlush( s_caretdisplay );
s_caretgc = 0;
}
}
static void s_CreateCaret( MWND* mwnd, Window w )
{
s_DestroyCaret();
XACCESSLOCK;
s_caretdisplay = mwnd->m_Display;
s_caretmwnd = mwnd;
s_caretwindow = w;
s_caretx = mwnd->Caretx;
s_carety = mwnd->Carety;
s_caretcx = mwnd->CaretCx;
s_caretcy = mwnd->CaretCy;
if( s_caretcx<5 )s_caretcx = 5;
if( s_caretcx>20 )s_caretcx = 20;
if( s_caretcy<16 )s_caretcy = 16;
if( s_caretcy>100 )s_caretcy = 100;
XGCValues gcval;
gcval.function = GXinvert;
gcval.fill_style = FillSolid;
if( IsValidXWindow( w, "XCreateGC" ) )
s_caretgc = XCreateGC(s_caretdisplay,w,GCFunction|GCFillStyle,&gcval);
XFlush( s_caretdisplay );
}