2016-10-18 2 views
0

Ich schreibe ein Shell-Skript, das sein Verhalten unterscheiden muss und verschiedene Optionen für aufgerufene Programme basierend auf dem Vorhandensein oder Fehlen bestimmter X11-Erweiterungen bereitstellen muss. Ich habe eine funktionierende Lösung, aber ich hoffe auf eine sauberere Lösung. Ich bin offen dafür, ein einfaches c-Programm in Betracht zu ziehen, um den Test durchzuführen und das Ergebnis zurückzugeben. Hier ist, was ich habe Arbeit als minimal Funktionsbeispiel:Auf X11-Erweiterung prüfen

#!/bin/sh 
xdpyinfo |sed -nr '/^number of extensions/,/^[^ ]/s/^ *//p' | \ 
    grep -q $EXTENSION && echo present 

Ich denke, es ist eine Möglichkeit, die sed, grep zu vereinfachen, aber ich würde wirklich lieber nicht xdpyinfo analysieren.

Antwort

1

Sie haben auch das C-Tag, also lassen Sie mich vorschlagen, die xdpyinfo selbst zu tun. Die folgenden C-Programm druckt nur die Erweiterungen:

#include <X11/Xlib.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

static int compare(const void *a, const void *b) 
{ 
    return strcmp(*(char **) a, *(char **) b); 
} 

static void print_extension_info(Display * dpy) 
{ 
    int n = 0, i; 
    char **extlist = XListExtensions(dpy, &n); 


    printf("number of extensions: %d\n", n); 
    if (extlist) { 
    qsort(extlist, n, sizeof(char *), compare); 
    for (i = 0; i < n; i++) { 

     printf(" %s\n", extlist[i]); 

    } 
    } 
    // TODO: it might not be a good idea to free extlist, check 
} 

int main() 
{ 
    Display *dpy; 
    char *displayname = NULL; 

    dpy = XOpenDisplay(displayname); 
    if (!dpy) { 
    fprintf(stderr, "Unable to open display \"%s\".\n", 
      XDisplayName(displayname)); 
    exit(EXIT_FAILURE); 
    } 

    print_extension_info(dpy); 

    XCloseDisplay(dpy); 
    exit(EXIT_SUCCESS); 
} 

Compile mit zB: GCC

gcc -O3 -g3 -W -Wall -Wextra xdpyinfo1.0.2.c $(pkg-config --cflags --libs x11) -o xdpyinfo1.0.2 

(sollte eine Warnung über nicht genutzte argc geben, aber das ist harmlos)

einfach die printf() s‘ändern zu dem Format, das Sie möchten.

+0

Vielen Dank, dies sieht aus, um mich am meisten Weg dorthin zu bekommen, aber es ist ein wenig eine Schande, Ihre harte Arbeit als Ersatz für xdpyinfo zu lösen, aber das ist nur ein paar printfs. – hildred

+0

@hildred Wenn du zu viel machst, wirst du über deinen Kopf geschlagen und wenn du es auch tust ... * seufz * Dieses kleine Programm listet die Erweiterungen auf. Soll ich es so erweitern, dass es Anfragen von der Kommandozeile akzeptiert oder kannst du es selbst machen? – deamentiaemundi

+0

Nein, mein c ist nicht so schlimm, ich kann es von hier aus nehmen, es ist das X11-Zeug, auf dem ich rostig bin. Ich werde es bald bei Github haben. Wie findest du eine gpl3-Lizenz? – hildred