/* From sch57.mcn.msk.su!karlson@pulsar.ac.msk.su Wed May 24 12:18:55 1995 Return-Path: sch57.mcn.msk.su!karlson@pulsar.ac.msk.su To: moshkow.ac.msk.su!moshkow@pulsar.ac.msk.su References: <199505191819.VAA00558@moshkow.ac.msk.su> Organization: sch57 From: Nikita Kozhekin (Kitya Karlson)"[SHAMIL']" Date: Wed, 24 May 95 10:05:22 +0400 (MSD) X-Mailer: dMail (Demos Mail v1.11a) Subject: Re: About Monitor 2.95 Lines: 414 þÐÆ Ó ÊÉ Ê ÏÂÙÅÍ. æÐÍÛÌÐ þÝ ÔÈÕÕÌÊÅ ×ÈÌÞÝ Êß ÌÐÎÎÅÏÆÂÔÊÅÞ È×ÅÔÊÆÅ. âÍÛÆÅÔÏÂÆÊÞÏÂÓ ÌÐÄÊÔÐÞÌ ÕÊÍÛÏÐ Linux ÏÅÔÞÊÔÈÅÆ ÐÄÏÂÌÐ ;-( åÕÍÊ ÞÝ ÒÐÍÈÀÂÅÆÅ ÒÐÀÆÈ Þ ìðê-8, ÆÐ ØÆÐ ÏÅÐ×ÓßÂÆÅÍÛÏÐ. åÕÍÊ ÞÝ ÒÐÍÈÀÊÆÅ ÒÐÀÆÈ Þ MS-DOS, ÆÐ ÏÅ ßÂ×ÈÄÛÆÅ ßÂÎÅÏÊÆÛ CR LF Ï CR. (òÔÐÕÆÅËÙÊË ÕÒÐÕÐ× -- ßÂÚÔÈßÊÆÛ Þ jed, ÞÕÆÂÞÊÆÛ Ê ÈÄÂÍÊÆÛ ÒÔÐ×ÅÍ Ê ÞÝËÆÊ). ï. ìÐÃÅÌÊÏ ïÂÀÂÍ ÒÔÐÚÔÂÎÎÊÔÐÞÂÏÊÓ Þ X-Window íÊÕÆÊÏÚ 1. MESSAGE.H */ /* þÌÍÁÀÂÅÎÝË ÎÐÄÈÍÛ: message.h */ #include #include #include /* ôÂ×ÐÆÂ Õ ÕÅÎÂÖÐÔÂÎÊ */ #include /* ôÂ×ÐÆÂ Õ ÔÂßÄÅÍÓÅÎÐË ÒÂÎÓÆÛÁ */ /* ôÂ×ÐÆÂ Þ X-Window */ #include #include #include #include #include #include #include #define SEM_ID 2001 /* ìÍÁÀ ÎÂÕÕÊÞ ÕÅÎÂÖÐÔÐÞ */ #define SHM_ID 2002 /* ìÍÁÀ ÔÂßÄÅÍÓÅÎÐË ÒÂÎÓÆÊ */ #define PERMIS 0666 /* òÔÂÞ ÄÐÕÆÈÒÂ: ÞÕÅ ÎÐÚÈÆ ÀÊÆÂÆÛ Ê ÒÊÕÂÆÛ*/ #define MSG_TYPE_EMPTY 0 /* æÊÒÝ ÕÐÐ×ÜÅÏÊË: */ #define MSG_TYPE_STRING 1 /* ÒÈÕÆÐÅ, ÕÆÔÐÌÂ, */ #define MSG_TYPE_FINISH 2 /* ÌÐÏÅÇ ÄÊÂÍÐÚ */ #define MAX_STRING 20 /* îÂÌÕÊÎÂÍÛÏÂÓ ÄÍÊÏ ÕÐÐ×ÜÅÏÊÓ */ #define WND_WDT 200 /* ùÊÔÊÏ ÐÌÏ */ #define WND_HGH 100 /* þÝÕÐÆ ÐÌÏ */ #define WND_MIN_WDT 50 /* îÊÏÊÎÂÍÛÏÂÓ ÙÊÔÊÏ ÐÌÏ */ #define WND_MIN_HGH 50 /* îÊÏÊÎÂÍÛÏÂÓ ÞÝÕÐÆ ÐÌÏ */ #define WND_BORDER_WDT 5 /* ùÊÔÊÏ ×ÐÔÄÁÔ */ struct msg_t { int type; char string[MAX_STRING]; }; /* õÆÔÈÌÆÈÔ ÕÐÐ×ÜÅÏÊÓ */ inline void sys_err( char * msg ) { puts( msg ); exit( 1 ); } /* õÊÕÆÅÎÏÂÓ ÐÙÊ×Ì */ /* ôÂ×ÐÆ ÕÐ ÕÆÔÈÌÆÈÔÐË semun */ inline union semun semun (int i) { union semun s; s.val = i; return s; } inline union semun semun (struct semid_ds * b) { union semun s; s.buf = b; return s; } /* êÏÊÇÊÂÍÊßÂÇÊÓ ÐÌÏ ÏÂÒÊÕÂÏÂ Þ window.c */ void SetWindowManagerHints ( Display * prDisplay, char * psPrgClass, char * argv[], int argc, Window nWnd, int x , int y, int nWidth, int nHeight, int nMinWidth, int nMinHeight, char * psTitle, char * psIconTitle, Pixmap nIconPixmap); íÊÕÆÊÏÚ 2. WINDOW.C /* êÏÊÇÊÂÍÊßÂÇÊÓ ÐÌÏ */ #include "message.h" void SetWindowManagerHints ( Display * prDisplay, char * psPrgClass, char * argv[], int argc, Window nWnd, int x, int y, int nWidth, int nHeight, int nMinWidth, int nMinHeight, char * psTitle, char * psIconTitle, Pixmap nIconPixmap) { XSizeHints rSizeHints; #ifdef X11R3 /* X11R3 Ê ÏÊÃÅ */ rSizeHints.flags = PPosition | PSize | PMinSize; rSizeHints.x = x; rSizeHints.y = y; rSizeHints.width = nWidth; rSizeHints.height = nHeight; rSizeHints.min_width = nMinWidth; rSizeHints.min_height = nMinHeight; XSetStandardProperties ( prDisplay, nWnd, psTitle, psIconTitle, nIconPixmap, argv, argc, &rSizeHints ); #else /* X11R4 Ê ÞÝÙÅ */ XWMHints rWMHints; XClassHint rClassHint; XTextProperty prWindowName, prIconName; if ( !XStringListToTextProperty(&psTitle, 1, &prWindowName) || !XStringListToTextProperty( &psIconTitle, 1, &prIconName)) { sys_err("No memory!"); } rSizeHints.flags = PPosition | PSize | PMinSize; rSizeHints.min_width = nMinWidth; rSizeHints.min_height = nMinHeight; rWMHints.flags = StateHint | IconPixmapHint | InputHint; rWMHints.initial_state = NormalState; rWMHints.input = True; rWMHints.icon_pixmap = nIconPixmap; rClassHint.res_name = argv[0]; rClassHint.res_class = psPrgClass; XSetWMProperties ( prDisplay, nWnd, &prWindowName, &prIconName, argv, argc, &rSizeHints, &rWMHints, &rClassHint); #endif } íÊÕÆÊÏÚ 3. CLIENT.C /* íÊÕÆÊÏÚ ÒÔÐÚÔÂÎÎÝ ÌÍÊÅÏÆÂ: client.c ìÐÎÒÊÍÓÇÊÓ : g++ window.c client.c -o client -lX11 & */ #include "message.h" #define WND_X 0 /* ìÐÐÔÄÊÏÂÆÝ ÐÌÏ */ #define WND_Y 100 #define WND_TITLE "Client Window" /* ÿÂÚÐÍÐÞÐÌ ÐÌÏ */ #define WND_ICON_TITLE "Client Icon" /* ÿÂÚÐÍÐÞÐÌ ÒÊÌÆÐÚÔÂÎÎÝ */ #define PRG_CLASS "Client" int main(int argc, char * argv[]) /* ðÕÏÐÞÏÂÓ ÒÔÐÇÅÄÈÔ */ { Display *prDisplay; Window nWnd; int semid,shmid,x,y,nScreenNum; GC prGC; XEvent rEvent; msg_t *msg_p; char s[MAX_STRING]; KeySym nKeySym,naModList[2]; if (( semid = semget(SEM_ID,1, 0)) < 0 ) sys_err("CLIENT: can't get semaphore!"); /* àÆÅÏÊÅ ÎÂÕÕÊÞ ÕÅÎÂÖÐÔÐÞ */ if (( shmid = shmget(SHM_ID,sizeof(msg_t),0))<0) sys_err("CLIENT: can't get shared memory segment!"); /* äÐÕÆÈÒ Ì ÕÅÚÎÅÏÆÈ ÔÂßÄÅÍÓÅÎÐË ÒÂÎÓÆÊ */ if ((msg_p = (msg_t * ) shmat(shmid, 0, 0)) == NULL) sys_err("CLIENT: shared memory attach error!"); /* òÐÍÈÀÅÏÊÅ ÂÄÔÅÕ */ if ((prDisplay = XOpenDisplay(NULL))==NULL) sys_err("CLIENT: can't connect to the X server!"); /* òÐÄÌÍÁÀÅÏÊÅ Ì X-ÕÅÔÞÅÔÈ */ /* ôÅÚÊÕÆÔÂÇÊÓ ÐÌÏ */ nScreenNum = DefaultScreen(prDisplay); nWnd = XCreateSimpleWindow(prDisplay, RootWindow(prDisplay,nScreenNum), WND_X, WND_Y, WND_WDT, WND_HGH, WND_BORDER_WDT, BlackPixel(prDisplay, nScreenNum), WhitePixel(prDisplay,nScreenNum)); SetWindowManagerHints(prDisplay, PRG_CLASS, argv, argc, nWnd, WND_X, WND_Y, WND_WDT, WND_HGH, WND_MIN_WDT, WND_MIN_HGH, WND_TITLE, WND_ICON_TITLE, 0); /* þÝ×ÐÔ ÀÆÅÏÊÓ ÕÐ×ÝÆÊË */ XSelectInput(prDisplay, nWnd , ExposureMask | KeyPressMask); /* òÐÌÂß ÐÌÏ */ XMapWindow(prDisplay, nWnd); /* èÕÆÂÏÐÞÌ ÏÐÞÐË ÌÏÐÒÌÊ ÌÍÂÞÊÂÆÈÔÝ */ naModList[0] = XK_Control_L; naModList[1] = XK_Shift_L; XRebindKeysym( prDisplay, XK_A, naModList, 2, "EXIT", strlen("EXIT")); x = 0; y = 0; /* õÐßÄÂÏÊÅ ÚÔÂÖÊÀÅÕÌÐÚÐ ÌÐÏÆÅÌÕÆ */ prGC = XCreateGC(prDisplay, nWnd, 0, NULL); /* úÍÂÞÏÝË ÇÊÌÍ: ÀÆÅÏÊÅ ÕÐ×ÝÆÊË */ for (;;) { /* þÝ×ÐÔ ÕÐ×ÝÆÊÓ Êß ÐÀÅÔÅÄÊ */ XNextEvent(prDisplay, &rEvent); switch (rEvent.type) { case Expose : /* ÿÂÒÔÐÕ Ï ÒÅÔÅÔÊÕÐÞÌÈ */ if (rEvent.xexpose.count!=0) break; XSetForeground(prDisplay, prGC, BlackPixel(prDisplay, 0)); /* þÝÞÐÄ ÕÆÔÐÌÊ */ XDrawString(prDisplay, nWnd, prGC, 10, 50, "Client,", strlen("Client,")); break; case KeyPress : /* ïÂÃÂÆÊÅ ÌÍÂÞÊÙÊ */ memset(s, 0, sizeof(s)); XSetForeground(prDisplay, prGC, BlackPixel(prDisplay, 0)); XDrawString(prDisplay, nWnd, prGC, 10, 66, "TALK:", strlen("TALK:")); /* àÆÅÏÊÅ ÕÆÔÐÌÊ-ÕÐÐÆÞÅÆÕÆÞÊÓ ÏÂÃÂÆÐË ÌÍÂÞÊÙÊ */ XLookupString(&rEvent.xkey, s, sizeof(s), &nKeySym, NULL); /* ãÄÅÎ-Õ ... */ while ( semctl (semid, 0, GETVAL, semun(0) ) || msg_p->type != MSG_TYPE_EMPTY); /* ÷ÍÐÌÊÔÐÞÌ */ semctl(semid, 0, GETVAL, semun(1)); strncpy(msg_p->string,s,MAX_STRING); /* øÉÐ-ÐÆÐ×ÔÂÃÅÏÊÅ */ XDrawString(prDisplay, nWnd, prGC, 10+x, 80 + y, s, strlen(s)); if ((10+x) > WND_WDT) {x =0; y=y+10;} else x = x + 10; if (strcmp(s,"EXIT")) msg_p->type= MSG_TYPE_STRING; else msg_p->type = MSG_TYPE_FINISH; /* õÏÓÆÊÅ ×ÍÐÌÊÔÐÞÌÊ */ semctl(semid, 0, SETVAL, semun(0)); if (!strcmp(s,"EXIT")) { /* ìÐÏÅÇ ÔÂ×ÐÆÝ */ shmdt((char*)msg_p); XFreeGC(prDisplay,prGC); XCloseDisplay(prDisplay); exit(0); } break; } } /* ðÕÞÐ×ÐÃÄÅÏÊÅ ÚÔÂÖÊÀÅÕÌÐÚÐ ÌÐÏÆÅÌÕÆ */ XFreeGC(prDisplay,prGC); XCloseDisplay(prDisplay); exit(0); } íÊÕÆÊÏÚ 4. SERVER.C /* íÊÕÆÊÏÚ ÒÔÐÚÔÂÎÎÝ ÕÅÔÞÅÔÂ: server.c ìÐÎÒÊÍÓÇÊÓ : g++ window.c server.c -o server -lX11 & */ #include "message.h" #define WND_X 300 /* ìÐÐÔÄÊÏÂÆÝ */ #define WND_Y 100 #define WND_TITLE "Server Window" /* ÿÂÚÐÍÐÞÌÊ */ #define WND_ICON_TITLE "Server Icon" #define PRG_CLASS "Server" int main(int argc, char * argv[]) { Display *prDisplay; Window nWnd; int semid,shmid,x,y,nScreenNum; GC prGC; XEvent rEvent; msg_t *msg_p; char s[MAX_STRING]; /* õÐßÄÂÏÊÅ ÕÅÎÂÖÐÔÐÞ */ if ((semid = semget(SEM_ID,1, PERMIS | IPC_CREAT)) < 0 ) sys_err("SERVER: can't create semaphore!"); /* õÐßÄÂÏÊÅ ÔÂßÄÅÍÓÅÎÐÚÐ ÕÅÚÎÅÏÆ */ if ((shmid = shmget(SHM_ID,sizeof(msg_t), PERMIS | IPC_CREAT))<0) sys_err("SERVER: can't create shared memory segment!"); if ((msg_p = (msg_t * ) shmat(shmid, 0, 0)) == NULL) sys_err("SERVER: shared memory attach error!"); semctl( semid, 0 , SETVAL, semun(0)); msg_p->type = MSG_TYPE_EMPTY; /* òÐÄÌÍÁÀÅÏÊÅ Ì X-ÕÅÔÞÅÔÈ */ if ((prDisplay = XOpenDisplay(NULL))==NULL) sys_err("SERVER: can't connect to the X server!"); /* êÏÊÇÊÂÍÊßÂÇÊÓ ÐÌÏÂ Ê ØÌÔÂÏ */ nScreenNum = DefaultScreen(prDisplay); nWnd = XCreateSimpleWindow(prDisplay, RootWindow(prDisplay, nScreenNum), WND_X, WND_Y, WND_WDT, WND_HGH, WND_BORDER_WDT, BlackPixel(prDisplay, nScreenNum), WhitePixel(prDisplay, nScreenNum)); SetWindowManagerHints(prDisplay, PRG_CLASS, argv, argc, nWnd, WND_X, WND_Y, WND_WDT, WND_HGH, WND_MIN_WDT, WND_MIN_HGH, WND_TITLE, WND_ICON_TITLE, 0); /* þÝ×ÐÔ ÕÐ×ÝÆÊË: ÒÅÔÅÔÊÕÐÞÌÂ, ÌÍÂÞÊÂÆÈÔ */ XSelectInput(prDisplay, nWnd, ExposureMask | KeyPressMask); /* þÝÞÐÄ ÐÌÏ */ XMapWindow(prDisplay, nWnd); x = 0; y = 0; /* õÐßÄÂÏÊÅ ÚÔÂÖÊÀÅÕÌÐÚÐ ÌÐÏÆÅÌÕÆ */ prGC = XCreateGC(prDisplay, nWnd, 0 ,NULL); for (;;) { if (msg_p->type != MSG_TYPE_EMPTY) { /* ÷ÍÐÌÊÔÐÞÂÏÐ - ÃÄÅÎ-Õ ... */ if (semctl(semid, 0, GETVAL, semun(0))) continue; /* ÷ÍÐÌÊÔÐÞÌ */ semctl(semid, 0, SETVAL, semun(1)); if (msg_p->type == MSG_TYPE_STRING) { XSetForeground(prDisplay, prGC, BlackPixel(prDisplay, 0)); /* þÝÞÐÄ ÒÔÐÀÊÆÂÏÏÐË ÕÆÔÐÌÊ */ XDrawString(prDisplay, nWnd, prGC, 10 + x, 78 + y, msg_p->string, strlen(msg_p->string)); if ((10+x) > WND_WDT) {x =0; y=y+10;} else x = x + 10; } if (msg_p->type == MSG_TYPE_FINISH) break; msg_p->type = MSG_TYPE_EMPTY; /* ðÆÎÅÏ ×ÍÐÌÊÔÐÞÌÊ */ semctl(semid, 0, SETVAL, semun(0)); } /* þÝÞÐÄ ÒÔÊÚÍÂÙÅÏÊÓ ÄÍÓ ÆÅÉ, ÌÆÐ ÒÐÏÓÍ */ XSetForeground(prDisplay, prGC, BlackPixel(prDisplay, 0)); XDrawString(prDisplay, nWnd, prGC, 10, 50, "Server,",strlen("Server,")); XDrawString(prDisplay, nWnd, prGC, 20, 66, "LISTEN:",strlen("LISTEN:")); } /* ðÕÞÐ×ÐÃÄÅÏÊÅ ÚÔÂÖÊÀÅÕÌÐÚÐ ÌÐÏÆÅÌÕÆ */ XFreeGC(prDisplay, prGC); /* ÿÂÌÔÝÆÊÅ ÄÊÕÒÍÅÓ */ XCloseDisplay(prDisplay); if (semctl(semid, 0, IPC_RMID, semun(((struct semid_ds *) 0)) )<0) sys_err("SERVER: semaphore remove error!"); /* èÄÂÍÅÏÊÅ ÎÂÕÕÊÞ ÕÅÎÂÖÐÔÐÞ */ shmdt((char *)msg_p); /* èÄÂÍÅÏÊÅ ÕÅÚÎÅÏÆ ÔÂßÄÅÍÓÅÎÐË ÒÂÎÓÆÊ */ if ( shmctl( shmid, IPC_RMID, (struct shmid_ds *) 0)<0) sys_err("SERVER: shared memory remove error!"); /* þÝÉÐÄ */ exit(0); } /* -- ----------------------------------------------------------- NIKITA KOZHEKIN (KITYA KARLSON) [SHAMIL] \ Microsoft is not the answer. e-mail : KARLSON@SCH57.MCN.MSK.SU\ Microsoft is the question. phone : (095) 373-0554 \ Linux is the answer. ----------------------------------------------------------- Russia, 111395, Moscow, Snayperskaya str., h.4, app. 182. | Letters are welcome from 13 to 12. /--\/---\/\/-| | E-mail welcome around the clock. | * <------/|----| ------------------------------------ \ / \/ K K K K /~~ | |_/\___/ KK KK \--\ |=| K K K K __/ | | */