xlib如何为输入框显示闪烁的光标

时间:2013-11-04 20:22:00

标签: xlib

我正在尝试用xlib实现一个输入框,但我找不到任何关于如何显示闪烁光标的ifnormation。

如下所示: enter image description here

怎么做?

2 个答案:

答案 0 :(得分:3)

xlib没有动画或闪烁的内置概念。您必须运行计时器并定期绘制和擦除光标。

答案 1 :(得分:1)

我使用类似的东西: 这是我的项目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 );
}