⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xipmsg.c

📁 飞鸽传书for linux X图形界面下源码
💻 C
📖 第 1 页 / 共 3 页
字号:
			*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 + -