Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow taking screenshots of formspecs and move message to chat #1672

Merged
merged 1 commit into from Sep 21, 2014
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.
+53 −40
Diff settings

Always

Just for now

@@ -2538,16 +2538,14 @@ void Client::typeChatMessage(const std::wstring &message)
// Show locally
if (message[0] == L'/')
{
m_chat_queue.push_back(
(std::wstring)L"issued command: "+message);
m_chat_queue.push_back((std::wstring)L"issued command: " + message);
}
else
{
LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
std::wstring name = narrow_to_wide(player->getName());
m_chat_queue.push_back(
(std::wstring)L"<"+name+L"> "+message);
m_chat_queue.push_back((std::wstring)L"<" + name + L"> " + message);
}
}

@@ -2732,6 +2730,34 @@ float Client::getAvgRate(void)
m_con.getLocalStat(con::AVG_DL_RATE));
}

void Client::makeScreenshot(IrrlichtDevice *device)
{
irr::video::IVideoDriver *driver = device->getVideoDriver();
irr::video::IImage* const raw_image = driver->createScreenShot();
if (raw_image) {
irr::video::IImage* const image = driver->createImage(video::ECF_R8G8B8,
raw_image->getDimension());

if (image) {
raw_image->copyTo(image);
irr::c8 filename[256];
snprintf(filename, sizeof(filename), "%s" DIR_DELIM "screenshot_%u.png",
g_settings->get("screenshot_path").c_str(),
device->getTimer()->getRealTime());
std::stringstream sstr;
if (driver->writeImageToFile(image, filename)) {
sstr << "Saved screenshot to '" << filename << "'";
} else {
sstr << "Failed to save screenshot '" << filename << "'";
}
m_chat_queue.push_back(narrow_to_wide(sstr.str()));
infostream << sstr << std::endl;
image->drop();
}
raw_image->drop();
}
}

// IGameDef interface
// Under envlock
IItemDefManager* Client::getItemDefManager()
@@ -464,6 +464,8 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef

LocalClientState getState() { return m_state; }

void makeScreenshot(IrrlichtDevice *device);

private:

// Virtual methods from con::PeerHandler
@@ -933,12 +933,12 @@ bool nodePlacementPrediction(Client &client,
static inline void create_formspec_menu(GUIFormSpecMenu** cur_formspec,
InventoryManager *invmgr, IGameDef *gamedef,
IWritableTextureSource* tsrc, IrrlichtDevice * device,
IFormSource* fs_src, TextDest* txt_dest
IFormSource* fs_src, TextDest* txt_dest, Client* client
) {

if (*cur_formspec == 0) {
*cur_formspec = new GUIFormSpecMenu(device, guiroot, -1, &g_menumgr,
invmgr, gamedef, tsrc, fs_src, txt_dest, cur_formspec );
invmgr, gamedef, tsrc, fs_src, txt_dest, cur_formspec, client);
(*cur_formspec)->doPause = false;
(*cur_formspec)->drop();
}
@@ -972,7 +972,7 @@ static void show_chat_menu(GUIFormSpecMenu** cur_formspec,
FormspecFormSource* fs_src = new FormspecFormSource(formspec);
LocalFormspecHandler* txt_dst = new LocalFormspecHandler("MT_CHAT_MENU", client);

create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst);
create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst, NULL);
}

static void show_deathscreen(GUIFormSpecMenu** cur_formspec,
@@ -993,7 +993,7 @@ static void show_deathscreen(GUIFormSpecMenu** cur_formspec,
FormspecFormSource* fs_src = new FormspecFormSource(formspec);
LocalFormspecHandler* txt_dst = new LocalFormspecHandler("MT_DEATH_SCREEN", client);

create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst);
create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst, NULL);
}

/******************************************************************************/
@@ -1060,7 +1060,7 @@ static void show_pause_menu(GUIFormSpecMenu** cur_formspec,
FormspecFormSource* fs_src = new FormspecFormSource(os.str());
LocalFormspecHandler* txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU");

create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst);
create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst, NULL);

(*cur_formspec)->doPause = true;
}
@@ -1966,7 +1966,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
PlayerInventoryFormSource* fs_src = new PlayerInventoryFormSource(&client);
TextDest* txt_dst = new TextDestPlayerInventory(&client);

create_formspec_menu(&current_formspec, &client, gamedef, tsrc, device, fs_src, txt_dst);
create_formspec_menu(&current_formspec, &client, gamedef, tsrc, device, fs_src, txt_dst, &client);

InventoryLocation inventoryloc;
inventoryloc.setCurrentPlayer();
@@ -2070,30 +2070,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
}
else if(input->wasKeyDown(getKeySetting("keymap_screenshot")))
{
irr::video::IImage* const raw_image = driver->createScreenShot();
if (raw_image) {
irr::video::IImage* const image = driver->createImage(video::ECF_R8G8B8,
raw_image->getDimension());

if (image) {
raw_image->copyTo(image);
irr::c8 filename[256];
snprintf(filename, sizeof(filename), "%s" DIR_DELIM "screenshot_%u.png",
g_settings->get("screenshot_path").c_str(),
device->getTimer()->getRealTime());
if (driver->writeImageToFile(image, filename)) {
std::wstringstream sstr;
sstr << "Saved screenshot to '" << filename << "'";
infostream << "Saved screenshot to '" << filename << "'" << std::endl;
statustext = sstr.str();
statustext_time = 0;
} else {
infostream << "Failed to save screenshot '" << filename << "'" << std::endl;
}
image->drop();
}
raw_image->drop();
}
client.makeScreenshot(device);
}
else if(input->wasKeyDown(getKeySetting("keymap_toggle_hud")))
{
@@ -2483,7 +2460,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
new TextDestPlayerInventory(&client,*(event.show_formspec.formname));

create_formspec_menu(&current_formspec, &client, gamedef,
tsrc, device, fs_src, txt_dst);
tsrc, device, fs_src, txt_dst, &client);

delete(event.show_formspec.formspec);
delete(event.show_formspec.formname);
@@ -3033,7 +3010,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
TextDest* txt_dst = new TextDestNodeMetadata(nodepos, &client);

create_formspec_menu(&current_formspec, &client, gamedef,
tsrc, device, fs_src, txt_dst);
tsrc, device, fs_src, txt_dst, &client);

current_formspec->setFormSpec(meta->getString("formspec"), inventoryloc);
}
@@ -189,7 +189,7 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev,
m_texture_source,
m_formspecgui,
m_buttonhandler,
NULL);
NULL, NULL);

m_menu->allowClose(false);
m_menu->lockSize(true,v2u32(800,600));
@@ -49,6 +49,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "porting.h"
#include "main.h"
#include "settings.h"
#include "client.h"

#define MY_CHECKPOS(a,b) \
if (v_pos.size() != 2) { \
@@ -71,7 +72,7 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
gui::IGUIElement* parent, s32 id, IMenuManager *menumgr,
InventoryManager *invmgr, IGameDef *gamedef,
ISimpleTextureSource *tsrc, IFormSource* fsrc, TextDest* tdst,
GUIFormSpecMenu** ext_ptr) :
GUIFormSpecMenu** ext_ptr, Client* client) :
GUIModalMenu(dev->getGUIEnvironment(), parent, id, menumgr),
m_device(dev),
m_invmgr(invmgr),
@@ -88,7 +89,8 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
m_text_dst(tdst),
m_ext_ptr(ext_ptr),
m_font(dev->getGUIEnvironment()->getSkin()->getFont()),
m_formspec_version(0)
m_formspec_version(0),
m_client(client)
#ifdef __ANDROID__
,m_JavaDialogFieldName(L"")
#endif
@@ -2912,6 +2914,9 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
m_text_dst->gotText(narrow_to_wide("MenuQuit"));
}
return true;
} else if (m_client != NULL && event.KeyInput.PressedDown &&
(kp == getKeySetting("keymap_screenshot"))) {
m_client->makeScreenshot(m_device);
}
if (event.KeyInput.PressedDown &&
(event.KeyInput.Key==KEY_RETURN ||
@@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class IGameDef;
class InventoryManager;
class ISimpleTextureSource;
class Client;

typedef enum {
f_Button,
@@ -209,7 +210,8 @@ class GUIFormSpecMenu : public GUIModalMenu
ISimpleTextureSource *tsrc,
IFormSource* fs_src,
TextDest* txt_dst,
GUIFormSpecMenu** ext_ptr
GUIFormSpecMenu** ext_ptr,
Client* client
);

~GUIFormSpecMenu();
@@ -294,6 +296,7 @@ class GUIFormSpecMenu : public GUIModalMenu
InventoryManager *m_invmgr;
IGameDef *m_gamedef;
ISimpleTextureSource *m_tsrc;
Client *m_client;

std::string m_formspec_string;
InventoryLocation m_current_inventory_location;
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.