/*
 * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */


package sun.awt.X11;

public interface MWMConstants {

/* bit definitions for MwmHints.flags */
    static final int MWM_HINTS_FUNCTIONS=       (1  << 0);
    static final int MWM_HINTS_DECORATIONS=     (1  << 1);
    static final int MWM_HINTS_INPUT_MODE=      (1  << 2);
    static final int MWM_HINTS_STATUS=          (1  << 3);

/* bit definitions for MwmHints.functions */
    static final int MWM_FUNC_ALL=              (1  << 0);
    static final int MWM_FUNC_RESIZE=           (1  << 1);
    static final int MWM_FUNC_MOVE=             (1  << 2);
    static final int MWM_FUNC_MINIMIZE=         (1  << 3);
    static final int MWM_FUNC_MAXIMIZE=         (1  << 4);
    static final int MWM_FUNC_CLOSE=            (1  << 5);

/* bit definitions for MwmHints.decorations */
    static final int MWM_DECOR_ALL=             (1  << 0);
    static final int MWM_DECOR_BORDER=          (1  << 1);
    static final int MWM_DECOR_RESIZEH=         (1  << 2);
    static final int MWM_DECOR_TITLE  =         (1  << 3);
    static final int MWM_DECOR_MENU     =       (1  << 4);
    static final int MWM_DECOR_MINIMIZE=        (1  << 5);
    static final int MWM_DECOR_MAXIMIZE=        (1  << 6);

    // Input modes
    static final int MWM_INPUT_MODELESS                 =0;
    static final int MWM_INPUT_PRIMARY_APPLICATION_MODAL=1;
    static final int MWM_INPUT_SYSTEM_MODAL             =2;
    static final int MWM_INPUT_FULL_APPLICATION_MODAL   =3;

/* number of elements of size 32 in _MWM_HINTS */
    static final int PROP_MWM_HINTS_ELEMENTS          = 5;
/* number of elements of size 32 in _MWM_INFO */
    final static int PROP_MOTIF_WM_INFO_ELEMENTS=       2;
    final static int PROP_MWM_INFO_ELEMENTS=            PROP_MOTIF_WM_INFO_ELEMENTS;

    static final String MWM_HINTS_ATOM_NAME = "_MOTIF_WM_HINTS";
}
