📄 xipmsg.c
字号:
*p ^= 0xff; p++; }/* while */ return str;}/* cryption *//* * 倡甚ボタン */static voidopen_proc(Widget w, XtPointer closure, XtPointer call_data){ struct maddr_t *replyto = closure; Widget dialog = XtParent(w); Widget w_pkno = XtNameToWidget(dialog, "pkno"); String str, str_pkno; XtVaGetValues(dialog, XtNlabel, &str, NULL); cryption(str, 1); XtVaSetValues(dialog, XtNlabel, str, NULL); XtSetSensitive(w, False); XtVaGetValues(w_pkno, XtNlabel, &str_pkno, NULL); send_IPMSG_READMSG(replyto, strtoul(str_pkno, NULL, 0));}/* open_proc *//* * */static char *mkmsg(const char *msg, const char *from){ char *ret, lbuf[64]; time_t now = time(NULL); struct tm lc = *localtime(&now); sprintf(lbuf, "\n\n%02d:%02d ", lc.tm_hour, lc.tm_min); ret = XtMalloc(strlen(msg) + strlen(lbuf) + strlen(from) + 1); strcat(strcat(strcpy(ret, msg), lbuf), from); return ret;}/* mkmsg *//* * メッセ〖ジが葡きました。 */static voidrecv_dialog(const char *msg, const char *from, const unsigned char *icon, struct maddr_t *replyto_, unsigned long opt, unsigned long pkno){ Widget popup, dialog; Pixmap pix; Dimension nx, ny; char title[256], *label = NULL, *str_pkno = NULL; struct from_t *fr = from_lookup(from); struct maddr_t *replyto = (void *)XtMalloc(sizeof(*replyto)); *replyto = *replyto_; if (fr == NULL) fr = from_install(from); popup = XtVaCreatePopupShell("recv_popup", transientShellWidgetClass, toplevel, NULL); label = mkmsg(msg, from); str_pkno = XtMalloc(20); if (opt & IPMSG_SECRETOPT) { cryption(label, 0); sprintf(str_pkno, "%lu", pkno); } pix = XCreateBitmapFromData(XtDisplay(toplevel), XtWindow(toplevel), (char *)icon, 32, 32); dialog = XtVaCreateManagedWidget("recv_from", dialogWidgetClass, popup, XtNlabel, label, XtNicon, pix, NULL); XtAddCallback(dialog, XtNdestroyCallback, destroy_proc, replyto); XtAddCallback(dialog, XtNdestroyCallback, destroy_proc, label); XtAddCallback(dialog, XtNdestroyCallback, destroy_proc, str_pkno); XtAddCallback(dialog, XtNdestroyCallback, from_free_proc, fr); XawDialogAddButton(dialog, "answer", answer_proc, replyto); XawDialogAddButton(dialog, "done", done_proc, NULL); XawDialogAddButton(dialog, "select", select_proc, NULL); if (opt & IPMSG_SECRETOPT) { XawDialogAddButton(dialog, "open", open_proc, replyto); } XtVaCreateManagedWidget("from", labelWidgetClass, dialog, XtNlabel, from, XtNmappedWhenManaged, False, NULL); XtVaCreateManagedWidget("pkno", labelWidgetClass, dialog, XtNlabel, str_pkno, XtNmappedWhenManaged, False, NULL); from_next_pos(fr, &nx, &ny); from_count_up(fr); XtVaSetValues(popup, XtNx, nx, XtNy, ny, NULL); XtPopup(popup, XtGrabNone); sprintf(title, "%s %s.%d", from, inet_ntoa(replyto->m_saddr.sin.sin_addr), (unsigned short)htons(replyto->m_saddr.sin.sin_port));#ifdef NOTDEF XStoreName(XtDisplay(popup), XtWindow(popup), title);#else { char *v = title; XTextProperty ct; Display *d = XtDisplay(popup); XmbTextListToTextProperty(d, &v, 1, XCompoundTextStyle, &ct); XSetWMName(d, XtWindow(popup), &ct); }#endif XBell(XtDisplay(toplevel), 20); XFlush(XtDisplay(toplevel));}/* recv_dialog *//* * */static voiderror_dialog(Widget w, const char *msg){ Position nx, ny; Widget err_popup = XtVaCreatePopupShell("err_popup", transientShellWidgetClass, toplevel, NULL); Widget err_dialog = XtVaCreateManagedWidget(msg, dialogWidgetClass, err_popup, NULL); XawDialogAddButton(err_dialog, "ok", done_proc, NULL); XtTranslateCoords(w, 0, 0, &nx, &ny); XtVaSetValues(err_popup, XtNx, nx + 20, XtNy, ny + 20, NULL); XtPopup(err_popup, XtGrabExclusive); XBell(XtDisplay(toplevel), 20); XFlush(XtDisplay(toplevel));}/* error_dialog *//* * */static unsigned char *get_icon_data(XImage *img, unsigned char *buf){ int y; unsigned char *d = buf; for (y = 0; y < 32; y++) { int x, z = 0; for (x = 0; x < 32; x++) { z >>= 1; if (XGetPixel(img, x, y) != 0) z |= 0x80; if ((x & 7) == 7) { *d++ = z; z = 0; } }/* for */ }/* for */ return buf;}/* get_icon_data *//* * 流慨ボタン */static voidsend_proc(Widget w, XtPointer closure, XtPointer call_data){ struct maddr_t *replyto = closure; Widget dialog = XtParent(w); String msg, label; Pixmap icon; XImage *img; Widget button = XtNameToWidget(dialog, "*icon_button"); int err = -1; struct from_t *fr; XtVaGetValues(button, XtNbitmap, &icon, NULL); XtVaGetValues(dialog, XtNvalue, &msg, XtNlabel, &label, NULL); img = XGetImage(XtDisplay(w), icon, 0, 0, 32, 32, 1L, XYPixmap); if (msg[0] != '\0' && img != NULL) { if (strlen(msg) < MESSAGE_MAX - 1 - 128) { unsigned char pat[128]; get_icon_data(img, pat); XDestroyImage(img); last_icon = icon; strcpy(last_msg, msg); fr = from_lookup(label); if (fr != NULL) strncpyz(fr->fr_last_msg, msg, sizeof(fr->fr_last_msg)); XDefineCursor(XtDisplay(dialog), XtWindow(dialog), csr_clock); XDefineCursor(XtDisplay(toplevel), XtWindow(toplevel), csr_clock); XFlush(XtDisplay(dialog)); err = bro_send(msg, pat, replyto); XUndefineCursor(XtDisplay(toplevel), XtWindow(toplevel)); XUndefineCursor(XtDisplay(dialog), XtWindow(dialog)); if (err == 0) { if (bogus_fix) XtPopdown(XtParent(dialog)); else XtDestroyWidget(XtParent(dialog)); } else { error_dialog(dialog, "not_sent"); } } else { error_dialog(dialog, "too_long"); } }}/* send_proc *//* * クリアボタン */static voidclear_proc(Widget w, XtPointer closure, XtPointer call_data){ Widget dialog = XtParent(w); Widget value = XtNameToWidget(dialog, "value"); XawTextBlock tb; tb.firstPos = 0; tb.length = 0; tb.ptr = ""; tb.format = FMT8BIT; XawTextReplace(value, 0, 9999, &tb); XawTextSetInsertionPoint(value, 0);}/* clear_proc *//* * */static Widgetmake_menu(const char *rsc, const char *inst, Widget parent, const char * const *list, int n, void (*callback)()){ Widget menu = XtVaCreatePopupShell(rsc, simpleMenuWidgetClass, parent, NULL); int i; for (i = 0; i < n; i++) { char iname[256]; Widget entry; sprintf(iname, "%s%02d", inst, i); entry = XtVaCreateManagedWidget(iname, smeBSBObjectClass, menu, NULL); XtAddCallback(entry, XtNcallback, callback, (XtPointer)i); }/* for */ return menu;}/* make_menu *//* * アイコンポップアップメニュ〖 */static voidicon_select(Widget w, XtPointer closure, XtPointer call_data){ Pixmap pix; Widget menu = XtParent(w); Widget button = XtParent(menu); XtVaGetValues(w, XtNleftBitmap, &pix, NULL); XtVaSetValues(button, XtNbitmap, pix, NULL);}/* icon_select *//* * 流慨ダイアログ * parent のウィンドウの烧夺にだします。 */static voidsend_dialog(Widget parent, const struct maddr_t *dstaddr, const char *to){ struct from_t *fr = from_lookup(to); String label = XtMalloc(strlen(to) + 1); struct maddr_t *daddr = (void *)XtMalloc(sizeof(*daddr)); Widget send_popup = XtVaCreatePopupShell("send_popup", transientShellWidgetClass, toplevel, NULL); Widget send_to = XtVaCreateManagedWidget("send_to", dialogWidgetClass, send_popup, XtNlabel, (strcpy(label, to)), XtNvalue, from_last_msg(fr), NULL); Widget icon_button = XtVaCreateManagedWidget("icon_button", menuButtonWidgetClass, send_to, XtNfromVert, NULL, XtNfromHoriz, NULL, NULL); Position nx, ny; *daddr = *dstaddr; XtAddCallback(send_to, XtNdestroyCallback, destroy_proc, label); XtAddCallback(send_to, XtNdestroyCallback, destroy_proc, daddr); make_menu("icon_menu", "icon", icon_button, NULL, NUMBER_OF_MENU, icon_select); if (last_msg[0] == '\0') { Widget entry = XtNameToWidget(icon_button, "*icon00"); XtVaGetValues(entry, XtNleftBitmap, &last_icon, NULL); } XtVaSetValues(icon_button, XtNbitmap, last_icon, NULL); XawDialogAddButton(send_to, "clear", clear_proc, NULL); XawDialogAddButton(send_to, "cancel", done_proc, NULL); XawDialogAddButton(send_to, "send", send_proc, (XtPointer)daddr); XtTranslateCoords(parent, 0, 0, &nx, &ny); XtVaSetValues(send_popup, XtNx, nx, XtNy, ny, NULL); XtPopup(send_popup, XtGrabNone);}/* send_dialog *//* * 流慨ダイアログを叫すボタン */static voidcompose_proc(Widget w, XtPointer closure, XtPointer call_data){ Widget name_list = closure; XawListReturnStruct *np = XawListShowCurrent(name_list); if (np->list_index != XAW_LIST_NONE) { struct ns_t *ns = ns_get(np->list_index); if (ns != NULL) send_dialog(XtParent(w), &ns->ns_maddr, np->string); }}/* compose_proc *//* * List Widget の拎侯 [ *//* * List を鄂っぽにする。 */static intlist_clear(Widget list){ static String empty[1] = {NULL}; XawListChange(list, empty, 0, 0, True); return 0;}/* list_clear *//* * list の科が viewport だったら、 * 1 ペ〖ジの乖眶を手す。つもり。 */static intlist_lines_per_page(Widget list){ int n, lines; Widget view = XtParent(list); XtVaGetValues(list, XtNnumberStrings, &n, NULL); lines = n; if (XtClass(view) == viewportWidgetClass) { Widget vbar = XtNameToWidget(view, "vertical"); if (vbar != NULL) { float shown, top; XtVaGetValues(vbar, XtNshown, &shown, XtNtop, &top, NULL); lines = floor(n * shown / 1.0); } } return lines;}/* list_lines_per_page *//* * List の科が Viewport だったら、 * vertical スクロ〖ルバ〖の疤弥を拇腊する。 */static voidlist_manage_viewport(Widget list){ XawListReturnStruct *elm = XawListShowCurrent(list); int idx = elm->list_index; Widget view = XtParent(list); if (idx != XAW_LIST_NONE && XtClass(view) == viewportWidgetClass) { Widget vbar = XtNameToWidget(view, "vertical"); if (vbar != NULL) { int n; float shown, top; XtVaGetValues(list, XtNnumberStrings, &n, NULL); XtVaGetValues(vbar, XtNshown, &shown, NULL); top = (double)idx / (n + 1); XawScrollbarSetThumb(vbar, top, shown); XtCallCallbacks(vbar, XtNjumpProc, &top); } }}/* list_manage_viewport *//* * List のセレクトの疤弥を delta ずらす。 */static voidlist_move_select(Widget list, int delta){ String *ls; XawListReturnStruct *elm = XawListShowCurrent(list); int n, idx = elm->list_index; XtVaGetValues(list, XtNlist, &ls, XtNnumberStrings, &n, NULL); if (elm->list_index == XAW_LIST_NONE) idx = -1; idx += delta; if (idx >= n) idx = n -1; if (idx < 0) idx = 0; if (idx != elm->list_index && idx < n) { XawListHighlight(list, idx); list_manage_viewport(list); }}/* list_move_select *//* * List の妥燎のから、矢机误 match とマッチした疥を联买する。 */static voidlist_select_match(Widget list, const char *match){ String *ls; int n, i = 0, found = -1, len = strlen(match); XtVaGetValues(list, XtNlist, &ls, XtNnumberStrings, &n, NULL); while (i < n && found < 0) { if (strncmpi(ls[i], match, len) == 0) found = i; else i++; }/* while */ if (found >= 0) { XawListHighlight(list, found); list_manage_viewport(list); }}/* list_select_match *//* * List にカ〖ソルキ〖やペ〖ジキ〖の借妄をする。 */static voiddo_control_key(Widget list, int ksym){#ifndef XK_Page_Up#define XK_Page_Up XK_Prior#endif#ifndef XK_Page_Down#define XK_Page_Down XK_Next#endif int lpp; switch (ksym) { case XK_Up: list_move_select(list, -1); break; case XK_Down: list_move_select(list, 1); break; case XK_Home: list_move_select(list, -9999); break; case XK_End: list_move_select(list, 9999); break; case XK_Page_Up: lpp = list_lines_per_page(list); list_move_select(list, -lpp); break; case XK_Page_Down: lpp = list_lines_per_page(list); list_move_select(list, lpp); break; }/* switch */}/* do_control_key *//* * List にカ〖ソルキ〖やペ〖ジキ〖の借妄をさせるアクション。 * アクションのパラメ〖タにキ〖の叹涟が掐っている。 */static voidlist_key_named_action(Widget list, XEvent *event, String *params, Cardinal *num_params){ int err = -1; if (XtClass(list) == listWidgetClass && event->type == KeyPress) { String arg = *params; if (arg != NULL) { struct kw_t { const char *name;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -