?? waitdisp.c
字號:
#include <stdio.h>#include <unistd.h>#include <signal.h>#include <errno.h>//KEC#include <varargs.h>//KEC#include <stdarg.h>#include <X11/Xatom.h>#include "system.h"#include "kyotu_t.h"#include "kyotu_s.h"/*-------------------------------------------------------------------*/#define DEBUG 0#define INTERVAL 500L /* タイマ粗持(ミリ擅帽疤∷ */#define WAITOUT 0#define FORK_TASKNAM "FORK_TASKNAM"#define PPID_CHECK "PPID_CHECK"/*-------------------------------------------------------------------*/extern int errno;extern char *sys_errlist[];char work[MAXPATHLEN];void recv_proc();void work_proc();void chld_end();void quit();struct _replace { /* デ〖タ構糠覺斗チェック脫 */ int flg; pid_t pid;};struct _evt_tbl { int type; /* 鹼侍∈山績妥滇】久殿妥滇∷ */ pid_t ppid; /* 妥滇傅pid */ Display *dpy; /* 妥滇傅ディスプレイ */ Window win; /* 妥滇傅ウィンドウID */ char msg[MAX_MSG]; /* メッセ〖ジ */};struct _inf_default { /* 瘦賂脫デフォルトデ〖タ */ /* 彈瓢妥滇により彈瓢されるタ */ char fork_tasknam[256]; /* スク */ /* 山績妥滇傅と久殿妥滇傅のチ */ int ppid_check; /* ェックフラグ */};struct _default_tbl { int type; /* デフォルトデ〖タタイプ */ /* 0:char 1:int 2:float */ char *name; /* 嘆疚コ〖ド */ char *data; /* デフォルト脫デ〖タ */};Display *dpy;XtIntervalId interval_id;XtAppContext appcon;Widget topshell;Widget form, rc;Widget label, text;Widget pb[8];Widget waitout = NULL;Arg args[32];static int wait_num = 0;static int evt_num = 0;static int ppid_check = 0;struct _waitdisp *waitdisp = NULL;static struct _evt_tbl *evt_tbl = NULL;static struct _replace replace = { False, 0 };static struct _inf_default inf_default; /* 茨董肋年デ〖タ艱評脫 */static struct _default_tbl default_tbl[] = { { 0, FORK_TASKNAM, NULL }, { 1, PPID_CHECK, NULL }, {-1, (char*)NULL , NULL }};/*-------------------------------------------------------------------*/main(argc, argv)int argc;char **argv;{ Atom window_id; Window win[1];/*-------------------------------------------------------------------*/ setlocale(LC_ALL,""); XtSetLanguageProc(NULL,(XtLanguageProc)NULL,NULL); signal(SIGCHLD, chld_end); /* 灰タスク姜位箕借妄判峽 */ read_defaultdata(); /* デフォルト攫鼠艱評 */ get_defaultdata(FORK_TASKNAM, inf_default.fork_tasknam); get_defaultdata(PPID_CHECK, &inf_default.ppid_check);#if DEBUG printf("デフォルトデ〖タ肋年柒推\n"); printf("%s:%s\n", FORK_TASKNAM, inf_default.fork_tasknam); printf("%s:%d\n", PPID_CHECK, inf_default.ppid_check);#endif topshell = XtAppInitialize(&appcon, "Wait", NULL, 0, &argc, argv, NULL, NULL, 0); create_win(topshell); /* イベントハンドラ判峽 */ XtAddEventHandler(label, NoEventMask, True, recv_proc, NULL); XtRealizeWidget(topshell); /* イベント減慨脫デ〖タ肋年 */ dpy = XtDisplay(label); win[0] = XtWindow(label); window_id = XInternAtom(dpy, "__WAITDISP", False); XChangeProperty(dpy, RootWindow(dpy, 0), window_id, XA_WINDOW, 32, PropModeReplace, win, 1);/* while(1) { if (XtAppPending(appcon)) { XtAppProcessEvent(appcon, XtIMAll); XSync(dpy, 0); } else { work_proc(); } }*/ interval_id = XtAppAddTimeOut(appcon, 1000L, work_proc, label); XtAppMainLoop(appcon);}int create_win(shell)Widget shell;{ int n; int decor = 0; XmString mstr; void button_callbk();/*-------------------------------------------------------------------*/ decor |= MWM_DECOR_BORDER; decor |= MWM_DECOR_TITLE; decor |= MWM_DECOR_MAXIMIZE; decor |= MWM_DECOR_MINIMIZE; XtVaSetValues(shell, XmNmwmDecorations, decor, NULL); n = 0; XtSetArg(args[n], XmNmarginWidth, 0); n++; XtSetArg(args[n], XmNmarginHeight, 0); n++; XtSetArg(args[n], XmNresizePolicy, XmRESIZE_ANY); n++; form = XmCreateForm(shell, "form", args, n); XtManageChild(form); n = 0; mstr = XmStringCreateLtoR("メッセ〖ジ", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNlabelString, mstr); n++; label = XmCreateLabel(form, "lbl", args, n); XtManageChild(label); XmStringFree(mstr); n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, label); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++; rc = XmCreateRowColumn(form, "rc", args, n); XtManageChild(rc); n = 0; XtSetArg(args[n], XmNtraversalOn, False); n++; pb[0] = XmCreatePushButtonGadget(rc, "メッセ〖ジ久殿", args, n); XtAddCallback(pb[0], XmNactivateCallback, button_callbk, 0); XtManageChild(pb[0]);/** 姜位ボタンは山績しない n = 0; XtSetArg(args[n], XmNtraversalOn, False); n++; pb[1] = XmCreatePushButtonGadget(rc, "Waitdisp姜位", args, n); XtAddCallback(pb[1], XmNactivateCallback, button_callbk, 1); XtManageChild(pb[1]);**/ n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, rc); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrows, 6); n++; XtSetArg(args[n], XmNcolumns, 20); n++; XtSetArg(args[n], XmNeditable, False); n++; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg(args[n], XmNwordWrap, True); n++; XtSetArg(args[n], XmNscrollHorizontal, False); n++; XtSetArg(args[n], XmNblinkRate, 0); n++; XtSetArg(args[n], XmNautoShowCursorPosition, True); n++; XtSetArg(args[n], XmNcursorPositionVisible, False); n++; text = XmCreateScrolledText(form, "text_w", args, n); XtManageChild(text); if (WAITOUT) { /* メッセ〖ジ叫蝸黎肋年 */ waitout = text; } else { waitout = NULL; }}void button_callbk(w, btn_no, cbs)Widget w;int btn_no;XmAnyCallbackStruct *cbs;{/*-------------------------------------------------------------------*/ switch(btn_no) { case 0: XmTextSetString(text, NULL); break; case 1: quit(); break; }}void recv_proc(w, client, event)Widget w;caddr_t client;XClientMessageEvent *event;{ int sts = ABNORMAL; Atom disp_on, disp_off, disp_kill; struct _waitdisp data;/*-------------------------------------------------------------------*/ if (event != NULL) { /* ClientMessage が流られてき */ /* た眷圭 */ if (event->type == ClientMessage) { SUB_wsprint(waitout, "イベント減慨 流慨傅pid=%d\n", event->data.l[0]); /* 山績妥滇、久殿妥滇、茶燙か */ /* らの動擴姜位のイベントチェ */ /* ック脫デ〖タ侯喇 */ disp_on = XInternAtom(dpy, "__WAITDISP_ON", False); disp_off = XInternAtom(dpy, "__WAITDISP_OFF", False); disp_kill = XInternAtom(dpy, "__WAITDISP_KILL", False); /* 山績妥滇、久殿妥滇、茶燙か */ /* らの動擴姜位のイベントの眷 */ /* 圭 */ if (event->message_type == disp_on || event->message_type == disp_off || event->message_type == disp_kill) { /* 流られてきたイベントを瘦賂 */ evt_tbl = (struct _evt_tbl*)XtRealloc(evt_tbl, sizeof(struct _evt_tbl) * (evt_num + 1)); /* 茶燙山績妥滇 */ if (event->message_type == disp_on) { SUB_wsprint(waitout, "茶燙山績妥滇減慨\n"); evt_tbl[evt_num].type = 1; /* 茶燙久殿妥滇 */ } else if (event->message_type == disp_off) { SUB_wsprint(waitout, "茶燙久殿妥滇減慨\n"); evt_tbl[evt_num].type = 2; } else { /* 茶燙動擴姜位妥滇 */ SUB_wsprint(waitout, "茶燙動擴姜位妥滇減慨\n"); evt_tbl[evt_num].type = 3; } evt_tbl[evt_num].ppid = (pid_t)event->data.l[0]; evt_tbl[evt_num].dpy = (Display*)event->data.l[1]; evt_tbl[evt_num].win = (Window)event->data.l[2]; /* 茶燙山績妥滇の眷圭 */ if (evt_tbl[evt_num].type == 1) { /* 瓷妄脫デ〖タファイルから山 */ /* 績するデ〖タを粕み哈む */ sts = getdata(evt_tbl[evt_num].ppid, &data); if (sts != NORMAL) { SUB_wsprint(waitout, "々々々々\n"); } strcpy(evt_tbl[evt_num].msg, data.msg); } else { evt_tbl[evt_num].msg[0] = 0; } evt_num ++; XFlush(XtDisplay(topshell)); } else { SUB_wsprint(waitout, "waitdisp:message_type 稍賴\n"); } } }}void work_proc(w)Widget w;{ int sts = ABNORMAL; int idx; struct _waitdisp data; struct _evt_tbl area;/*-------------------------------------------------------------------*//*printf("******* work_proc() *******\n");*/ /* イベントが瘦賂されている眷 */ if (evt_num > 0) { /* 圭 */ /* 辦戎黎片のイベント攫鼠艱評 */ memcpy(&area, &evt_tbl[0], sizeof(struct _evt_tbl)); /* 2戎謄笆慣のイベント攫鼠を */ /* 1つづつずらす */ for(idx = 0;idx < evt_num - 1;idx++) { memcpy(&evt_tbl[idx], &evt_tbl[idx+1], sizeof(struct _evt_tbl)); } evt_num --; /* イベント攫鼠撾拌を浩刨澄瘦 */ evt_tbl = (struct _evt_tbl*)XtRealloc(evt_tbl, sizeof(struct _evt_tbl) * evt_num); if (area.type == 1) { /* 茶燙山績妥滇の眷圭 */ for(idx = 0;idx < wait_num;idx++) { /* 妥滇傅のpidの辦米するデ */ /* 〖タが肋年されている眷圭 */ if (waitdisp[idx].ppid == area.ppid || inf_default.ppid_check == 0) { /* 茶燙彈瓢面∈山績面∷の眷圭 */ if (waitdisp[idx].pid > 0) { /* 茶燙久殿妥滇 */ wait_disp_off(waitdisp[idx].pid); idx = wait_num; } break; } } /* 彈瓢覺斗デ〖タに踏判峽の眷 */ if (idx >= wait_num) { /* 圭 */ /* 彈瓢覺斗デ〖タに糠しく判峽 */ waitdisp = (struct _waitdisp*)XtRealloc(waitdisp, sizeof(struct _waitdisp) * (wait_num + 1)); /* 介袋猛肋年 */ waitdisp[idx].pid = INITIAL; waitdisp[idx].ppid = area.ppid; wait_num ++; } strcpy(waitdisp[idx].msg, area.msg); /* 茶燙山績妥滇 */ wait_disp_on(&waitdisp[idx].pid, waitdisp[idx].msg);#if DEBUG SUB_wsprint(waitout, "pid=%d\n", waitdisp[idx].pid);#endif } else if (area.type == 2) { /* 茶燙久殿妥滇の眷圭 */ for(idx = 0;idx < wait_num;idx++) { if (waitdisp[idx].ppid == area.ppid || inf_default.ppid_check == 0) { /* 茶燙久殿妥滇 */ wait_disp_off(waitdisp[idx].pid); idx = wait_num - 1; break; } } if (idx >= wait_num) { SUB_wsprint(waitout, "久殿妥滇傅pid[%d] 佰撅\n", area.ppid); } } else if (area.type == 3) { /* 茶燙からの動擴姜位 */ wait_disp_off(area.ppid); } } interval_id = XtAppAddTimeOut(appcon, 1000L, work_proc, w);}static int wait_disp_on(pid, msg)pid_t *pid;char *msg;{ int sts = ABNORMAL; int n; char *p; char buff[MAX_MSG];/*-------------------------------------------------------------------*/ *pid = INITIAL; if (msg != NULL) { /* メッセ〖ジ矢機誤肋年 */ strncpy(buff, msg, MAX_MSG); buff[MAX_MSG-1] = '\0'; } else { strcpy(buff, "略ち。"); } n = 0; for(p = buff;*p != NULL;p++) { /* 猖乖コ〖ド猴近 */ if (*p == 0x0a) { continue; } buff[n++] = *p;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -