static int getmouseregion( a_list *list, int *row, int *col ) { a_list_info *box; box = list->box; uimousepos( box->vs, row, col ); if( *row - box->area.row >= (int)uilistsize( list ) ) { return( R_UNS ); } if( *row >= box->area.height + box->area.row ) { return( R_DOWN ); } if( *row < box->area.row ) { return( R_UP ); } if( ( *col >= box->area.col + box->area.width ) || ( *col < box->area.col ) ) { return( R_UNS ); } return( R_SEL ); }
EVENT uigadgetfilter( EVENT ev, p_gadget g ) { int m_anchor, m_linear; int tmp; EVENT newev; ORD start; int length; int pos = 0; if( uimouseinstalled() ) { uiunprotect( g->win ); uimousepos( g->win, &m_anchor, &m_linear ); uiprotect( g->win ); if( g->dir == VERTICAL ) { tmp = m_linear; m_linear = m_anchor; m_anchor = tmp; } if( ( ev == EV_MOUSE_PRESS ) || ( ev == EV_MOUSE_DCLICK ) ) { if( ( m_anchor != g->anchor ) || ( m_linear < g->start ) || ( m_linear > g->end ) || ( Pressed != NULL ) ) { return( ev ); } else { Pressed = g; } } /* ignore everything if the gadget was not pressed */ if( Pressed != g ) return( ev ); length = g->end - g->start - 1; /* don't send pagefoward followed by pagebackward, then forward */ /* ignore non-mouse events */ switch( ev ) { case EV_MOUSE_PRESS : StartPos = g->pos; case EV_MOUSE_DCLICK : RepeatEvent = EV_NO_EVENT; case EV_MOUSE_REPEAT : if( Drag ) { break; } if( m_linear == g->start ) { return( g->backward ); } if( m_linear == g->end ) { return( g->forward ); } /* don't do page up and page down when total size is less than or equal to the page size */ if( g->total_size <= g->page_size ) break; start = g->linear; //CalcStart( g, g->pos, length ); if( m_linear < start ) { if( RepeatEvent == g->pageforward ) { return( EV_NO_EVENT ); } else { RepeatEvent = g->pagebackward; return( g->pagebackward ); } } if( m_linear > start ) { if( RepeatEvent == g->pagebackward ) { return( EV_NO_EVENT ); } else { RepeatEvent = g->pageforward; return( g->pageforward ); } } break; case EV_MOUSE_DRAG : /* don't do draging if total_size is less than or equal to the page size or mouse is too far from gadget */ if( ( m_anchor < ( g->anchor -1 ) ) || ( m_anchor > (g->anchor+1) ) || ( g->total_size <= g->page_size ) ) { return( EV_NO_EVENT ); } else { Drag = TRUE; /* so we don't send page events on MOUSE_REPEAT */ if( g->slider == EV_NO_EVENT ) { return( EV_NO_EVENT ); } } case EV_MOUSE_RELEASE : if( Pressed == NULL ) { break; } if( g->slider == EV_NO_EVENT ) { Drag = FALSE; } if( Drag ) { if( ( m_anchor < ( g->anchor -1 ) ) || ( m_anchor > (g->anchor+1) ) ) { /* note : must have got EV_MOUSE_RELEASE */ pos = StartPos; setgadget( g, pos, FALSE ); m_linear = g->linear; Drag = FALSE; } else { /* mouse drag to first scroll character or further left, so pos = 0 */ if( m_linear <= ( g->start + 1 ) ) { m_linear = g->start + 1; pos = 0; } else { /* mouse drag to last scroll character or further right, so pos = total_size */ if( m_linear >= ( g->end - 1 ) ) { m_linear = g->end - 1; pos = g->total_size - g->page_size; } else { pos = (int)((long)( m_linear - g->start ) * (long)( g->total_size - g->page_size ) / (long)length); } } } g->linear = m_linear; uidrawgadget( g ); } if( ( ev == EV_MOUSE_RELEASE ) || ( g->flags & GADGET_TRACK ) ) { if( Drag ) { StartPos = pos; g->pos = pos; g->linear = m_linear; setlinear( g ); if( g->linear < m_linear ) { g->pos++; setlinear( g ); } if( g->linear > m_linear ) { g->pos--; setlinear( g ); } newev = g->slider; } else { newev = EV_NO_EVENT; } if( ev == EV_MOUSE_RELEASE ) { Drag = FALSE; Pressed = NULL; } } else { newev = EV_NO_EVENT; } return( newev ); case EV_MOUSE_HOLD : break; default : return( ev ); } } else { return( ev ); } return( EV_NO_EVENT ); }
void main( void ) /***************/ { ui_event ui_ev; SAREA area; char buff[80]; an_event_string *ptr; ORD evrow = TOP_ROW; int mrow, mcol; int diff; if( uistart() ) { #ifdef CHARMAP uiinitgmouse( INIT_MOUSE_INITIALIZED ); /* the 0=mouseless,1=mouse,2=initialized mouse */ // uivgaattrs(); FlipCharacterMap(); #else initmouse( INIT_MOUSE_INITIALIZED ); #endif uimenus( barmenu, pulldownuimenus, EV_F1 ); UIData->mouse_clk_delay = uiclockdelay( 250 /* ms */ ); UIData->tick_delay = uiclockdelay( 3000 /* ms */ ); mainwin.area.height = UIData->height - 7; if( uivopen( &mainwin ) ) { for( ;; ) { uipushlist( evlist ); ui_ev = uivgetevent( &mainwin ); uipoplist( /* evlist */ ); if( ui_ev == EV_MOUSE_PRESS_R ) { uimousepos( NULL, &mrow, &mcol ); mrow++; mcol++; uipushlist( evlist ); ui_ev = uicreatepopup( mrow, mcol, filemenu, false, true, EV_NO_EVENT ); uipoplist( /* evlist */ ); } switch( ui_ev ) { case EV_QUIT: break; case EV_BACKGROUND_RESIZE: uivclose( &mainwin ); mainwin.area.height = UIData->height - 7; uivopen( &mainwin ); if( evrow > mainwin.area.height ) { evrow = TOP_ROW; } break; case EV_SAMPLE_DIALOG: sample_dialog(); break; case EV_OPEN: open(); break; case EV_GO: uispawnstart(); uiblankscreen(); printf( "Type exit to return\n" ); #if defined( __QNX__ ) || defined( __UNIX__ ) system( "" ); #elif defined( __WINDOWS__ ) // do nothing #else { const char *command; command = getenv( "COMSPEC" ); if( command == NULL ) { command = "c:\\command.com"; } system( command ); } #endif uispawnend(); // uibackground( "wf.img" ); area.row = 0; area.col = 0; area.height = UIData->height; area.width = UIData->width; uidirty( area ); break; case EV_F1: area.width = 10; area.height = 10; area.row = 1; area.col = 1; uivattribute( &mainwin, area, (ATTR) 1 ); break; } if( ui_ev == EV_QUIT ) { break; } else if( ui_ev != EV_NO_EVENT ) { for( ptr = evstrs; ; ++ptr ) { if( ptr->ui_ev == EV_NO_EVENT ) { sprintf( buff, "event 0x%4.4x", ui_ev ); break; } else if( ptr->ui_ev == ui_ev ) { sprintf( buff, "event 0x%4.4x (%s)", ui_ev, ptr->str ); break; } } uivtextput( &mainwin, evrow, 2, UIData->attrs[ATTR_NORMAL], buff, 40 ); if( ++evrow >= mainwin.area.height ) { evrow = TOP_ROW; } uivtextput( &mainwin, evrow, 2, UIData->attrs[ATTR_NORMAL], "", 40 ); switch( ui_ev ) { case EV_MOUSE_PRESS: BandOn = 1; uimousepos( NULL, &mrow, &mcol ); BandArea.row = mrow; BandArea.col = mcol; BandArea.width = 0; BandArea.height = 0; uibandinit( BandArea, UIData->attrs[ATTR_ACTIVE] ); break; case EV_MOUSE_DRAG: if( BandOn ) { uimousepos( NULL, &mrow, &mcol ); diff = mcol - BandArea.col; if( diff < 0 ) diff = 0; BandArea.width = diff; diff = mrow - BandArea.row; if( diff < 0 ) diff = 0; BandArea.height = diff; uibandmove( BandArea ); } break; case EV_MOUSE_RELEASE: if( BandOn ) uibandfini(); BandOn = 0; break; } } } uivclose( &mainwin ); } uinomenus(); uiswap(); uirestorebackground(); /* must be after uiswap */ #ifdef CHARMAP FlipCharacterMap(); uifinigmouse(); #else finimouse(); #endif uistop(); } }
int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { EVENT ev; SAREA area; char buff[80]; an_event_string *ptr; ORD evrow = TOP_ROW; BOOL fixup = FALSE; int mrow, mcol; int diff; hInstance = hInstance; hPrevInstance = hPrevInstance; lpCmdLine = lpCmdLine; nShowCmd = nShowCmd; if( InitSwapper() ) return( 0 ); // Yes - well, I would make the swapper // return 1 on error, unlike everything // else, wouldn't I? if( !uistart() ) return( 0 ); ToCharacter(); initmouse( 2 ); uimenus( barmenu, pulldownuimenus, EV_FUNC( 1 ) ); UIData->mouse_clk_delay = uiclockdelay( 250 ); UIData->tick_delay = uiclockdelay( 3000 ); mainwin.area.height = UIData->height - 7; area.row = 0; area.col = 0; area.width = UIData->width; area.height = UIData->height; uidirty( area ); uirefresh(); if( uivopen( &mainwin ) ) { uirefresh(); sprintf( buff, "screen height : %d\0", UIData->height ); uivtextput( &mainwin, TOP_ROW - 1, 2, UIData->attrs[ ATTR_NORMAL ], buff, 30 ); for( ; ; ) { uipushlist( evlist ); ev = uivgetevent( NULL ); uipoplist(); if( ev == EV_QUIT ) break; if( ev == EV_ALT_R ) break; if( ev == EV_MOUSE_PRESS_R ) { uimousepos( NULL, &mrow, &mcol ); mrow++; mcol++; uipushlist( evlist ); ev = uicreatepopup( mrow, mcol, &filemenu, FALSE, TRUE, NULL ); uipoplist(); } switch ( ev ) { case EV_SAMPLE_DIALOG: sample_dialog(); break; case EV_OPEN: open(); break; case EV_FUNC(1): area.width = 10; area.height = 10; area.row = 1; area.col = 1; uivattribute( &mainwin, area, (ATTR) 1 ); break; case EV_CURSOR_RIGHT: mainwin.col++; if( mainwin.col >= mainwin.area.width ) mainwin.col--; fixup = TRUE; break; case EV_CURSOR_DOWN: mainwin.row++; if( mainwin.row >= mainwin.area.height ) mainwin.row--; fixup = TRUE; break; case EV_CURSOR_LEFT: if( mainwin.col > 0 ) { mainwin.col--; fixup = TRUE; } break; case EV_CURSOR_UP: if( mainwin.row > 0 ) { mainwin.row--; fixup = TRUE; } break; } if( fixup ) { fixup = FALSE; uivsetcursor( &mainwin ); } if( ev != EV_NO_EVENT ) { for( ptr=evstrs; ; ++ptr ){ if( ptr->ev == EV_NO_EVENT ) { sprintf( buff, "event 0x%4.4x", ev ); break; } else if( ptr->ev == ev ) { strcpy( buff, ptr->str ); break; } } uivtextput( &mainwin, evrow, 2, UIData->attrs[ ATTR_NORMAL ], buff, 30 ); if( ++evrow >= mainwin.area.height ){ evrow = TOP_ROW; } uivtextput( &mainwin, evrow, 2, UIData->attrs[ ATTR_NORMAL ], "", 30 ); switch( ev ) { case EV_MOUSE_PRESS: BandOn = 1; uimousepos( NULL, &mrow, &mcol ); BandArea.row = mrow; BandArea.col = mcol; BandArea.width = 0; BandArea.height = 0; uibandinit( BandArea, UIData->attrs[ ATTR_ACTIVE ] ); break; case EV_MOUSE_DRAG: if( BandOn ) { uimousepos( NULL, &mrow, &mcol ); diff = mcol - BandArea.col; if( diff < 0 ) diff = 0; BandArea.width = diff; diff = mrow - BandArea.row; if( diff < 0 ) diff = 0; BandArea.height = diff; uibandmove( BandArea ); } break; case EV_MOUSE_RELEASE: if( BandOn ) uibandfini(); BandOn = 0; break; } } } uivclose( &mainwin ); } uinomenus(); uiswap(); uirestorebackground(); /* must be after uiswap */ finimouse(); ToGraphical(); uistop(); FiniSwapper(); return( 0 ); }