void feh_event_handle_keypress(XEvent * ev) { int state; char kbuf[20]; KeySym keysym; XKeyEvent *kev; winwidget winwid = NULL; feh_menu_item *selected_item; feh_menu *selected_menu; winwid = winwidget_get_from_window(ev->xkey.window); /* nuke dupe events, unless we're typing text */ if (winwid && !winwid->caption_entry) { while (XCheckTypedWindowEvent(disp, ev->xkey.window, KeyPress, ev)); } kev = (XKeyEvent *) ev; XLookupString(&ev->xkey, (char *) kbuf, sizeof(kbuf), &keysym, NULL); state = kev->state & (ControlMask | ShiftMask | Mod1Mask | Mod4Mask); if (ignore_space(keysym)) state &= ~ShiftMask; /* menus are showing, so this is a menu control keypress */ if (ev->xbutton.window == menu_cover) { selected_item = feh_menu_find_selected_r(menu_root, &selected_menu); if (feh_is_kp(EVENT_menu_close, state, keysym, 0)) feh_menu_hide(menu_root, True); else if (feh_is_kp(EVENT_menu_parent, state, keysym, 0)) feh_menu_select_parent(selected_menu); else if (feh_is_kp(EVENT_menu_down, state, keysym, 0)) feh_menu_select_next(selected_menu, selected_item); else if (feh_is_kp(EVENT_menu_up, state, keysym, 0)) feh_menu_select_prev(selected_menu, selected_item); else if (feh_is_kp(EVENT_menu_child, state, keysym, 0)) feh_menu_select_submenu(selected_menu); else if (feh_is_kp(EVENT_menu_select, state, keysym, 0)) feh_menu_item_activate(selected_menu, selected_item); return; } if (winwid == NULL) return; feh_event_handle_generic(winwid, state, keysym, 0); }
static void feh_set_parse_kb_partial(fehkey *key, int index, char *ks) { char *cur = ks; int mod = 0; if (!*ks) { key->keysyms[index] = 0; return; } while (cur[1] == '-') { switch (cur[0]) { case 'C': mod |= ControlMask; break; case 'S': mod |= ShiftMask; break; case '1': mod |= Mod1Mask; break; case '4': mod |= Mod4Mask; break; default: weprintf("keys: invalid modifier %c in \"%s\"", cur[0], ks); break; } cur += 2; } key->keysyms[index] = XStringToKeysym(cur); if (ignore_space(key->keysyms[index])) mod &= ~ShiftMask; key->keystates[index] = mod; if (key->keysyms[index] == NoSymbol) weprintf("keys: Invalid keysym: %s", cur); }
static inline int build_url_repled(int dest_index, struct rule_entry_s *rule, char *req_url, char* url_repled) { int replace_flag = rule->type_repled_pos; /* 0-整体替换,>0-替换部分字段 */ char *p_dst_page = rule->dest_pages[dest_index]; char *p_url_repled = url_repled; int offset = 0; int str_length = 0; int pre_pos_num = 0; int pos_num = 0; char dst_page_element[256] = {0}; char *p_dst_page_element = NULL; /* 用以替换URL中间字段 */ if (replace_flag > 0) { /* 兼容现有配置,pos>0且dst_page中没有<> */ if (NULL==strchr(p_dst_page, '<')) { str_length = rule->subs_src_page[replace_flag].rm_so; if(str_length == -1) { /* 策略配置错误*/ return IPTRAFFIC_FUNC_ERROR; } memcpy(url_repled, req_url, str_length); url_repled[str_length] = '\0'; strcat(url_repled, rule->dest_pages[dest_index]); strcat(url_repled, req_url+rule->subs_src_page[replace_flag].rm_eo); return IPTRAFFIC_FUNC_SUCCESS; } /* 拆分dest_page字符串,获取替换位置 */ while((p_dst_page=strchr(p_dst_page, '<'))) { sscanf(p_dst_page, "<%d%s", &pos_num, dst_page_element); /* 策略配置错误*/ if(pre_pos_num > pos_num) { errlog("Dest_page pos index is wrong:%s",rule->dest_pages[dest_index]); return IPTRAFFIC_FUNC_ERROR; } pre_pos_num = pos_num; /* 刨除> */ p_dst_page_element = ignore_space(dst_page_element+1); /* 偏移下一个<> */ p_dst_page += 1; /* 该位置没有匹配*/ if((rule->subs_src_page[pos_num].rm_so == -1)) { continue; } /* 保留替换dest_page前的部分*/ str_length = rule->subs_src_page[pos_num].rm_so - offset; memcpy(p_url_repled, req_url+offset, str_length); p_url_repled += str_length; /* 将目标内容替换到指定位置 */ str_length = strlen(p_dst_page_element); memcpy(p_url_repled, p_dst_page_element, str_length); p_url_repled += str_length; offset = rule->subs_src_page[pos_num].rm_eo; } /* 追加替换位置后的部分*/ *p_url_repled = '\0'; strcat(url_repled, req_url+offset); } else { /* 直接替换*/ strcpy(url_repled, rule->dest_pages[dest_index]); } return IPTRAFFIC_FUNC_SUCCESS; }
int main(void) { stack_t *stack; int getf,buffer[128],errcode; size_t counter,size; stack = stack_initialize(sizeof(int),DEFAULT_RELEASE_FUNCTION); if(!stack){ fputs("Error!\n",stderr); return -1; } while(1){ ignore_space(stdin); getf = fgetc(stdin); if(getf == 's'){ fputs("set ",stdout); counter = 0; while(counter != 128){ ignore_space(stdin); getf = fgetc(stdin); ungetc(getf,stdin); if(getf == '\n' || (getf != '+' && getf != '-' && !isdigit(getf))){ break; } buffer[counter] = read_integer(stdin); fprintf(stdout,"%d ",buffer[counter]); counter++; } ignore_to_newline(stdin); errcode = stack_push_many_elements(stack,counter,buffer); if(errcode){ fputs("Error!\n",stderr); return -1; } fputc('\n',stdout); fputs("stack trace : ",stdout); stack_trace(stack); } else if(getf == 'g'){ fputs("get ",stdout); ignore_space(stdin); size = read_integer(stdin); ignore_to_newline(stdin); errcode = stack_pop_many_elements(stack,size,buffer); if(errcode){ fputs("Error!\n",stderr); return -1; } counter = 0; while(counter != size){ fprintf(stdout,"%d ",buffer[counter]); counter++; } fputc('\n',stdout); fputs("stack trace : ",stdout); stack_trace(stack); } else if(!isspace(getf)){ break; } } stack_release(stack); return 0; }