blob: b033a371a005040560aeed191655f04cf83a8334 [file] [log] [blame]
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# resolve symlinks
#
PRG=$0
while [ -h "$PRG" ]; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null`
if expr "$link" : '^/' 2> /dev/null >/dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
progdir=`dirname "$PRG"`
old=`pwd`
cd "$progdir"/..
basedir=`pwd`
cd "$old"
case "`uname`" in
Darwin*)
# set default userdir and cachedir on Mac OS X
DEFAULT_USERDIR_ROOT="${HOME}/Library/Application Support/NetBeans"
DEFAULT_CACHEDIR_ROOT=${HOME}/Library/Caches/NetBeans
;;
*)
# set default userdir and cachedir on unix systems
DEFAULT_USERDIR_ROOT=${HOME}/.netbeans
DEFAULT_CACHEDIR_ROOT=${HOME}/.cache/netbeans
;;
esac
if [ -f "$basedir"/etc/netbeans.conf ] ; then
. "$basedir"/etc/netbeans.conf
fi
# following should be done just in RPM or Solaris Launcher
# if [ -f /etc/netbeans.conf ] ; then
# . /etc/netbeans.conf
# fi
export DEFAULT_USERDIR_ROOT
# #68373: look for userdir, but do not modify "$@"
userdir="${netbeans_default_userdir}"
cachedir="${netbeans_default_cachedir}"
founduserdir=""
for opt in "$@"; do
if [ "${founduserdir}" = "yes" ]; then
userdir="$opt"
break
elif [ "$opt" = "--userdir" ]; then
founduserdir="yes"
fi
done
foundcachedir=""
for opt in "$@"; do
if [ "${foundcachedir}" = "yes" ]; then
cachedir="$opt"
break
elif [ "$opt" = "--cachedir" ]; then
foundcachedir="yes"
fi
done
if [ -f "${userdir}"/etc/netbeans.conf ] ; then
. "${userdir}"/etc/netbeans.conf
fi
if [ ! -f "$basedir"/etc/netbeans.clusters ]; then
echo Cannot read cluster file: "$basedir"/etc/netbeans.clusters 1>&2
exit 1
fi
readClusters() {
grep -v "^#" "$basedir"/etc/netbeans.clusters | grep -v "^$" | grep -v platform | while read X; do
if expr "$X" : "/.*" >/dev/null; then
echo "$X"
else
echo "$basedir/$X"
fi
done
}
absolutize_paths() {
while read path; do
if [ -d "$path" ]; then
(cd "$path" 2>/dev/null && pwd)
else
echo "$path"
fi
done
}
netbeans_clusters=`readClusters | absolutize_paths | tr '\012' ':'`
if [ ! -z "$netbeans_extraclusters" ] ; then
netbeans_clusters="$netbeans_clusters:$netbeans_extraclusters"
fi
launchNbexec() {
nbexec=`grep -v "^#" "$basedir"/etc/netbeans.clusters | grep -v "^$" | grep platform | while read X; do
if expr "$X" : "/.*" >/dev/null; then
echo $X/lib/nbexec
elif [ -f "$basedir"/$X/lib/nbexec ]; then
echo "$basedir"/$X/lib/nbexec
fi
done | head -n 1`
sh=sh
# #73162: Ubuntu uses the ancient Bourne shell, which does not implement trap well.
if [ -x /bin/bash ]
then
sh=/bin/bash
fi
if [ "${founduserdir}" = "yes" ]; then
exec $sh "$nbexec" "$@"
else
if [ "${foundcachedir}" = "yes" ]; then
exec $sh "$nbexec" --userdir "${userdir}" "$@"
else
exec $sh "$nbexec" --userdir "${userdir}" --cachedir "${cachedir}" "$@"
fi
fi
}
# in case of macosx, the apple.laf.useScreenMenuBar property should be ideally in the Info.plist file
# but it doesn't get propagated into the executed java VM.
case "`uname`" in
Darwin*)
eval launchNbexec \
--jdkhome '"$netbeans_jdkhome"' \
-J-Xdock:name=NetBeans \
'"-J-Xdock:icon=$basedir/nb/netbeans.icns"' \
--branding nb \
--clusters '"$netbeans_clusters"' \
-J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade \
${netbeans_default_options} \
'"$@"'
;;
*)
# Support 2x HiDPI scaling on Linux systems that have configured this via Xft.dpi but not via
# GDK_SCALE, notably Ubuntu as of 20.04.1. Xft.dpi technically relates to the size of fonts
# only, but Ubuntu sets it when the "Scaling" setting is changed in the "Displays" settings
# UI. OpenJDK supports the GDK_SCALE setting at the GraphicsConfiguration level, but not
# Xft.dpi (as of 2020-11-22 and LTS 11.0.9). Individual LAFs may react to the latter, though
# FlatLAF in particular works correctly even both are set at the same time.
#
# OpenJDK does not support fractional scalings in GDK_SCALE, so we only handle the 2x case
# here. OpenJDK also does not query the separate GDK_DPI_SCALE variable.
#
# We do not attempt to support per-monitor DPI scalings here. OpenJDK might support this
# through the ubuntu.user-interface/scale-factor setting, but as of Ubuntu 20.04.1, the
# Displays setting UI does not appear to touch this setting at all, and does in fact appear
# to force all monitors to use the same scaling. JetBrains mentions the scale-factor setting,
# saying it is "not well supported yet" (presumably in their own OpenJDK fork).
# https://intellij-support.jetbrains.com/hc/en-us/articles/360007994999-HiDPI-configuration
# If the xrdb command does not exist, no action will be taken here.
if [ "`command xrdb -query 2> /dev/null | grep Xft.dpi | cut -d ':' -f2 | xargs`" = 192 ]
then
echo "Detected 2x HiDPI scaling in Xft.dpi setting; setting GDK_SCALE=2"
export GDK_SCALE=2
fi
# Handle another case that indicates a need for 2x HiDPI scaling, observed on openSUSE
# Tumbleweed (see NETBEANS-2360). A user with a HiDPI monitor and 2x HiDPI scaling
# enabled reported that "xdpyinfo | grep -B 2 resolution" yielded the following:
#
# screen #0:
# dimensions: 3840x2160 pixels (508x285 millimeters)
# resolution: 192x193 dots per inch
#
# Xft.dpi was not set in this case, however. In the following test, we
# set GDK_SCALE=2 if _all_ monitors report a resolution of "192x"
# something (ignoring the odd "193" figure observed above).
if [ "`command xdpyinfo 2> /dev/null | grep 'resolution:.*dots per inch' | cut -d ':' -f2 | cut -d 'x' -f1 | sort -u | xargs`" = 192 ]
then
echo "Detected 192 DPI on all screens in xdpyinfo; setting GDK_SCALE=2"
export GDK_SCALE=2
fi
extra_automatic_options=""
# Java/AWT/Swing will correctly detect text anti-aliasing settings on
# GNOME, but not on KDE. Force anti-aliasing on in this case using the
# "awt.useSystemAAFontSettings" property, as recommended in
# https://bugs.openjdk.java.net/browse/JDK-6408759 . Said bug is old,
# but the relevant logic (in sun.awt.X11.XToolkit.initXSettingsIfNeeded ,
# and fontpath.c ) seems not to have changed significantly since then.
# Don't set the "swing.aatext" property; it was "an interim property
# strictly for testing" that has been removed from the JDK and
# superseded by awt.useSystemAAFontSettings (see
# https://bugs.openjdk.java.net/browse/JDK-6391267 ).
# "If you plan on using this variable to detect a running KDE session,
# check if the value is not empty instead of seeing if it equals true.
# The value might be changed in the future to include KDE version
# information."
# https://userbase.kde.org/KDE_System_Administration/Environment_Variables
if [ ! -z "$KDE_FULL_SESSION" ] ; then
echo "Detected KDE; adding awt.useSystemAAFontSettings=on"
extra_automatic_options="-J-Dawt.useSystemAAFontSettings=on"
fi
# Add extra_automatic_options before default_options, to allow system
# property definitions from the configuration file to take precedence.
eval launchNbexec \
--jdkhome '"$netbeans_jdkhome"' \
--branding nb \
--clusters '"$netbeans_clusters"' \
-J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade \
${extra_automatic_options} \
${netbeans_default_options} \
'"$@"'
;;
esac