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

📄 waitdisp.c

📁 想学linux中的motif编程
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -