From 4e2b2f662ad3f7b2e09f9451227bbf7018d91708 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 20 Oct 2019 23:45:52 +0200 Subject: Update freetype to 2.10.1 and move viewer fonts to their own package --- indra/newview/CMakeLists.txt | 6 ++ indra/newview/fonts/DejaVu-license.txt | 99 ------------------------- indra/newview/fonts/DejaVuSans-Bold.ttf | Bin 573136 -> 0 bytes indra/newview/fonts/DejaVuSans-BoldOblique.ttf | Bin 524056 -> 0 bytes indra/newview/fonts/DejaVuSans-Oblique.ttf | Bin 523804 -> 0 bytes indra/newview/fonts/DejaVuSans.ttf | Bin 622280 -> 0 bytes indra/newview/fonts/DejaVuSansMono.ttf | Bin 321524 -> 0 bytes indra/newview/viewer_manifest.py | 2 +- 8 files changed, 7 insertions(+), 100 deletions(-) delete mode 100644 indra/newview/fonts/DejaVu-license.txt delete mode 100644 indra/newview/fonts/DejaVuSans-Bold.ttf delete mode 100644 indra/newview/fonts/DejaVuSans-BoldOblique.ttf delete mode 100644 indra/newview/fonts/DejaVuSans-Oblique.ttf delete mode 100644 indra/newview/fonts/DejaVuSans.ttf delete mode 100644 indra/newview/fonts/DejaVuSansMono.ttf (limited to 'indra/newview') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b8789da66b..b83d3afadd 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1470,6 +1470,12 @@ if (WINDOWS) set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp) endif(USE_PRECOMPILED_HEADERS) + message("Copying fonts") + file(GLOB FONT_FILE_GLOB_LIST + "${AUTOBUILD_INSTALL_DIR}/fonts/*" + ) + file(COPY ${FONT_FILE_GLOB_LIST} DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/fonts") + # Replace the icons with the appropriate ones for the channel # ('test' is the default) set(ICON_PATH "test") diff --git a/indra/newview/fonts/DejaVu-license.txt b/indra/newview/fonts/DejaVu-license.txt deleted file mode 100644 index 254e2cc42a..0000000000 --- a/indra/newview/fonts/DejaVu-license.txt +++ /dev/null @@ -1,99 +0,0 @@ -Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. -Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) - -Bitstream Vera Fonts Copyright ------------------------------- - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is -a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute the -Font Software, including without limitation the rights to use, copy, merge, -publish, distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to the -following conditions: - -The above copyright and trademark notices and this permission notice shall -be included in all copies of one or more of the Font Software typefaces. - -The Font Software may be modified, altered, or added to, and in particular -the designs of glyphs or characters in the Fonts may be modified and -additional glyphs or characters may be added to the Fonts, only if the fonts -are renamed to names not containing either the words "Bitstream" or the word -"Vera". - -This License becomes null and void to the extent applicable to Fonts or Font -Software that has been modified and is distributed under the "Bitstream -Vera" names. - -The Font Software may be sold as part of a larger software package but no -copy of one or more of the Font Software typefaces may be sold by itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME -FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING -ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE -FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font Software -without prior written authorization from the Gnome Foundation or Bitstream -Inc., respectively. For further information, contact: fonts at gnome dot -org. - -Arev Fonts Copyright ------------------------------- - -Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the fonts accompanying this license ("Fonts") and -associated documentation files (the "Font Software"), to reproduce -and distribute the modifications to the Bitstream Vera Font Software, -including without limitation the rights to use, copy, merge, publish, -distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to -the following conditions: - -The above copyright and trademark notices and this permission notice -shall be included in all copies of one or more of the Font Software -typefaces. - -The Font Software may be modified, altered, or added to, and in -particular the designs of glyphs or characters in the Fonts may be -modified and additional glyphs or characters may be added to the -Fonts, only if the fonts are renamed to names not containing either -the words "Tavmjong Bah" or the word "Arev". - -This License becomes null and void to the extent applicable to Fonts -or Font Software that has been modified and is distributed under the -"Tavmjong Bah Arev" names. - -The Font Software may be sold as part of a larger software package but -no copy of one or more of the Font Software typefaces may be sold by -itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL -TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the name of Tavmjong Bah shall not -be used in advertising or otherwise to promote the sale, use or other -dealings in this Font Software without prior written authorization -from Tavmjong Bah. For further information, contact: tavmjong @ free -. fr. - -$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/indra/newview/fonts/DejaVuSans-Bold.ttf b/indra/newview/fonts/DejaVuSans-Bold.ttf deleted file mode 100644 index ec1a2ebaf2..0000000000 Binary files a/indra/newview/fonts/DejaVuSans-Bold.ttf and /dev/null differ diff --git a/indra/newview/fonts/DejaVuSans-BoldOblique.ttf b/indra/newview/fonts/DejaVuSans-BoldOblique.ttf deleted file mode 100644 index 1a5576460d..0000000000 Binary files a/indra/newview/fonts/DejaVuSans-BoldOblique.ttf and /dev/null differ diff --git a/indra/newview/fonts/DejaVuSans-Oblique.ttf b/indra/newview/fonts/DejaVuSans-Oblique.ttf deleted file mode 100644 index becc549927..0000000000 Binary files a/indra/newview/fonts/DejaVuSans-Oblique.ttf and /dev/null differ diff --git a/indra/newview/fonts/DejaVuSans.ttf b/indra/newview/fonts/DejaVuSans.ttf deleted file mode 100644 index c1b19d8705..0000000000 Binary files a/indra/newview/fonts/DejaVuSans.ttf and /dev/null differ diff --git a/indra/newview/fonts/DejaVuSansMono.ttf b/indra/newview/fonts/DejaVuSansMono.ttf deleted file mode 100644 index 6bc854ddae..0000000000 Binary files a/indra/newview/fonts/DejaVuSansMono.ttf and /dev/null differ diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index fcb97ded8f..d5526bf5fd 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -137,7 +137,7 @@ class ViewerManifest(LLManifest): self.path("*.tga") # Include our fonts - with self.prefix(src_dst="fonts"): + with self.prefix(src="../packages/fonts"): self.path("*.ttf") self.path("*.txt") -- cgit v1.2.3 From 05566ce7a7e1895a5b3ab2f9df2587dac63429e1 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 27 Oct 2019 16:41:38 +0200 Subject: Font debugging aid to dump descriptors + individual textures --- indra/newview/llviewermenu.cpp | 4 ++++ indra/newview/skins/default/xui/en/menu_login.xml | 26 ++++++++++++++++++++++ indra/newview/skins/default/xui/en/menu_viewer.xml | 12 ++++++++++ 3 files changed, 42 insertions(+) (limited to 'indra/newview') diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 52b2c631fa..f99cbedcbe 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -9121,6 +9121,10 @@ void initialize_menus() //Develop (clear cache immediately) commit.add("Develop.ClearCache", boost::bind(&handle_cache_clear_immediately) ); + // Develop (Fonts debugging) + commit.add("Develop.Fonts.Dump", boost::bind(&LLFontGL::dumpFonts)); + commit.add("Develop.Fonts.DumpTextures", boost::bind(&LLFontGL::dumpFontTextures)); + // Admin >Object view_listener_t::addMenu(new LLAdminForceTakeCopy(), "Admin.ForceTakeCopy"); view_listener_t::addMenu(new LLAdminHandleObjectOwnerSelf(), "Admin.HandleObjectOwnerSelf"); diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 07b3cc3bd8..93795be474 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -166,6 +166,32 @@ parameter="ui_preview" /> + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 418308bc7ce4e9924d6280f784222ba45172eea4 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 6 Nov 2019 12:34:26 +0100 Subject: Characters can have more than one representation in LLFontFreetype * By default all viewer text will use B/W glyphs * Added temporary use_color attribute to LLTextBase for testing --- indra/newview/llexpandabletextbox.cpp | 2 +- indra/newview/llfloateruipreview.cpp | 8 ++++---- indra/newview/lltextureview.cpp | 2 +- indra/newview/llviewerwindow.cpp | 2 +- indra/newview/llworldmapview.cpp | 3 ++- 5 files changed, 9 insertions(+), 8 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index d657f04457..a03b84daa5 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -88,7 +88,7 @@ public: mStyle->getShadowType(), end - start, draw_rect.getWidth(), &right_x, - mEditor.getUseEllipses()); + mEditor.getUseEllipses(), mEditor.getUseColor()); return right_x; } /*virtual*/ bool canEdit() const { return false; } diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index db5a192287..211371571d 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -1601,7 +1601,7 @@ void LLOverlapPanel::draw() LLUI::translate(5,getRect().getHeight()-20); // translate to top-5,left-5 LLView::sDrawPreviewHighlights = FALSE; LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text, 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); } else { @@ -1619,7 +1619,7 @@ void LLOverlapPanel::draw() std::string current_selection = std::string(current_selection_text + LLView::sPreviewClickedElement->getName() + " (no elements overlap)"); S32 text_width = LLFontGL::getFontSansSerifSmall()->getWidth(current_selection) + 10; LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection, 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); // widen panel enough to fit this text LLRect rect = getRect(); setRect(LLRect(rect.mLeft,rect.mTop,rect.getWidth() < text_width ? rect.mLeft + text_width : rect.mRight,rect.mTop)); @@ -1685,7 +1685,7 @@ void LLOverlapPanel::draw() // draw currently-selected element at top of overlappers LLUI::translate(0,-mSpacing); LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text + LLView::sPreviewClickedElement->getName(), 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); LLUI::translate(0,-mSpacing-LLView::sPreviewClickedElement->getRect().getHeight()); // skip spacing distance + height LLView::sPreviewClickedElement->draw(); @@ -1700,7 +1700,7 @@ void LLOverlapPanel::draw() // draw name LLUI::translate(0,-mSpacing); LLFontGL::getFontSansSerifSmall()->renderUTF8(overlapper_text + viewp->getName(), 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); // draw element LLUI::translate(0,-mSpacing-viewp->getRect().getHeight()); // skip spacing distance + height diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 0d2edc0268..9ec6b99416 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -612,7 +612,7 @@ void LLGLTexMemBar::draw() LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3, text_color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, - &x_right, FALSE); + &x_right, /*use_ellipses*/FALSE, /*use_color*/FALSE); F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth()); F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS")); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index c3cf07e9c7..e4d445b95c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -867,7 +867,7 @@ public: const Line& line = *iter; LLFontGL::getFontMonospace()->renderUTF8(line.text, 0, (F32)line.x, (F32)line.y, mTextColor, LLFontGL::LEFT, LLFontGL::TOP, - LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); } mLineList.clear(); } diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 86249badaa..ff1f95526e 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -469,7 +469,8 @@ void LLWorldMapView::draw() S32_MAX, //max_chars sMapScale, //max_pixels NULL, - TRUE); //use ellipses + /*use_ellipses*/TRUE, + /*use_color*/FALSE); } } } -- cgit v1.2.3 From 5a6ddb2ea666e895890d3cb690cce5101cf12652 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 7 Nov 2019 17:15:21 +0100 Subject: Fallback fonts can have first crack at adding an unknown character + set Twemoji as the viewer's fallback for all emoji blocks --- indra/newview/CMakeLists.txt | 2 ++ indra/newview/skins/default/xui/en/fonts.xml | 1 + 2 files changed, 3 insertions(+) (limited to 'indra/newview') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b83d3afadd..f03dcb4066 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -21,6 +21,7 @@ include(EXPAT) include(FMODEX) include(GLOD) include(Hunspell) +include(ICU4C) include(JsonCpp) include(LLAppearance) include(LLAudio) @@ -2003,6 +2004,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${NDOF_LIBRARY} ${NVAPI_LIBRARY} ${HUNSPELL_LIBRARY} + ${ICU4C_LIBRARY} ${viewer_LIBRARIES} ${BOOST_PROGRAM_OPTIONS_LIBRARY} ${BOOST_REGEX_LIBRARY} diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 2d5263b78f..6df666a700 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -3,6 +3,7 @@ DejaVuSans.ttf + Twemoji.ttf meiryo.TTC MSGOTHIC.TTC -- cgit v1.2.3 From bab70f6f152952ce755188d29bea1cfd8821a4be Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Mon, 29 Aug 2022 00:00:31 +0200 Subject: Review + resolve minor issues --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 281777e492..85c9318b8a 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -140,7 +140,7 @@ class ViewerManifest(LLManifest): self.path("*.tga") # Include our fonts - with self.prefix(src="../packages/fonts"): + with self.prefix(src="../packages/fonts",src_dst="fonts"): self.path("*.ttf") self.path("*.txt") -- cgit v1.2.3 From cf2afdc541b540582650f89c6b95aacfeaef516f Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 11 Sep 2022 21:44:00 +0100 Subject: Add emoji as its own font to promote character reuse --- indra/newview/skins/default/xui/en/fonts.xml | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index ed35546322..681f670f08 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -70,6 +70,11 @@ DejaVuSans-BoldOblique.ttf + + Twemoji.ttf + + DejaVuSansMono.ttf -- cgit v1.2.3 From d95571cf7cd319e17338bc509d46ab5eab4eb968 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:10:06 +0200 Subject: Add mini emoji (auto-)complete helper --- indra/newview/CMakeLists.txt | 2 + indra/newview/llpanelemojicomplete.cpp | 210 +++++++++++++++++++++ indra/newview/llpanelemojicomplete.h | 99 ++++++++++ indra/newview/llviewerfloaterreg.cpp | 2 + .../default/xui/en/floater_emoji_complete.xml | 26 +++ .../default/xui/en/widgets/emoji_complete.xml | 7 + 6 files changed, 346 insertions(+) create mode 100644 indra/newview/llpanelemojicomplete.cpp create mode 100644 indra/newview/llpanelemojicomplete.h create mode 100644 indra/newview/skins/default/xui/en/floater_emoji_complete.xml create mode 100644 indra/newview/skins/default/xui/en/widgets/emoji_complete.xml (limited to 'indra/newview') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8d902ce618..0bb1814322 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -441,6 +441,7 @@ set(viewer_SOURCE_FILES llpaneleditsky.cpp llpaneleditwater.cpp llpaneleditwearable.cpp + llpanelemojicomplete.cpp llpanelenvironment.cpp llpanelexperiencelisteditor.cpp llpanelexperiencelog.cpp @@ -1072,6 +1073,7 @@ set(viewer_HEADER_FILES llpaneleditsky.h llpaneleditwater.h llpaneleditwearable.h + llpanelemojicomplete.h llpanelenvironment.h llpanelexperiencelisteditor.h llpanelexperiencelog.h diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp new file mode 100644 index 0000000000..e1d80b62e2 --- /dev/null +++ b/indra/newview/llpanelemojicomplete.cpp @@ -0,0 +1,210 @@ +๏ปฟ/** +* @file llpanelemojicomplete.h +* @brief Header file for LLPanelEmojiComplete +* +* $LicenseInfo:firstyear=2012&license=lgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2011, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library 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 +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" + +#include "llemojidictionary.h" +#include "llpanelemojicomplete.h" +#include "lluictrlfactory.h" + +constexpr U32 MIN_MOUSE_MOVE_DELTA = 4; + +// ============================================================================ +// LLPanelEmojiComplete +// + +static LLDefaultChildRegistry::Register r("emoji_complete"); + +LLPanelEmojiComplete::Params::Params() + : selected_image("selected_image") +{ +} + +LLPanelEmojiComplete::LLPanelEmojiComplete(const LLPanelEmojiComplete::Params& p) + : LLUICtrl(p) + , mSelectedImage(p.selected_image) +{ + setFont(p.font); +} + +LLPanelEmojiComplete::~LLPanelEmojiComplete() +{ +} + +void LLPanelEmojiComplete::draw() +{ + if (!mEmojis.empty()) + { + const S32 centerY = mRenderRect.getCenterY(); + const size_t firstVisibleIdx = mScrollPos, lastVisibleIdx = llmin(mScrollPos + mVisibleEmojis, mEmojis.size()) - 1; + + if (mCurSelected >= firstVisibleIdx && mCurSelected <= lastVisibleIdx) + { + const S32 emoji_left = mRenderRect.mLeft + (mCurSelected - firstVisibleIdx) * mEmojiWidth; + const S32 emoji_height = mFont->getLineHeight() + mPadding; + mSelectedImage->draw(emoji_left, centerY - emoji_height / 2, mEmojiWidth, emoji_height); + } + + U32 left = mRenderRect.mLeft + mPadding; + for (U32 curIdx = firstVisibleIdx; curIdx <= lastVisibleIdx; curIdx++) + { + mFont->render( + mEmojis, curIdx, + left, centerY, + LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW_SOFT, + 1, S32_MAX, nullptr, false, true); + left += mEmojiWidth; + } + } +} + +BOOL LLPanelEmojiComplete::handleHover(S32 x, S32 y, MASK mask) +{ + LLVector2 curHover(x, y); + if ((mLastHover - curHover).lengthSquared() > MIN_MOUSE_MOVE_DELTA) + { + mCurSelected = posToIndex(x, y); + mLastHover = curHover; + } + + return TRUE; +} + +BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent) +{ + if (MASK_NONE == mask) + { + bool handled = false; + switch (key) + { + case KEY_LEFT: + case KEY_UP: + selectPrevious(); + handled = true; + break; + case KEY_RIGHT: + case KEY_DOWN: + selectNext(); + handled = true; + break; + } + return handled; + } + + return false; +} + +void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLUICtrl::reshape(width, height, called_from_parent); + updateConstraints(); +} + +void LLPanelEmojiComplete::setEmojiHint(const std::string& hint) +{ + mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint); + mScrollPos = llmin(mScrollPos, mEmojis.size()); + updateConstraints(); +} + +size_t LLPanelEmojiComplete::posToIndex(S32 x, S32 y) const +{ + if (mRenderRect.pointInRect(x, y)) + { + return llmin((size_t)x / mEmojiWidth, mEmojis.size() - 1); + } + return npos; +} + +void LLPanelEmojiComplete::select(size_t emoji_idx) +{ + mCurSelected = llclamp(emoji_idx, 0, mEmojis.size()); + updateScrollPos(); +} + +void LLPanelEmojiComplete::selectNext() +{ + select(mCurSelected + 1 < mEmojis.size() ? mCurSelected + 1 : 0); +} + +void LLPanelEmojiComplete::selectPrevious() +{ + select(mCurSelected - 1 >= 0 ? mCurSelected - 1 : mEmojis.size() - 1); +} + +void LLPanelEmojiComplete::setFont(const LLFontGL* fontp) +{ + mFont = fontp; + updateConstraints(); +} + +void LLPanelEmojiComplete::updateConstraints() +{ + const S32 ctrlWidth = getLocalRect().getWidth(); + + mEmojiWidth = mFont->getWidthF32(u8"\U0001F431") + mPadding * 2; + mVisibleEmojis = ctrlWidth / mEmojiWidth; + mRenderRect = getLocalRect().stretch((ctrlWidth - mVisibleEmojis * mEmojiWidth) / -2, 0); + + updateScrollPos(); +} + +void LLPanelEmojiComplete::updateScrollPos() +{ + const size_t cntEmoji = mEmojis.size(); + if (0 == cntEmoji || cntEmoji < mVisibleEmojis || 0 == mCurSelected) + { + mScrollPos = 0; + } + else if (cntEmoji - 1 == mCurSelected) + { + mScrollPos = mCurSelected - mVisibleEmojis + 1; + } + else + { + mScrollPos = mCurSelected - ((float)mCurSelected / (cntEmoji - 2) * (mVisibleEmojis - 2)); + } +} + +// ============================================================================ +// LLFloaterEmojiComplete +// + +LLFloaterEmojiComplete::LLFloaterEmojiComplete(const LLSD& sdKey) + : LLFloater(sdKey) +{ + // This floater should hover on top of our dependent (with the dependent having the focus) + setFocusStealsFrontmost(false); + setAutoFocus(false); + setBackgroundVisible(false); +} + +void LLFloaterEmojiComplete::onOpen(const LLSD& key) +{ + findChild("emoji_complete_ctrl")->setEmojiHint(key["hint"].asString()); +} + +// ============================================================================ diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h new file mode 100644 index 0000000000..85b0609ae9 --- /dev/null +++ b/indra/newview/llpanelemojicomplete.h @@ -0,0 +1,99 @@ +/** +* @file llpanelemojicomplete.h +* @brief Header file for LLPanelEmojiComplete +* +* $LicenseInfo:firstyear=2014&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2014, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library 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 +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#pragma once + +#include "llfloater.h" +#include "lluictrl.h" + +// ============================================================================ +// LLPanelEmojiComplete +// + +class LLPanelEmojiComplete : public LLUICtrl +{ + friend class LLUICtrlFactory; +public: + struct Params : public LLInitParam::Block + { + Optional selected_image; + + Params(); + }; + +protected: + LLPanelEmojiComplete(const LLPanelEmojiComplete::Params&); +public: + virtual ~LLPanelEmojiComplete(); + + void draw() override; + BOOL handleHover(S32 x, S32 y, MASK mask) override; + BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; + void reshape(S32 width, S32 height, BOOL called_from_parent) override; + +public: + void setEmojiHint(const std::string& hint); +protected: + size_t posToIndex(S32 x, S32 y) const; + void select(size_t emoji_idx); + void selectNext(); + void selectPrevious(); + void setFont(const LLFontGL* fontp); + void updateConstraints(); + void updateScrollPos(); + +protected: + static constexpr auto npos = std::numeric_limits::max(); + + const LLFontGL* mFont; + U16 mEmojiWidth = 0; + LLUIImagePtr mSelectedImage; + + LLWString mEmojis; + U16 mVisibleEmojis = 0; + size_t mFirstVisible = 0; + size_t mScrollPos = 0; + size_t mCurSelected = 0; + LLVector2 mLastHover; + + S32 mPadding = 8; + LLRect mRenderRect; +}; + +// ============================================================================ +// LLFloaterEmojiComplete +// + +class LLFloaterEmojiComplete : public LLFloater +{ +public: + LLFloaterEmojiComplete(const LLSD& sdKey); + +public: + void onOpen(const LLSD& key) override; +}; + +// ============================================================================ diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 5a05f89758..a54b91030e 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -155,6 +155,7 @@ #include "llfloaterimnearbychat.h" #include "llpanelblockedlist.h" #include "llpanelclassified.h" +#include "llpanelemojicomplete.h" #include "llpreviewanim.h" #include "llpreviewgesture.h" #include "llpreviewnotecard.h" @@ -229,6 +230,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("delete_pref_preset", "floater_delete_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("emoji_complete", "floater_emoji_complete.xml", &LLFloaterReg::build); LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("env_fixed_environmentent_water", "floater_fixedenvironment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/xui/en/floater_emoji_complete.xml b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml new file mode 100644 index 0000000000..eb666bc32c --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml new file mode 100644 index 0000000000..f35105ff7e --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml @@ -0,0 +1,7 @@ + + + -- cgit v1.2.3 From 90e272993bb4c591fd2a98772d7fe1104dbff921 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:24:25 +0200 Subject: Autosize the mini emoji helper to fit the number of shown emojis --- indra/newview/llpanelemojicomplete.cpp | 49 ++++++++++++++++++++-- indra/newview/llpanelemojicomplete.h | 17 ++++++-- .../default/xui/en/floater_emoji_complete.xml | 22 +++++----- 3 files changed, 72 insertions(+), 16 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index e1d80b62e2..f6823befac 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -39,12 +39,18 @@ constexpr U32 MIN_MOUSE_MOVE_DELTA = 4; static LLDefaultChildRegistry::Register r("emoji_complete"); LLPanelEmojiComplete::Params::Params() - : selected_image("selected_image") + : autosize("autosize") + , max_emoji("max_emoji") + , padding("padding") + , selected_image("selected_image") { } LLPanelEmojiComplete::LLPanelEmojiComplete(const LLPanelEmojiComplete::Params& p) : LLUICtrl(p) + , mAutoSize(p.autosize) + , mMaxVisible(p.max_emoji) + , mPadding(p.padding) , mSelectedImage(p.selected_image) { setFont(p.font); @@ -125,9 +131,23 @@ void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_paren void LLPanelEmojiComplete::setEmojiHint(const std::string& hint) { + llwchar curEmoji = (mCurSelected < mEmojis.size()) ? mEmojis.at(mCurSelected) : 0; + size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos; + mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint); + mCurSelected = (std::string::npos != curEmojiIdx) ? curEmojiIdx : 0; + + if (mAutoSize) + { + mVisibleEmojis = std::min(mEmojis.size(), mMaxVisible); + reshape(mVisibleEmojis * mEmojiWidth, getRect().getHeight(), false); + } + else + { + updateConstraints(); + } + mScrollPos = llmin(mScrollPos, mEmojis.size()); - updateConstraints(); } size_t LLPanelEmojiComplete::posToIndex(S32 x, S32 y) const @@ -200,11 +220,34 @@ LLFloaterEmojiComplete::LLFloaterEmojiComplete(const LLSD& sdKey) setFocusStealsFrontmost(false); setAutoFocus(false); setBackgroundVisible(false); + setIsChrome(true); } void LLFloaterEmojiComplete::onOpen(const LLSD& key) { - findChild("emoji_complete_ctrl")->setEmojiHint(key["hint"].asString()); + mEmojiCtrl->setEmojiHint(key["hint"].asString()); +} + +BOOL LLFloaterEmojiComplete::postBuild() +{ + mEmojiCtrl = findChild("emoji_complete_ctrl"); + mEmojiCtrlHorz = getRect().getWidth() - mEmojiCtrl->getRect().getWidth(); + + return TRUE; +} + +void LLFloaterEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + if (!called_from_parent) + { + LLRect rctFloater = getRect(), rctCtrl = mEmojiCtrl->getRect(); + rctFloater.mRight = rctFloater.mLeft + rctCtrl.getWidth() + mEmojiCtrlHorz; + setRect(rctFloater); + + return; + } + + LLFloater::reshape(width, height, called_from_parent); } // ============================================================================ diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index 85b0609ae9..b389ac9d53 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -39,6 +39,10 @@ class LLPanelEmojiComplete : public LLUICtrl public: struct Params : public LLInitParam::Block { + Optional autosize; + Optional max_emoji, + padding; + Optional selected_image; Params(); @@ -68,8 +72,12 @@ protected: protected: static constexpr auto npos = std::numeric_limits::max(); + bool mAutoSize = false; const LLFontGL* mFont; U16 mEmojiWidth = 0; + size_t mMaxVisible = 0; + S32 mPadding = 8; + LLRect mRenderRect; LLUIImagePtr mSelectedImage; LLWString mEmojis; @@ -78,9 +86,6 @@ protected: size_t mScrollPos = 0; size_t mCurSelected = 0; LLVector2 mLastHover; - - S32 mPadding = 8; - LLRect mRenderRect; }; // ============================================================================ @@ -94,6 +99,12 @@ public: public: void onOpen(const LLSD& key) override; + BOOL postBuild() override; + void reshape(S32 width, S32 height, BOOL called_from_parent) override; + +protected: + LLPanelEmojiComplete* mEmojiCtrl = nullptr; + S32 mEmojiCtrlHorz = 0; }; // ============================================================================ diff --git a/indra/newview/skins/default/xui/en/floater_emoji_complete.xml b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml index eb666bc32c..e9ea8f4de7 100644 --- a/indra/newview/skins/default/xui/en/floater_emoji_complete.xml +++ b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml @@ -13,14 +13,16 @@ single_instance="true" width="240" > - - + + -- cgit v1.2.3 From 58cdcd5dd23778c6fad9fa0da31b670ceff8eeeb Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 17:47:51 +0200 Subject: Handle return and escape in the mini emoji helper --- indra/newview/llpanelemojicomplete.cpp | 48 +++++++++++++++++++++++++++++++--- indra/newview/llpanelemojicomplete.h | 1 + 2 files changed, 45 insertions(+), 4 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index f6823befac..61b08ad48d 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "llemojidictionary.h" +#include "llemojihelper.h" #include "llpanelemojicomplete.h" #include "lluictrlfactory.h" @@ -101,9 +102,9 @@ BOOL LLPanelEmojiComplete::handleHover(S32 x, S32 y, MASK mask) BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent) { + bool handled = false; if (MASK_NONE == mask) { - bool handled = false; switch (key) { case KEY_LEFT: @@ -116,11 +117,24 @@ BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent selectNext(); handled = true; break; + case KEY_RETURN: + if (!mEmojis.empty()) + { + LLWString wstr; + wstr.push_back(mEmojis.at(mCurSelected)); + setValue(wstring_to_utf8str(wstr)); + onCommit(); + handled = true; + } + break; } - return handled; } - return false; + if (handled) + { + return TRUE; + } + return LLUICtrl::handleKey(key, mask, called_from_parent); } void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) @@ -223,6 +237,26 @@ LLFloaterEmojiComplete::LLFloaterEmojiComplete(const LLSD& sdKey) setIsChrome(true); } +BOOL LLFloaterEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent) +{ + bool handled = false; + if (MASK_NONE == mask) + { + switch (key) + { + case KEY_ESCAPE: + LLEmojiHelper::instance().hideHelper(); + handled = true; + break; + } + + } + + if (handled) + return TRUE; + return LLFloater::handleKey(key, mask, called_from_parent); +} + void LLFloaterEmojiComplete::onOpen(const LLSD& key) { mEmojiCtrl->setEmojiHint(key["hint"].asString()); @@ -231,9 +265,15 @@ void LLFloaterEmojiComplete::onOpen(const LLSD& key) BOOL LLFloaterEmojiComplete::postBuild() { mEmojiCtrl = findChild("emoji_complete_ctrl"); + mEmojiCtrl->setCommitCallback( + std::bind([&](const LLSD& sdValue) + { + setValue(sdValue); + onCommit(); + }, std::placeholders::_2)); mEmojiCtrlHorz = getRect().getWidth() - mEmojiCtrl->getRect().getWidth(); - return TRUE; + return LLFloater::postBuild(); } void LLFloaterEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index b389ac9d53..361a2dc9b7 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -98,6 +98,7 @@ public: LLFloaterEmojiComplete(const LLSD& sdKey); public: + BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; void onOpen(const LLSD& key) override; BOOL postBuild() override; void reshape(S32 width, S32 height, BOOL called_from_parent) override; -- cgit v1.2.3 From cb0bb91108b628e1134f1f655eaca9d305961cda Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 17:51:22 +0200 Subject: Mini emoji helper shows as a small slice when there are no matching emojis --- indra/newview/llpanelemojicomplete.cpp | 4 ++++ indra/newview/llpanelemojicomplete.h | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index 61b08ad48d..a7058a6724 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -260,6 +260,10 @@ BOOL LLFloaterEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_pare void LLFloaterEmojiComplete::onOpen(const LLSD& key) { mEmojiCtrl->setEmojiHint(key["hint"].asString()); + if (0 == mEmojiCtrl->getEmojiCount()) + { + LLEmojiHelper::instance().hideHelper(); + } } BOOL LLFloaterEmojiComplete::postBuild() diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index 361a2dc9b7..138cc465ba 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -59,7 +59,8 @@ public: void reshape(S32 width, S32 height, BOOL called_from_parent) override; public: - void setEmojiHint(const std::string& hint); + size_t getEmojiCount() const { return mEmojis.size(); } + void setEmojiHint(const std::string& hint); protected: size_t posToIndex(S32 x, S32 y) const; void select(size_t emoji_idx); -- cgit v1.2.3 From 97300c608153d21a441ed34b0a5b9a2ea815df2e Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 2 Nov 2022 19:11:20 +0100 Subject: Add (partial) emoji set descriptors --- .../skins/default/xui/en/emoji_characters.xml | 10955 +++++++++++++++++++ 1 file changed, 10955 insertions(+) create mode 100644 indra/newview/skins/default/xui/en/emoji_characters.xml (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/emoji_characters.xml b/indra/newview/skins/default/xui/en/emoji_characters.xml new file mode 100644 index 0000000000..55aefe6745 --- /dev/null +++ b/indra/newview/skins/default/xui/en/emoji_characters.xml @@ -0,0 +1,10955 @@ + + + + + Character + ๐Ÿ˜€ + ShortCodes + + :grinning: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜„ + ShortCodes + + :smile: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜† + ShortCodes + + :laughing: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿคฃ + ShortCodes + + :rofl: + :satisfied: + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ™‚ + ShortCodes + + :slightly_smiling_face: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜‰ + ShortCodes + + :wink: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜‡ + ShortCodes + + :innocent: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜ƒ + ShortCodes + + :smiley: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜ + ShortCodes + + :grin: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜… + ShortCodes + + :sweat_smile: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜‚ + ShortCodes + + :joy: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ™ƒ + ShortCodes + + :upside_down_face: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿ˜Š + ShortCodes + + :blush: + + + + Categories + + Smiley + Face Smiling + + + + Character + ๐Ÿฅฐ + ShortCodes + + :smiling_face_with_three_hearts: + + + + Categories + + Smiley + Face Affection + + + + Character + ๐Ÿคฉ + ShortCodes + + :star_struck: + + + + Categories + + Smiley + Face Affection + + + + Character + ๐Ÿ˜— + ShortCodes + + :kissing: + + + + Categories + + Smiley + Face Affection + + + + Character + ๐Ÿ˜š + ShortCodes + + :kissing_closed_eyes: + + + + Categories + + Smiley + Face Affection + + + + Character + ๐Ÿฅฒ + ShortCodes + + :smiling_face_with_tear: + + + + Categories + + Smiley + Face Affection + + + + Character + ๐Ÿ˜ + ShortCodes + + :heart_eyes: + + + + Categories + + Smiley + Face Affection + + + + Character + ๐Ÿ˜˜ + ShortCodes + + :kissing_heart: + + + + Categories + + Smiley + Face Affection + + + + Character + โ˜บ๏ธ + ShortCodes + + :relaxed: + + + + Categories + + Smiley + Face Affection + + + + Character + ๐Ÿ˜™ + ShortCodes + + :kissing_smiling_eyes: + + + + Categories + + Smiley + Face Affection + + + + Character + ๐Ÿ˜‹ + ShortCodes + + :yum: + + + + Categories + + Smiley + Face Tongue + + + + Character + ๐Ÿ˜œ + ShortCodes + + :stuck_out_tongue_winking_eye: + + + + Categories + + Smiley + Face Tongue + + + + Character + ๐Ÿ˜ + ShortCodes + + :stuck_out_tongue_closed_eyes: + + + + Categories + + Smiley + Face Tongue + + + + Character + ๐Ÿ˜› + ShortCodes + + :stuck_out_tongue: + + + + Categories + + Smiley + Face Tongue + + + + Character + ๐Ÿคช + ShortCodes + + :zany_face: + + + + Categories + + Smiley + Face Tongue + + + + Character + ๐Ÿค‘ + ShortCodes + + :money_mouth_face: + + + + Categories + + Smiley + Face Tongue + + + + Character + ๐Ÿค— + ShortCodes + + :hugs: + + + + Categories + + Smiley + Face Hand + + + + Character + ๐Ÿคซ + ShortCodes + + :shushing_face: + + + + Categories + + Smiley + Face Hand + + + + Character + ๐Ÿคญ + ShortCodes + + :hand_over_mouth: + + + + Categories + + Smiley + Face Hand + + + + Character + ๐Ÿค” + ShortCodes + + :thinking: + + + + Categories + + Smiley + Face Hand + + + + Character + ๐Ÿค + ShortCodes + + :zipper_mouth_face: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜ + ShortCodes + + :neutral_face: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜ถ + ShortCodes + + :no_mouth: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜ + ShortCodes + + :smirk: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ™„ + ShortCodes + + :roll_eyes: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜ฎโ€๐Ÿ’จ + ShortCodes + + :face_exhaling: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿคจ + ShortCodes + + :raised_eyebrow: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜‘ + ShortCodes + + :expressionless: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜ถโ€๐ŸŒซ๏ธ + ShortCodes + + :face_in_clouds: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜’ + ShortCodes + + :unamused: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜ฌ + ShortCodes + + :grimacing: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿคฅ + ShortCodes + + :lying_face: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + ๐Ÿ˜Œ + ShortCodes + + :relieved: + + + + Categories + + Smiley + Face Sleepy + + + + Character + ๐Ÿ˜ช + ShortCodes + + :sleepy: + + + + Categories + + Smiley + Face Sleepy + + + + Character + ๐Ÿ˜ด + ShortCodes + + :sleeping: + + + + Categories + + Smiley + Face Sleepy + + + + Character + ๐Ÿ˜” + ShortCodes + + :pensive: + + + + Categories + + Smiley + Face Sleepy + + + + Character + ๐Ÿคค + ShortCodes + + :drooling_face: + + + + Categories + + Smiley + Face Sleepy + + + + Character + ๐Ÿ˜ท + ShortCodes + + :mask: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿค• + ShortCodes + + :face_with_head_bandage: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿคฎ + ShortCodes + + :vomiting_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿฅต + ShortCodes + + :hot_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿฅด + ShortCodes + + :woozy_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿ˜ตโ€๐Ÿ’ซ + ShortCodes + + :face_with_spiral_eyes: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿค’ + ShortCodes + + :face_with_thermometer: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿคข + ShortCodes + + :nauseated_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿคง + ShortCodes + + :sneezing_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿฅถ + ShortCodes + + :cold_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿ˜ต + ShortCodes + + :dizzy_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿคฏ + ShortCodes + + :exploding_head: + + + + Categories + + Smiley + Face Unwell + + + + Character + ๐Ÿค  + ShortCodes + + :cowboy_hat_face: + + + + Categories + + Smiley + Face Hat + + + + Character + ๐Ÿฅธ + ShortCodes + + :disguised_face: + + + + Categories + + Smiley + Face Hat + + + + Character + ๐Ÿฅณ + ShortCodes + + :partying_face: + + + + Categories + + Smiley + Face Hat + + + + Character + ๐Ÿ˜Ž + ShortCodes + + :sunglasses: + + + + Categories + + Smiley + Face Glasses + + + + Character + ๐Ÿง + ShortCodes + + :monocle_face: + + + + Categories + + Smiley + Face Glasses + + + + Character + ๐Ÿค“ + ShortCodes + + :nerd_face: + + + + Categories + + Smiley + Face Glasses + + + + Character + ๐Ÿ˜• + ShortCodes + + :confused: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ™ + ShortCodes + + :slightly_frowning_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฎ + ShortCodes + + :open_mouth: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฒ + ShortCodes + + :astonished: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿฅบ + ShortCodes + + :pleading_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ง + ShortCodes + + :anguished: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฐ + ShortCodes + + :cold_sweat: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ข + ShortCodes + + :cry: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฑ + ShortCodes + + :scream: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฃ + ShortCodes + + :persevere: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜“ + ShortCodes + + :sweat: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ซ + ShortCodes + + :tired_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜Ÿ + ShortCodes + + :worried: + + + + Categories + + Smiley + Face Concerned + + + + Character + โ˜น๏ธ + ShortCodes + + :frowning_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฏ + ShortCodes + + :hushed: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ณ + ShortCodes + + :flushed: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฆ + ShortCodes + + :frowning: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜จ + ShortCodes + + :fearful: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฅ + ShortCodes + + :disappointed_relieved: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ญ + ShortCodes + + :sob: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜– + ShortCodes + + :confounded: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ž + ShortCodes + + :disappointed: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ฉ + ShortCodes + + :weary: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿฅฑ + ShortCodes + + :yawning_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + ๐Ÿ˜ค + ShortCodes + + :triumph: + + + + Categories + + Smiley + Face Negative + + + + Character + ๐Ÿ˜  + ShortCodes + + :angry: + + + + Categories + + Smiley + Face Negative + + + + Character + ๐Ÿ˜ˆ + ShortCodes + + :smiling_imp: + + + + Categories + + Smiley + Face Negative + + + + Character + ๐Ÿ’€ + ShortCodes + + :skull: + + + + Categories + + Smiley + Face Negative + + + + Character + ๐Ÿ˜ก + ShortCodes + + :pout: + :rage: + + + Categories + + Smiley + Face Negative + + + + Character + ๐Ÿคฌ + ShortCodes + + :cursing_face: + + + + Categories + + Smiley + Face Negative + + + + Character + ๐Ÿ‘ฟ + ShortCodes + + :imp: + + + + Categories + + Smiley + Face Negative + + + + Character + โ˜ ๏ธ + ShortCodes + + :skull_and_crossbones: + + + + Categories + + Smiley + Face Negative + + + + Character + ๐Ÿ’ฉ + ShortCodes + + :hankey: + :poop: + :shit: + + Categories + + Smiley + Face Costume + + + + Character + ๐Ÿ‘น + ShortCodes + + :japanese_ogre: + + + + Categories + + Smiley + Face Costume + + + + Character + ๐Ÿ‘ป + ShortCodes + + :ghost: + + + + Categories + + Smiley + Face Costume + + + + Character + ๐Ÿ‘พ + ShortCodes + + :space_invader: + + + + Categories + + Smiley + Face Costume + + + + Character + ๐Ÿคก + ShortCodes + + :clown_face: + + + + Categories + + Smiley + Face Costume + + + + Character + ๐Ÿ‘บ + ShortCodes + + :japanese_goblin: + + + + Categories + + Smiley + Face Costume + + + + Character + ๐Ÿ‘ฝ + ShortCodes + + :alien: + + + + Categories + + Smiley + Face Costume + + + + Character + ๐Ÿค– + ShortCodes + + :robot: + + + + Categories + + Smiley + Face Costume + + + + Character + ๐Ÿ˜บ + ShortCodes + + :smiley_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ˜น + ShortCodes + + :joy_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ˜ผ + ShortCodes + + :smirk_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ™€ + ShortCodes + + :scream_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ˜พ + ShortCodes + + :pouting_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ˜ธ + ShortCodes + + :smile_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ˜ป + ShortCodes + + :heart_eyes_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ˜ฝ + ShortCodes + + :kissing_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ˜ฟ + ShortCodes + + :crying_cat_face: + + + + Categories + + Smiley + Cat Face + + + + Character + ๐Ÿ™ˆ + ShortCodes + + :see_no_evil: + + + + Categories + + Smiley + Monkey Face + + + + Character + ๐Ÿ™Š + ShortCodes + + :speak_no_evil: + + + + Categories + + Smiley + Monkey Face + + + + Character + ๐Ÿ™‰ + ShortCodes + + :hear_no_evil: + + + + Categories + + Smiley + Monkey Face + + + + Character + ๐Ÿ’‹ + ShortCodes + + :kiss: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’˜ + ShortCodes + + :cupid: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’– + ShortCodes + + :sparkling_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’“ + ShortCodes + + :heartbeat: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’• + ShortCodes + + :two_hearts: + + + + Categories + + Emotion + + + + + Character + โฃ๏ธ + ShortCodes + + :heavy_heart_exclamation: + + + + Categories + + Emotion + + + + + Character + โค๏ธโ€๐Ÿ”ฅ + ShortCodes + + :heart_on_fire: + + + + Categories + + Emotion + + + + + Character + โค๏ธ + ShortCodes + + :heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’› + ShortCodes + + :yellow_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’™ + ShortCodes + + :blue_heart: + + + + Categories + + Emotion + + + + + Character + ๐ŸคŽ + ShortCodes + + :brown_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿค + ShortCodes + + :white_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ข + ShortCodes + + :anger: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ซ + ShortCodes + + :dizzy: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’จ + ShortCodes + + :dash: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ฃ + ShortCodes + + :bomb: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ + ShortCodes + + :eye_speech_bubble: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ—ฏ๏ธ + ShortCodes + + :right_anger_bubble: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ค + ShortCodes + + :zzz: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’Œ + ShortCodes + + :love_letter: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ + ShortCodes + + :gift_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’— + ShortCodes + + :heartpulse: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ž + ShortCodes + + :revolving_hearts: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’Ÿ + ShortCodes + + :heart_decoration: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’” + ShortCodes + + :broken_heart: + + + + Categories + + Emotion + + + + + Character + โค๏ธโ€๐Ÿฉน + ShortCodes + + :mending_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿงก + ShortCodes + + :orange_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’š + ShortCodes + + :green_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’œ + ShortCodes + + :purple_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ–ค + ShortCodes + + :black_heart: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ฏ + ShortCodes + + :100: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ฅ + ShortCodes + + :boom: + :collision: + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ฆ + ShortCodes + + :sweat_drops: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ•ณ๏ธ + ShortCodes + + :hole: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ฌ + ShortCodes + + :speech_balloon: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ—จ๏ธ + ShortCodes + + :left_speech_bubble: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ’ญ + ShortCodes + + :thought_balloon: + + + + Categories + + Emotion + + + + + Character + ๐Ÿ‘‹ + ShortCodes + + :wave: + + + + Categories + + Body + Hand Fingers Open + + + + Character + ๐Ÿ–๏ธ + ShortCodes + + :raised_hand_with_fingers_splayed: + + + + Categories + + Body + Hand Fingers Open + + + + Character + ๐Ÿ–– + ShortCodes + + :vulcan_salute: + + + + Categories + + Body + Hand Fingers Open + + + + Character + ๐Ÿคš + ShortCodes + + :raised_back_of_hand: + + + + Categories + + Body + Hand Fingers Open + + + + Character + โœ‹ + ShortCodes + + :hand: + :raised_hand: + + + Categories + + Body + Hand Fingers Open + + + + Character + ๐Ÿ‘Œ + ShortCodes + + :ok_hand: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + ๐Ÿค + ShortCodes + + :pinching_hand: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + ๐Ÿคž + ShortCodes + + :crossed_fingers: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + ๐Ÿค˜ + ShortCodes + + :metal: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + ๐ŸคŒ + ShortCodes + + :pinched_fingers: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + โœŒ๏ธ + ShortCodes + + :v: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + ๐ŸคŸ + ShortCodes + + :love_you_gesture: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + ๐Ÿค™ + ShortCodes + + :call_me_hand: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + ๐Ÿ‘ˆ + ShortCodes + + :point_left: + + + + Categories + + Body + Hand Single Finger + + + + Character + ๐Ÿ‘† + ShortCodes + + :point_up_2: + + + + Categories + + Body + Hand Single Finger + + + + Character + ๐Ÿ‘‡ + ShortCodes + + :point_down: + + + + Categories + + Body + Hand Single Finger + + + + Character + ๐Ÿ‘‰ + ShortCodes + + :point_right: + + + + Categories + + Body + Hand Single Finger + + + + Character + ๐Ÿ–• + ShortCodes + + :fu: + :middle_finger: + + + Categories + + Body + Hand Single Finger + + + + Character + โ˜๏ธ + ShortCodes + + :point_up: + + + + Categories + + Body + Hand Single Finger + + + + Character + ๐Ÿ‘ + ShortCodes + + :+1: + :thumbsup: + + + Categories + + Body + Hand Fingers Closed + + + + Character + โœŠ + ShortCodes + + :fist: + :fist_raised: + + + Categories + + Body + Hand Fingers Closed + + + + Character + ๐Ÿค› + ShortCodes + + :fist_left: + + + + Categories + + Body + Hand Fingers Closed + + + + Character + ๐Ÿ‘Ž + ShortCodes + + :-1: + :thumbsdown: + + + Categories + + Body + Hand Fingers Closed + + + + Character + ๐Ÿ‘Š + ShortCodes + + :facepunch: + :fist_oncoming: + :punch: + + Categories + + Body + Hand Fingers Closed + + + + Character + ๐Ÿคœ + ShortCodes + + :fist_right: + + + + Categories + + Body + Hand Fingers Closed + + + + Character + ๐Ÿ‘ + ShortCodes + + :clap: + + + + Categories + + Body + Hands + + + + Character + ๐Ÿ‘ + ShortCodes + + :open_hands: + + + + Categories + + Body + Hands + + + + Character + ๐Ÿค + ShortCodes + + :handshake: + + + + Categories + + Body + Hands + + + + Character + ๐Ÿ™Œ + ShortCodes + + :raised_hands: + + + + Categories + + Body + Hands + + + + Character + ๐Ÿคฒ + ShortCodes + + :palms_up_together: + + + + Categories + + Body + Hands + + + + Character + ๐Ÿ™ + ShortCodes + + :pray: + + + + Categories + + Body + Hands + + + + Character + โœ๏ธ + ShortCodes + + :writing_hand: + + + + Categories + + Body + Hand Prop + + + + Character + ๐Ÿคณ + ShortCodes + + :selfie: + + + + Categories + + Body + Hand Prop + + + + Character + ๐Ÿ’… + ShortCodes + + :nail_care: + + + + Categories + + Body + Hand Prop + + + + Character + ๐Ÿ’ช + ShortCodes + + :muscle: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿฆฟ + ShortCodes + + :mechanical_leg: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿฆถ + ShortCodes + + :foot: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿฆป + ShortCodes + + :ear_with_hearing_aid: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿง  + ShortCodes + + :brain: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿซ + ShortCodes + + :lungs: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿฆด + ShortCodes + + :bone: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿ‘๏ธ + ShortCodes + + :eye: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿ‘„ + ShortCodes + + :lips: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿฆพ + ShortCodes + + :mechanical_arm: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿฆต + ShortCodes + + :leg: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿ‘‚ + ShortCodes + + :ear: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿ‘ƒ + ShortCodes + + :nose: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿซ€ + ShortCodes + + :anatomical_heart: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿฆท + ShortCodes + + :tooth: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿ‘€ + ShortCodes + + :eyes: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿ‘… + ShortCodes + + :tongue: + + + + Categories + + Body + Body Parts + + + + Character + ๐Ÿ‘ถ + ShortCodes + + :baby: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฆ + ShortCodes + + :boy: + + + + Categories + + Person + + + + + Character + ๐Ÿง‘ + ShortCodes + + :adult: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘จ + ShortCodes + + :man: + + + + Categories + + Person + + + + + Character + ๐Ÿง”โ€โ™‚๏ธ + ShortCodes + + :man_beard: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘จโ€๐Ÿฆฐ + ShortCodes + + :red_haired_man: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘จโ€๐Ÿฆณ + ShortCodes + + :white_haired_man: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฉ + ShortCodes + + :woman: + + + + Categories + + Person + + + + + Character + ๐Ÿง‘โ€๐Ÿฆฐ + ShortCodes + + :person_red_hair: + + + + Categories + + Person + + + + + Character + ๐Ÿง‘โ€๐Ÿฆฑ + ShortCodes + + :person_curly_hair: + + + + Categories + + Person + + + + + Character + ๐Ÿง‘โ€๐Ÿฆณ + ShortCodes + + :person_white_hair: + + + + Categories + + Person + + + + + Character + ๐Ÿง‘โ€๐Ÿฆฒ + ShortCodes + + :person_bald: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฑโ€โ™‚๏ธ + ShortCodes + + :blond_haired_man: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ด + ShortCodes + + :older_man: + + + + Categories + + Person + + + + + Character + ๐Ÿง’ + ShortCodes + + :child: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ง + ShortCodes + + :girl: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฑ + ShortCodes + + :blond_haired_person: + + + + Categories + + Person + + + + + Character + ๐Ÿง” + ShortCodes + + :bearded_person: + + + + Categories + + Person + + + + + Character + ๐Ÿง”โ€โ™€๏ธ + ShortCodes + + :woman_beard: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘จโ€๐Ÿฆฑ + ShortCodes + + :curly_haired_man: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘จโ€๐Ÿฆฒ + ShortCodes + + :bald_man: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿฆฐ + ShortCodes + + :red_haired_woman: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿฆฑ + ShortCodes + + :curly_haired_woman: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿฆณ + ShortCodes + + :white_haired_woman: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿฆฒ + ShortCodes + + :bald_woman: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ฑโ€โ™€๏ธ + ShortCodes + + :blond_haired_woman: + :blonde_woman: + + + Categories + + Person + + + + + Character + ๐Ÿง“ + ShortCodes + + :older_adult: + + + + Categories + + Person + + + + + Character + ๐Ÿ‘ต + ShortCodes + + :older_woman: + + + + Categories + + Person + + + + + Character + ๐Ÿ™ + ShortCodes + + :frowning_person: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™โ€โ™€๏ธ + ShortCodes + + :frowning_woman: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™Žโ€โ™‚๏ธ + ShortCodes + + :pouting_man: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™… + ShortCodes + + :no_good: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™…โ€โ™€๏ธ + ShortCodes + + :ng_woman: + :no_good_woman: + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™†โ€โ™‚๏ธ + ShortCodes + + :ok_man: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ’ + ShortCodes + + :information_desk_person: + :tipping_hand_person: + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ’โ€โ™€๏ธ + ShortCodes + + :sassy_woman: + :tipping_hand_woman: + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™‹โ€โ™‚๏ธ + ShortCodes + + :raising_hand_man: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿง + ShortCodes + + :deaf_person: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿงโ€โ™€๏ธ + ShortCodes + + :deaf_woman: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™‡โ€โ™‚๏ธ + ShortCodes + + :bowing_man: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿคฆ + ShortCodes + + :facepalm: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿคฆโ€โ™€๏ธ + ShortCodes + + :woman_facepalming: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿคทโ€โ™‚๏ธ + ShortCodes + + :man_shrugging: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™โ€โ™‚๏ธ + ShortCodes + + :frowning_man: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™Ž + ShortCodes + + :pouting_face: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™Žโ€โ™€๏ธ + ShortCodes + + :pouting_woman: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™…โ€โ™‚๏ธ + ShortCodes + + :ng_man: + :no_good_man: + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™† + ShortCodes + + :ok_person: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™†โ€โ™€๏ธ + ShortCodes + + :ok_woman: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ’โ€โ™‚๏ธ + ShortCodes + + :sassy_man: + :tipping_hand_man: + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™‹ + ShortCodes + + :raising_hand: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™‹โ€โ™€๏ธ + ShortCodes + + :raising_hand_woman: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿงโ€โ™‚๏ธ + ShortCodes + + :deaf_man: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™‡ + ShortCodes + + :bow: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿ™‡โ€โ™€๏ธ + ShortCodes + + :bowing_woman: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿคฆโ€โ™‚๏ธ + ShortCodes + + :man_facepalming: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿคท + ShortCodes + + :shrug: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿคทโ€โ™€๏ธ + ShortCodes + + :woman_shrugging: + + + + Categories + + Person Gesture + + + + + Character + ๐Ÿง‘โ€โš•๏ธ + ShortCodes + + :health_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€โš•๏ธ + ShortCodes + + :woman_health_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐ŸŽ“ + ShortCodes + + :man_student: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿซ + ShortCodes + + :teacher: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿซ + ShortCodes + + :woman_teacher: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€โš–๏ธ + ShortCodes + + :man_judge: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐ŸŒพ + ShortCodes + + :farmer: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐ŸŒพ + ShortCodes + + :woman_farmer: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿณ + ShortCodes + + :man_cook: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿ”ง + ShortCodes + + :mechanic: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ”ง + ShortCodes + + :woman_mechanic: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿญ + ShortCodes + + :man_factory_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿ’ผ + ShortCodes + + :office_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ’ผ + ShortCodes + + :woman_office_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿ”ฌ + ShortCodes + + :man_scientist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿ’ป + ShortCodes + + :technologist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ’ป + ShortCodes + + :woman_technologist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐ŸŽค + ShortCodes + + :man_singer: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐ŸŽจ + ShortCodes + + :artist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐ŸŽจ + ShortCodes + + :woman_artist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€โœˆ๏ธ + ShortCodes + + :man_pilot: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿš€ + ShortCodes + + :astronaut: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿš€ + ShortCodes + + :woman_astronaut: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿš’ + ShortCodes + + :man_firefighter: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฎ + ShortCodes + + :cop: + :police_officer: + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฎโ€โ™€๏ธ + ShortCodes + + :policewoman: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ•ต๏ธโ€โ™‚๏ธ + ShortCodes + + :male_detective: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ’‚ + ShortCodes + + :guard: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ’‚โ€โ™€๏ธ + ShortCodes + + :guardswoman: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ท + ShortCodes + + :construction_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ทโ€โ™€๏ธ + ShortCodes + + :construction_worker_woman: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ธ + ShortCodes + + :princess: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ณโ€โ™‚๏ธ + ShortCodes + + :man_with_turban: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฒ + ShortCodes + + :man_with_gua_pi_mao: + + + + Categories + + Person Role + + + + + Character + ๐Ÿคต + ShortCodes + + :person_in_tuxedo: + + + + Categories + + Person Role + + + + + Character + ๐Ÿคตโ€โ™€๏ธ + ShortCodes + + :woman_in_tuxedo: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฐโ€โ™‚๏ธ + ShortCodes + + :man_with_veil: + + + + Categories + + Person Role + + + + + Character + ๐Ÿคฐ + ShortCodes + + :pregnant_woman: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿผ + ShortCodes + + :woman_feeding_baby: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿผ + ShortCodes + + :person_feeding_baby: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€โš•๏ธ + ShortCodes + + :man_health_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐ŸŽ“ + ShortCodes + + :student: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐ŸŽ“ + ShortCodes + + :woman_student: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿซ + ShortCodes + + :man_teacher: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€โš–๏ธ + ShortCodes + + :judge: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€โš–๏ธ + ShortCodes + + :woman_judge: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐ŸŒพ + ShortCodes + + :man_farmer: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿณ + ShortCodes + + :cook: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿณ + ShortCodes + + :woman_cook: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿ”ง + ShortCodes + + :man_mechanic: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿญ + ShortCodes + + :factory_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿญ + ShortCodes + + :woman_factory_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿ’ผ + ShortCodes + + :man_office_worker: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿ”ฌ + ShortCodes + + :scientist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ”ฌ + ShortCodes + + :woman_scientist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿ’ป + ShortCodes + + :man_technologist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐ŸŽค + ShortCodes + + :singer: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐ŸŽค + ShortCodes + + :woman_singer: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐ŸŽจ + ShortCodes + + :man_artist: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€โœˆ๏ธ + ShortCodes + + :pilot: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€โœˆ๏ธ + ShortCodes + + :woman_pilot: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿš€ + ShortCodes + + :man_astronaut: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง‘โ€๐Ÿš’ + ShortCodes + + :firefighter: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿš’ + ShortCodes + + :woman_firefighter: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฎโ€โ™‚๏ธ + ShortCodes + + :policeman: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ•ต๏ธ + ShortCodes + + :detective: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ•ต๏ธโ€โ™€๏ธ + ShortCodes + + :female_detective: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ’‚โ€โ™‚๏ธ + ShortCodes + + :guardsman: + + + + Categories + + Person Role + + + + + Character + ๐Ÿฅท + ShortCodes + + :ninja: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ทโ€โ™‚๏ธ + ShortCodes + + :construction_worker_man: + + + + Categories + + Person Role + + + + + Character + ๐Ÿคด + ShortCodes + + :prince: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ณ + ShortCodes + + :person_with_turban: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ณโ€โ™€๏ธ + ShortCodes + + :woman_with_turban: + + + + Categories + + Person Role + + + + + Character + ๐Ÿง• + ShortCodes + + :woman_with_headscarf: + + + + Categories + + Person Role + + + + + Character + ๐Ÿคตโ€โ™‚๏ธ + ShortCodes + + :man_in_tuxedo: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฐ + ShortCodes + + :person_with_veil: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ฐโ€โ™€๏ธ + ShortCodes + + :bride_with_veil: + :woman_with_veil: + + + Categories + + Person Role + + + + + Character + ๐Ÿคฑ + ShortCodes + + :breast_feeding: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘จโ€๐Ÿผ + ShortCodes + + :man_feeding_baby: + + + + Categories + + Person Role + + + + + Character + ๐Ÿ‘ผ + ShortCodes + + :angel: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿคถ + ShortCodes + + :mrs_claus: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿฆธ + ShortCodes + + :superhero: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿฆธโ€โ™€๏ธ + ShortCodes + + :superhero_woman: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿฆนโ€โ™‚๏ธ + ShortCodes + + :supervillain_man: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿง™ + ShortCodes + + :mage: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿง™โ€โ™€๏ธ + ShortCodes + + :mage_woman: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงšโ€โ™‚๏ธ + ShortCodes + + :fairy_man: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿง› + ShortCodes + + :vampire: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿง›โ€โ™€๏ธ + ShortCodes + + :vampire_woman: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงœโ€โ™‚๏ธ + ShortCodes + + :merman: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿง + ShortCodes + + :elf: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงโ€โ™€๏ธ + ShortCodes + + :elf_woman: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงžโ€โ™‚๏ธ + ShortCodes + + :genie_man: + + + + Categories + + Person Fantasy + + + + + Character + ๐ŸงŸ + ShortCodes + + :zombie: + + + + Categories + + Person Fantasy + + + + + Character + ๐ŸงŸโ€โ™€๏ธ + ShortCodes + + :zombie_woman: + + + + Categories + + Person Fantasy + + + + + Character + ๐ŸŽ… + ShortCodes + + :santa: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿง‘โ€๐ŸŽ„ + ShortCodes + + :mx_claus: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿฆธโ€โ™‚๏ธ + ShortCodes + + :superhero_man: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿฆน + ShortCodes + + :supervillain: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿฆนโ€โ™€๏ธ + ShortCodes + + :supervillain_woman: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿง™โ€โ™‚๏ธ + ShortCodes + + :mage_man: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงš + ShortCodes + + :fairy: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงšโ€โ™€๏ธ + ShortCodes + + :fairy_woman: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿง›โ€โ™‚๏ธ + ShortCodes + + :vampire_man: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงœ + ShortCodes + + :merperson: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงœโ€โ™€๏ธ + ShortCodes + + :mermaid: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงโ€โ™‚๏ธ + ShortCodes + + :elf_man: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงž + ShortCodes + + :genie: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿงžโ€โ™€๏ธ + ShortCodes + + :genie_woman: + + + + Categories + + Person Fantasy + + + + + Character + ๐ŸงŸโ€โ™‚๏ธ + ShortCodes + + :zombie_man: + + + + Categories + + Person Fantasy + + + + + Character + ๐Ÿ’† + ShortCodes + + :massage: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ’†โ€โ™€๏ธ + ShortCodes + + :massage_woman: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ’‡โ€โ™‚๏ธ + ShortCodes + + :haircut_man: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿšถ + ShortCodes + + :walking: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿšถโ€โ™€๏ธ + ShortCodes + + :walking_woman: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿงโ€โ™‚๏ธ + ShortCodes + + :standing_man: + + + + Categories + + Person Activity + + + + + Character + ๐ŸงŽ + ShortCodes + + :kneeling_person: + + + + Categories + + Person Activity + + + + + Character + ๐ŸงŽโ€โ™€๏ธ + ShortCodes + + :kneeling_woman: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘จโ€๐Ÿฆฏ + ShortCodes + + :man_with_probing_cane: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง‘โ€๐Ÿฆผ + ShortCodes + + :person_in_motorized_wheelchair: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿฆผ + ShortCodes + + :woman_in_motorized_wheelchair: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘จโ€๐Ÿฆฝ + ShortCodes + + :man_in_manual_wheelchair: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿƒ + ShortCodes + + :runner: + :running: + + + Categories + + Person Activity + + + + + Character + ๐Ÿƒโ€โ™€๏ธ + ShortCodes + + :running_woman: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ•บ + ShortCodes + + :man_dancing: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘ฏ + ShortCodes + + :dancers: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘ฏโ€โ™€๏ธ + ShortCodes + + :dancing_women: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง–โ€โ™‚๏ธ + ShortCodes + + :sauna_man: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง— + ShortCodes + + :climbing: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง—โ€โ™€๏ธ + ShortCodes + + :climbing_woman: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ’†โ€โ™‚๏ธ + ShortCodes + + :massage_man: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ’‡ + ShortCodes + + :haircut: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ’‡โ€โ™€๏ธ + ShortCodes + + :haircut_woman: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿšถโ€โ™‚๏ธ + ShortCodes + + :walking_man: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง + ShortCodes + + :standing_person: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿงโ€โ™€๏ธ + ShortCodes + + :standing_woman: + + + + Categories + + Person Activity + + + + + Character + ๐ŸงŽโ€โ™‚๏ธ + ShortCodes + + :kneeling_man: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง‘โ€๐Ÿฆฏ + ShortCodes + + :person_with_probing_cane: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿฆฏ + ShortCodes + + :woman_with_probing_cane: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘จโ€๐Ÿฆผ + ShortCodes + + :man_in_motorized_wheelchair: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง‘โ€๐Ÿฆฝ + ShortCodes + + :person_in_manual_wheelchair: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘ฉโ€๐Ÿฆฝ + ShortCodes + + :woman_in_manual_wheelchair: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿƒโ€โ™‚๏ธ + ShortCodes + + :running_man: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ’ƒ + ShortCodes + + :dancer: + :woman_dancing: + + + Categories + + Person Activity + + + + + Character + ๐Ÿ•ด๏ธ + ShortCodes + + :business_suit_levitating: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿ‘ฏโ€โ™‚๏ธ + ShortCodes + + :dancing_men: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง– + ShortCodes + + :sauna_person: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง–โ€โ™€๏ธ + ShortCodes + + :sauna_woman: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿง—โ€โ™‚๏ธ + ShortCodes + + :climbing_man: + + + + Categories + + Person Activity + + + + + Character + ๐Ÿคบ + ShortCodes + + :person_fencing: + + + + Categories + + Person Sport + + + + + Character + โ›ท๏ธ + ShortCodes + + :skier: + + + + Categories + + Person Sport + + + + + Character + ๐ŸŒ๏ธ + ShortCodes + + :golfing: + + + + Categories + + Person Sport + + + + + Character + ๐ŸŒ๏ธโ€โ™€๏ธ + ShortCodes + + :golfing_woman: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿ„โ€โ™‚๏ธ + ShortCodes + + :surfing_man: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšฃ + ShortCodes + + :rowboat: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšฃโ€โ™€๏ธ + ShortCodes + + :rowing_woman: + + + + Categories + + Person Sport + + + + + Character + ๐ŸŠโ€โ™‚๏ธ + ShortCodes + + :swimming_man: + + + + Categories + + Person Sport + + + + + Character + โ›น๏ธ + ShortCodes + + :bouncing_ball_person: + + + + Categories + + Person Sport + + + + + Character + โ›น๏ธโ€โ™€๏ธ + ShortCodes + + :basketball_woman: + :bouncing_ball_woman: + + + Categories + + Person Sport + + + + + Character + ๐Ÿ‹๏ธโ€โ™‚๏ธ + ShortCodes + + :weight_lifting_man: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšด + ShortCodes + + :bicyclist: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšดโ€โ™€๏ธ + ShortCodes + + :biking_woman: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšตโ€โ™‚๏ธ + ShortCodes + + :mountain_biking_man: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคธ + ShortCodes + + :cartwheeling: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคธโ€โ™€๏ธ + ShortCodes + + :woman_cartwheeling: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคผโ€โ™‚๏ธ + ShortCodes + + :men_wrestling: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคฝ + ShortCodes + + :water_polo: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคฝโ€โ™€๏ธ + ShortCodes + + :woman_playing_water_polo: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคพโ€โ™‚๏ธ + ShortCodes + + :man_playing_handball: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคน + ShortCodes + + :juggling_person: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคนโ€โ™€๏ธ + ShortCodes + + :woman_juggling: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿ‡ + ShortCodes + + :horse_racing: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿ‚ + ShortCodes + + :snowboarder: + + + + Categories + + Person Sport + + + + + Character + ๐ŸŒ๏ธโ€โ™‚๏ธ + ShortCodes + + :golfing_man: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿ„ + ShortCodes + + :surfer: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿ„โ€โ™€๏ธ + ShortCodes + + :surfing_woman: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšฃโ€โ™‚๏ธ + ShortCodes + + :rowing_man: + + + + Categories + + Person Sport + + + + + Character + ๐ŸŠ + ShortCodes + + :swimmer: + + + + Categories + + Person Sport + + + + + Character + ๐ŸŠโ€โ™€๏ธ + ShortCodes + + :swimming_woman: + + + + Categories + + Person Sport + + + + + Character + โ›น๏ธโ€โ™‚๏ธ + ShortCodes + + :basketball_man: + :bouncing_ball_man: + + + Categories + + Person Sport + + + + + Character + ๐Ÿ‹๏ธ + ShortCodes + + :weight_lifting: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿ‹๏ธโ€โ™€๏ธ + ShortCodes + + :weight_lifting_woman: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšดโ€โ™‚๏ธ + ShortCodes + + :biking_man: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšต + ShortCodes + + :mountain_bicyclist: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿšตโ€โ™€๏ธ + ShortCodes + + :mountain_biking_woman: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคธโ€โ™‚๏ธ + ShortCodes + + :man_cartwheeling: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคผ + ShortCodes + + :wrestling: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคผโ€โ™€๏ธ + ShortCodes + + :women_wrestling: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคฝโ€โ™‚๏ธ + ShortCodes + + :man_playing_water_polo: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคพ + ShortCodes + + :handball_person: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคพโ€โ™€๏ธ + ShortCodes + + :woman_playing_handball: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿคนโ€โ™‚๏ธ + ShortCodes + + :man_juggling: + + + + Categories + + Person Sport + + + + + Character + ๐Ÿง˜ + ShortCodes + + :lotus_position: + + + + Categories + + Person Resting + + + + + Character + ๐Ÿง˜โ€โ™€๏ธ + ShortCodes + + :lotus_position_woman: + + + + Categories + + Person Resting + + + + + Character + ๐Ÿ›Œ + ShortCodes + + :sleeping_bed: + + + + Categories + + Person Resting + + + + + Character + ๐Ÿง˜โ€โ™‚๏ธ + ShortCodes + + :lotus_position_man: + + + + Categories + + Person Resting + + + + + Character + ๐Ÿ›€ + ShortCodes + + :bath: + + + + Categories + + Person Resting + + + + + Character + ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ + ShortCodes + + :people_holding_hands: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ซ + ShortCodes + + :couple: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ’ + ShortCodes + + :couplekiss: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ + ShortCodes + + :couplekiss_man_man: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ’‘ + ShortCodes + + :couple_with_heart: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ + ShortCodes + + :couple_with_heart_man_man: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ช + ShortCodes + + :family: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง + ShortCodes + + :family_man_woman_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_woman_boy_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_man_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_man_girl_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง + ShortCodes + + :family_man_man_girl_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง + ShortCodes + + :family_woman_woman_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ + ShortCodes + + :family_woman_woman_boy_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘ง + ShortCodes + + :family_man_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง + ShortCodes + + :family_man_girl_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ + ShortCodes + + :family_woman_boy_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ + ShortCodes + + :family_woman_girl_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ญ + ShortCodes + + :two_women_holding_hands: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฌ + ShortCodes + + :two_men_holding_hands: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ + ShortCodes + + :couplekiss_man_woman: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ + ShortCodes + + :couplekiss_woman_woman: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ + ShortCodes + + :couple_with_heart_woman_man: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ + ShortCodes + + :couple_with_heart_woman_woman: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_woman_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_woman_girl_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง + ShortCodes + + :family_man_woman_girl_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง + ShortCodes + + :family_man_man_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_man_boy_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ + ShortCodes + + :family_woman_woman_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ + ShortCodes + + :family_woman_woman_girl_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง + ShortCodes + + :family_woman_woman_girl_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_boy_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ + ShortCodes + + :family_man_girl_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘ฆ + ShortCodes + + :family_woman_boy: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘ง + ShortCodes + + :family_woman_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง + ShortCodes + + :family_woman_girl_girl: + + + + Categories + + Person + Family + + + + Character + ๐Ÿ—ฃ๏ธ + ShortCodes + + :speaking_head: + + + + Categories + + Person Symbol + + + + + Character + ๐Ÿ‘ฅ + ShortCodes + + :busts_in_silhouette: + + + + Categories + + Person Symbol + + + + + Character + ๐Ÿ‘ฃ + ShortCodes + + :footprints: + + + + Categories + + Person Symbol + + + + + Character + ๐Ÿ‘ค + ShortCodes + + :bust_in_silhouette: + + + + Categories + + Person Symbol + + + + + Character + ๐Ÿซ‚ + ShortCodes + + :people_hugging: + + + + Categories + + Person Symbol + + + + + Character + ๐Ÿต + ShortCodes + + :monkey_face: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ + ShortCodes + + :gorilla: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿถ + ShortCodes + + :dog: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆฎ + ShortCodes + + :guide_dog: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฉ + ShortCodes + + :poodle: + + + + Categories + + Animal Mammal + + + + + Character + ๐ŸฆŠ + ShortCodes + + :fox_face: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฑ + ShortCodes + + :cat: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿˆโ€โฌ› + ShortCodes + + :black_cat: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฏ + ShortCodes + + :tiger: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ† + ShortCodes + + :leopard: + + + + Categories + + Animal Mammal + + + + + Character + ๐ŸŽ + ShortCodes + + :racehorse: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ“ + ShortCodes + + :zebra: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆฌ + ShortCodes + + :bison: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ‚ + ShortCodes + + :ox: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ„ + ShortCodes + + :cow2: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ– + ShortCodes + + :pig2: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฝ + ShortCodes + + :pig_nose: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ‘ + ShortCodes + + :sheep: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿช + ShortCodes + + :dromedary_camel: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ™ + ShortCodes + + :llama: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ˜ + ShortCodes + + :elephant: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ + ShortCodes + + :rhinoceros: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿญ + ShortCodes + + :mouse: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ€ + ShortCodes + + :rat: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฐ + ShortCodes + + :rabbit: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฟ๏ธ + ShortCodes + + :chipmunk: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ” + ShortCodes + + :hedgehog: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿป + ShortCodes + + :bear: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿจ + ShortCodes + + :koala: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆฅ + ShortCodes + + :sloth: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆจ + ShortCodes + + :skunk: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆก + ShortCodes + + :badger: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ’ + ShortCodes + + :monkey: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆง + ShortCodes + + :orangutan: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ• + ShortCodes + + :dog2: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ•โ€๐Ÿฆบ + ShortCodes + + :service_dog: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿบ + ShortCodes + + :wolf: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ + ShortCodes + + :raccoon: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿˆ + ShortCodes + + :cat2: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ + ShortCodes + + :lion: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ… + ShortCodes + + :tiger2: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿด + ShortCodes + + :horse: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ„ + ShortCodes + + :unicorn: + + + + Categories + + Animal Mammal + + + + + Character + ๐ŸฆŒ + ShortCodes + + :deer: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฎ + ShortCodes + + :cow: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿƒ + ShortCodes + + :water_buffalo: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿท + ShortCodes + + :pig: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ— + ShortCodes + + :boar: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ + ShortCodes + + :ram: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ + ShortCodes + + :goat: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿซ + ShortCodes + + :camel: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ’ + ShortCodes + + :giraffe: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆฃ + ShortCodes + + :mammoth: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ› + ShortCodes + + :hippopotamus: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ + ShortCodes + + :mouse2: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿน + ShortCodes + + :hamster: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿ‡ + ShortCodes + + :rabbit2: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆซ + ShortCodes + + :beaver: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ‡ + ShortCodes + + :bat: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿปโ€โ„๏ธ + ShortCodes + + :polar_bear: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿผ + ShortCodes + + :panda_face: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆฆ + ShortCodes + + :otter: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆ˜ + ShortCodes + + :kangaroo: + + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿพ + ShortCodes + + :feet: + :paw_prints: + + + Categories + + Animal Mammal + + + + + Character + ๐Ÿฆƒ + ShortCodes + + :turkey: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿ“ + ShortCodes + + :rooster: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿค + ShortCodes + + :baby_chick: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆ + ShortCodes + + :bird: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿ•Š๏ธ + ShortCodes + + :dove: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆ† + ShortCodes + + :duck: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆ‰ + ShortCodes + + :owl: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿชถ + ShortCodes + + :feather: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆš + ShortCodes + + :peacock: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿ” + ShortCodes + + :chicken: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฃ + ShortCodes + + :hatching_chick: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฅ + ShortCodes + + :hatched_chick: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿง + ShortCodes + + :penguin: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆ… + ShortCodes + + :eagle: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆข + ShortCodes + + :swan: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆค + ShortCodes + + :dodo: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆฉ + ShortCodes + + :flamingo: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿฆœ + ShortCodes + + :parrot: + + + + Categories + + Animal Bird + + + + + Character + ๐Ÿธ + ShortCodes + + :frog: + + + + Categories + + Animal Amphibian + + + + + Character + ๐ŸŠ + ShortCodes + + :crocodile: + + + + Categories + + Animal Reptile + + + + + Character + ๐ŸฆŽ + ShortCodes + + :lizard: + + + + Categories + + Animal Reptile + + + + + Character + ๐Ÿฒ + ShortCodes + + :dragon_face: + + + + Categories + + Animal Reptile + + + + + Character + ๐Ÿฆ• + ShortCodes + + :sauropod: + + + + Categories + + Animal Reptile + + + + + Character + ๐Ÿข + ShortCodes + + :turtle: + + + + Categories + + Animal Reptile + + + + + Character + ๐Ÿ + ShortCodes + + :snake: + + + + Categories + + Animal Reptile + + + + + Character + ๐Ÿ‰ + ShortCodes + + :dragon: + + + + Categories + + Animal Reptile + + + + + Character + ๐Ÿฆ– + ShortCodes + + :t-rex: + + + + Categories + + Animal Reptile + + + + + Character + ๐Ÿณ + ShortCodes + + :whale: + + + + Categories + + Animal Marine + + + + + Character + ๐Ÿฌ + ShortCodes + + :dolphin: + :flipper: + + + Categories + + Animal Marine + + + + + Character + ๐ŸŸ + ShortCodes + + :fish: + + + + Categories + + Animal Marine + + + + + Character + ๐Ÿก + ShortCodes + + :blowfish: + + + + Categories + + Animal Marine + + + + + Character + ๐Ÿ™ + ShortCodes + + :octopus: + + + + Categories + + Animal Marine + + + + + Character + ๐Ÿ‹ + ShortCodes + + :whale2: + + + + Categories + + Animal Marine + + + + + Character + ๐Ÿฆญ + ShortCodes + + :seal: + + + + Categories + + Animal Marine + + + + + Character + ๐Ÿ  + ShortCodes + + :tropical_fish: + + + + Categories + + Animal Marine + + + + + Character + ๐Ÿฆˆ + ShortCodes + + :shark: + + + + Categories + + Animal Marine + + + + + Character + ๐Ÿš + ShortCodes + + :shell: + + + + Categories + + Animal Marine + + + + + Character + ๐ŸŒ + ShortCodes + + :snail: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿ› + ShortCodes + + :bug: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿ + ShortCodes + + :bee: + :honeybee: + + + Categories + + Animal Bug + + + + + Character + ๐Ÿž + ShortCodes + + :lady_beetle: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿชณ + ShortCodes + + :cockroach: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿ•ธ๏ธ + ShortCodes + + :spider_web: + + + + Categories + + Animal Bug + + + + + Character + ๐ŸฆŸ + ShortCodes + + :mosquito: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿชฑ + ShortCodes + + :worm: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿฆ‹ + ShortCodes + + :butterfly: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿœ + ShortCodes + + :ant: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿชฒ + ShortCodes + + :beetle: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿฆ— + ShortCodes + + :cricket: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿ•ท๏ธ + ShortCodes + + :spider: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿฆ‚ + ShortCodes + + :scorpion: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿชฐ + ShortCodes + + :fly: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿฆ  + ShortCodes + + :microbe: + + + + Categories + + Animal Bug + + + + + Character + ๐Ÿ’ + ShortCodes + + :bouquet: + + + + Categories + + Plant Flower + + + + + Character + ๐Ÿ’ฎ + ShortCodes + + :white_flower: + + + + Categories + + Plant Flower + + + + + Character + ๐ŸŒน + ShortCodes + + :rose: + + + + Categories + + Plant Flower + + + + + Character + ๐ŸŒบ + ShortCodes + + :hibiscus: + + + + Categories + + Plant Flower + + + + + Character + ๐ŸŒผ + ShortCodes + + :blossom: + + + + Categories + + Plant Flower + + + + + Character + ๐ŸŒธ + ShortCodes + + :cherry_blossom: + + + + Categories + + Plant Flower + + + + + Character + ๐Ÿต๏ธ + ShortCodes + + :rosette: + + + + Categories + + Plant Flower + + + + + Character + ๐Ÿฅ€ + ShortCodes + + :wilted_flower: + + + + Categories + + Plant Flower + + + + + Character + ๐ŸŒป + ShortCodes + + :sunflower: + + + + Categories + + Plant Flower + + + + + Character + ๐ŸŒท + ShortCodes + + :tulip: + + + + Categories + + Plant Flower + + + + + Character + ๐ŸŒฑ + ShortCodes + + :seedling: + + + + Categories + + Plant Other + + + + + Character + ๐ŸŒฒ + ShortCodes + + :evergreen_tree: + + + + Categories + + Plant Other + + + + + Character + ๐ŸŒด + ShortCodes + + :palm_tree: + + + + Categories + + Plant Other + + + + + Character + ๐ŸŒพ + ShortCodes + + :ear_of_rice: + + + + Categories + + Plant Other + + + + + Character + โ˜˜๏ธ + ShortCodes + + :shamrock: + + + + Categories + + Plant Other + + + + + Character + ๐Ÿ + ShortCodes + + :maple_leaf: + + + + Categories + + Plant Other + + + + + Character + ๐Ÿƒ + ShortCodes + + :leaves: + + + + Categories + + Plant Other + + + + + Character + ๐Ÿชด + ShortCodes + + :potted_plant: + + + + Categories + + Plant Other + + + + + Character + ๐ŸŒณ + ShortCodes + + :deciduous_tree: + + + + Categories + + Plant Other + + + + + Character + ๐ŸŒต + ShortCodes + + :cactus: + + + + Categories + + Plant Other + + + + + Character + ๐ŸŒฟ + ShortCodes + + :herb: + + + + Categories + + Plant Other + + + + + Character + ๐Ÿ€ + ShortCodes + + :four_leaf_clover: + + + + Categories + + Plant Other + + + + + Character + ๐Ÿ‚ + ShortCodes + + :fallen_leaf: + + + + Categories + + Plant Other + + + + + Character + ๐Ÿ‡ + ShortCodes + + :grapes: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ‰ + ShortCodes + + :watermelon: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ‹ + ShortCodes + + :lemon: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ + ShortCodes + + :pineapple: + + + + Categories + + Food Fruit + + + + + Character + ๐ŸŽ + ShortCodes + + :apple: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ + ShortCodes + + :pear: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ’ + ShortCodes + + :cherries: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿซ + ShortCodes + + :blueberries: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ… + ShortCodes + + :tomato: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿฅฅ + ShortCodes + + :coconut: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿˆ + ShortCodes + + :melon: + + + + Categories + + Food Fruit + + + + + Character + ๐ŸŠ + ShortCodes + + :mandarin: + :orange: + :tangerine: + + Categories + + Food Fruit + + + + + Character + ๐ŸŒ + ShortCodes + + :banana: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿฅญ + ShortCodes + + :mango: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ + ShortCodes + + :green_apple: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ‘ + ShortCodes + + :peach: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿ“ + ShortCodes + + :strawberry: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿฅ + ShortCodes + + :kiwi_fruit: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿซ’ + ShortCodes + + :olive: + + + + Categories + + Food Fruit + + + + + Character + ๐Ÿฅ‘ + ShortCodes + + :avocado: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿฅ” + ShortCodes + + :potato: + + + + Categories + + Food Vegetable + + + + + Character + ๐ŸŒฝ + ShortCodes + + :corn: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿซ‘ + ShortCodes + + :bell_pepper: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿฅฌ + ShortCodes + + :leafy_green: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿง„ + ShortCodes + + :garlic: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿ„ + ShortCodes + + :mushroom: + + + + Categories + + Food Vegetable + + + + + Character + ๐ŸŒฐ + ShortCodes + + :chestnut: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿ† + ShortCodes + + :eggplant: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿฅ• + ShortCodes + + :carrot: + + + + Categories + + Food Vegetable + + + + + Character + ๐ŸŒถ๏ธ + ShortCodes + + :hot_pepper: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿฅ’ + ShortCodes + + :cucumber: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿฅฆ + ShortCodes + + :broccoli: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿง… + ShortCodes + + :onion: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿฅœ + ShortCodes + + :peanuts: + + + + Categories + + Food Vegetable + + + + + Character + ๐Ÿž + ShortCodes + + :bread: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅ– + ShortCodes + + :baguette_bread: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅจ + ShortCodes + + :pretzel: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅž + ShortCodes + + :pancakes: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿง€ + ShortCodes + + :cheese: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿ— + ShortCodes + + :poultry_leg: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅ“ + ShortCodes + + :bacon: + + + + Categories + + Food Prepared + + + + + Character + ๐ŸŸ + ShortCodes + + :fries: + + + + Categories + + Food Prepared + + + + + Character + ๐ŸŒญ + ShortCodes + + :hotdog: + + + + Categories + + Food Prepared + + + + + Character + ๐ŸŒฎ + ShortCodes + + :taco: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿซ” + ShortCodes + + :tamale: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿง† + ShortCodes + + :falafel: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿณ + ShortCodes + + :fried_egg: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฒ + ShortCodes + + :stew: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅฃ + ShortCodes + + :bowl_with_spoon: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฟ + ShortCodes + + :popcorn: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿง‚ + ShortCodes + + :salt: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅ + ShortCodes + + :croissant: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿซ“ + ShortCodes + + :flatbread: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅฏ + ShortCodes + + :bagel: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿง‡ + ShortCodes + + :waffle: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿ– + ShortCodes + + :meat_on_bone: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅฉ + ShortCodes + + :cut_of_meat: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿ” + ShortCodes + + :hamburger: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿ• + ShortCodes + + :pizza: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅช + ShortCodes + + :sandwich: + + + + Categories + + Food Prepared + + + + + Character + ๐ŸŒฏ + ShortCodes + + :burrito: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅ™ + ShortCodes + + :stuffed_flatbread: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅš + ShortCodes + + :egg: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅ˜ + ShortCodes + + :shallow_pan_of_food: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿซ• + ShortCodes + + :fondue: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅ— + ShortCodes + + :green_salad: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿงˆ + ShortCodes + + :butter: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฅซ + ShortCodes + + :canned_food: + + + + Categories + + Food Prepared + + + + + Character + ๐Ÿฑ + ShortCodes + + :bento: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿ™ + ShortCodes + + :rice_ball: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿ› + ShortCodes + + :curry: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿ + ShortCodes + + :spaghetti: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿข + ShortCodes + + :oden: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿค + ShortCodes + + :fried_shrimp: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿฅฎ + ShortCodes + + :moon_cake: + + + + Categories + + Food Asian + + + + + Character + ๐ŸฅŸ + ShortCodes + + :dumpling: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿฅก + ShortCodes + + :takeout_box: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿ˜ + ShortCodes + + :rice_cracker: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿš + ShortCodes + + :rice: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿœ + ShortCodes + + :ramen: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿ  + ShortCodes + + :sweet_potato: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿฃ + ShortCodes + + :sushi: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿฅ + ShortCodes + + :fish_cake: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿก + ShortCodes + + :dango: + + + + Categories + + Food Asian + + + + + Character + ๐Ÿฅ  + ShortCodes + + :fortune_cookie: + + + + Categories + + Food Asian + + + + + -- cgit v1.2.3 From ec6c4f102f8b23e0c79dd2c1c0ecbad54f019566 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 6 Nov 2022 16:30:44 +0100 Subject: Switch to using the Twemoji OT-SVG font --- indra/newview/skins/default/xui/en/fonts.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 681f670f08..40045625fd 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -3,7 +3,7 @@ DejaVuSans.ttf - Twemoji.ttf + TwemojiSVG.ttf meiryo.TTC MSGOTHIC.TTC @@ -72,7 +72,7 @@ - Twemoji.ttf + TwemojiSVG.ttf Date: Tue, 8 Nov 2022 00:16:58 +0100 Subject: [FIXED] Various minor issues - Typing :+1: doesn't replace the short code with the thumbs-up emoji - Moving the mouse over the emoji complete panel highlights the wrong emoji when mScrollPos > 0 - Emoji complete panel is missing attributes - Crash when attempting to show the tooltip for an emoji text segment - Emoji autocomplete panel can sometimes show empty (type ':cat', select the heart eyed one, Ctrl-Z and then type 2 which should show the emoji for :cat2 but shows an empty square instead) --- indra/newview/llpanelemojicomplete.cpp | 4 ++-- indra/newview/skins/default/xui/en/widgets/emoji_complete.xml | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index a7058a6724..f890a14e8e 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -146,9 +146,9 @@ void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_paren void LLPanelEmojiComplete::setEmojiHint(const std::string& hint) { llwchar curEmoji = (mCurSelected < mEmojis.size()) ? mEmojis.at(mCurSelected) : 0; - size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos; mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint); + size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos; mCurSelected = (std::string::npos != curEmojiIdx) ? curEmojiIdx : 0; if (mAutoSize) @@ -168,7 +168,7 @@ size_t LLPanelEmojiComplete::posToIndex(S32 x, S32 y) const { if (mRenderRect.pointInRect(x, y)) { - return llmin((size_t)x / mEmojiWidth, mEmojis.size() - 1); + return mScrollPos + llmin((size_t)x / mEmojiWidth, mEmojis.size() - 1); } return npos; } diff --git a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml index f35105ff7e..370f1d174e 100644 --- a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml +++ b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml @@ -1,7 +1,10 @@ -- cgit v1.2.3 From 17a3924a28770e6910022ad8f627bb8e2b667730 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 8 Nov 2022 01:10:09 +0100 Subject: Add proper mouse down handler to the emoji complete panel -> the previous commit didn't properly set mFrontChild after restoring the topmost floaters -> additionally we don't want mouse clicks in "can't steal focus from frontmost" floaters to set focus to them --- indra/newview/llpanelemojicomplete.cpp | 30 +++++++++++++++++++++++++++--- indra/newview/llpanelemojicomplete.h | 3 +++ 2 files changed, 30 insertions(+), 3 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index f890a14e8e..8b89e3aa14 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -120,9 +120,6 @@ BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent case KEY_RETURN: if (!mEmojis.empty()) { - LLWString wstr; - wstr.push_back(mEmojis.at(mCurSelected)); - setValue(wstring_to_utf8str(wstr)); onCommit(); handled = true; } @@ -137,6 +134,33 @@ BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent return LLUICtrl::handleKey(key, mask, called_from_parent); } +BOOL LLPanelEmojiComplete::handleMouseDown(S32 x, S32 y, MASK mask) +{ + mCurSelected = posToIndex(x, y); + mLastHover = LLVector2(x, y); + + return TRUE; +} + +BOOL LLPanelEmojiComplete::handleMouseUp(S32 x, S32 y, MASK mask) +{ + mCurSelected = posToIndex(x, y); + onCommit(); + + return TRUE; +} + +void LLPanelEmojiComplete::onCommit() +{ + if (npos != mCurSelected) + { + LLWString wstr; + wstr.push_back(mEmojis.at(mCurSelected)); + setValue(wstring_to_utf8str(wstr)); + LLUICtrl::onCommit(); + } +} + void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) { LLUICtrl::reshape(width, height, called_from_parent); diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index 138cc465ba..2116b350be 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -56,6 +56,9 @@ public: void draw() override; BOOL handleHover(S32 x, S32 y, MASK mask) override; BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; + BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + void onCommit() override; void reshape(S32 width, S32 height, BOOL called_from_parent) override; public: -- cgit v1.2.3 From f3e7c7454f6647aa09f220baa20c9bbc7480a37b Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 8 Nov 2022 01:14:10 +0100 Subject: Enable color emojis (and the emoji helper) on the chat history and editor --- indra/newview/llchathistory.cpp | 2 ++ indra/newview/skins/default/xui/en/widgets/chat_editor.xml | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index c110e0d815..f07d4658f9 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -1010,6 +1010,8 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p) editor_params.enabled = false; // read only editor_params.show_context_menu = "true"; editor_params.trusted_content = false; + editor_params.text_valign = LLFontGL::VAlign::VCENTER; + editor_params.use_color = true; mEditor = LLUICtrlFactory::create(editor_params, this); mEditor->setIsFriendCallback(LLAvatarActions::isFriend); mEditor->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0)); diff --git a/indra/newview/skins/default/xui/en/widgets/chat_editor.xml b/indra/newview/skins/default/xui/en/widgets/chat_editor.xml index f9facb593a..c550f634e5 100644 --- a/indra/newview/skins/default/xui/en/widgets/chat_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/chat_editor.xml @@ -1,4 +1,7 @@ + show_context_menu="true" + show_emoji_helper="true" + use_color="true" + /> -- cgit v1.2.3 From 1727a31db0e3434adec087d6442fc5eca0ea68cf Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 9 Nov 2022 00:11:22 +0100 Subject: Show color emojis and emoji helper in notecards --- indra/newview/skins/default/xui/en/floater_preview_notecard.xml | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index dcbdfa8794..ac5467c036 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -73,6 +73,8 @@ spellcheck="true" tab_group="1" top="46" + use_color="true" + show_emoji_helper="true" width="392" word_wrap="true"> Loading... -- cgit v1.2.3 From b5033a8859b38df045cc74e074aaee864985f145 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 9 Nov 2022 00:14:51 +0100 Subject: Enable color on HUD text --- indra/newview/llhudrender.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index dff310ecf9..c1f17c9d33 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -138,7 +138,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f)); F32 right_x; - font.render(wstr, 0, 0, 1, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x); + font.render(wstr, 0, 0, 1, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x, /*use_ellipses*/false, /*use_color*/true); LLUI::popMatrix(); gGL.popMatrix(); -- cgit v1.2.3