static long uibc_kbd_dev_ioctl(struct file * file, unsigned int cmd, unsigned long arg) { void __user *uarg = (void __user *)arg; static short XValue; static short YValue; short keycode; short touchPosition[16]; int err, i; pr_debug("uibc_kbd_dev_ioctl,cmd=%d\n", cmd); switch (cmd) { case UIBC_KEYBOARD: { uibc_input_dev->keycodemax = ARRAY_SIZE(uibc_keycode); for (i = 0; i < ARRAY_SIZE(uibckbd->keymap); i++) __set_bit(uibckbd->keymap[i], uibc_input_dev->keybit); err = input_register_device(uibc_input_dev); if (err) { pr_err("register input device failed (%d)\n", err); input_free_device(uibc_input_dev); return err; } uibc_registered = 1; break; } case UIBC_KEYBOARD_MIRACAST: { uibc_input_dev->keycodemax = ARRAY_SIZE(uibc_keycode_chars); for (i = 0; i < ARRAY_SIZE(uibc_keycode_chars); i++) __set_bit(uibc_keycode_chars[i], uibc_input_dev->keybit); err = input_register_device(uibc_input_dev); if (err) { pr_err("register input device failed (%d)\n", err); input_free_device(uibc_input_dev); return err; } uibc_registered = 1; break; } case UIBC_KEY_PRESS: { if (copy_from_user(&keycode, uarg, sizeof(keycode))) return -EFAULT; pr_debug("uibc keycode %d\n", keycode); input_report_key(uibc_input_dev, keycode, 1); input_sync(uibc_input_dev); break; } case UIBC_KEY_RELEASE: { if (copy_from_user(&keycode, uarg, sizeof(keycode))) return -EFAULT; input_report_key(uibc_input_dev, keycode, 0); input_sync(uibc_input_dev); break; } case UIBC_POINTER_X: { if (copy_from_user(&XValue, uarg, sizeof(XValue))) return -EFAULT; pr_debug("uibc pointer X %d\n", XValue); break; } case UIBC_POINTER_Y: { if (copy_from_user(&YValue, uarg, sizeof(YValue))) return -EFAULT; pr_debug("uibc pointer Y %d\n", YValue); input_report_rel(uibc_input_dev, REL_X, XValue); input_report_rel(uibc_input_dev, REL_Y, YValue); input_sync(uibc_input_dev); XValue = 0; YValue = 0; break; } case UIBC_TOUCH_DOWN: { if (copy_from_user(&touchPosition, uarg, sizeof(touchPosition))) return -EFAULT; pr_debug("uibc UIBC_TOUCH_DOWN id=%d,(%d,%d)\n", touchPosition[idVal(0)], touchPosition[xVal(0)], touchPosition[yVal(0)]); input_report_key(uibc_input_dev, BTN_TOUCH, 1); input_report_abs(uibc_input_dev, ABS_MT_TRACKING_ID, touchPosition[idVal(0)]); input_report_abs(uibc_input_dev, ABS_MT_POSITION_X, touchPosition[xVal(0)]); input_report_abs(uibc_input_dev, ABS_MT_POSITION_Y, touchPosition[yVal(0)]); input_mt_sync(uibc_input_dev); input_sync(uibc_input_dev); break; } case UIBC_TOUCH_UP: { if (copy_from_user(&touchPosition, uarg, sizeof(touchPosition))) return -EFAULT; pr_debug("uibc UIBC_TOUCH_UP"); input_report_key(uibc_input_dev, BTN_TOUCH, 0); input_sync(uibc_input_dev); break; } case UIBC_TOUCH_MOVE: { if (copy_from_user(&touchPosition, uarg, sizeof(touchPosition))) return -EFAULT; for (i = 0; i < MAX_POINTERS; i++) { if (touchPosition[xVal(i)] == 0 && touchPosition[yVal(i)] == 0) continue; input_report_abs(uibc_input_dev, ABS_MT_TRACKING_ID, touchPosition[idVal(i)]); input_report_abs(uibc_input_dev, ABS_MT_POSITION_X, touchPosition[xVal(i)]); input_report_abs(uibc_input_dev, ABS_MT_POSITION_Y, touchPosition[yVal(i)]); input_mt_sync(uibc_input_dev); } input_sync(uibc_input_dev); break; } default: return -EINVAL; } return 0; }
static void vid_show_results(struct Datum *dp) { int i; switch (res_gran) { case g_not_set: case g_text: case g_record: for (i = 0; i < dp->count; ++i) { struct location8 *l8p = dp->l.l8p[i]; fprintf(out_f, "%s\n", vid_get_id(vp,idVal(l8p->text_id), vid_display_proj)); } break; case g_field: for (i = 0; i < dp->count; ++i) { struct location8 *l8p = dp->l.l8p[i]; fprintf(out_f, "%s.%d\n", vid_get_id(vp,idVal(l8p->text_id), vid_display_proj), l8p->unit_id); } break; case g_word: case g_grapheme: if (dp->data_size == sizeof(struct location24)) { for (i = 0; i < dp->count; ++i) { struct location8 *l8p = dp->l.l8p[i]; const char *tra = ""; if (return_index && !strcmp(return_index,"tra")) tra = set_tra_suffix(dp->l.l16p[i]->branch_id); fprintf(out_f, "%s%s.%d.%d", vid_get_id(vp,idVal(l8p->text_id), vid_display_proj), tra, l8p->unit_id, l8p->word_id); while (more_in_unit24(l8p, dp->l.l8p[i+1])) { if (l8p->word_id != dp->l.l8p[i+1]->word_id) { /* FIXME: both the fprinted l8p[i] here were l8p[++i] which must be wrong--but with new wmapper this code is going to go away anyway */ ++i; fprintf(out_f, ",%d.%d", dp->l.l8p[i]->unit_id, dp->l.l8p[i]->word_id); l8p = dp->l.l8p[i]; } else ++i; } fputc('\n',out_f); } } else { for (i = 0; i < dp->count; ++i) { struct location8 *l8p = dp->l.l8p[i]; const char *tra = ""; if (return_index && !strcmp(return_index,"tra")) tra = set_tra_suffix(dp->l.l16p[i]->branch_id); fprintf(out_f, "%s%s.%d.%d", vid_get_id(vp,idVal(l8p->text_id), vid_display_proj), tra, l8p->unit_id, l8p->word_id); while (more_in_unit(l8p, dp->l.l8p[i+1])) { if (l8p->word_id != dp->l.l8p[i+1]->word_id) { fprintf(out_f, ",%d",dp->l.l8p[++i]->word_id); l8p = dp->l.l8p[i]; } else ++i; } fputc('\n',out_f); } } break; } }