/***************************************************************************/ void Update_Time() { char time_str[35]; char *message; byte minutes,hours,day_o_week,day_o_month,month,am_pm,i,time_len,color; byte x,y,max_time_str = 34; _asm mov ah,2ch _asm int 21h _asm mov minutes,cl _asm mov hours,ch if (current_minute != minutes){ current_minute = minutes; _asm mov ah,2ah _asm int 21h _asm mov day_o_week,al _asm mov day_o_month,dl _asm mov month,dh am_pm = 0; if (hours >= 12) { am_pm = 1; hours -=12; } if (hours == 0) hours = 12; switch (day_o_week){ case 0: strcpy(time_str,"Sunday, "); break; case 1: strcpy(time_str,"Monday, "); break; case 2: strcpy(time_str,"Tuesday, "); break; case 3: strcpy(time_str,"Wednesday, "); break; case 4: strcpy(time_str,"Thursday, "); break; case 5: strcpy(time_str,"Friday, "); break; case 6: strcpy(time_str,"Saturday, "); break; } switch (month){ case 1: strcat( time_str,"January"); break; case 2: strcat( time_str,"February"); break; case 3: strcat( time_str,"March"); break; case 4: strcat( time_str,"April"); break; case 5: strcat( time_str,"May"); break; case 6: strcat( time_str,"June"); break; case 7: strcat( time_str,"July"); break; case 8: strcat( time_str,"August"); break; case 9: strcat( time_str,"September"); break; case 10: strcat( time_str,"October"); break; case 11: strcat( time_str,"November"); break; case 12: strcat( time_str,"December"); break; } /* day, hours, minutes and am/pm */ sprintf( (time_str + strlen(time_str))," %d, %d:%02d ",day_o_month,hours,minutes); if (am_pm) strcat( time_str,"pm"); else strcat(time_str,"am"); /* display time */ time_len = strlen(time_str); message = time_str; color = (byte) (palette[header_palette][BACK] <<4) | (palette[header_palette][TEXT]); /* tigger timer special action if time expires */ if (timer){ if (!--timer){ event.action = SPECIAL; event.data = 0; } } // Determine where and if to display the time x = max_screen_x -2; y = 1; if ( !timer && timer_holder ){ Fill_Screen(' ',0); if (screen_saver_message != NULL) message = screen_saver_message; max_time_str = time_len = strlen( message ); /* invent a psuedo random number */ x = time_len + clock_place % (max_screen_x - time_len); y = clock_place % max_screen_y; } else if (!show_time) return; Hide_Mouse(); for (i=1;i <= time_len ;i++) Draw( (byte)(x-i),y,*(message+time_len-i),color); /* overlap old spot should new time be shorter */ for (;i0;i--) if (special_item[i] != NULL) break; if (!i) x=0; else x=special_item[i]->item_number; Hide_Mouse(); for (;x < special_item[selected_fn]->item_number;x++) Put_Color(x,max_screen_y,footer_color); Show_Mouse(); selected_fn = 0; } /***************************************************************************/ void Select_Fn(x) byte x; { byte i; for (i=1;i<11;i++) if (special_item[i]!=NULL && special_item[i]->item_number>x) break; if (i == selected_fn) return; if (i == 11){ Unselect_Fn(); return; } Unselect_Fn(); selected_fn=i; for (i--;i>0 && special_item[i] == NULL;i--); if (!i) x=0; else x=special_item[i]->item_number; Hide_Mouse(); for (;x< special_item[selected_fn]->item_number;x++) Put_Color(x,max_screen_y,footer_highlight); Show_Mouse(); } /***************************************************************************/ byte Old_Window(x,y) byte x,y; { byte window = (byte) win_index; for (window--;window!=255;window--) if (x>=Win[window].left && x<= Win[window].right && y>=Win[window].top && y<= Win[window].bottom) return( (int) win_index - window); return( 0); } /***************************************************************************/ void Update_Mouse() { unsigned int mouse_x,mouse_y,button; byte choice; Item *item; _asm mov ax,3 /* read current mouse position */ _asm sub bx,bx _asm sub cx,cx _asm sub dx,dx _asm int 33h _asm mov mouse_x,cx _asm mov mouse_y,dx _asm mov button,bx mouse_x = mouse_x >> 3; mouse_y = mouse_y >> 3; /* decide what is going on with the mouse */ if (mouse_x == 0 && mouse_y == 0) return; if (mouse_x == last_x && mouse_y == last_y && button == last_button) return; /* select item if the mouse is over a selectable item */ choice = mouse_y-top-2; if ( mouse_x>left && mouse_x0 && choice<=current_menu->number_of_items){ if ( choice!=current_item->item_number ){ item = Number_To_Item( (byte) choice ); if (item->first_line != NULL){ event.action = GOTO_ITEM; event.data = choice; } } } /* this checks for top & bottom run off */ else if ( last_y < bottom && last_y > (byte)top+2 ){ if ( last_y > mouse_y) choice = 1; else choice = current_menu->number_of_items; item = Number_To_Item( (byte) choice ); if (item->first_line != NULL){ event.action = GOTO_ITEM; event.data = choice; } } } /* highlight footer spots */ if (mouse_y == max_screen_y ) Select_Fn( (byte)mouse_x); else if (selected_fn) Unselect_Fn(); /* left button */ if ( !(last_button & 1) && (button & 1)){ event.action = OTHER; if ( mouse_x>left && mouse_x0 && choice<=current_menu->number_of_items ){ item = Number_To_Item( (byte) choice ); if (item->first_line != NULL) event.action = DO_ITEM; } else if (selected_fn){ event.action = SPECIAL; event.data = selected_fn; } else if ( mouse_x < left || mouse_x > right || mouse_y > bottom || mouse_y < top){ choice = Old_Window( (byte)mouse_x, (byte)mouse_y ); if (choice > 0){ event.action = ESCAPE; event.data = choice; } } } /* right button */ if ( !(last_button & 2) && (button & 2) ){ event.action = ESCAPE; event.data = 1; } timer = timer_holder; /* reset timer */ last_x = mouse_x; last_y = mouse_y; last_button = button; Show_Mouse(); } /***************************************************************************/ void Get_Key_Input() { char key_input; byte index; timer = timer_holder; key_input = getch(); event.action = KEY_PRESS; event.data = key_input; if (!key_input) /* if key input == 0 get the extended part */ switch(key_input = getch()){ case 71: /* home */ case 73: /* page up */ event.action = GOTO_TOP; return; case 72: /* up arrow */ event.action = MOVE_UP; return; case 75: /* back arrow */ case 83: /* delete key */ event.action = BACK_SPACE; event.data = 1; return; case 79: /* end */ case 81: /* page down */ event.action = GOTO_BOTTOM; return; case 80: /* down arrow */ event.action = MOVE_DOWN; return; default: /* chech fn keys */ if (key_input >58 && key_input < 69){ key_input -= 58; if (special_item[key_input] != NULL){ event.action = SPECIAL; event.data = key_input; } return; } /* check extended hot keys */ for(index=11;index < hot_keys;index++){ if (special_item[index]->item_number == 0 && special_item[index]->title_length == key_input){ event.action = SPECIAL; event.data = index; return; } } event.action = NO_ACTION; return; } switch(key_input){ case 8: event.action = BACK_SPACE; event.data = 1; return; case 13: event.action = DO_ITEM; return; case 27: event.action = ESCAPE; event.data = 1; return; default: /* check regular hot keys */ for(index=11;index < hot_keys;index++){ if (special_item[index]->item_number == key_input){ event.action = SPECIAL; event.data = index; return; } } return; } } /***************************************************************************/ void Scan_For_Letter( key_input ) char key_input; { Item *item = current_item->next_item; if (key_input == ' '){ event.action = MOVE_DOWN; return; } key_input = key_input | 32; /* ignore case */ if (quick_select){ if ( key_input > 48 && key_input <= 57 ){ if ( key_input <= (byte) (current_menu->number_of_items + 48) ){ item = Number_To_Item( (byte) (key_input - 48) ); if ( item->first_line != NULL ){ Win[win_index].item = current_item = item; event.action = DO_ITEM; } } } if ( key_input > 96 ){ /* 87 is becuase 'a' is actually 10 */ if ( key_input <= (byte) (current_menu->number_of_items + 87 ) ){ item = Number_To_Item( (byte) (key_input - 87) ); if ( item->first_line != NULL ){ Win[win_index].item = current_item = item; event.action = DO_ITEM; } } } return; } for (; item != NULL; item = item->next_item) if (item->first_line != NULL && (*(item->title)|32) == key_input){ event.action = GOTO_ITEM; event.data = item->item_number; return; } for (item = Home_Item(); item != current_item; item = item->next_item) if (item->first_line != NULL && (*(item->title)|32) == key_input){ event.action = GOTO_ITEM; event.data = item->item_number; return; } } /***************************************************************************/ void Wait_For_Event() { Show_Mouse(); event.action = NO_ACTION; while( event.action == NO_ACTION ){ Update_Mouse(); Update_Time(); if (kbhit()) Get_Key_Input(); } Hide_Mouse(); } /***************************************************************************/ void Pause_Until_Serious_Action( void ) { do Wait_For_Event(); while (event.action == GOTO_ITEM); if (event.action != SPECIAL && event.action != ESCAPE) event.action = NO_ACTION; }