📄 xtel.c
字号:
XResizeWindow (dpy, iconWindow, xpma.width, xpma.height); XSetWindowBackgroundPixmap (dpy, iconWindow, icon); XtVaSetValues (w, XtNiconWindow, iconWindow, NULL); }}#endif /* NO_XPM */void Usage (){ fprintf (stderr, "Options disponibles:\n"); fprintf (stderr, "-ng\n\tForce le mode niveaux de gris\n"); fprintf (stderr, "-petit\n\tSelectionne la petite fonte\n"); fprintf (stderr, "-br\n\tValide le bouton pour raccrocher\n"); fprintf (stderr, "-service service_xtel\n\tSelectionne le nom TCP du service XTel\n"); fprintf (stderr, "-serveur serveur_xtel\n\tSelectionne le nom du serveur XTel\n"); fprintf (stderr, "-low\n\tPas de jolis boutons\n"); fprintf (stderr, "--exec-procedure, -e nom_procedure\n\tExecute une procedure\n"); fprintf (stderr, "-private\n\tForce une colormap privee\n"); exit (1);}static void execute_procedure (w, proc, pevent)Widget w;char *proc;XEvent *pevent;{ Boolean fc; int i; XtVaGetValues (w, XtNconnecte, &fc, NULL); if (!(fc || flag_execution)) { flag_execution = True; /* Composition du service */ start_procedure ((i = get_proc_index(proc))); init_xtel (); connexion_service (procedures[i].service); }}/* Affichage/effacement du telephone de connexion */void affiche_telephone (){#ifdef LOW_MEMORY XDefineCursor (XtDisplay(ecran_minitel), XtWindow(ecran_minitel), teleph_cursor);#else if (!rsc_xtel.lowMemory) XtMapWidget (teleph); XDefineCursor (XtDisplay(ecran_minitel), XtWindow(ecran_minitel), teleph_cursor);#endif}void efface_telephone (){#ifdef LOW_MEMORY XUndefineCursor (XtDisplay(ecran_minitel), XtWindow(ecran_minitel));#else if (!rsc_xtel.lowMemory) XtUnmapWidget (teleph); XUndefineCursor (XtDisplay(ecran_minitel), XtWindow(ecran_minitel));#endif}/* Creation du curseur */void create_teleph_cursor (top)Widget top;{ Pixmap shape, mask; Display *dpy = XtDisplay(top); shape = XCreatePixmapFromBitmapData (dpy, DefaultRootWindow(dpy), teleph_bits, teleph_width, teleph_height, 1, 0, 1); mask = XCreatePixmapFromBitmapData (dpy, DefaultRootWindow(dpy), teleph_mask_bits, teleph_mask_width, teleph_mask_height, 1, 0, 1); teleph_cursor = XCreatePixmapCursor (dpy, shape, mask, &black, &white, 0, 0);}/* * Programme principal */main(ac, av)int ac;char **av;{ unsigned char c; static char l; char buf[256]; struct passwd *pw; struct stat statb; Boolean flag_point_xtel = False; XColor exact; int i; Widget topLevel; if (prototype_xtel == 0) { if (PATCHLEVEL != 0) printf ("XTEL %d.%d.%d, Emulateur MINITEL %s\n", version_xtel, revision_xtel, PATCHLEVEL, copyright_string); else printf ("XTEL %d.%d, Emulateur MINITEL %s\n", version_xtel, revision_xtel, copyright_string); } else { if (PATCHLEVEL != 0) printf ("XTEL %d.%d.%db%d [beta], Emulateur MINITEL %s\n", version_xtel, revision_xtel, PATCHLEVEL, prototype_xtel, copyright_string); else printf ("XTEL %d.%db%d [beta], Emulateur MINITEL %s\n", version_xtel, revision_xtel, prototype_xtel, copyright_string); } taille_zone_enregistrement = 1000; mode_emulation = MODE_VIDEOTEX;#ifdef NO_NETWORK unaddr.sun_family = AF_UNIX; strcpy (unaddr.sun_path, XTEL_UNIX_PATH);#endif /* NO_NETWORK */ /* * Allocation de la zone d'enregistrement par defaut */ if ((zone_enregistrement = malloc (taille_zone_enregistrement)) == NULL) { perror ("malloc"); exit (1); } XtSetLanguageProc (NULL, NULL, NULL); if ((topLevel = init_toolkit (&ac, av)) == NULL) { fprintf (stderr, "Erreur initialisation Toolkit, dommage...\n"); exit (1); } XSetErrorHandler (xtel_X_error_handler); /* * Options annexes */ i = 1; while (i < ac) { if (strcmp (av[i], "-e") * strcmp (av[i], "--exec-procedure") == 0) procedure_executee = av[++i]; else if (av[i][0] != '-') { strcpy (nom_fichier_charge, av[i]); } else Usage (); i++; } sprintf (buf, "%s-%d.%d", xtel_basename(av[0]), version_xtel, revision_xtel); XtVaSetValues (topLevel, XtNtitle, buf, XtNiconName, buf, NULL); /* * lecture des ressources specifiques */ XtGetApplicationResources (topLevel, &rsc_xtel, ressources, XtNumber(ressources), NULL, 0); /* Colormap */ if (rsc_xtel.privateColormap) { current_cmap = XCopyColormapAndFree (XtDisplay(topLevel), DefaultColormapOfScreen (XtScreen (topLevel))); XtVaSetValues (topLevel, XtNcolormap, current_cmap, NULL); } else current_cmap = DefaultColormapOfScreen (XtScreen (topLevel)); /* Noir et blanc */ if (!XAllocNamedColor (XtDisplay(topLevel), current_cmap, "white", &white, &exact)) { fprintf (stderr, "Erreur XAllocNamedColor white\n"); } else white_pixel = white.pixel; if (!XAllocNamedColor (XtDisplay(topLevel), current_cmap, "black", &black, &exact)) { fprintf (stderr, "Erreur XAllocNamedColor black\n"); } else black_pixel = black.pixel; /* * Lecture des services disponibles */#ifdef NO_NETWORK if ((socket_xteld = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) { perror ("socket"); exit (1); } if (connect (socket_xteld, (struct sockaddr *)&unaddr, sizeof(unaddr)) < 0) { perror ("connect"); exit (1); }#else if ((socket_xteld = c_clientbyname(rsc_xtel.serveur, rsc_xtel.nomService)) < 0) { fprintf (stderr, "Erreur de connexion au serveur XTEL...\n"); exit (1); }#endif /* NO_NETWORK /* Transmet le nom d'utilisateur */ if ((pw = getpwuid(getuid())) == NULL) { perror ("getpwuid"); exit(1); } l = strlen (pw->pw_name); write (socket_xteld, &l, 1); write (socket_xteld, pw->pw_name, l); nb_services = 0; for(;;) { write (socket_xteld, CHAINE_COMMANDE_SERVICE_SUIVANT, 1); read (socket_xteld, &c, 1); if (c == VALEUR_REPONSE_PLUS_DE_SERVICE) break; else { /* transmet la longueur de la chaine */ int l = c; if (l != 0) { read (socket_xteld, buf, l); buf[l] = 0; definition_services[nb_services].nom_service = build_name (buf); entree_compose[nb_services] = definition_services[nb_services].nom_service; write (socket_xteld, CHAINE_COMMANDE_NOM_UUCP, 1); read (socket_xteld, &c, 1); l = c; definition_services[nb_services].nom_uucp = (char *) calloc (1, l+1); read (socket_xteld, definition_services[nb_services].nom_uucp, l); definition_services[nb_services].nom_uucp[l] = 0;#ifdef DEBUG printf ("%d %s %s\n", nb_services, definition_services[nb_services].nom_service ,definition_services[nb_services].nom_uucp);#endif nb_services++; } else {#ifdef DEBUG fprintf (stderr, "entree %d interdite\n", nb_services);#endif } } } close (socket_xteld); /* * Procedures et protocoles */ sprintf (buf, "%s/.xtel", getenv ("HOME")); flag_point_xtel = (stat (buf, &statb) == 0); /* Procedures */ /* Ouvre le fichier $HOME/.xtelproc */ if (flag_point_xtel) sprintf (buf, "%s/.xtel/procedures", getenv ("HOME")); else sprintf (buf, "%s/.xtelproc", getenv ("HOME")); nb_procedures = init_procedures (buf); /* Verifie la procedure a executer si il y lieu */ if (procedure_executee && get_proc_index (procedure_executee) < 0) { fprintf (stderr, "procedure %s inexistante :-(\n", procedure_executee); exit (1); } /* * Protocoles de telechargement */ if (flag_point_xtel) sprintf (buf, "%s/.xtel/protocols", getenv ("HOME")); else sprintf (buf, "%s/.xtelproto", getenv ("HOME")); nb_protocoles = init_protocoles (buf, &protocoles[0]); /* * Initialisation des widgets */ if ((ecran_minitel = init_widgets (topLevel)) == NULL) { fprintf (stderr, "Erreur initialisation widgets\n"); exit (1); } /* Creation du curseur telephone */ create_teleph_cursor (topLevel); /* * Contruction de l'icone */ XtVaGetValues(topLevel, XtNiconPixmap, &pixmap_icone, NULL); if (pixmap_icone == None) {#ifdef NO_XPM XtVaSetValues (topLevel, XtNiconPixmap, XCreateBitmapFromData(XtDisplay(topLevel), XtScreen(topLevel)->root, xtel_bits, xtel_width, xtel_height), NULL);#else SetIconImage (topLevel);#endif /* NO_XPM */ } XtRealizeWidget(topLevel); XtAddCallback (ecran_minitel, XtNmodeCallback, (XtCallbackProc)selection_mode_emulation, (XtPointer)"A"); XtAddCallback (ecran_minitel, XtNenregCallback, (XtCallbackProc)enregistre_caractere, (XtPointer)NULL); init_xtel (); XtAddEventHandler (topLevel, LeaveWindowMask, False, (XtEventHandler)sauve_l_ecran, NULL); if (procedure_executee) XtAddEventHandler (ecran_minitel, ExposureMask, False, (XtEventHandler)execute_procedure, (XtPointer)procedure_executee); if (nom_fichier_charge[0]) { if (!Charge ()) debut_lecteur (); } /* attente evenements */ XtAppMainLoop (app_context); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -