static void itemview_dispatch( UThread* ut, GWidget* wp, const GLViewEvent* ev ) { EX_PTR; (void) ut; /* UCell* val; UCell* cell; UBuffer* cblk; if( ! wp->cell[0].ctx.valBlk ) return; cblk = ur_blockPtr( wp->cell[0].ctx.valBlk ); val = ur_s_next(UR_TOS); */ switch( ev->type ) { /* case GLV_EVENT_FOCUS_IN: ur_initType(val, UT_LOGIC); ur_logic(val) = 1; break; case GLV_EVENT_FOCUS_OUT: ur_initType(val, UT_LOGIC); ur_logic(val) = 0; break; case GLV_EVENT_RESIZE: break; */ case GLV_EVENT_BUTTON_DOWN: { double prevTime; int top = wp->area.y + wp->area.h + ep->scrollY; int row = (top - ev->y) / ep->itemHeight; if( itemview_validRow( ep, row ) ) { prevTime = ep->clickTime; ep->clickTime = ur_now(); if( row != ep->selRow ) { ep->selRow = row; itemview_updateSelection( ep ); } else if( (ep->clickTime - prevTime) < GUI_DCLICK_TIME ) { if( ep->actionBlkN != UR_INVALID_BUF ) gui_doBlockN( ut, ep->actionBlkN ); } } gui_setKeyFocus( wp ); //printf( "KR down %d,%d row %d\n", ev->x, ev->y, row ); } break; /* case GLV_EVENT_BUTTON_UP: ur_initType(val, UT_INT); ur_int(val) = mapButton( ev->code ); cell = CCELL( CI_TWIDGETPROTO_MOUSE_UP ); break; case GLV_EVENT_MOTION: // coord elements: x, y, dx, dy ur_initType(val, UT_COORD); val->coord.len = 5; val->coord.n[0] = ev->x - wp->x; //val->coord.n[1] = (ui->rootH - ev->y - 1) - wp->y; val->coord.n[1] = ev->y - wp->y; val->coord.n[2] = glEnv.mouseDeltaX; val->coord.n[3] = glEnv.mouseDeltaY; val->coord.n[4] = ev->state; cell = CCELL( CI_TWIDGETPROTO_MOUSE_MOVE ); break; */ case GLV_EVENT_WHEEL: itemview_scroll( ep, ev->y >> 2 ); break; case GLV_EVENT_KEY_DOWN: switch( ev->code ) { case KEY_Return: if( ep->actionBlkN != UR_INVALID_BUF ) gui_doBlockN( ut, ep->actionBlkN ); return; case KEY_Up: itemview_selectPrevItem( wp ); return; case KEY_Down: itemview_selectNextItem( wp ); return; } // Fall through... case GLV_EVENT_KEY_UP: gui_ignoreEvent( ev ); break; } }
static void ledit_dispatch( UThread* ut, GWidget* wp, const GLViewEvent* ev ) { EX_PTR; //printf( "KR ledit %d\n", ev->type ); switch( ev->type ) { case GLV_EVENT_BUTTON_DOWN: if( (ev->code == GLV_BUTTON_LEFT) || (ev->code == GLV_BUTTON_MIDDLE) ) { ledit_setState( ut, ep, LEDIT_STATE_EDIT ); gui_setKeyFocus( wp ); if( ev->code == GLV_BUTTON_LEFT ) { // Don't have access to font here so just notify render. ep->newCursorX = ev->x; setFlag( NEW_CURSORX ); } else // if( ev->code == GLV_BUTTON_MIDDLE ) { ledit_paste( ut, ep ); setFlag( CHANGED ); } } break; case GLV_EVENT_BUTTON_UP: case GLV_EVENT_MOTION: break; case GLV_EVENT_KEY_DOWN: if( ep->strN ) { UBuffer* str = ur_buffer( ep->strN ); if( ev->state & GLV_MASK_CTRL ) { if( ev->code == KEY_k ) { // Remove from cursor to end (from Bash). int len = str->used - ep->editPos; if( len > 0 ) { ur_arrErase( str, ep->editPos, len ); setFlag( CHANGED ); } } else if( ev->code == KEY_v ) { ledit_paste( ut, ep ); setFlag( CHANGED ); } break; } switch( ev->code ) { case KEY_Return: goto activate; case KEY_Left: if( ep->editPos > 0 ) { --ep->editPos; setFlag( CHANGED ); } break; case KEY_Right: if( ep->editPos < str->used ) { ++ep->editPos; setFlag( CHANGED ); } break; case KEY_Home: ep->editPos = 0; setFlag( CHANGED ); break; case KEY_End: ep->editPos = str->used; setFlag( CHANGED ); break; case KEY_Insert: break; case KEY_Delete: if( ep->editPos < str->used ) { ur_arrErase( str, ep->editPos, 1 ); setFlag( CHANGED ); } break; case KEY_Back_Space: if( ep->editPos > 0 ) { --ep->editPos; ur_arrErase( str, ep->editPos, 1 ); setFlag( CHANGED ); } break; default: if( str->used < ep->maxChars ) { int key = KEY_ASCII(ev); if( key >= ' ' ) { if( ep->filterN ) { UBuffer* bin = ur_buffer( ep->filterN ); if( ! _bitIsSet( bin->ptr.b, key ) ) break; } ur_arrExpand( str, ep->editPos, 1 ); if( ur_strIsUcs2(str) ) str->ptr.u16[ ep->editPos ] = key; else str->ptr.b[ ep->editPos ] = key; ++ep->editPos; setFlag( CHANGED ); } else { gui_ignoreEvent( ev ); } } break; } } break; case GLV_EVENT_KEY_UP: gui_ignoreEvent( ev ); break; case GLV_EVENT_FOCUS_IN: break; case GLV_EVENT_FOCUS_OUT: ledit_setState( ut, ep, LEDIT_STATE_DISPLAY ); break; } return; activate: if( ep->codeN ) gui_doBlockN( ut, ep->codeN ); }