mirror of https://github.com/minetest/minetest.git
Get rid of manual refcounting to fix use-after-free, accidental copying, etc.
This commit is contained in:
parent
dedabef6f6
commit
154cccc0a1
|
@ -160,8 +160,7 @@ AutoHideButtonBar::AutoHideButtonBar(IrrlichtDevice *device, ISimpleTextureSourc
|
||||||
IGUIButton *starter_gui_button = m_guienv->addButton(starter_rect, nullptr,
|
IGUIButton *starter_gui_button = m_guienv->addButton(starter_rect, nullptr,
|
||||||
starter_id, L"", nullptr);
|
starter_id, L"", nullptr);
|
||||||
|
|
||||||
m_starter.gui_button = starter_gui_button;
|
m_starter.gui_button.grab(starter_gui_button);
|
||||||
m_starter.gui_button->grab();
|
|
||||||
m_starter.repeat_counter = -1.0f;
|
m_starter.repeat_counter = -1.0f;
|
||||||
m_starter.keycode = KEY_OEM_8; // use invalid keycode as it's not relevant
|
m_starter.keycode = KEY_OEM_8; // use invalid keycode as it's not relevant
|
||||||
m_starter.immediate_release = true;
|
m_starter.immediate_release = true;
|
||||||
|
@ -174,22 +173,6 @@ AutoHideButtonBar::AutoHideButtonBar(IrrlichtDevice *device, ISimpleTextureSourc
|
||||||
m_timeout_value = timeout;
|
m_timeout_value = timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoHideButtonBar::~AutoHideButtonBar()
|
|
||||||
{
|
|
||||||
if (m_starter.gui_button) {
|
|
||||||
m_starter.gui_button->setVisible(false);
|
|
||||||
m_starter.gui_button->drop();
|
|
||||||
m_starter.gui_button = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto &button : m_buttons) {
|
|
||||||
if (button.gui_button) {
|
|
||||||
button.gui_button->drop();
|
|
||||||
button.gui_button = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoHideButtonBar::addButton(touch_gui_button_id button_id, const wchar_t *caption,
|
void AutoHideButtonBar::addButton(touch_gui_button_id button_id, const wchar_t *caption,
|
||||||
const std::string &btn_image)
|
const std::string &btn_image)
|
||||||
{
|
{
|
||||||
|
@ -238,8 +221,7 @@ void AutoHideButtonBar::addButton(touch_gui_button_id button_id, const wchar_t *
|
||||||
caption, nullptr);
|
caption, nullptr);
|
||||||
|
|
||||||
button_info btn;
|
button_info btn;
|
||||||
btn.gui_button = btn_gui_button;
|
btn.gui_button.grab(btn_gui_button);
|
||||||
btn.gui_button->grab();
|
|
||||||
btn.gui_button->setVisible(false);
|
btn.gui_button->setVisible(false);
|
||||||
btn.gui_button->setEnabled(false);
|
btn.gui_button->setEnabled(false);
|
||||||
btn.repeat_counter = -1.0f;
|
btn.repeat_counter = -1.0f;
|
||||||
|
@ -278,7 +260,7 @@ bool AutoHideButtonBar::isButton(const SEvent &event)
|
||||||
if (m_active) {
|
if (m_active) {
|
||||||
// check for all buttons in vector
|
// check for all buttons in vector
|
||||||
for (auto &button : m_buttons) {
|
for (auto &button : m_buttons) {
|
||||||
if (button.gui_button == element) {
|
if (button.gui_button.get() == element) {
|
||||||
SEvent translated{};
|
SEvent translated{};
|
||||||
translated.EventType = irr::EET_KEY_INPUT_EVENT;
|
translated.EventType = irr::EET_KEY_INPUT_EVENT;
|
||||||
translated.KeyInput.Key = button.keycode;
|
translated.KeyInput.Key = button.keycode;
|
||||||
|
@ -315,7 +297,7 @@ bool AutoHideButtonBar::isButton(const SEvent &event)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// check for starter button only
|
// check for starter button only
|
||||||
if (element == m_starter.gui_button) {
|
if (element == m_starter.gui_button.get()) {
|
||||||
m_starter.ids.push_back(event.TouchInput.ID);
|
m_starter.ids.push_back(event.TouchInput.ID);
|
||||||
m_starter.gui_button->setVisible(false);
|
m_starter.gui_button->setVisible(false);
|
||||||
m_starter.gui_button->setEnabled(false);
|
m_starter.gui_button->setEnabled(false);
|
||||||
|
@ -532,8 +514,7 @@ void TouchScreenGUI::initButton(touch_gui_button_id id, const rect<s32> &button_
|
||||||
IGUIButton *btn_gui_button = m_guienv->addButton(button_rect, nullptr, id, caption.c_str());
|
IGUIButton *btn_gui_button = m_guienv->addButton(button_rect, nullptr, id, caption.c_str());
|
||||||
|
|
||||||
button_info &btn = m_buttons[id];
|
button_info &btn = m_buttons[id];
|
||||||
btn.gui_button = btn_gui_button;
|
btn.gui_button.grab(btn_gui_button);
|
||||||
btn.gui_button->grab();
|
|
||||||
btn.repeat_counter = -1.0f;
|
btn.repeat_counter = -1.0f;
|
||||||
btn.repeat_delay = repeat_delay;
|
btn.repeat_delay = repeat_delay;
|
||||||
btn.keycode = id_to_keycode(id);
|
btn.keycode = id_to_keycode(id);
|
||||||
|
@ -550,9 +531,8 @@ button_info TouchScreenGUI::initJoystickButton(touch_gui_button_id id,
|
||||||
IGUIButton *btn_gui_button = m_guienv->addButton(button_rect, nullptr, id, L"O");
|
IGUIButton *btn_gui_button = m_guienv->addButton(button_rect, nullptr, id, L"O");
|
||||||
|
|
||||||
button_info btn;
|
button_info btn;
|
||||||
btn.gui_button = btn_gui_button;
|
btn.gui_button.grab(btn_gui_button);
|
||||||
btn.gui_button->setVisible(visible);
|
btn.gui_button->setVisible(visible);
|
||||||
btn.gui_button->grab();
|
|
||||||
btn.ids.clear();
|
btn.ids.clear();
|
||||||
|
|
||||||
load_button_texture(btn, joystick_image_names[texture_id], button_rect,
|
load_button_texture(btn, joystick_image_names[texture_id], button_rect,
|
||||||
|
@ -571,7 +551,7 @@ touch_gui_button_id TouchScreenGUI::getButtonID(s32 x, s32 y)
|
||||||
|
|
||||||
if (element)
|
if (element)
|
||||||
for (unsigned int i = 0; i < after_last_element_id; i++)
|
for (unsigned int i = 0; i < after_last_element_id; i++)
|
||||||
if (element == m_buttons[i].gui_button)
|
if (element == m_buttons[i].gui_button.get())
|
||||||
return (touch_gui_button_id) i;
|
return (touch_gui_button_id) i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -922,31 +902,6 @@ void TouchScreenGUI::applyJoystickStatus()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TouchScreenGUI::~TouchScreenGUI()
|
|
||||||
{
|
|
||||||
for (auto &button : m_buttons) {
|
|
||||||
if (button.gui_button) {
|
|
||||||
button.gui_button->drop();
|
|
||||||
button.gui_button = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_joystick_btn_off.gui_button) {
|
|
||||||
m_joystick_btn_off.gui_button->drop();
|
|
||||||
m_joystick_btn_off.gui_button = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_joystick_btn_bg.gui_button) {
|
|
||||||
m_joystick_btn_bg.gui_button->drop();
|
|
||||||
m_joystick_btn_bg.gui_button = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_joystick_btn_center.gui_button) {
|
|
||||||
m_joystick_btn_center.gui_button->drop();
|
|
||||||
m_joystick_btn_center.gui_button = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TouchScreenGUI::step(float dtime)
|
void TouchScreenGUI::step(float dtime)
|
||||||
{
|
{
|
||||||
// simulate keyboard repeats
|
// simulate keyboard repeats
|
||||||
|
|
|
@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "irr_ptr.h"
|
||||||
#include "irrlichttypes.h"
|
#include "irrlichttypes.h"
|
||||||
#include <IEventReceiver.h>
|
#include <IEventReceiver.h>
|
||||||
#include <IGUIButton.h>
|
#include <IGUIButton.h>
|
||||||
|
@ -97,7 +98,7 @@ struct button_info
|
||||||
float repeat_delay;
|
float repeat_delay;
|
||||||
EKEY_CODE keycode;
|
EKEY_CODE keycode;
|
||||||
std::vector<size_t> ids;
|
std::vector<size_t> ids;
|
||||||
IGUIButton *gui_button = nullptr;
|
irr_ptr<IGUIButton> gui_button = nullptr;
|
||||||
bool immediate_release;
|
bool immediate_release;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -115,8 +116,6 @@ public:
|
||||||
const std::string &starter_img, touch_gui_button_id starter_id,
|
const std::string &starter_img, touch_gui_button_id starter_id,
|
||||||
core::recti starter_rect, autohide_button_bar_dir dir, float timeout);
|
core::recti starter_rect, autohide_button_bar_dir dir, float timeout);
|
||||||
|
|
||||||
~AutoHideButtonBar();
|
|
||||||
|
|
||||||
// add button to be shown
|
// add button to be shown
|
||||||
void addButton(touch_gui_button_id id, const wchar_t *caption,
|
void addButton(touch_gui_button_id id, const wchar_t *caption,
|
||||||
const std::string &btn_image);
|
const std::string &btn_image);
|
||||||
|
@ -170,7 +169,6 @@ class TouchScreenGUI
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TouchScreenGUI(IrrlichtDevice *device, ISimpleTextureSource *tsrc);
|
TouchScreenGUI(IrrlichtDevice *device, ISimpleTextureSource *tsrc);
|
||||||
~TouchScreenGUI();
|
|
||||||
|
|
||||||
void translateEvent(const SEvent &event);
|
void translateEvent(const SEvent &event);
|
||||||
void applyContextControls(const TouchInteractionMode &mode);
|
void applyContextControls(const TouchInteractionMode &mode);
|
||||||
|
|
Loading…
Reference in New Issue