Edit

IABSD.fr/xenocara/app/xsystrace/interface.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2006-11-26 10:53:04
    Hash : 3458219f
    Message : Importing from XF4, plus BSD make infrastructure

  • app/xsystrace/interface.c
  • /* $OpenBSD: interface.c,v 1.1.1.1 2006/11/26 10:58:43 matthieu Exp $ */
    /*
     * Copyright (c) 2002 Matthieu Herrb and Niels Provos
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *    - Redistributions of source code must retain the above copyright
     *	notice, this list of conditions and the following disclaimer.
     *    - Redistributions in binary form must reproduce the above
     *	copyright notice, this list of conditions and the following
     *	disclaimer in the documentation and/or other materials provided
     *	with the distribution.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     * POSSIBILITY OF SUCH DAMAGE.
     */
    
    #include <X11/Intrinsic.h>
    #include <X11/Shell.h>
    #include <X11/StringDefs.h>
    #include <X11/Xatom.h>
    #include <X11/Xaw/Form.h>
    #include <X11/Xaw/Label.h>
    #include <X11/Xaw/Command.h>
    #include <X11/Xaw/AsciiText.h>
    #include <X11/Xaw/Box.h>
    #include <X11/Xaw/MenuButton.h>
    #include <X11/Xaw/SmeBSB.h>
    #include <X11/Xaw/SimpleMenu.h>
    #include <time.h>
    
    #include "callbacks.h"
    #include "interface.h"
    
    static String formNames[] = {
    	"title-form",
    	"processInfo-form",
    	"syscallInfo-form",
    	"status-form",
    	"errorCode-form",
    	"specialProc-form",
    	"buttons-form",
    };
    #define NUM_FORMS (sizeof(formNames)/sizeof(char *))
    
    
    XtAppContext appContext;
    Atom wm_delete_window;
    Widget forms[NUM_FORMS], errorCodeMenu, errorCodeText,
        filterText, filterMenu, filterPopup,
        wizardButton, timeline, pName,
        pId, policyName, syscallName, status, reviewButton;
    volatile Boolean done;
    
    Widget
    makeForm(Widget parent)
    {
    	Widget form;
    	Widget errorCodePopup, sme, w;
    	time_t when;
    	int i;
    
    	form = XtVaCreateWidget("form", formWidgetClass, parent, NULL);
    	for (i = 0; i < NUM_FORMS; i++) {
    		forms[i] = XtCreateManagedWidget(formNames[i],
    		    formWidgetClass, form, NULL, 0);
    	}
    	XtVaCreateManagedWidget("title-label", labelWidgetClass,
    	    forms[0], NULL);
    	when = time(NULL);
    	timeline = XtVaCreateManagedWidget("date-label", labelWidgetClass,
    	    forms[0], NULL);
    	XtVaCreateManagedWidget("processInfo-label", labelWidgetClass,
    	    forms[1], NULL);
    	XtVaCreateManagedWidget("processName-label", labelWidgetClass,
    	    forms[1], NULL);
    	pName = XtVaCreateManagedWidget("processName-value", labelWidgetClass,
    	    forms[1], NULL);
    	XtVaCreateManagedWidget("processPid-label", labelWidgetClass,
    	    forms[1], NULL);
    	pId = XtVaCreateManagedWidget("processPid-value", labelWidgetClass,
    	    forms[1], NULL);
    	XtVaCreateManagedWidget("policyName-label", labelWidgetClass,
    	    forms[1], NULL);
    	policyName = XtVaCreateManagedWidget("policyName-value",
    	    labelWidgetClass, forms[1], NULL);
    	XtVaCreateManagedWidget("syscallInfo-label", labelWidgetClass,
    	    forms[2], NULL);
    	syscallName = XtVaCreateManagedWidget("syscallInfo-value",
    	    labelWidgetClass, forms[2], NULL);
    	XtVaCreateManagedWidget("filter-label", labelWidgetClass,
    	    forms[2], NULL);
    	filterText = XtVaCreateManagedWidget("filter-text",
    	    asciiTextWidgetClass, forms[2], XtNeditType, XawtextEdit,
    	    NULL, 0);
    	filterMenu = XtCreateManagedWidget("filter-menu-button",
    	    menuButtonWidgetClass, forms[2], NULL, 0);
    	filterPopup = XtCreatePopupShell("filter-menu", simpleMenuWidgetClass,
    	    forms[2], NULL, 0);
    
    	wizardButton = XtVaCreateManagedWidget("filter-button",
    	    commandWidgetClass, forms[2], NULL, 0);
    	XtAddCallback(wizardButton, XtNcallback, on_wizard_clicked, NULL);
    
    	XtVaCreateManagedWidget("status-label", labelWidgetClass,
    	    forms[3], NULL);
    	status = XtVaCreateManagedWidget("status-value", labelWidgetClass,
    	    forms[3], NULL);
    	XtVaCreateManagedWidget("errorCode-label", labelWidgetClass,
    	    forms[4], NULL);
    	errorCodeText = XtVaCreateManagedWidget("errorCode-text",
    	    asciiTextWidgetClass, forms[4], XtNeditType, XawtextEdit,
    	    NULL, 0);
    	errorCodeMenu = XtCreateManagedWidget("errorCode-button",
    	    menuButtonWidgetClass, forms[4], NULL, 0);
    	errorCodePopup = XtCreatePopupShell("menu", simpleMenuWidgetClass,
    	    forms[4], NULL, 0);
    	sme = XtCreateManagedWidget("eperm", smeBSBObjectClass,
    	    errorCodePopup, NULL, 0);
    	XtAddCallback(sme, XtNcallback, on_error_select, (XtPointer)"eperm");
    	sme = XtCreateManagedWidget("enoent", smeBSBObjectClass,
    	    errorCodePopup, NULL, 0);
    	XtAddCallback(sme, XtNcallback, on_error_select, (XtPointer)"enoent");
    	sme = XtCreateManagedWidget("einval", smeBSBObjectClass,
    	    errorCodePopup, NULL, 0);
    	XtAddCallback(sme, XtNcallback, on_error_select, (XtPointer)"einval");
    	sme = XtCreateManagedWidget("enotdir", smeBSBObjectClass,
    	    errorCodePopup, NULL, 0);
    	XtAddCallback(sme, XtNcallback, on_error_select, (XtPointer)"enotdir");
    	sme = XtCreateManagedWidget("eio", smeBSBObjectClass,
    	    errorCodePopup, NULL, 0);
    	XtAddCallback(sme, XtNcallback, on_error_select, (XtPointer)"eio");
    	sme = XtCreateManagedWidget("enxio", smeBSBObjectClass,
    	    errorCodePopup, NULL, 0);
    	XtAddCallback(sme, XtNcallback, on_error_select, (XtPointer)"enxio");
    	sme = XtCreateManagedWidget("eaccess", smeBSBObjectClass,
    	    errorCodePopup, NULL, 0);
    	XtAddCallback(sme, XtNcallback, on_error_select, (XtPointer)"eaccess");
    	/* Initial value */
    	on_error_select(errorCodeMenu, "eperm", NULL);
    
    	XtVaCreateManagedWidget("specialProc-label", labelWidgetClass,
    	    forms[5], NULL);
    	w = XtVaCreateManagedWidget("kill-button", commandWidgetClass,
    	    forms[5], NULL);
    	XtAddCallback(w, XtNcallback, on_killbutton_clicked, NULL);
    
    	reviewButton = XtVaCreateManagedWidget("review-button",
    	    commandWidgetClass, forms[5], NULL);
    	XtAddCallback(reviewButton, XtNcallback, on_reviewbutton_clicked,
    	    (XtPointer)parent);
    
    	w = XtVaCreateManagedWidget("auto-button", commandWidgetClass,
    	    forms[5], NULL);
    	XtAddCallback(w, XtNcallback, on_detachbutton_clicked, NULL);
    
    	w = XtVaCreateManagedWidget("deny-button", commandWidgetClass,
    	    forms[6], NULL);
    	XtAddCallback(w, XtNcallback, on_denyone_clicked, NULL);
    	w = XtVaCreateManagedWidget("allow-button", commandWidgetClass,
    	    forms[6], NULL);
    	XtAddCallback(w, XtNcallback, on_permitonce_clicked, NULL);
    
    	w = XtVaCreateManagedWidget("deny-all-button", commandWidgetClass,
    	    forms[6], NULL);
    	XtAddCallback(w, XtNcallback, on_deny_clicked, NULL);
    	w = XtVaCreateManagedWidget("allow-all-button", commandWidgetClass,
    	    forms[6], NULL);
    	XtAddCallback(w, XtNcallback, on_permit_clicked, NULL);
    
    	XtManageChild(form);
    
    	return form;
    }
    
    /*
     * Widget positionning
     */
    static void
    position_near(Widget shell, int x, int y)
    {
    	int max_x, max_y;
    	Dimension width, height, border;
    	int gravity;
    
    	/* some of this is copied from CenterWidgetOnPoint in Xaw/TextPop.c */
    
    	XtVaGetValues(shell, XtNwidth, &width, XtNheight, &height,
    	    XtNborderWidth, &border, NULL);
    
    	width += 2 * border;
    	height += 2 * border;
    
    	max_x = WidthOfScreen(XtScreen(shell));
    	max_y = HeightOfScreen(XtScreen(shell));
    
    	/* set gravity hint based on position on screen */
    	gravity = 1;
    	if (x > max_x/3) gravity += 1;
    	if (x > max_x*2/3) gravity += 1;
    	if (y > max_y/3) gravity += 3;
    	if (y > max_y*2/3) gravity += 3;
    
    	max_x -= width;
    	max_y -= height;
    
    	x -= ( (Position) width/2 );
    	if (x < 0) x = 0;
    	if (x > max_x) x = max_x;
    
    	y -= ( (Position) height/2 );
    	if (y < 0) y = 0;
    	if ( y > max_y ) y = max_y;
    
    	XtVaSetValues(shell, XtNx, (Position)x, XtNy, (Position)y,
    	    XtNwinGravity, gravity, NULL);
    }
    
    void
    position_near_mouse(Widget shell)
    {
    	int x, y;
    	Window root, child;
    	int winx, winy;
    	unsigned int mask;
    
    	XQueryPointer(XtDisplay(shell), XtWindow(shell),
    	    &root, &child, &x, &y, &winx, &winy, &mask);
    	position_near(shell, x, y);
    }
    
    void
    position_near_center(Widget shell)
    {
    	position_near(shell, WidthOfScreen(XtScreen(shell))/2,
    	    HeightOfScreen(XtScreen(shell))/2);
    }