# HG changeset patch # User koda # Date 1308359685 -7200 # Node ID ded882439548d416e768d39e68a2a2c6180adf74 # Parent f31d1073345e7564d9f6cb9e31282264d2870b44 file association for mac! associating file is done automatically when you move the app in your system but there is also a button to set it manually i had to disable argument parsing and to subclass qapplication to make this work please test diff -r f31d1073345e -r ded882439548 QTfrontend/CMakeLists.txt --- a/QTfrontend/CMakeLists.txt Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/CMakeLists.txt Sat Jun 18 03:14:45 2011 +0200 @@ -46,6 +46,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/hwconsts.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/hwconsts.cpp) set(hwfr_src + HWApplication.cpp game.cpp main.cpp hwform.cpp @@ -130,6 +131,7 @@ endif(MINGW) set(hwfr_moc_hdrs + HWApplication.h game.h hats.h hwform.h diff -r f31d1073345e -r ded882439548 QTfrontend/HWApplication.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/HWApplication.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -0,0 +1,45 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2005-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "HWApplication.h" +#include + +#include "hwform.h" + +HWApplication::HWApplication(int argc, char **argv): + QApplication(argc,argv) +{ + +} + +bool HWApplication::event(QEvent *event) { + QFileOpenEvent *openEvent; + switch (event->type()) { + case QEvent::FileOpen: + openEvent = (QFileOpenEvent *)event; + form->PlayDemoQuick(openEvent->file()); + + return true; + break; + default: + return QApplication::event(event); + break; + } +} + + diff -r f31d1073345e -r ded882439548 QTfrontend/HWApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/HWApplication.h Sat Jun 18 03:14:45 2011 +0200 @@ -0,0 +1,42 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2005-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef HWAPP_H +#define HWAPP_H + +#include +#include +#include + +class HWForm; + +class HWApplication : public QApplication +{ + Q_OBJECT +public: + HWApplication(int argc, char **argv); + ~HWApplication() {}; + + HWForm *form; + QString *fileToLoad; +protected: + bool event(QEvent *); +}; + +#endif + diff -r f31d1073345e -r ded882439548 QTfrontend/SDLs.cpp --- a/QTfrontend/SDLs.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/SDLs.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -21,8 +21,7 @@ #include "SDL.h" #include "SDL_mixer.h" #include "hwconsts.h" - -#include +#include "HWApplication.h" extern char sdlkeys[1024][2][128]; @@ -101,38 +100,38 @@ for(int aid = 0; aid < SDL_JoystickNumAxes(joy) && i < 1021; aid++) { // Again store the part of the string not changing for multiple uses - QString axis = prefix + QApplication::translate("binds (keys)", "Axis") + QString(" %1 ").arg(aid + 1); + QString axis = prefix + HWApplication::translate("binds (keys)", "Axis") + QString(" %1 ").arg(aid + 1); // Entry for "Axis Up" sprintf(sdlkeys[i][0], "j%da%du", jid, aid); - sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + QApplication::translate("binds (keys)", xbox360axes[aid * 2])) : axis + QApplication::translate("binds (keys)", "(Up)")).toStdString().c_str()); + sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2])) : axis + HWApplication::translate("binds (keys)", "(Up)")).toStdString().c_str()); // Entry for "Axis Down" sprintf(sdlkeys[i][0], "j%da%dd", jid, aid); - sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + QApplication::translate("binds (keys)", xbox360axes[aid * 2 + 1])) : axis + QApplication::translate("binds (keys)", "(Down)")).toStdString().c_str()); + sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2 + 1])) : axis + HWApplication::translate("binds (keys)", "(Down)")).toStdString().c_str()); } // Register entries for all coolie hats of this joystick/gamepad for(int hid = 0; hid < SDL_JoystickNumHats(joy) && i < 1019; hid++) { // Again store the part of the string not changing for multiple uses - QString hat = prefix + (isxb ? (QApplication::translate("binds (keys)", xb360dpad) + QString(" ")) : QApplication::translate("binds (keys)", "Hat") + QString(" %1 ").arg(hid + 1)); + QString hat = prefix + (isxb ? (HWApplication::translate("binds (keys)", xb360dpad) + QString(" ")) : HWApplication::translate("binds (keys)", "Hat") + QString(" %1 ").arg(hid + 1)); // Entry for "Hat Up" sprintf(sdlkeys[i][0], "j%dh%du", jid, hid); - sprintf(sdlkeys[i++][1], "%s", (hat + QApplication::translate("binds (keys)", "(Up)")).toStdString().c_str()); + sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Up)")).toStdString().c_str()); // Entry for "Hat Down" sprintf(sdlkeys[i][0], "j%dh%dd", jid, hid); - sprintf(sdlkeys[i++][1], "%s", (hat + QApplication::translate("binds (keys)", "(Down)")).toStdString().c_str()); + sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Down)")).toStdString().c_str()); // Entry for "Hat Left" sprintf(sdlkeys[i][0], "j%dh%dl", jid, hid); - sprintf(sdlkeys[i++][1], "%s", (hat + QApplication::translate("binds (keys)", "(Left)")).toStdString().c_str()); + sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Left)")).toStdString().c_str()); // Entry for "Hat Right" sprintf(sdlkeys[i][0], "j%dh%dr", jid, hid); - sprintf(sdlkeys[i++][1], "%s", (hat + QApplication::translate("binds (keys)", "(Right)")).toStdString().c_str()); + sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Right)")).toStdString().c_str()); } // Register entries for all buttons of this joystick/gamepad @@ -140,7 +139,7 @@ { // Buttons sprintf(sdlkeys[i][0], "j%db%d", jid, bid); - sprintf(sdlkeys[i++][1], "%s", (prefix + ((isxb && bid < 10) ? (QApplication::translate("binds (keys)", xb360buttons[bid]) + QString(" ")) : QApplication::translate("binds (keys)", "Button") + QString(" %1").arg(bid + 1))).toStdString().c_str()); + sprintf(sdlkeys[i++][1], "%s", (prefix + ((isxb && bid < 10) ? (HWApplication::translate("binds (keys)", xb360buttons[bid]) + QString(" ")) : HWApplication::translate("binds (keys)", "Button") + QString(" %1").arg(bid + 1))).toStdString().c_str()); } // Close the game controller as we no longer need it SDL_JoystickClose(joy); diff -r f31d1073345e -r ded882439548 QTfrontend/chatwidget.cpp --- a/QTfrontend/chatwidget.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/chatwidget.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include diff -r f31d1073345e -r ded882439548 QTfrontend/drawmapwidget.cpp --- a/QTfrontend/drawmapwidget.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/drawmapwidget.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -18,6 +18,7 @@ #include #include +#include #include "drawmapwidget.h" diff -r f31d1073345e -r ded882439548 QTfrontend/drawmapwidget.h --- a/QTfrontend/drawmapwidget.h Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/drawmapwidget.h Sat Jun 18 03:14:45 2011 +0200 @@ -23,7 +23,6 @@ #include #include #include -#include #include "qaspectratiolayout.h" #include "drawmapscene.h" diff -r f31d1073345e -r ded882439548 QTfrontend/gameuiconfig.cpp --- a/QTfrontend/gameuiconfig.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/gameuiconfig.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -30,6 +29,7 @@ #include "pagenetserver.h" #include "hwconsts.h" #include "fpsedit.h" +#include "HWApplication.h" GameUIConfig::GameUIConfig(HWForm * FormWidgets, const QString & fileName) : QSettings(fileName, QSettings::IniFormat) @@ -97,7 +97,7 @@ Form->ui.pageOptions->CBLanguage->setCurrentIndex(Form->ui.pageOptions->CBLanguage->findData(value("misc/locale", "").toString())); - depth = QApplication::desktop()->depth(); + depth = HWApplication::desktop()->depth(); if (depth < 16) depth = 16; else if (depth > 16) depth = 32; } diff -r f31d1073345e -r ded882439548 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/hwform.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -182,9 +182,7 @@ connect(ui.pageOptions->BtnDeleteTeam, SIGNAL(clicked()), this, SLOT(DeleteTeam())); connect(ui.pageOptions->BtnSaveOptions, SIGNAL(clicked()), config, SLOT(SaveOptions())); connect(ui.pageOptions->BtnSaveOptions, SIGNAL(clicked()), this, SLOT(GoBack())); -#ifndef __APPLE__ connect(ui.pageOptions->BtnAssociateFiles, SIGNAL(clicked()), this, SLOT(AssociateFiles())); -#endif connect(ui.pageOptions->WeaponEdit, SIGNAL(clicked()), this, SLOT(GoToSelectWeapon())); connect(ui.pageOptions->WeaponNew, SIGNAL(clicked()), this, SLOT(GoToSelectNewWeapon())); @@ -713,12 +711,18 @@ tr("Error"), tr("Please select record from the list above"), tr("OK")); - return ; + return; } CreateGame(0, 0, 0); game->PlayDemo(curritem->data(Qt::UserRole).toString()); } +void HWForm::PlayDemoQuick(const QString & demofilename) +{ + CreateGame(0, 0, 0); + game->PlayDemo(demofilename); +} + void HWForm::NetConnectServer(const QString & host, quint16 port) { _NetConnect(host, port, ui.pageOptions->editNetNick->text().trimmed()); @@ -1253,8 +1257,10 @@ registry_hkcr.setValue("Hedgewars.Demo/Shell/Open/Command/Default", "\"" + bindir->absolutePath().replace("/", "\\") + "\\hwengine.exe\" \"" + cfgdir->absolutePath().replace("/","\\") + "\" \"" + datadir->absolutePath().replace("/", "\\") + "\" \"%1\" --set-everything "+arguments); registry_hkcr.setValue("Hedgewars.Save/Shell/Open/Command/Default", "\"" + bindir->absolutePath().replace("/", "\\") + "\\hwengine.exe\" \"" + cfgdir->absolutePath().replace("/","\\") + "\" \"" + datadir->absolutePath().replace("/", "\\") + "\" \"%1\" --set-everything "+arguments); #elif defined __APPLE__ - success = false; - // TODO; also enable button in pages.cpp and signal in hwform.cpp + // only useful when other apps have taken precedence over our file extensions and you want to reset it + system("defaults write com.apple.LaunchServices LSHandlers -array-add 'LSHandlerContentTaghwdLSHandlerContentTagClasspublic.filename-extensionLSHandlerRoleAllorg.hedgewars.desktop'"); + system("defaults write com.apple.LaunchServices LSHandlers -array-add 'LSHandlerContentTaghwsLSHandlerContentTagClasspublic.filename-extensionLSHandlerRoleAllorg.hedgewars.desktop'"); + system("/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -domain local -domain system -domain user"); #else // this is a little silly due to all the system commands below anyway - just use mkdir -p ? Does have the advantage of the alert I guess if (success) success = checkForDir(QDir::home().absolutePath() + "/.local"); diff -r f31d1073345e -r ded882439548 QTfrontend/hwform.h --- a/QTfrontend/hwform.h Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/hwform.h Sat Jun 18 03:14:45 2011 +0200 @@ -58,6 +58,7 @@ GameUIConfig * config; QSettings * gameSettings; // Same file GameUIConfig points to but without the baggage. Needs sync() calls if you want to get GameUIConfig changes though void updateXfire(); + void PlayDemoQuick(const QString & demofilename); private slots: void GoToSaves(); @@ -161,7 +162,7 @@ QSignalMapper * pageSwitchMapper; #ifdef __APPLE__ - InstallController * panel; + InstallController * panel; #endif void OnPageShown(quint8 id, quint8 lastid=0); diff -r f31d1073345e -r ded882439548 QTfrontend/main.cpp --- a/QTfrontend/main.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/main.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -16,7 +16,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#include +#include "HWApplication.h" + #include #include #include @@ -51,11 +52,14 @@ } int main(int argc, char *argv[]) { - QApplication app(argc, argv); + HWApplication app(argc, argv); app.setAttribute(Qt::AA_DontShowIconsInMenus,false); QStringList arguments = app.arguments(); QMap parsedArgs; +#ifndef __APPLE__ +//HACK: it's difficult/rarely done to use command line args on macs anyways +// but why does this section of code make the app crash when opening a file? { QList::iterator i = arguments.begin(); while(i != arguments.end()) { @@ -70,6 +74,7 @@ } } } +#endif if(parsedArgs.contains("data-dir")) { QFileInfo f(parsedArgs["data-dir"]); @@ -455,8 +460,8 @@ CocoaInitializer initializer; #endif - HWForm *Form = new HWForm(); + app.form = new HWForm(); - Form->show(); + app.form->show(); return app.exec(); } diff -r f31d1073345e -r ded882439548 QTfrontend/mapContainer.cpp --- a/QTfrontend/mapContainer.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/mapContainer.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -35,6 +34,7 @@ #include "hwconsts.h" #include "mapContainer.h" #include "igbox.h" +#include "HWApplication.h" HWMapContainer::HWMapContainer(QWidget * parent) : QWidget(parent), @@ -46,10 +46,10 @@ hhLimit = 18; templateFilter = 0; - mainLayout.setContentsMargins(QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin), + mainLayout.setContentsMargins(HWApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin), 1, - QApplication::style()->pixelMetric(QStyle::PM_LayoutRightMargin), - QApplication::style()->pixelMetric(QStyle::PM_LayoutBottomMargin)); + HWApplication::style()->pixelMetric(QStyle::PM_LayoutRightMargin), + HWApplication::style()->pixelMetric(QStyle::PM_LayoutBottomMargin)); QWidget* mapWidget = new QWidget(this); mainLayout.addWidget(mapWidget, 0, 0, Qt::AlignHCenter); diff -r f31d1073345e -r ded882439548 QTfrontend/namegen.cpp --- a/QTfrontend/namegen.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/namegen.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -19,7 +19,6 @@ #include #include -#include #include #include #include "namegen.h" diff -r f31d1073345e -r ded882439548 QTfrontend/pageeditteam.cpp --- a/QTfrontend/pageeditteam.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/pageeditteam.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -24,13 +24,13 @@ #include #include #include -#include #include "pageeditteam.h" #include "sdlkeys.h" #include "hwconsts.h" #include "SquareLabel.h" #include "hats.h" +#include "HWApplication.h" PageEditTeam::PageEditTeam(QWidget* parent, SDLInteraction * sdli) : AbstractPage(parent) @@ -315,24 +315,24 @@ pagelayout->addWidget(l, num++, 0, 1, 2); } curW = new QWidget(this); - BindsBox->addItem(curW, QApplication::translate("binds (categories)", cbinds[i].category)); + BindsBox->addItem(curW, HWApplication::translate("binds (categories)", cbinds[i].category)); pagelayout = new QGridLayout(curW); num = 0; } if(cbinds[i].description != NULL) { l = new QLabel(curW); - l->setText((num > 0 ? QString("\n") : QString("")) + QApplication::translate("binds (descriptions)", cbinds[i].description)); + l->setText((num > 0 ? QString("\n") : QString("")) + HWApplication::translate("binds (descriptions)", cbinds[i].description)); pagelayout->addWidget(l, num++, 0, 1, 2); } l = new QLabel(curW); - l->setText(QApplication::translate("binds", cbinds[i].name)); + l->setText(HWApplication::translate("binds", cbinds[i].name)); l->setAlignment(Qt::AlignRight); pagelayout->addWidget(l, num, 0); CBBind[i] = new QComboBox(curW); for(int j = 0; sdlkeys[j][1][0] != '\0'; j++) - CBBind[i]->addItem(QApplication::translate("binds (keys)", sdlkeys[j][1]).contains(": ") ? QApplication::translate("binds (keys)", sdlkeys[j][1]) : QApplication::translate("binds (keys)", "Keyboard") + QString(": ") + QApplication::translate("binds (keys)", sdlkeys[j][1]), sdlkeys[j][0]); + CBBind[i]->addItem(HWApplication::translate("binds (keys)", sdlkeys[j][1]).contains(": ") ? HWApplication::translate("binds (keys)", sdlkeys[j][1]) : HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + HWApplication::translate("binds (keys)", sdlkeys[j][1]), sdlkeys[j][0]); pagelayout->addWidget(CBBind[i++], num++, 1); } } diff -r f31d1073345e -r ded882439548 QTfrontend/pageoptions.cpp --- a/QTfrontend/pageoptions.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/pageoptions.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -239,16 +239,15 @@ CBNameWithDate->setText(QCheckBox::tr("Append date and time to record file name")); MiscLayout->addWidget(CBNameWithDate, 4, 0, 1, 2); -#ifdef SPARKLE_ENABLED - CBAutoUpdate = new QCheckBox(groupMisc); - CBAutoUpdate->setText(QCheckBox::tr("Check for updates at startup")); - MiscLayout->addWidget(CBAutoUpdate, 5, 0, 1, 2); -#endif -#ifndef __APPLE__ BtnAssociateFiles = new QPushButton(groupMisc); BtnAssociateFiles->setText(QPushButton::tr("Associate file extensions")); BtnAssociateFiles->setEnabled(!custom_data && !custom_config); MiscLayout->addWidget(BtnAssociateFiles, 5, 0, 1, 2); + +#ifdef __APPLE__ && SPARKLE_ENABLED + CBAutoUpdate = new QCheckBox(groupMisc); + CBAutoUpdate->setText(QCheckBox::tr("Check for updates at startup")); + MiscLayout->addWidget(CBAutoUpdate, 6, 0, 1, 3); #endif gbTBLayout->addWidget(groupMisc, 2, 0); } diff -r f31d1073345e -r ded882439548 QTfrontend/team.cpp --- a/QTfrontend/team.cpp Wed Jun 15 23:59:44 2011 +0200 +++ b/QTfrontend/team.cpp Sat Jun 18 03:14:45 2011 +0200 @@ -18,11 +18,11 @@ #include #include -#include #include #include #include #include + #include "team.h" #include "hwform.h" #include "pageeditteam.h" diff -r f31d1073345e -r ded882439548 share/CMakeLists.txt --- a/share/CMakeLists.txt Wed Jun 15 23:59:44 2011 +0200 +++ b/share/CMakeLists.txt Sat Jun 18 03:14:45 2011 +0200 @@ -20,6 +20,8 @@ DESTINATION ../) install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/Icon.icns" DESTINATION ../Resources/) + install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/hwico.icns" + DESTINATION ../Resources/) install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/dsa_pub.pem" DESTINATION ../Resources/) ENDIF(APPLE) diff -r f31d1073345e -r ded882439548 share/Info.plist.in --- a/share/Info.plist.in Wed Jun 15 23:59:44 2011 +0200 +++ b/share/Info.plist.in Sat Jun 18 03:14:45 2011 +0200 @@ -75,5 +75,81 @@ zh_CN zh_TW + UTExportedTypeDeclarations + + + UTTypeIdentifier + org.hedgewars.desktop.hws + UTTypeReferenceURL + http://www.hedgewars.org/demos/ + UTTypeDescription + Hedgewars Save Game + UTTypeIconFile + public.text.icns + UTTypeConformsTo + + public.data + + UTTypeTagSpecification + + public.filename-extension + + hws + + public.mime-type + application/x-hedgewars-save + + + + UTTypeIdentifier + org.hedgewars.desktop.hwd + UTTypeReferenceURL + http://www.hedgewars.org/demos/ + UTTypeIconFile + public.text.icns + UTTypeDescription + Hedgewars Demo Game + UTTypeConformsTo + + public.data + + UTTypeTagSpecification + + public.filename-extension + + hwd + + public.mime-type + application/x-hedgewars-demo + + + + CFBundleDocumentTypes + + + CFBundleTypeIconFile + hwico.icns + CFBundleTypeName + Hedgewars Savefile + LSItemContentTypes + + org.hedgewars.desktop.hws + + CFBundleTypeRole + Editor + + + CFBundleTypeIconFile + hwico.icns + CFBundleTypeName + Hedgewars Demofile + LSItemContentTypes + + org.hedgewars.desktop.hwd + + CFBundleTypeRole + Viewer + + diff -r f31d1073345e -r ded882439548 share/hwico.icns Binary file share/hwico.icns has changed