static int glw_text_bitmap_event(glw_t *w, event_t *e) { glw_text_bitmap_t *gtb = (glw_text_bitmap_t *)w; if(event_is_action(e, ACTION_BS)) { del_char(gtb); gtb_notify(gtb); return 1; } else if(event_is_type(e, EVENT_UNICODE)) { event_int_t *eu = (event_int_t *)e; if(insert_char(gtb, eu->val)) gtb_notify(gtb); return 1; } else if(event_is_type(e, EVENT_INSERT_STRING)) { event_payload_t *ep = (event_payload_t *)e; const char *str = ep->payload; int uc; while((uc = utf8_get(&str)) != 0) { insert_char(gtb, uc); } gtb_notify(gtb); return 1; } else if(event_is_action(e, ACTION_LEFT)) { if(gtb->gtb_edit_ptr > 0) { gtb->gtb_edit_ptr--; gtb->gtb_update_cursor = 1; } return 1; } else if(event_is_action(e, ACTION_RIGHT)) { if(gtb->gtb_edit_ptr < gtb->gtb_uc_len) { gtb->gtb_edit_ptr++; gtb->gtb_update_cursor = 1; } return 1; } else if(event_is_action(e, ACTION_ACTIVATE) || event_is_action(e, ACTION_ITEMMENU)) { gtb_caption_refresh(gtb); if(gtb->gtb_flags & (GTB_FILE_REQUEST | GTB_DIR_REQUEST)) { if(gtb->gtb_p == NULL) { TRACE(TRACE_ERROR, "GLW", "File requests on unbound widgets is not supported"); } else { int flags = (gtb->gtb_flags & GTB_FILE_REQUEST ? FILEPICKER_FILES : 0) | (gtb->gtb_flags & GTB_DIR_REQUEST ? FILEPICKER_DIRECTORIES : 0); filepicker_pick_to_prop(gtb->gtb_description, gtb->gtb_p, gtb->gtb_caption, flags); } } else { if(event_is_action(e, ACTION_ACTIVATE) && e->e_flags & EVENT_MOUSE) return 1; w->glw_root->gr_open_osk(w->glw_root, gtb->gtb_description, gtb->gtb_caption, w, gtb->gtb_flags & GTB_PASSWORD); } return 1; } return 0; }
static int glw_text_bitmap_callback(glw_t *w, void *opaque, glw_signal_t signal, void *extra) { glw_text_bitmap_t *gtb = (void *)w; event_t *e; event_int_t *eu; switch(signal) { default: break; case GLW_SIGNAL_DESTROY: gtb_unbind(gtb); break; case GLW_SIGNAL_LAYOUT: glw_text_bitmap_layout(w, extra); break; case GLW_SIGNAL_INACTIVE: gtb_inactive(gtb); break; case GLW_SIGNAL_EVENT: if(w->glw_class == &glw_label) return 0; e = extra; if(event_is_action(e, ACTION_BS)) { del_char(gtb); gtb_notify(gtb); return 1; } else if(event_is_type(e, EVENT_UNICODE)) { eu = extra; if(insert_char(gtb, eu->val)) gtb_notify(gtb); return 1; } else if(event_is_action(e, ACTION_LEFT)) { if(gtb->gtb_edit_ptr > 0) { gtb->gtb_edit_ptr--; gtb->gtb_update_cursor = 1; return 1; } return 0; } else if(event_is_action(e, ACTION_RIGHT)) { if(gtb->gtb_edit_ptr < gtb->gtb_uc_len) { gtb->gtb_edit_ptr++; gtb->gtb_update_cursor = 1; return 1; } return 0; } else if(event_is_action(e, ACTION_ACTIVATE)) { if(w->glw_root->gr_open_osk != NULL) { char buf[512]; char *q = buf; int i; for(i = 0; i < gtb->gtb_uc_len; i++) q += utf8_put(q, gtb->gtb_uc_buffer[i]); *q = 0; w->glw_root->gr_open_osk(w->glw_root, NULL, buf, w, gtb->gtb_flags & GTB_PASSWORD); return 1; } } return 0; } return 0; }