gint viper_form_driver(FORM *form,gint request,guint32 flags, chtype active,chtype normal,gshort cursor_color) { WINDOW *window; chtype eraser; chtype temp_ch; gint x,y; gint retval; gshort fg,bg; if(form==NULL) return ERR; if(form_sub(form)!=form_win(form)) window=form_sub(form); else window=form_win(form); getyx(window,y,x); eraser=field_back(current_field(form)); mvwchgat(window,y,x,1,(eraser & A_ATTRIBUTES), PAIR_NUMBER(eraser & A_COLOR),NULL); retval=form_driver(form,request); if(flags & FORM_COLORIZE) viper_form_colorize(form,active,normal,active,normal); if(flags & FORM_CURSOR_NONE) return retval; temp_ch=termattrs(); if((flags & FORM_CURSOR_ULINE) && !(temp_ch & A_UNDERLINE)) return ERR; getyx(window,y,x); temp_ch=field_fore(current_field(form)); if(flags & FORM_CURSOR_ULINE) mvwchgat(window,y,x,1,(temp_ch & A_ATTRIBUTES) | A_UNDERLINE, PAIR_NUMBER(temp_ch & A_COLOR),NULL); else { pair_content(PAIR_NUMBER(temp_ch & A_COLOR),&fg,&bg); if(cursor_color!=-1) { bg=cursor_color; mvwchgat(window,y,x,1,A_NORMAL,viper_color_pair(fg,bg),NULL); } else mvwchgat(window,y,x,1,A_REVERSE,viper_color_pair(fg,bg),NULL); } return E_OK; }
void viper_form_destroy(FORM *form,gboolean free_windows) { WINDOW *parent; WINDOW *window; WINDOW *subwin; FIELD **fields; gint count; unpost_form(form); window=form_win(form); subwin=form_sub(form); parent=window->_parent; count=field_count(form); fields=form_fields(form); free_form(form); while(count>0) { free_field(fields[count-1]); count--; } g_free(fields); if(free_windows==FALSE) return; /* delete subwin if it is completely independent. */ if(subwin!=parent && subwin!=window && subwin!=NULL) delwin(subwin); /* delete window if it is not the parent window. */ if(parent!=NULL && window!=parent && window!=NULL) delwin(window); return; }
static void erase_form(FORM * f) { WINDOW *w = form_win(f); WINDOW *s = form_sub(f); unpost_form(f); werase(w); wrefresh(w); delwin(s); delwin(w); }
void render_form(FORM *form) { int y, x, line; WINDOW *w = form_win(form); WINDOW *inner_w = form_sub(form); int numlines = getmaxy(w)-2; getyx(inner_w, y, x); line = y - (y % numlines); WINDOW *der = derwin(w, getmaxy(w)-2, getmaxx(w)-2, 1, 1); wclear(der); wrefresh(der); delwin(der); copywin(inner_w, w, line, 0, 1, 1, min(numlines, getmaxy(inner_w)-line), 68, 0); wmove(w, y + 1 - line, x + 1); wrefresh(w); }
int eq_run (kr_client_t *client, char *sysname) { WINDOW *eq_win,*tmpw; PANEL *eq_mainpan,*eq_subpan,*ctrl_subp; FORM *eq_form; FIELD **field; FIELD **ctrl_field; FORM *ctrl_form; /* Panels Structs */ ctrls_show_t *ctrls; eq_port_t *eqport; db_show_t *db; hz_show_t *hz; bw_show_t *bw; eq_saved_val_t *vals; int i; int max_co,subx,suby,gap; int offs = 0; int field_idx; int in_ctrl = 0; int nbands = KRAD_EQ_MAX_BANDS; int showed_bands = 1; int idx; char num[3]; int ch; int res; int bandn; clear (); char *fieldname[3] = {"Power","Frequency","Bandwidth"}; int nctrls = 3; eq_win = newwin (0,0,0,0); field = calloc (nbands+1,sizeof (FIELD*)); ctrl_field = calloc (nctrls+1,sizeof (FIELD*)); max_co = getmaxx (eq_win); gap = floor ((max_co) / nbands); vals = NULL; bandn = 0; ch = 0; for (i=0;i<nbands;i++) { field[i] = new_field (1,2,1, offs, 0, 0); set_field_just (field[i], JUSTIFY_CENTER); itoa (i,num,digits (i) + 1 ); set_field_buffer (field[i], 0, num); field_opts_off (field[i], O_AUTOSKIP | O_EDIT); offs += gap; } field[nbands] = NULL; offs = 0; gap = floor ((max_co ) / nctrls); for (i=0;i<nctrls;i++) { ctrl_field[i] = new_field (1,strlen (fieldname[i]),1, offs, 0, 0); set_field_just (ctrl_field[i], JUSTIFY_CENTER); set_field_buffer (ctrl_field[i], 0, fieldname[i]); field_opts_off (ctrl_field[i], O_AUTOSKIP | O_EDIT); offs += gap; } /* Controls generation */ ctrls = eq_ctrls_gen (eq_win,showed_bands); vals = calloc (1,sizeof (eq_saved_val_t)); eqport = calloc (1,sizeof (eq_port_t)); db = ctrls->db; hz = ctrls->hz; bw = ctrls->bw; eqport->name = sysname; eqport->vals = vals; eqport->ctrls = ctrls; /* Eq form init */ eq_form = new_form (field); wattron (eq_win,COLOR_PAIR (2) | A_BOLD); mvwprintw (eq_win,getmaxy (eq_win) * 0.05,floor ((max_co/2)-((strlen (sysname)+14)/2)),"Equalizer for %s",sysname); wattroff (eq_win,COLOR_PAIR (2) | A_BOLD); set_form_win (eq_form, eq_win); scale_form (eq_form, &suby, &subx); set_form_sub (eq_form, derwin (eq_win,suby, subx , getmaxy (eq_win) * 0.10 , (max_co - subx) / 2 )); eq_mainpan = new_panel (eq_win); eq_subpan = new_panel (form_sub (eq_form)); top_panel (eq_mainpan); top_panel (eq_subpan); post_form (eq_form); keypad (eq_win, TRUE); set_current_field (eq_form,field[0]); set_field_fore (current_field (eq_form),A_BOLD | COLOR_PAIR (3)); /* Eq ctrls form init */ ctrl_form = new_form (ctrl_field); set_form_win (ctrl_form, eq_win); scale_form (ctrl_form, &suby, &subx); set_form_sub (ctrl_form, derwin (eq_win,suby, subx , getmaxy (eq_win) * 0.90 , (max_co - subx) / 2 )); ctrl_subp = new_panel (form_sub (ctrl_form)); top_panel (ctrl_subp); post_form (ctrl_form); field_idx = field_index (current_field (eq_form)); /* Let's show controls! */ kr_mixer_portgroups (client); show_all_panels (ctrls,showed_bands); update_panels (); doupdate (); while (ch != 'q') { res = krm_poll (client,-1); switch (res) { case 0: continue; case 1: ch = getch (); break; case 2: eqport->band = bandn; kr_delivery_recv (client); eq_delivery_handler (client,eqport); continue; case -1: continue; } switch (ch) { case KEY_LEFT: if (in_ctrl) { set_field_fore (current_field (ctrl_form),A_NORMAL); form_driver (ctrl_form, REQ_PREV_FIELD); set_field_fore (current_field (ctrl_form),A_BOLD | COLOR_PAIR (1)); idx = field_index (current_field (ctrl_form)); } else { set_field_fore (current_field (eq_form),A_NORMAL); form_driver (eq_form, REQ_PREV_FIELD); set_field_fore (current_field (eq_form),A_BOLD | COLOR_PAIR (3)); bandn = field_index (current_field (eq_form)); kr_mixer_portgroups (client); } break; case KEY_RIGHT: if (in_ctrl) { set_field_fore (current_field (ctrl_form),A_NORMAL); form_driver (ctrl_form, REQ_NEXT_FIELD); set_field_fore (current_field (ctrl_form),A_BOLD | COLOR_PAIR (1)); idx = field_index (current_field (ctrl_form)); } else { set_field_fore (current_field (eq_form),A_NORMAL); form_driver (eq_form, REQ_NEXT_FIELD); set_field_fore (current_field (eq_form),A_BOLD | COLOR_PAIR (3)); bandn = field_index (current_field (eq_form)); kr_mixer_portgroups (client); } break; case KEY_UP: if (in_ctrl) { switch (idx) { case 0: vals->db += 0.50; kr_mixer_set_effect_control (client, sysname, 0, bandn, "db", vals->db, 0, 0); break; case 1: vals->hz += 5; kr_mixer_set_effect_control (client, sysname, 0, bandn, "hz", vals->hz, 0, 0); break; case 2: vals->bw += 0.10; kr_mixer_set_effect_control (client, sysname, 0, bandn, "bw", vals->bw, 0, 0); break; } } break; case KEY_DOWN: if (in_ctrl) { switch (idx) { case 0: vals->db -= 0.5; kr_mixer_set_effect_control (client, sysname, 0, bandn, "db", vals->db, 0, 0); break; case 1: vals->hz -= 5; kr_mixer_set_effect_control (client, sysname, 0, bandn, "hz", vals->hz, 0, 0); break; case 2: vals->bw -= 0.10; kr_mixer_set_effect_control (client, sysname, 0, bandn, "bw", vals->bw, 0, 0); break; } } break; case 'w': if (in_ctrl) { switch (idx) { case 0: vals->db += 0.10; kr_mixer_set_effect_control (client, sysname, 0, bandn, "db", vals->db, 0, 0); break; case 1: vals->hz += 1; kr_mixer_set_effect_control (client, sysname, 0, bandn, "hz", vals->hz, 0, 0); break; case 2: break; } } break; case 's': if (in_ctrl) { switch (idx) { case 0: vals->db -= 0.10; kr_mixer_set_effect_control (client, sysname, 0, bandn, "db", vals->db, 0, 0); break; case 1: vals->hz -= 1; kr_mixer_set_effect_control (client, sysname, 0, bandn, "hz", vals->hz, 0, 0); break; case 2: break; } } break; case 9: if (in_ctrl) { idx = field_index (current_field (ctrl_form)); set_field_fore (ctrl_field[idx],A_NORMAL); /* ncurses bug I suppose */ form_driver (ctrl_form, REQ_NEXT_FIELD); form_driver (ctrl_form, REQ_PREV_FIELD); set_current_field (eq_form,field[field_idx]); in_ctrl = 0; } else { field_idx = field_index (current_field (eq_form)); set_current_field (ctrl_form,ctrl_field[0]); set_field_fore (ctrl_field[0],A_BOLD | COLOR_PAIR (1)); /* ncurses bug I suppose */ form_driver (ctrl_form, REQ_NEXT_FIELD); form_driver (ctrl_form, REQ_PREV_FIELD); idx = 0; in_ctrl = 1; } break; default: break; } update_panels (); doupdate (); } /* CLEANUP */ for (i=0;i<showed_bands;i++) { tmpw = panel_window (db->slider_p[i]); del_panel (db->slider_p[i]); delwin (tmpw); tmpw = panel_window (db->bar_p[i]); del_panel (db->bar_p[i]); delwin (tmpw); tmpw = panel_window (hz->cell_p[i]); del_panel (hz->cell_p[i]); delwin (tmpw); tmpw = panel_window (bw->bar_p[i]); del_panel (bw->bar_p[i]); delwin (tmpw); tmpw = panel_window (bw->slider_p[i]); del_panel (bw->slider_p[i]); delwin (tmpw); tmpw = panel_window (bw->cell_p[i]); del_panel (bw->cell_p[i]); delwin (tmpw); } free (db->bar_w); free (db->slider_w); free (hz->cell_w); free (bw->bar_w); free (bw->slider_w); free (bw->cell_w); free (db->bar_p); free (db->slider_p); free (hz->cell_p); free (bw->bar_p); free (bw->slider_p); free (bw->cell_p); tmpw = panel_window (db->pan); del_panel (db->pan); delwin (tmpw); tmpw = panel_window (hz->pan); del_panel (hz->pan); delwin (tmpw); tmpw = panel_window (bw->pan); del_panel (bw->pan); delwin (tmpw); free (ctrls); free (db); free (hz); free (bw); free (vals); free (eqport); tmpw = form_sub (ctrl_form); unpost_form (ctrl_form); free_form (ctrl_form); for (i=0;i<nctrls;i++) { free_field (ctrl_field[i]); } free (ctrl_field); del_panel (ctrl_subp); delwin (tmpw); tmpw = form_sub (eq_form); unpost_form (eq_form); free_form (eq_form); for (i=0;i<nbands;i++) { free_field (field[i]); } free (field); del_panel (eq_subpan); del_panel (eq_mainpan); delwin (tmpw); delwin (eq_win); return 0; }