/* * @(#) xtalk.c - XWindow simple (two-party) talk program. * (c) 1996 Ivan Maidanski http://ivmai.chat.ru * Freeware program source. All rights reserved. ** * Language: C * Tested with: BSD GNU CC * Last modified: 1996-02-29 17:20:00 GMT+03:00 */ #define X11R3 /* XWindow v11 r3 */ #include #include #include #include #include #define MAXSTRLEN 255 /* window geometry & title */ #define WND_X 0 #define WND_Y 0 #define WND_WDT 200 #define WND_HGH 50 #define WND_MIN_WDT 50 #define WND_MIN_HGH 20 #define WND_BORDER_WDT 5 #define WND_TITLE "XTalk " #define WND_ICON_TITLE "XTalk!" #define PRG_CLASS "Intertalk" /* finds string in the table, returns number of string or -1 */ int FindStrInTable(char *table[],char *str) { int n=0; while (table[n]) { if (!strcmp(table[n],str)) return n; n++; } return -1; } /* window properties procedure */ static 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 /* XWindow Version X11R3 or lower */ 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 /* XWindow Version X11R4 or higher */ XWMHints rWMHints; XClassHint rClassHint; XTextProperty prWindowName,prIconName; if (!XStringListToTextProperty(&psTitle,1,&prWindowName) || !XStringListToTextProperty(&psIconTitle,1,&prIconName)) { fprintf(stderr,"No memory!\n"); exit(1); } 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; rWMHints.res_name=argv[0]; rWMHints.res_class=psPrgClass; XSetWMProperties(prDisplay,nWnd,&prWindowName,&prIconName, argv,argc,&rSizeHints,&rWMHints,&rClassHint); #endif } /* opens X display */ Display *ConnectToXServer(char *argv[]) { int n=FindStrInTable(argv,"-d"); /* Option -d */ Display *prDisplay=XOpenDisplay(n>=0 ? argv[n+1] : 0); if (!prDisplay) { fprintf(stderr,"Cannot connect to the X server!\n"); exit(1); } return prDisplay; } /* opens new window */ Window OpenNewWindow(Display *prDisplay, char *ClassName,char *Title,char *IconTitle, int x,int y,int w,int h,int b,int min_w,int min_h, int argc,char *argv[],int RvGCFlag) { int nScr=DefaultScreen(prDisplay); Window nWnd=XCreateSimpleWindow( prDisplay,RootWindow(prDisplay,nScr),x,y,w,h,b, RvGCFlag ? WhitePixel(prDisplay,nScr) : BlackPixel(prDisplay,nScr), RvGCFlag ? BlackPixel(prDisplay,nScr) : WhitePixel(prDisplay,nScr)); SetWindowManagerHints(prDisplay,ClassName,argv,argc,nWnd, x,y,w,h,min_w,min_h, Title,IconTitle,0); /* Draw Window... */ XMapWindow(prDisplay,nWnd); return nWnd; } void Draw(Display *prDisplay,Window nWnd,int RvGCFlag,char *Text) { GC prGC=XCreateGC(prDisplay,nWnd,0,0); /* Graphic Context */ XSetForeground(prDisplay,prGC, RvGCFlag ? WhitePixel(prDisplay,0) : BlackPixel(prDisplay,0)); XClearWindow(prDisplay,nWnd); XDrawString(prDisplay,nWnd,prGC,10,10,Text,strlen(Text)); XFreeGC(prDisplay,prGC); } void main(int argc,char *argv[]) { int RvGCFlag=FindStrInTable(argv,"-rv")>=0; /* Option -rv (Reverse) */ Display *prDisplay; Window nWnd; XEvent rEvent; char Text[MAXSTRLEN]; if (argc<2) { printf("XTalk v1.0 for XWindow\n" "Usage:\n" " xtalk -d [-rv]\n\n"); exit(0); } prDisplay=ConnectToXServer(argv); nWnd=OpenNewWindow(prDisplay,PRG_CLASS,WND_TITLE,WND_ICON_TITLE, WND_X,WND_Y,WND_WDT,WND_HGH,WND_BORDER_WDT, WND_MIN_WDT,WND_MIN_HGH,argc,argv,RvGCFlag); XSelectInput(prDisplay,nWnd,ExposureMask | KeyPressMask | ButtonPressMask); for (;;) { printf("Enter Text to Transmit:\n"); if (!gets(Text)) break; Draw(prDisplay,nWnd,RvGCFlag,Text); do { XNextEvent(prDisplay,&rEvent); if (rEvent.type==Expose && !rEvent.xexpose.count) Draw(prDisplay,nWnd,RvGCFlag,Text); } while (rEvent.type!=KeyPress && rEvent.type!=ButtonPress); } XCloseDisplay(prDisplay); printf("\n"); }