mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-04-18 20:59:17 +00:00
Introduce EGL backend support for the OpenGL canvas
wxWidgets 3.1.5+ on Linux will compile with the Wayland EGL canvas as the backend instead of the X11 backend. This requires a version of GLEW compiled with the proper EGL defines and a different header/code for certain parts that are X11 GLEW specific. This introduces an in-tree version of GLEW that will be built with the GLEW_EGL flag then statically linked into the KiCad executables when EGL support is needed.
This commit is contained in:
parent
ce3b2921bd
commit
11e6cac42b
3d-viewer
3d_canvas
3d_rendering
3d_render_ogl_legacy
3d_render_raytracing
common_ogl
Documentation/development
common
include
thirdparty
@ -27,7 +27,7 @@
|
||||
* @brief Implementation of a 3d canvas
|
||||
*/
|
||||
|
||||
#include <GL/glew.h> // Must be included first
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
#include <gl_utils.h>
|
||||
#include <wx/tokenzr.h>
|
||||
|
||||
|
@ -27,11 +27,7 @@
|
||||
* @brief
|
||||
*/
|
||||
|
||||
// Apple, in their infinite wisdom, has decided to mark OpenGL as deprecated.
|
||||
// Luckily we can silence warnings about its deprecation. This is needed on the GLEW
|
||||
// includes since they seem to transitively include the OpenGL headers.
|
||||
#define GL_SILENCE_DEPRECATION 1
|
||||
#include <GL/glew.h>
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include "c3d_render_ogl_legacy.h"
|
||||
#include "ogl_legacy_utils.h"
|
||||
|
@ -28,7 +28,8 @@
|
||||
* @brief
|
||||
*/
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include "c_ogl_3dmodel.h"
|
||||
#include "ogl_legacy_utils.h"
|
||||
#include "../common_ogl/ogl_utils.h"
|
||||
@ -400,7 +401,7 @@ void C_OGL_3DMODEL::Draw(bool aTransparent, float aOpacity, bool aUseSelectedMat
|
||||
if( aOpacity <= FLT_EPSILON )
|
||||
return;
|
||||
|
||||
|
||||
|
||||
if( !glBindBuffer )
|
||||
throw std::runtime_error( "The OpenGL context no longer exists: unable to draw" );
|
||||
|
||||
|
@ -27,7 +27,8 @@
|
||||
* @brief
|
||||
*/
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include <algorithm>
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
|
@ -27,7 +27,7 @@
|
||||
* @brief implements generic openGL functions that are common to any openGL target
|
||||
*/
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include "openGL_includes.h"
|
||||
#include "ogl_utils.h"
|
||||
|
@ -34,6 +34,7 @@ endif()
|
||||
project( kicad )
|
||||
|
||||
include( GNUInstallDirs )
|
||||
include( CMakeDependentOption )
|
||||
|
||||
# Path to local CMake modules.
|
||||
set( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules )
|
||||
@ -126,6 +127,15 @@ option( KICAD_WIN32_DPI_AWARE
|
||||
"Turn on DPI awareness for Windows builds only"
|
||||
OFF )
|
||||
|
||||
option( KICAD_USE_EGL
|
||||
"Build KiCad with EGL backend support for Wayland."
|
||||
OFF )
|
||||
|
||||
cmake_dependent_option( KICAD_USE_BUNDLED_GLEW
|
||||
"Use the bundled version of GLEW - only available when KICAD_USE_EGL is set"
|
||||
ON "KICAD_USE_EGL"
|
||||
OFF )
|
||||
|
||||
# when option KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES is enabled:
|
||||
# PYTHON_EXECUTABLE can be defined when invoking cmake
|
||||
# ( use -DPYTHON_EXECUTABLE=<python path>/python.exe or python2 )
|
||||
@ -447,6 +457,12 @@ if( KICAD_USE_OCC )
|
||||
unset( KICAD_USE_OCE CACHE )
|
||||
endif()
|
||||
|
||||
if( KICAD_USE_EGL AND UNIX AND NOT APPLE )
|
||||
message( STATUS "Configuring KiCad for the wxGLCanvas EGL backend" )
|
||||
add_definitions( -DKICAD_USE_EGL )
|
||||
elseif( KICAD_USE_EGL )
|
||||
message( STATUS "Ignoring KICAD_USE_EGL since not on Linux" )
|
||||
endif()
|
||||
|
||||
# KIFACE_SUFFIX is the file extension used for top level program modules which
|
||||
# implement the KIFACE interface. A valid suffix starts with a period '.'.
|
||||
@ -599,7 +615,25 @@ find_package( OpenGL REQUIRED )
|
||||
#
|
||||
# Find GLEW library, required
|
||||
#
|
||||
if( NOT GLEW_FOUND )
|
||||
# The EGL canvas on GTK requires the use of a GLEW version compiled with an EGL flag.
|
||||
# The one built in the thirdparty directory has the flag for EGL set, so we use it unless told
|
||||
# otherwise. Then we search for the system GLEW version and use that instead.
|
||||
#
|
||||
if( KICAD_USE_EGL AND KICAD_USE_BUNDLED_GLEW AND UNIX AND NOT APPLE )
|
||||
if( OpenGL_EGL_FOUND )
|
||||
message( STATUS "Found OpenGL EGL library: ${OPENGL_egl_LIBRARY}" )
|
||||
else()
|
||||
message( FATAL_ERROR "OpenGL EGL library not found" )
|
||||
endif()
|
||||
|
||||
# Add the custom GLEW target
|
||||
add_subdirectory( thirdparty/glew )
|
||||
|
||||
# Set the standard package variables to point to our custom target to mimic the system version.
|
||||
set( GLEW_LIBRARIES glew )
|
||||
set( GLEW_FOUND TRUE )
|
||||
include_directories( SYSTEM $<TARGET_PROPERTY:glew,PRIVATE_INCLUDE_DIRECTORIES> )
|
||||
else()
|
||||
find_package( GLEW REQUIRED )
|
||||
check_find_package_result( GLEW_FOUND "GLEW" )
|
||||
include_directories( SYSTEM ${GLEW_INCLUDE_DIR} )
|
||||
|
@ -198,6 +198,17 @@ passed via the OCE_DIR flag. This option is enabled by default.
|
||||
Alternatively KICAD_USE_OCC can be used instead of OCE. Both options are not supposed to be enabled
|
||||
at the same time.
|
||||
|
||||
## Wayland EGL support ## {#egl_opt}
|
||||
|
||||
The KICAD_USE_EGL option switches the OpenGL backend from using X11 bindings to Wayland EGL bindings.
|
||||
This option is only relevant on Linux when running wxWidgets 3.1.5+ with the EGL backend of
|
||||
the wxGLCanvas (which is the default option, but can be disabled in the wxWidgets build).
|
||||
|
||||
By default, setting KICAD_USE_EGL will use a in-tree version of the GLEW library (that is compiled with
|
||||
the additional flags needed to run on an EGL canvas) staticly linked into KiCad. If the system
|
||||
version of GLEW supports EGL (it must be compiled with the GLEW_EGL flag), then it can be used instead
|
||||
by setting KICAD_USE_BUNDLED_GLEW to OFF.
|
||||
|
||||
## Development Analysis Tools ## {#dev_tools}
|
||||
|
||||
KiCad can be compiled with support for several features to aid in the catching and debugging of
|
||||
@ -629,4 +640,4 @@ you will have to apply the Boost patches in the KiCad source [patches folder][].
|
||||
[libngspice]: https://sourceforge.net/projects/ngspice/
|
||||
[ZLib]: http://www.zlib.net/
|
||||
[vcpkg]: https://github.com/microsoft/vcpkg
|
||||
[Visual Studio]: https://visualstudio.microsoft.com/vs/
|
||||
[Visual Studio]: https://visualstudio.microsoft.com/vs/
|
||||
|
@ -239,6 +239,10 @@ wxString GetVersionInfoData( const wxString& aTitle, bool aHtml, bool aBrief )
|
||||
aMsg << indent4 << "KICAD_USE_OCC=" << ON;
|
||||
#endif
|
||||
|
||||
#ifdef KICAD_USE_EGL
|
||||
aMsg << indent4 << "KICAD_USE_EGL=" << ON;
|
||||
#endif
|
||||
|
||||
aMsg << indent4 << "KICAD_SPICE=";
|
||||
#ifdef KICAD_SPICE
|
||||
aMsg << ON;
|
||||
|
@ -24,7 +24,8 @@
|
||||
|
||||
#include <confirm.h> // DisplayError
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include <stdexcept>
|
||||
#include <wx/log.h> // wxLogDebug
|
||||
|
||||
|
68
include/gal/opengl/kiglew.h
Normal file
68
include/gal/opengl/kiglew.h
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program 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 for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* This file is used for including the proper GLEW header for the platform.
|
||||
*/
|
||||
|
||||
#ifndef KIGLEW_H_
|
||||
#define KIGLEW_H_
|
||||
|
||||
// Pull in the configuration options for wxWidgets
|
||||
#include <wx/setup.h>
|
||||
|
||||
// Apple, in their infinite wisdom, has decided to mark OpenGL as deprecated.
|
||||
// Luckily we can silence warnings about its deprecation. This is needed on the GLEW
|
||||
// includes since they transitively include the OpenGL headers.
|
||||
#define GL_SILENCE_DEPRECATION 1
|
||||
|
||||
#ifdef __WXGTK__
|
||||
|
||||
#ifdef KICAD_USE_EGL
|
||||
|
||||
#ifdef wxUSE_GLCANVAS_EGL
|
||||
// wxWidgets was compiled with the EGL canvas, so use the EGL header for GLEW
|
||||
#include <GL/eglew.h>
|
||||
#else
|
||||
#error "KICAD_USE_EGL can only be used when wxWidgets is compiled with the EGL canvas"
|
||||
#endif
|
||||
|
||||
#else // KICAD_USE_EGL
|
||||
|
||||
#ifdef wxUSE_GLCANVAS_EGL
|
||||
#error "KICAD_USE_EGL must be defined since wxWidgets has been compiled with the EGL canvas"
|
||||
#else
|
||||
// wxWidgets wasn't compiled with the EGL canvas, so use the X11 GLEW
|
||||
#include <GL/glxew.h>
|
||||
#endif
|
||||
|
||||
#endif // KICAD_USE_EGL
|
||||
|
||||
#else // __WXGTK__
|
||||
|
||||
// Non-GTK platforms only need the normal GLEW include
|
||||
#include <GL/glew.h>
|
||||
|
||||
#endif // __WXGTK__
|
||||
|
||||
#endif // KIGLEW_H_
|
@ -31,10 +31,11 @@
|
||||
#ifndef OPENGL_COMPOSITOR_H_
|
||||
#define OPENGL_COMPOSITOR_H_
|
||||
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include <gal/compositor.h>
|
||||
#include <gal/opengl/antialiasing.h>
|
||||
#include <gal/gal_display_options.h>
|
||||
#include <GL/glew.h>
|
||||
#include <deque>
|
||||
|
||||
namespace KIGFX
|
||||
|
@ -29,7 +29,7 @@
|
||||
#ifndef SHADER_H_
|
||||
#define SHADER_H_
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include <math/vector2d.h>
|
||||
|
||||
|
@ -30,8 +30,9 @@
|
||||
#ifndef VERTEX_COMMON_H_
|
||||
#define VERTEX_COMMON_H_
|
||||
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include <math/vector2d.h>
|
||||
#include <GL/glew.h>
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
|
@ -24,12 +24,12 @@
|
||||
#ifndef GL_UTILS_H
|
||||
#define GL_UTILS_H
|
||||
|
||||
#ifdef __linux__
|
||||
#include <GL/glxew.h>
|
||||
#endif
|
||||
#include <gal/opengl/kiglew.h> // Must be included first
|
||||
|
||||
#include <limits>
|
||||
|
||||
#include <wx/setup.h>
|
||||
|
||||
class GL_UTILS
|
||||
{
|
||||
public:
|
||||
@ -40,9 +40,9 @@ public:
|
||||
*/
|
||||
static int SetSwapInterval( int aVal )
|
||||
{
|
||||
/// This routine is written for Linux only. The equivalent functions under Windows would
|
||||
/// This routine is written for Linux using X11 only. The equivalent functions under Windows would
|
||||
/// include <wglext.h> and call wglSwapIntervalEXT
|
||||
#ifdef __linux__
|
||||
#if defined( __linux__ ) && !defined( KICAD_USE_EGL )
|
||||
Display *dpy = glXGetCurrentDisplay();
|
||||
GLXDrawable drawable = glXGetCurrentDrawable();
|
||||
|
||||
|
2
thirdparty/CMakeLists.txt
vendored
2
thirdparty/CMakeLists.txt
vendored
@ -21,6 +21,8 @@
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
#
|
||||
|
||||
# Note: The glew folder isn't added here because it is added inside the main CMakeLists.txt
|
||||
|
||||
add_subdirectory( clipper )
|
||||
add_subdirectory( compoundfilereader )
|
||||
add_subdirectory( delaunator )
|
||||
|
21
thirdparty/glew/CMakeLists.txt
vendored
Normal file
21
thirdparty/glew/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
add_library( glew STATIC )
|
||||
|
||||
# Mark the include directory as private so that it doesn't get used by other targets
|
||||
# and is only used when building the actual library.
|
||||
# The actual include directories will be added to the global include paths as
|
||||
# system headers
|
||||
target_include_directories( glew PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include" )
|
||||
|
||||
# Definitions for compiling GLEW staticly for EGL (extracted from the main GLEW CMakeLists.txt file)
|
||||
add_definitions( -DGLEW_STATIC )
|
||||
add_definitions( -DGLEW_EGL )
|
||||
add_definitions( -DGLEW_NO_GLU )
|
||||
|
||||
target_sources( glew PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/glew.c
|
||||
)
|
||||
|
||||
target_link_libraries( glew PUBLIC
|
||||
${OPENGL_LIBRARIES}
|
||||
${OPENGL_egl_LIBRARY}
|
||||
)
|
73
thirdparty/glew/LICENSE.txt
vendored
Normal file
73
thirdparty/glew/LICENSE.txt
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
The OpenGL Extension Wrangler Library
|
||||
Copyright (C) 2002-2007, Milan Ikits <milan ikits[]ieee org>
|
||||
Copyright (C) 2002-2007, Marcelo E. Magallon <mmagallo[]debian org>
|
||||
Copyright (C) 2002, Lev Povalahev
|
||||
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.
|
||||
* The name of the author may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
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 OWNER 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.
|
||||
|
||||
|
||||
Mesa 3-D graphics library
|
||||
Version: 7.0
|
||||
|
||||
Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
Copyright (c) 2007 The Khronos Group Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and/or associated documentation files (the
|
||||
"Materials"), to deal in the Materials without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
permit persons to whom the Materials are furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Materials.
|
||||
|
||||
THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
14
thirdparty/glew/README.md
vendored
Normal file
14
thirdparty/glew/README.md
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
This directory contains the source code and includes for the GLEW library
|
||||
(https://github.com/nigels-com/glew). This library is normally dynamically
|
||||
linked to KiCad on all platforms, but wxWidgets 3.1.5+ on Linux requires
|
||||
GLEW compiled with EGL support and most distributions do not supply this
|
||||
(since compiling GLEW for EGL is mutually exclusive with GLEW for X11).
|
||||
|
||||
The source files are generated from the GLEW repo, or can be pulled from
|
||||
a recent GLEW release.
|
||||
|
||||
As of November 10, 2020 this GLEW version was pulled from its GitHub
|
||||
repository and is what should be version upstream version 2.2.0.
|
||||
|
||||
This library is licensed under BSD and MIT licenses, with the actual
|
||||
license text given in the LICENSE file in this directory.
|
3093
thirdparty/glew/include/GL/eglew.h
vendored
Normal file
3093
thirdparty/glew/include/GL/eglew.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
26554
thirdparty/glew/include/GL/glew.h
vendored
Normal file
26554
thirdparty/glew/include/GL/glew.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1831
thirdparty/glew/include/GL/glxew.h
vendored
Normal file
1831
thirdparty/glew/include/GL/glxew.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1468
thirdparty/glew/include/GL/wglew.h
vendored
Normal file
1468
thirdparty/glew/include/GL/wglew.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
32167
thirdparty/glew/src/glew.c
vendored
Normal file
32167
thirdparty/glew/src/glew.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
19147
thirdparty/glew/src/glewinfo.c
vendored
Normal file
19147
thirdparty/glew/src/glewinfo.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1297
thirdparty/glew/src/visualinfo.c
vendored
Normal file
1297
thirdparty/glew/src/visualinfo.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user