int menu_select(menu_t *p_menu, uint32_t available_options, int *p_submenus) { vSetActiveFont(p_menu->p_font); while (vGetButtonData()) ; p_menu->available_options = available_options; while(1) { uint32_t keys; vSetForeColor(vRGB(0,0,0)); vFillRect(p_menu->x1, p_menu->y1, p_menu->x2, p_menu->y2); menu_draw(p_menu); vFlipScreen(1); msSleep(300); keys = wait_key_press(); if (keys & KEY_UP) select_next(p_menu, 0, -1); else if (keys & KEY_DOWN) select_next(p_menu, 0, 1); else if (keys & KEY_LEFT) select_next(p_menu, -1, 0); else if (keys & KEY_RIGHT) select_next(p_menu, 1, 0); else if (keys & KEY_SELECT) return -1; else if (keys & KEY_FIRE || keys & KEY_FIRE2) { int ret = p_menu->cur_sel; int i; if (!is_submenu_title(p_menu, ret)) { for (i=0; i<p_menu->n_submenus; i++) p_submenus[i] = p_menu->p_submenus[i].sel; p_menu->cur_sel = 0; return ret; } } } return -1; }
static void select_one(menu_t *p_menu, int sel) { if (sel >= p_menu->n_entries) sel = 0; p_menu->cur_sel = sel; if (p_menu->pp_msgs[p_menu->cur_sel][0] == ' ' || p_menu->pp_msgs[p_menu->cur_sel][0] == '#' || IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel])) select_next(p_menu, 0, 1 , 1); }
void schedule() { struct pcb_s* pcb; struct pcb_s* pcb_init; pcb_init = current_process; pcb = current_process; /* Start by eliminating all zombies (rhaaaaa !) */ while (pcb->next->state == TERMINATED) { /* If no process to be executed -> note that and leave loop */ if (pcb->next == pcb) { pcb = NULL; break; } else { /* Particular case of the head */ if (pcb->next == ready_queue) ready_queue = pcb; /* Remove pcb from the list (FIXME : could be done after the loop) */ pcb->next = pcb->next->next; /* Free memory */ malloc_free((char*) pcb->next->stack_base); malloc_free((char*) pcb->next); /* Get next process */ pcb = pcb->next; } } if (pcb != NULL) { /* On parcours la liste jusqu'à trouver un processus non bloqué */ pcb = pcb->next; while(pcb->state == WAITING && pcb != pcb_init) pcb = pcb->next; /* Si tous les processus sont bloqués -> on le note */ if(pcb->state == WAITING) pcb = NULL; } if(pcb == NULL) { /* Si pas de processus à élire -> idle */ ready_queue = NULL; current_process = &idle; } else { /* Sinon -> le processus élu est trouve par l'algorithme RMS*/ select_next(pcb); //current_process = pcb; } }
static int menu_select_internal(SDL_Surface *screen, menu_t *p_menu, int *p_submenus, int sel, void (*select_next_cb)(menu_t *p, void *data), void *select_next_cb_data, int font_size) { int ret = -1; int i; for (i = 0; i < p_menu->n_submenus; i++) p_menu->p_submenus[i].sel = p_submenus[i]; while(1) { uint32_t keys; int sel_last = p_menu->cur_sel; menu_draw(screen, p_menu, 0, font_size); SDL_Flip(screen); keys = menu_wait_key_press(); quit_thread = 1; if (keys & KEY_UP) {select_next(p_menu, 0, -1, 1);play_click(0);} else if (keys & KEY_DOWN) {select_next(p_menu, 0, 1, 1);play_click(0);} else if (keys & KEY_PAGEUP) {select_next(p_menu, 0, -20, 0);play_click(0);} else if (keys & KEY_PAGEDOWN) {select_next(p_menu, 0, 20, 0);play_click(0);} else if (keys & KEY_LEFT) {select_next(p_menu, -1, 0 ,1);play_click(0);} else if (keys & KEY_RIGHT) {select_next(p_menu, 1, 0 ,1);play_click(0);} else if (keys & KEY_ESCAPE) {play_click(2);break;} else if (keys & KEY_SELECT) { ret = p_menu->cur_sel; int i; for (i=0; i<p_menu->n_submenus; i++) p_submenus[i] = p_menu->p_submenus[i].sel; play_click(1); break; } /* Invoke the callback when an entry is selected */ if (sel_last != p_menu->cur_sel && select_next_cb != NULL) select_next_cb(p_menu, select_next_cb_data); } SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0)); return ret; }
static void select_next(menu_t *p_menu, int dx, int dy) { p_menu->cur_sel = (p_menu->cur_sel + dy) < 0 ? p_menu->n_entries - 1 : (p_menu->cur_sel + dy) % p_menu->n_entries; int next = (p_menu->cur_sel + dy + 1) < 0 ? p_menu->n_entries - 1 : (p_menu->cur_sel + dy + 1) % p_menu->n_entries; if (p_menu->pp_msgs[p_menu->cur_sel][0] == ' ' || ( (p_menu->available_options & (1<<p_menu->cur_sel)) == 0) || IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel]) ) select_next(p_menu, dx, dy); /* If the next is a submenu */ if (dx != 0 && IS_SUBMENU(p_menu->pp_msgs[next])) { submenu_t *p_submenu = find_submenu(p_menu, next); p_submenu->sel = (p_submenu->sel + dx) < 0 ? p_submenu->n_entries - 1 : (p_submenu->sel + dx) % p_submenu->n_entries; } }
static void select_next(menu_t *p_menu, int dx, int dy, int cicle) { int next; p_menu->cur_sel = get_next_seq_y(p_menu, p_menu->cur_sel, dy, cicle); next = get_next_seq_y(p_menu, p_menu->cur_sel, dy + 1, cicle); if (IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel])&&(dy!=1)&&(dy!=-1)) p_menu->cur_sel--; if (p_menu->pp_msgs[p_menu->cur_sel][0] == ' ' || p_menu->pp_msgs[p_menu->cur_sel][0] == '#' || IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel]) ) select_next(p_menu, dx, dy, cicle); /* If the next is a submenu */ if (dx != 0 && IS_SUBMENU(p_menu->pp_msgs[next])) { submenu_t *p_submenu = find_submenu(p_menu, next); p_submenu->sel = (p_submenu->sel + dx) < 0 ? p_submenu->n_entries - 1 : (p_submenu->sel + dx) % p_submenu->n_entries; } else if (dx == -1 && !strcmp(p_menu->pp_msgs[0], "[..]")) p_menu->cur_sel = 0; }
static int select_and_print(DB * db, const char *tname, col_t * cols, int ncol, cond_t * conds, int ncond) { table_t *t; cursor_t *cur; record_t *r; int count; int ret = 0; int error, xerror; if ((t = db_find_table(db, tname)) == NULL) { xerrno = ERR_NOTABLE; return -1; } for (int i = 0; i < ncol; i++) { int k; if ((k = table_find_col(t, cols[i].name)) < 0) { xerrno = ERR_NOCOL; return -1; } cols[i].type = t->cols[k].type; cols[i].size = t->cols[k].size; } if (ncol == 0) { ncol = t->ncols; cols = t->cols; } int *width; if ((width = calloc(ncol, sizeof(int))) == NULL) { perror("out of memory"); return -1; } for (int i = 0; i < ncol; i++) { int k = table_find_col(t, cols[i].name); switch (t->cols[k].type) { case TYPE_INT: width[i] = _max(INT_P_WIDTH, strlen(t->cols[k].name) + 1); break; case TYPE_FLOAT: width[i] = _max(FLOAT_P_WIDTH, strlen(t->cols[k].name) + 1); break; case TYPE_STRING: width[i] = _max(t->cols[k].size, strlen(t->cols[k].name) + 1); break; } } if ((cur = select_from(db, tname, conds, ncond)) == NULL) { preserve_errno(free(width)); return -1; } print_thead(cols, ncol, width); count = 0; while ((r = select_next(db, cur)) != NULL) { print_record(t, cols, ncol, r, width); free_record(r); count++; } if (select_error(cur)) { error = errno; xerror = xerrno; ret = -1; } printf("Total %d %s\n\n", count, count > 1 ? "records" : "record"); free_cursor(cur); free(width); errno = error; xerrno = xerror; return ret; }