summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
Diffstat (limited to 'platform')
-rw-r--r--platform/android/SCsub4
-rw-r--r--platform/android/export/export.cpp4
-rw-r--r--platform/android/java/res/drawable/icon.pngbin17135 -> 12574 bytes
-rw-r--r--platform/android/java/res/values-fa/strings.xml16
-rw-r--r--platform/android/java/src/com/android/godot/GodotPaymentV3.java60
-rw-r--r--platform/android/java/src/com/android/godot/GodotView.java23
-rw-r--r--platform/android/java/src/com/android/godot/payments/PaymentsManager.java123
-rw-r--r--platform/android/java/src/com/android/godot/payments/PurchaseTask.java8
-rw-r--r--platform/bb10/SCsub1
-rw-r--r--platform/bb10/os_bb10.cpp3
-rw-r--r--platform/flash/SCsub2
-rw-r--r--platform/haiku/os_haiku.cpp3
-rw-r--r--platform/iphone/app_delegate.mm2
-rw-r--r--platform/iphone/game_center.mm10
-rwxr-xr-xplatform/iphone/gl_view.mm10
-rw-r--r--platform/iphone/godot_iphone.cpp2
-rw-r--r--platform/iphone/icloud.mm6
-rw-r--r--platform/iphone/sem_iphone.cpp5
-rw-r--r--platform/iphone/view_controller.mm3
-rw-r--r--platform/nacl/html/icon_128.pngbin2255 -> 11146 bytes
-rw-r--r--platform/nacl/html/icon_16.pngbin850 -> 828 bytes
-rw-r--r--platform/server/os_server.cpp3
-rw-r--r--platform/windows/SCsub8
-rw-r--r--platform/windows/detect.py34
-rw-r--r--platform/windows/export/export.cpp343
-rw-r--r--platform/windows/export/export.h34
-rw-r--r--platform/windows/godot.icobin0 -> 370070 bytes
-rw-r--r--platform/windows/godot_res.rc33
-rw-r--r--platform/windows/os_windows.cpp108
-rw-r--r--platform/windows/packet_peer_udp_winsock.cpp21
-rw-r--r--platform/winrt/os_winrt.cpp31
-rw-r--r--platform/x11/os_x11.cpp5
32 files changed, 787 insertions, 118 deletions
diff --git a/platform/android/SCsub b/platform/android/SCsub
index 6feeb8b365..834ee58adc 100644
--- a/platform/android/SCsub
+++ b/platform/android/SCsub
@@ -62,10 +62,10 @@ pp_baseout.write( manifest )
for x in env.android_source_files:
- shutil.copy(x,abspath+"/java/src/com/android/godot")
+ shutil.copy(x,abspath+"/java/src/com/android/godot")
for x in env.android_module_libraries:
- shutil.copy(x,abspath+"/java/libs")
+ shutil.copy(x,abspath+"/java/libs")
env_android.SharedLibrary("#bin/libgodot",[android_objects],SHLIBSUFFIX=env["SHLIBSUFFIX"])
diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp
index f8fc03ec61..1deeb3457a 100644
--- a/platform/android/export/export.cpp
+++ b/platform/android/export/export.cpp
@@ -1123,6 +1123,10 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d
if (file=="lib/armeabi/libgodot_android.so" && !export_arm) {
skip=true;
}
+
+ if (file.begins_with("META-INF") && _signed) {
+ skip=true;
+ }
print_line("ADDING: "+file);
diff --git a/platform/android/java/res/drawable/icon.png b/platform/android/java/res/drawable/icon.png
index 78757e9035..013632ddf1 100644
--- a/platform/android/java/res/drawable/icon.png
+++ b/platform/android/java/res/drawable/icon.png
Binary files differ
diff --git a/platform/android/java/res/values-fa/strings.xml b/platform/android/java/res/values-fa/strings.xml
new file mode 100644
index 0000000000..450f9fe212
--- /dev/null
+++ b/platform/android/java/res/values-fa/strings.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="godot_project_name_string">godot-project-name-fa</string>
+ <string name="testuf8">سلام</string>
+ <string name="text_paused_cellular">آیا می خواهید بر روی اتصال داده همراه دانلود را شروع کنید؟ بر اساس نوع سطح داده شما این ممکن است برای شما هزینه مالی داشته باشد.</string>
+ <string name="text_paused_cellular_2">اگر نمی خواهید بر روی اتصال داده همراه دانلود را شروع کنید ، دانلود به صورت خودکار در زمان دسترسی به وای-فای شروع می شود.</string>
+ <string name="text_button_resume_cellular">ادامه دانلود</string>
+ <string name="text_button_wifi_settings">تنظیمات وای-فای</string>
+ <string name="text_verifying_download">درحال تایید دانلود</string>
+ <string name="text_validation_complete">تایید فایل XAPK تکمیل شد. برای خروج تایید کنید.</string>
+ <string name="text_validation_failed">اعتبارسنجی فایل XAPK ناموق.</string>
+ <string name="text_button_pause">توقف دانلود</string>
+ <string name="text_button_resume">ادامه دانلود</string>
+ <string name="text_button_cancel">انصراف</string>
+ <string name="text_button_cancel_verify">انصراف از تایید شدن</string>
+</resources>
diff --git a/platform/android/java/src/com/android/godot/GodotPaymentV3.java b/platform/android/java/src/com/android/godot/GodotPaymentV3.java
index 0fd102ac55..0799e1e83d 100644
--- a/platform/android/java/src/com/android/godot/GodotPaymentV3.java
+++ b/platform/android/java/src/com/android/godot/GodotPaymentV3.java
@@ -27,7 +27,7 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
activity.getPaymentsManager().requestPurchase(sku, transactionId);
}
});
- };
+ }
/* public string requestPurchasedTicket(){
activity.getPaymentsManager()
@@ -42,7 +42,7 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
public GodotPaymentV3(Activity p_activity) {
- registerClass("GodotPayments", new String[] {"purchase", "setPurchaseCallbackId", "setPurchaseValidationUrlPrefix", "setTransactionId", "getSignature", "consumeUnconsumedPurchases"});
+ registerClass("GodotPayments", new String[] {"purchase", "setPurchaseCallbackId", "setPurchaseValidationUrlPrefix", "setTransactionId", "getSignature", "consumeUnconsumedPurchases", "requestPurchased", "setAutoConsume", "consume"});
activity=(Godot) p_activity;
}
@@ -54,7 +54,6 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
activity.getPaymentsManager().consumeUnconsumedPurchases();
}
});
-
}
private String signature;
@@ -63,25 +62,26 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
}
- public void callbackSuccess(String ticket, String signature){
-// Log.d(this.getClass().getName(), "PRE-Send callback to purchase success");
- GodotLib.callobject(purchaseCallbackId, "purchase_success", new Object[]{ticket, signature});
-// Log.d(this.getClass().getName(), "POST-Send callback to purchase success");
+ public void callbackSuccess(String ticket, String signature, String sku){
+// Log.d(this.getClass().getName(), "PRE-Send callback to purchase success");
+ GodotLib.callobject(purchaseCallbackId, "purchase_success", new Object[]{ticket, signature, sku});
+// Log.d(this.getClass().getName(), "POST-Send callback to purchase success");
}
public void callbackSuccessProductMassConsumed(String ticket, String signature, String sku){
-// Log.d(this.getClass().getName(), "PRE-Send callback to consume success");
- GodotLib.calldeferred(purchaseCallbackId, "consume_success", new Object[]{ticket, signature, sku});
-// Log.d(this.getClass().getName(), "POST-Send callback to consume success");
+// Log.d(this.getClass().getName(), "PRE-Send callback to consume success");
+ Log.d(this.getClass().getName(), "callbackSuccessProductMassConsumed > "+ticket+","+signature+","+sku);
+ GodotLib.calldeferred(purchaseCallbackId, "consume_success", new Object[]{ticket, signature, sku});
+// Log.d(this.getClass().getName(), "POST-Send callback to consume success");
}
public void callbackSuccessNoUnconsumedPurchases(){
- GodotLib.calldeferred(purchaseCallbackId, "no_validation_required", new Object[]{});
+ GodotLib.calldeferred(purchaseCallbackId, "no_validation_required", new Object[]{});
}
public void callbackFail(){
- GodotLib.calldeferred(purchaseCallbackId, "purchase_fail", new Object[]{});
-// GodotLib.callobject(purchaseCallbackId, "purchase_fail", new Object[]{});
+ GodotLib.calldeferred(purchaseCallbackId, "purchase_fail", new Object[]{});
+// GodotLib.callobject(purchaseCallbackId, "purchase_fail", new Object[]{});
}
public void callbackCancel(){
@@ -89,6 +89,10 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
// GodotLib.callobject(purchaseCallbackId, "purchase_cancel", new Object[]{});
}
+ public void callbackAlreadyOwned(String sku){
+ GodotLib.calldeferred(purchaseCallbackId, "purchase_owned", new Object[]{sku});
+ }
+
public int getPurchaseCallbackId() {
return purchaseCallbackId;
}
@@ -97,8 +101,6 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
this.purchaseCallbackId = purchaseCallbackId;
}
-
-
public String getPurchaseValidationUrlPrefix(){
return this.purchaseValidationUrlPrefix ;
}
@@ -107,12 +109,10 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
this.purchaseValidationUrlPrefix = url;
}
-
public String getAccessToken() {
return accessToken;
}
-
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
@@ -125,4 +125,30 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
return this.transactionId;
}
+ // request purchased items are not consumed
+ public void requestPurchased(){
+ activity.getPaymentsManager().setBaseSingleton(this);
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ activity.getPaymentsManager().requestPurchased();
+ }
+ });
+ }
+
+ // callback for requestPurchased()
+ public void callbackPurchased(String receipt, String signature, String sku){
+ GodotLib.calldeferred(purchaseCallbackId, "has_purchased", new Object[]{receipt, signature, sku});
+ }
+
+ // consume item automatically after purchase. default is true.
+ public void setAutoConsume(boolean autoConsume){
+ activity.getPaymentsManager().setAutoConsume(autoConsume);
+ }
+
+ // consume a specific item
+ public void consume(String sku){
+ activity.getPaymentsManager().consume(sku);
+ }
}
+
diff --git a/platform/android/java/src/com/android/godot/GodotView.java b/platform/android/java/src/com/android/godot/GodotView.java
index ad0354e624..1a84923065 100644
--- a/platform/android/java/src/com/android/godot/GodotView.java
+++ b/platform/android/java/src/com/android/godot/GodotView.java
@@ -371,8 +371,8 @@ public class GodotView extends GLSurfaceView {
if (use_32) {
setEGLConfigChooser( translucent ?
- new ConfigChooser(8, 8, 8, 8, 24, stencil) :
- new ConfigChooser(8, 8, 8, 8, 24, stencil) );
+ new FallbackConfigChooser(8, 8, 8, 8, 24, stencil, new ConfigChooser(8, 8, 8, 8, 16, stencil)) :
+ new FallbackConfigChooser(8, 8, 8, 8, 24, stencil, new ConfigChooser(5, 6, 5, 0, 16, stencil)) );
} else {
setEGLConfigChooser( translucent ?
@@ -410,6 +410,25 @@ public class GodotView extends GLSurfaceView {
Log.e(TAG, String.format("%s: EGL error: 0x%x", prompt, error));
}
}
+ /* Fallback if 32bit View is not supported*/
+ private static class FallbackConfigChooser extends ConfigChooser {
+ private ConfigChooser fallback;
+
+ public FallbackConfigChooser(int r, int g, int b, int a, int depth, int stencil, ConfigChooser fallback) {
+ super(r, g, b, a, depth, stencil);
+ this.fallback = fallback;
+ }
+
+ @Override
+ public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs) {
+ EGLConfig ec = super.chooseConfig(egl, display, configs);
+ if (ec == null) {
+ Log.w(TAG, "Trying ConfigChooser fallback");
+ ec = fallback.chooseConfig(egl, display, configs);
+ }
+ return ec;
+ }
+ }
private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser {
diff --git a/platform/android/java/src/com/android/godot/payments/PaymentsManager.java b/platform/android/java/src/com/android/godot/payments/PaymentsManager.java
index 5bf86d0b69..189f7108c1 100644
--- a/platform/android/java/src/com/android/godot/payments/PaymentsManager.java
+++ b/platform/android/java/src/com/android/godot/payments/PaymentsManager.java
@@ -25,10 +25,8 @@ import com.android.vending.billing.IInAppBillingService;
public class PaymentsManager {
public static final int BILLING_RESPONSE_RESULT_OK = 0;
-
-
public static final int REQUEST_CODE_FOR_PURCHASE = 0x1001;
-
+ private static boolean auto_consume = true;
private Activity activity;
IInAppBillingService mService;
@@ -69,13 +67,12 @@ public class PaymentsManager {
}
@Override
- public void onServiceConnected(ComponentName name,
- IBinder service) {
- mService = IInAppBillingService.Stub.asInterface(service);
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ mService = IInAppBillingService.Stub.asInterface(service);
}
};
- public void requestPurchase(String sku, String transactionId){
+ public void requestPurchase(final String sku, String transactionId){
new PurchaseTask(mService, Godot.getInstance()) {
@Override
@@ -88,6 +85,12 @@ public class PaymentsManager {
protected void canceled() {
godotPaymentV3.callbackCancel();
}
+
+ @Override
+ protected void alreadyOwned() {
+ godotPaymentV3.callbackAlreadyOwned(sku);
+ }
+
}.purchase(sku, transactionId);
}
@@ -114,26 +117,82 @@ public class PaymentsManager {
}.consumeItAll();
}
+ public void requestPurchased(){
+ try{
+ PaymentsCache pc = new PaymentsCache(Godot.getInstance());
+
+// Log.d("godot", "requestPurchased for " + activity.getPackageName());
+ Bundle bundle = mService.getPurchases(3, activity.getPackageName(), "inapp",null);
+
+/*
+ for (String key : bundle.keySet()) {
+ Object value = bundle.get(key);
+ Log.d("godot", String.format("%s %s (%s)", key, value.toString(), value.getClass().getName()));
+ }
+*/
+
+ if (bundle.getInt("RESPONSE_CODE") == 0){
+
+ final ArrayList<String> myPurchases = bundle.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
+ final ArrayList<String> mySignatures = bundle.getStringArrayList("INAPP_DATA_SIGNATURE_LIST");
+
+
+ if (myPurchases == null || myPurchases.size() == 0){
+// Log.d("godot", "No purchases!");
+ godotPaymentV3.callbackPurchased("", "", "");
+ return;
+ }
+
+// Log.d("godot", "# products are purchased:" + myPurchases.size());
+ for (int i=0;i<myPurchases.size();i++)
+ {
+
+ try{
+ String receipt = myPurchases.get(i);
+ JSONObject inappPurchaseData = new JSONObject(receipt);
+ String sku = inappPurchaseData.getString("productId");
+ String token = inappPurchaseData.getString("purchaseToken");
+ String signature = mySignatures.get(i);
+// Log.d("godot", "purchased item:" + token + "\n" + receipt);
+
+ pc.setConsumableValue("ticket_signautre", sku, signature);
+ pc.setConsumableValue("ticket", sku, receipt);
+ pc.setConsumableFlag("block", sku, true);
+ pc.setConsumableValue("token", sku, token);
+
+ godotPaymentV3.callbackPurchased(receipt, signature, sku);
+ } catch (JSONException e) {
+ }
+ }
+
+ }
+ }catch(Exception e){
+ Log.d("godot", "Error requesting purchased products:" + e.getClass().getName() + ":" + e.getMessage());
+ }
+ }
+
public void processPurchaseResponse(int resultCode, Intent data) {
new HandlePurchaseTask(activity){
@Override
protected void success(final String sku, final String signature, final String ticket) {
- godotPaymentV3.callbackSuccess(ticket, signature);
- new ConsumeTask(mService, activity) {
+ godotPaymentV3.callbackSuccess(ticket, signature, sku);
+
+ if (auto_consume){
+ new ConsumeTask(mService, activity) {
- @Override
- protected void success(String ticket) {
-// godotPaymentV3.callbackSuccess("");
- }
+ @Override
+ protected void success(String ticket) {
+// godotPaymentV3.callbackSuccess("");
+ }
- @Override
- protected void error(String message) {
- godotPaymentV3.callbackFail();
+ @Override
+ protected void error(String message) {
+ godotPaymentV3.callbackFail();
- }
- }.consume(sku);
-
+ }
+ }.consume(sku);
+ }
// godotPaymentV3.callbackSuccess(new PaymentsCache(activity).getConsumableValue("ticket", sku),signature);
// godotPaymentV3.callbackSuccess(ticket);
@@ -151,7 +210,7 @@ public class PaymentsManager {
godotPaymentV3.callbackCancel();
}
- }.handlePurchaseRequest(resultCode, data);
+ }.handlePurchaseRequest(resultCode, data);
}
public void validatePurchase(String purchaseToken, final String sku){
@@ -165,7 +224,7 @@ public class PaymentsManager {
@Override
protected void success(String ticket) {
- godotPaymentV3.callbackSuccess(ticket, null);
+ godotPaymentV3.callbackSuccess(ticket, null, sku);
}
@@ -192,11 +251,31 @@ public class PaymentsManager {
}.validatePurchase(sku);
}
+ public void setAutoConsume(boolean autoConsume){
+ auto_consume = autoConsume;
+ }
+
+ public void consume(final String sku){
+ new ConsumeTask(mService, activity) {
+
+ @Override
+ protected void success(String ticket) {
+ godotPaymentV3.callbackSuccessProductMassConsumed(ticket, "", sku);
+
+ }
+
+ @Override
+ protected void error(String message) {
+ godotPaymentV3.callbackFail();
+
+ }
+ }.consume(sku);
+ }
+
private GodotPaymentV3 godotPaymentV3;
public void setBaseSingleton(GodotPaymentV3 godotPaymentV3) {
this.godotPaymentV3 = godotPaymentV3;
-
}
}
diff --git a/platform/android/java/src/com/android/godot/payments/PurchaseTask.java b/platform/android/java/src/com/android/godot/payments/PurchaseTask.java
index 75662a442e..c1f9d164a1 100644
--- a/platform/android/java/src/com/android/godot/payments/PurchaseTask.java
+++ b/platform/android/java/src/com/android/godot/payments/PurchaseTask.java
@@ -62,7 +62,11 @@ abstract public class PurchaseTask {
// Log.d("XXX", "Buy intent response code: " + responseCode);
if(responseCode == 1 || responseCode == 3 || responseCode == 4){
canceled();
- return ;
+ return;
+ }
+ if(responseCode == 7){
+ alreadyOwned();
+ return;
}
@@ -92,6 +96,6 @@ abstract public class PurchaseTask {
abstract protected void error(String message);
abstract protected void canceled();
-
+ abstract protected void alreadyOwned();
}
diff --git a/platform/bb10/SCsub b/platform/bb10/SCsub
index 24f2b5d242..81f6e726e4 100644
--- a/platform/bb10/SCsub
+++ b/platform/bb10/SCsub
@@ -19,4 +19,3 @@ if env['bb10_lgles_override'] == "yes":
prog = None
prog = env_bps.Program('#bin/godot', bb10_lib)
-
diff --git a/platform/bb10/os_bb10.cpp b/platform/bb10/os_bb10.cpp
index d89033b1df..c8e7ae561e 100644
--- a/platform/bb10/os_bb10.cpp
+++ b/platform/bb10/os_bb10.cpp
@@ -195,9 +195,10 @@ void OSBB10::finalize() {
// memdelete(debugger_connection_console);
//}
+ memdelete(sample_manager);
+
audio_server->finish();
memdelete(audio_server);
- memdelete(sample_manager);
visual_server->finish();
memdelete(visual_server);
diff --git a/platform/flash/SCsub b/platform/flash/SCsub
index b7aef3b65d..4e5f26d52a 100644
--- a/platform/flash/SCsub
+++ b/platform/flash/SCsub
@@ -36,5 +36,3 @@ java -jar $ALCHEMY/usr/lib/asc2.jar -md -strict -optimize -AS3 \
-import ../platform/flash/lib/libGL.abc \
../platform/flash/Console.as
"""
-
-
diff --git a/platform/haiku/os_haiku.cpp b/platform/haiku/os_haiku.cpp
index 1edb23d504..ef483657ca 100644
--- a/platform/haiku/os_haiku.cpp
+++ b/platform/haiku/os_haiku.cpp
@@ -137,9 +137,10 @@ void OS_Haiku::finalize() {
spatial_sound_2d_server->finish();
memdelete(spatial_sound_2d_server);
+ memdelete(sample_manager);
+
audio_server->finish();
memdelete(audio_server);
- memdelete(sample_manager);
visual_server->finish();
memdelete(visual_server);
diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm
index 647bf1a2d1..e5bd7a96b4 100644
--- a/platform/iphone/app_delegate.mm
+++ b/platform/iphone/app_delegate.mm
@@ -56,6 +56,8 @@
#import "Appirater.h"
#endif
+Error _shell_open(String);
+
Error _shell_open(String p_uri) {
NSString* url = [[NSString alloc] initWithUTF8String:p_uri.utf8().get_data()];
diff --git a/platform/iphone/game_center.mm b/platform/iphone/game_center.mm
index 79c056776d..4cb7a20a7f 100644
--- a/platform/iphone/game_center.mm
+++ b/platform/iphone/game_center.mm
@@ -30,8 +30,18 @@
#include "game_center.h"
+#ifdef __IPHONE_9_0
+
+#import <GameKit/GameKit.h>
+extern "C" {
+
+#else
+
extern "C" {
#import <GameKit/GameKit.h>
+
+#endif
+
#import "app_delegate.h"
};
diff --git a/platform/iphone/gl_view.mm b/platform/iphone/gl_view.mm
index 279fbdafa8..f19e16f3f6 100755
--- a/platform/iphone/gl_view.mm
+++ b/platform/iphone/gl_view.mm
@@ -54,6 +54,14 @@ static bool video_playing = false;
static float video_previous_volume = 0.0f;
static CMTime video_current_time;
+void _show_keyboard(String);
+void _hide_keyboard();
+bool _play_video(String, float, String, String);
+bool _is_video_playing();
+void _focus_out_video();
+void _unpause_video();
+void _stop_video();
+
void _show_keyboard(String p_existing) {
keyboard_text = p_existing;
printf("instance on show is %p\n", _instance);
@@ -618,7 +626,7 @@ static void clear_touches() {
- (void)audioRouteChangeListenerCallback:(NSNotification*)notification
{
- printf("*********** route changed!%i\n");
+ printf("*********** route changed!\n");
NSDictionary *interuptionDict = notification.userInfo;
NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
diff --git a/platform/iphone/godot_iphone.cpp b/platform/iphone/godot_iphone.cpp
index b7b9b747b4..f0cb929429 100644
--- a/platform/iphone/godot_iphone.cpp
+++ b/platform/iphone/godot_iphone.cpp
@@ -40,6 +40,8 @@ int add_path(int p_argc, char** p_args);
int add_cmdline(int p_argc, char** p_args);
};
+int iphone_main(int, int, int, char**);
+
int iphone_main(int width, int height, int argc, char** argv) {
int len = strlen(argv[0]);
diff --git a/platform/iphone/icloud.mm b/platform/iphone/icloud.mm
index 2dc2f7d9c1..518385992d 100644
--- a/platform/iphone/icloud.mm
+++ b/platform/iphone/icloud.mm
@@ -30,10 +30,16 @@
#include "icloud.h"
+#ifndef __IPHONE_9_0
extern "C" {
+#endif
+
#import <Foundation/Foundation.h>
#import "app_delegate.h"
+
+#ifndef __IPHONE_9_0
};
+#endif
ICloud* ICloud::instance = NULL;
diff --git a/platform/iphone/sem_iphone.cpp b/platform/iphone/sem_iphone.cpp
index 5afaa7b308..36baa40427 100644
--- a/platform/iphone/sem_iphone.cpp
+++ b/platform/iphone/sem_iphone.cpp
@@ -31,6 +31,11 @@
#include <unistd.h>
#include <fcntl.h>
+void cgsem_init(cgsem_t*);
+void cgsem_post(cgsem_t*);
+void cgsem_wait(cgsem_t*);
+void cgsem_destroy(cgsem_t*);
+
void cgsem_init(cgsem_t *cgsem)
{
int flags, fd, i;
diff --git a/platform/iphone/view_controller.mm b/platform/iphone/view_controller.mm
index 6a9c3ac9ec..f98fb7c355 100644
--- a/platform/iphone/view_controller.mm
+++ b/platform/iphone/view_controller.mm
@@ -32,6 +32,9 @@
extern "C" {
+int add_path(int, char**);
+int add_cmdline(int, char**);
+
int add_path(int p_argc, char** p_args) {
NSString* str = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"godot_path"];
diff --git a/platform/nacl/html/icon_128.png b/platform/nacl/html/icon_128.png
index 1793aa7e7a..653669c38d 100644
--- a/platform/nacl/html/icon_128.png
+++ b/platform/nacl/html/icon_128.png
Binary files differ
diff --git a/platform/nacl/html/icon_16.png b/platform/nacl/html/icon_16.png
index 09de19e418..9f6678c289 100644
--- a/platform/nacl/html/icon_16.png
+++ b/platform/nacl/html/icon_16.png
Binary files differ
diff --git a/platform/server/os_server.cpp b/platform/server/os_server.cpp
index 75e0878bac..8b831140d6 100644
--- a/platform/server/os_server.cpp
+++ b/platform/server/os_server.cpp
@@ -107,9 +107,10 @@ void OS_Server::finalize() {
// memdelete(debugger_connection_console);
//}
+ memdelete(sample_manager);
+
audio_server->finish();
memdelete(audio_server);
- memdelete(sample_manager);
visual_server->finish();
memdelete(visual_server);
diff --git a/platform/windows/SCsub b/platform/windows/SCsub
index 1ad32e7989..1fa793e2de 100644
--- a/platform/windows/SCsub
+++ b/platform/windows/SCsub
@@ -11,9 +11,15 @@ common_win=[
"stream_peer_winsock.cpp",
]
+env.RES('godot_res.rc')
+if env["is_mingw"]:
+ common_win.append("godot_res.o")
+else:
+ common_win.append("godot_res.res")
+
env.Program('#bin/godot',['godot_win.cpp']+common_win,PROGSUFFIX=env["PROGSUFFIX"])
-# Microsoft Visual Studio Project Generation
+# Microsoft Visual Studio Project Generation
if (env['vsproj'])=="yes":
env.vs_srcs = env.vs_srcs + ["platform/windows/godot_win.cpp"]
for x in common_win:
diff --git a/platform/windows/detect.py b/platform/windows/detect.py
index f0d2a7cc40..fcde14030f 100644
--- a/platform/windows/detect.py
+++ b/platform/windows/detect.py
@@ -88,7 +88,7 @@
import os
-import sys
+import sys
def is_active():
@@ -173,13 +173,30 @@ def get_flags():
('theora','no'),
]
+def build_res_file( target, source, env ):
+ cmdbase = ""
+ if (env["bits"] == "32"):
+ cmdbase = env['mingw_prefix']
+ else:
+ cmdbase = env['mingw_prefix_64']
+ CPPPATH = env['CPPPATH']
+ cmdbase = cmdbase + 'windres --include-dir . '
+ import subprocess
+ for x in range(len(source)):
+ cmd = cmdbase + '-i ' + str(source[x]) + ' -o ' + str(target[x])
+ try:
+ out = subprocess.Popen(cmd,shell = True,stderr = subprocess.PIPE).communicate()
+ if len(out[1]):
+ return 1
+ except:
+ return 1
+ return 0
def configure(env):
env.Append(CPPPATH=['#platform/windows'])
-
-
+ env['is_mingw']=False
if (os.name=="nt" and os.getenv("VSINSTALLDIR")!=None):
#build using visual studio
env['ENV']['TMP'] = os.environ['TMP']
@@ -203,14 +220,14 @@ def configure(env):
env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
elif (env["target"]=="debug_release"):
- env.Append(CCFLAGS=['/Zi','/Od'])
+ env.Append(CCFLAGS=['/Z7','/Od'])
env.Append(LINKFLAGS=['/DEBUG'])
env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
elif (env["target"]=="debug"):
- env.Append(CCFLAGS=['/Zi','/DDEBUG_ENABLED','/DDEBUG_MEMORY_ENABLED','/DD3D_DEBUG_INFO','/Od'])
+ env.Append(CCFLAGS=['/Z7','/DDEBUG_ENABLED','/DDEBUG_MEMORY_ENABLED','/DD3D_DEBUG_INFO','/Od'])
env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
env.Append(LINKFLAGS=['/DEBUG'])
@@ -354,7 +371,7 @@ def configure(env):
env.Append(LIBS=['mingw32','opengl32', 'dsound', 'ole32', 'd3d9','winmm','gdi32','iphlpapi','shlwapi','wsock32','kernel32'])
# if (env["bits"]=="32"):
-# # env.Append(LIBS=['gcc_s'])
+ # env.Append(LIBS=['gcc_s'])
# #--with-arch=i686
# env.Append(CPPFLAGS=['-march=i686'])
# env.Append(LINKFLAGS=['-march=i686'])
@@ -366,6 +383,10 @@ def configure(env):
env.Append(CPPFLAGS=['-DMINGW_ENABLED'])
env.Append(LINKFLAGS=['-g'])
+ # resrc
+ env['is_mingw']=True
+ env.Append( BUILDERS = { 'RES' : env.Builder(action = build_res_file, suffix = '.o',src_suffix = '.rc') } )
+
import methods
env.Append( BUILDERS = { 'GLSL120' : env.Builder(action = methods.build_legacygl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
env.Append( BUILDERS = { 'GLSL' : env.Builder(action = methods.build_glsl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
@@ -373,4 +394,3 @@ def configure(env):
env.Append( BUILDERS = { 'GLSL120GLES' : env.Builder(action = methods.build_gles2_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
-
diff --git a/platform/windows/export/export.cpp b/platform/windows/export/export.cpp
index 952f51fdd4..29f21bf227 100644
--- a/platform/windows/export/export.cpp
+++ b/platform/windows/export/export.cpp
@@ -1,6 +1,345 @@
+/*************************************************************************/
+/* export.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2015 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
#include "export.h"
#include "platform/windows/logo.h"
-#include "tools/editor/editor_import_export.h"
+#include "os/os.h"
+#include "globals.h"
+#include "tools/editor/editor_node.h"
+#include "tools/pe_bliss/pe_bliss_godot.h"
+
+/**
+ @author Masoud BaniHashemian <masoudbh3@gmail.com>
+*/
+
+
+void EditorExportPlatformWindows::store_16(DVector<uint8_t>& vector, uint16_t value) {
+ const uint8_t* bytes = reinterpret_cast<const uint8_t*>(&value);
+ int size = vector.size();
+ vector.resize( size + 2 );
+ DVector<uint8_t>::Write w = vector.write();
+ w[size]=bytes[0];
+ w[size+1]=bytes[1];
+}
+void EditorExportPlatformWindows::store_32(DVector<uint8_t>& vector, uint32_t value) {
+ const uint8_t* bytes = reinterpret_cast<const uint8_t*>(&value);
+ int size = vector.size();
+ vector.resize( size + 4 );
+ DVector<uint8_t>::Write w = vector.write();
+ w[size]=bytes[0];
+ w[size+1]=bytes[1];
+ w[size+2]=bytes[2];
+ w[size+3]=bytes[3];
+}
+
+bool EditorExportPlatformWindows::_set(const StringName& p_name, const Variant& p_value) {
+
+ String n = p_name;
+
+ if (n=="icon/icon_ico") {
+
+ icon_ico=p_value;
+ } else if (n=="icon/icon_png") {
+
+ icon_png=p_value;
+ } else if (n=="icon/icon_png16x16") {
+
+ icon16=p_value;
+ } else if (n=="icon/icon_png32x32") {
+
+ icon32=p_value;
+ } else if (n=="icon/icon_png48x48") {
+
+ icon48=p_value;
+ } else if (n=="icon/icon_png64x64") {
+
+ icon64=p_value;
+ } else if (n=="icon/icon_png128x128") {
+
+ icon128=p_value;
+ } else if (n=="icon/icon_png256x256") {
+
+ icon256=p_value;
+ } else if (n=="version_info/version_major") {
+
+ version_major=p_value;
+ } else if (n=="version_info/version_minor") {
+
+ version_minor=p_value;
+ } else if (n=="version_info/version_text") {
+
+ version_text=p_value;
+ } else if (n=="version_info/company_name") {
+
+ company_name=p_value;
+ } else if (n=="version_info/file_description") {
+
+ file_description=p_value;
+ } else if (n=="version_info/product_name") {
+
+ product_name=p_value;
+ } else if (n=="version_info/legal_copyright") {
+
+ legal_copyright=p_value;
+ } else if (n=="version_info/add_godot_version") {
+
+ set_godot_version=p_value;
+ } else
+ return false;
+
+ return true;
+
+}
+
+bool EditorExportPlatformWindows::_get(const StringName& p_name,Variant &r_ret) const {
+
+ String n = p_name;
+
+ if (n=="icon/icon_ico") {
+
+ r_ret=icon_ico;
+ } else if (n=="icon/icon_png") {
+
+ r_ret=icon_png;
+ } else if (n=="icon/icon_png16x16") {
+
+ r_ret=icon16;
+ } else if (n=="icon/icon_png32x32") {
+
+ r_ret=icon32;
+ } else if (n=="icon/icon_png48x48") {
+
+ r_ret=icon48;
+ } else if (n=="icon/icon_png64x64") {
+
+ r_ret=icon64;
+ } else if (n=="icon/icon_png128x128") {
+
+ r_ret=icon128;
+ } else if (n=="icon/icon_png256x256") {
+
+ r_ret=icon256;
+ } else if (n=="version_info/version_major") {
+
+ r_ret=version_major;
+ } else if (n=="version_info/version_minor") {
+
+ r_ret=version_minor;
+ } else if (n=="version_info/version_text") {
+
+ r_ret=version_text;
+ } else if (n=="version_info/company_name") {
+
+ r_ret=company_name;
+ } else if (n=="version_info/file_description") {
+
+ r_ret=file_description;
+ } else if (n=="version_info/product_name") {
+
+ r_ret=product_name;
+ } else if (n=="version_info/legal_copyright") {
+
+ r_ret=legal_copyright;
+ } else if (n=="version_info/add_godot_version") {
+
+ r_ret=set_godot_version;
+ } else
+ return false;
+
+ return true;
+
+}
+
+void EditorExportPlatformWindows::_get_property_list( List<PropertyInfo> *p_list) const {
+
+ p_list->push_back( PropertyInfo( Variant::STRING, "icon/icon_ico",PROPERTY_HINT_FILE,"ico") );
+ p_list->push_back( PropertyInfo( Variant::STRING, "icon/icon_png",PROPERTY_HINT_FILE,"png") );
+ p_list->push_back( PropertyInfo( Variant::BOOL, "icon/icon_png16x16") );
+ p_list->push_back( PropertyInfo( Variant::BOOL, "icon/icon_png32x32") );
+ p_list->push_back( PropertyInfo( Variant::BOOL, "icon/icon_png48x48") );
+ p_list->push_back( PropertyInfo( Variant::BOOL, "icon/icon_png64x64") );
+ p_list->push_back( PropertyInfo( Variant::BOOL, "icon/icon_png128x128") );
+ p_list->push_back( PropertyInfo( Variant::BOOL, "icon/icon_png256x256") );
+ p_list->push_back( PropertyInfo( Variant::INT, "version_info/version_major", PROPERTY_HINT_RANGE,"0,65535,1"));
+ p_list->push_back( PropertyInfo( Variant::INT, "version_info/version_minor", PROPERTY_HINT_RANGE,"0,65535,0"));
+ p_list->push_back( PropertyInfo( Variant::STRING, "version_info/version_text") );
+ p_list->push_back( PropertyInfo( Variant::STRING, "version_info/company_name") );
+ p_list->push_back( PropertyInfo( Variant::STRING, "version_info/file_description") );
+ p_list->push_back( PropertyInfo( Variant::STRING, "version_info/product_name") );
+ p_list->push_back( PropertyInfo( Variant::STRING, "version_info/legal_copyright") );
+ p_list->push_back( PropertyInfo( Variant::BOOL, "version_info/add_godot_version") );
+
+}
+
+Error EditorExportPlatformWindows::export_project(const String& p_path, bool p_debug, int p_flags) {
+
+ Error err = EditorExportPlatformPC::export_project(p_path, p_debug, p_flags);
+ if(err != OK)
+ {
+ return err;
+ }
+ EditorProgress ep("editexe","Edit EXE File",102);
+ ep.step("Create ico file..",0);
+
+ DVector<uint8_t> icon_content;
+ if (this->icon_ico!="" && this->icon_ico.ends_with(".ico")) {
+ FileAccess *f = FileAccess::open(this->icon_ico,FileAccess::READ);
+ if (f) {
+ icon_content.resize(f->get_len());
+ DVector<uint8_t>::Write write = icon_content.write();
+ f->get_buffer(write.ptr(),icon_content.size());
+ f->close();
+ memdelete(f);
+ }
+ } else if (this->icon_png!="" && this->icon_png.ends_with(".png") && (icon16 || icon32 || icon48 || icon64 || icon128 || icon256)) {
+ #ifdef PNG_ENABLED
+ Vector<Image> pngs;
+ Image png;
+ Error err_png = png.load(this->icon_png);
+ if (err_png==OK && !png.empty()) {
+ if(icon256) {
+ Image icon_256(png);
+ if(!(png.get_height()==256 && png.get_width()==256)) icon_256.resize(256,256);
+ pngs.push_back(icon_256);
+ }
+ if(icon128) {
+ Image icon_128(png);
+ if(!(png.get_height()==128 && png.get_width()==128)) icon_128.resize(128,128);
+ pngs.push_back(icon_128);
+ }
+ if(icon64) {
+ Image icon_64(png);
+ if(!(png.get_height()==64 && png.get_width()==64)) icon_64.resize(64,64);
+ pngs.push_back(icon_64);
+ }
+ if(icon48) {
+ Image icon_48(png);
+ if(!(png.get_height()==48 && png.get_width()==48)) icon_48.resize(48,48);
+ pngs.push_back(icon_48);
+ }
+ if(icon32) {
+ Image icon_32(png);
+ if(!(png.get_height()==32 && png.get_width()==32)) icon_32.resize(32,32);
+ pngs.push_back(icon_32);
+ }
+ if(icon16) {
+ Image icon_16(png);
+ if(!(png.get_height()==16 && png.get_width()==16)) icon_16.resize(16,16);
+ pngs.push_back(icon_16);
+ }
+ // create icon according to https://www.daubnet.com/en/file-format-ico
+ store_16(icon_content,0); //Reserved
+ store_16(icon_content,1); //Type
+ store_16(icon_content,pngs.size()); //Count
+ int offset = 6+pngs.size()*16;
+ //List of bitmaps
+ for(int i=0;i<pngs.size();i++) {
+ int w = pngs[i].get_width();
+ int h = pngs[i].get_height();
+ icon_content.push_back(w<256?w:0); //width
+ icon_content.push_back(h<256?h:0); //height
+ icon_content.push_back(0); //ColorCount = 0
+ icon_content.push_back(0); //Reserved
+ store_16(icon_content,1); //Planes
+ store_16(icon_content,32); //BitCount (bit per pixel)
+ int size = 40 + (w * h * 4) + (w * h / 8);
+ store_32(icon_content,size); //Size of (InfoHeader + ANDbitmap + XORbitmap)
+ store_32(icon_content,offset); //FileOffset
+ offset += size;
+ }
+ //Write bmp files.
+ for(int i=0;i<pngs.size();i++) {
+ int w = pngs[i].get_width();
+ int h = pngs[i].get_height();
+ store_32(icon_content,40); //Size of InfoHeader structure = 40
+ store_32(icon_content,w); //Width
+ store_32(icon_content,h*2); //Height
+ store_16(icon_content,1); //Planes
+ store_16(icon_content,32); //BitCount
+ store_32(icon_content,0); //Compression
+ store_32(icon_content,w*h*4); //ImageSize = Size of Image in Bytes
+ store_32(icon_content,0); //unused = 0
+ store_32(icon_content,0); //unused = 0
+ store_32(icon_content,0); //unused = 0
+ store_32(icon_content,0); //unused = 0
+ //XORBitmap
+ for(int y=h-1;y>=0;y--) {
+ for(int x=0;x<w;x++) {
+ store_32(icon_content,pngs[i].get_pixel(x,y).to_32());
+ }
+ }
+ //ANDBitmap
+ for(int m=0;m<(w * h / 8);m+=4) store_32(icon_content,0x00000000); // Add empty ANDBitmap , TODO create full ANDBitmap Structure if need.
+ }
+ }
+ #endif
+ }
+
+ ep.step("Add rsrc..",50);
+
+ String basename = Globals::get_singleton()->get("application/name");
+ product_name=product_name.replace("$genname",basename);
+ String godot_version;
+ if(set_godot_version) godot_version = String( VERSION_MKSTRING );
+ String ret = pe_bliss_add_resrc(p_path.utf8(), version_major, version_minor,
+ company_name, file_description, legal_copyright, version_text,
+ product_name, godot_version, icon_content);
+ if (ret.empty()) {
+ return OK;
+ } else {
+ EditorNode::add_io_error(ret);
+ return ERR_FILE_CANT_WRITE;
+ }
+}
+
+EditorExportPlatformWindows::EditorExportPlatformWindows() {
+
+ icon16=true;
+ icon32=true;
+ icon48=true;
+ icon64=true;
+ icon128=true;
+ icon256=true;
+ product_name="$genname";
+ company_name="Okam Studio";
+ file_description="Created With Godot Engine";
+ version_text="1.0";
+ OS::Date date = OS::get_singleton()->get_date();
+ legal_copyright="Copyright (c) 2007-";
+ legal_copyright+=String::num(date.year);
+ legal_copyright+=" Juan Linietsky, Ariel Manzur";
+ version_major=1;
+ version_minor=0;
+ set_godot_version=true;
+}
+
+
void register_windows_exporter() {
@@ -9,7 +348,7 @@ void register_windows_exporter() {
logo->create_from_image(img);
{
- Ref<EditorExportPlatformPC> exporter = Ref<EditorExportPlatformPC>( memnew(EditorExportPlatformPC) );
+ Ref<EditorExportPlatformWindows> exporter = Ref<EditorExportPlatformWindows>( memnew(EditorExportPlatformWindows) );
exporter->set_binary_extension("exe");
exporter->set_release_binary32("windows_32_release.exe");
exporter->set_debug_binary32("windows_32_debug.exe");
diff --git a/platform/windows/export/export.h b/platform/windows/export/export.h
index de3dc3fa50..2424efc861 100644
--- a/platform/windows/export/export.h
+++ b/platform/windows/export/export.h
@@ -1,3 +1,37 @@
+#include "tools/editor/editor_import_export.h"
+
+class EditorExportPlatformWindows : public EditorExportPlatformPC {
+ OBJ_TYPE( EditorExportPlatformWindows,EditorExportPlatformPC );
+
+private:
+ String icon_ico;
+ String icon_png;
+ bool icon16;
+ bool icon32;
+ bool icon48;
+ bool icon64;
+ bool icon128;
+ bool icon256;
+ String company_name;
+ String file_description;
+ String product_name;
+ String legal_copyright;
+ String version_text;
+ int version_major;
+ int version_minor;
+ bool set_godot_version;
+ void store_16(DVector<uint8_t>& vector, uint16_t value); ///< store 16 bits uint
+ void store_32(DVector<uint8_t>& vector, uint32_t value); ///< store 32 bits uint
+
+protected:
+ bool _set(const StringName& p_name, const Variant& p_value);
+ bool _get(const StringName& p_name,Variant &r_ret) const;
+ void _get_property_list( List<PropertyInfo> *p_list) const;
+
+public:
+ Error export_project(const String& p_path, bool p_debug,int p_flags=0);
+ EditorExportPlatformWindows();
+};
void register_windows_exporter();
diff --git a/platform/windows/godot.ico b/platform/windows/godot.ico
new file mode 100644
index 0000000000..e57ce36529
--- /dev/null
+++ b/platform/windows/godot.ico
Binary files differ
diff --git a/platform/windows/godot_res.rc b/platform/windows/godot_res.rc
new file mode 100644
index 0000000000..73f36e5e59
--- /dev/null
+++ b/platform/windows/godot_res.rc
@@ -0,0 +1,33 @@
+#include "core/version.h"
+#ifndef _STR
+#define _STR(m_x) #m_x
+#define _MKSTR(m_x) _STR(m_x)
+#endif
+
+GODOT_ICON ICON platform/windows/godot.ico
+
+1 VERSIONINFO
+FILEVERSION VERSION_MAJOR,VERSION_MINOR,0
+PRODUCTVERSION VERSION_MAJOR,VERSION_MINOR,0
+FILEOS 4
+FILETYPE 1
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", "Okam Studio"
+ VALUE "FileDescription", _MKSTR(VERSION_NAME) " Editor (" _MKSTR(VERSION_STATUS) ")"
+ VALUE "FileVersion", _MKSTR(VERSION_MAJOR) "." _MKSTR(VERSION_MINOR) "."_MKSTR(VERSION_REVISION)
+ VALUE "ProductName", _MKSTR(VERSION_NAME)
+ VALUE "Licence", "MIT"
+ VALUE "LegalCopyright", "Copyright (c) 2007-" _MKSTR(VERSION_YEAR) " Juan Linietsky, Ariel Manzur"
+ VALUE "Info", "http://www.godotengine.org"
+ VALUE "ProductVersion", _MKSTR(VERSION_MAJOR) "." _MKSTR(VERSION_MINOR) "."_MKSTR(VERSION_REVISION)
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END \ No newline at end of file
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index 438a5a6903..1fb8e6dbd0 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -1350,7 +1350,9 @@ void OS_Windows::finalize() {
memdelete(main_loop);
main_loop=NULL;
-
+
+ memdelete(input);
+
visual_server->finish();
memdelete(visual_server);
#ifdef OPENGL_ENABLED
@@ -1373,11 +1375,10 @@ void OS_Windows::finalize() {
// memdelete(debugger_connection_console);
//}
- audio_server->finish();
- memdelete(audio_server);
memdelete(sample_manager);
- memdelete(input);
+ audio_server->finish();
+ memdelete(audio_server);
physics_server->finish();
memdelete(physics_server);
@@ -1764,73 +1765,96 @@ bool OS_Windows::is_window_maximized() const{
}
-void OS_Windows::print_error(const char* p_function,const char* p_file,int p_line,const char *p_code,const char*p_rationale,ErrorType p_type) {
-
- HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
- if (!hCon || hCon==INVALID_HANDLE_VALUE) {
- if (p_rationale && p_rationale[0]) {
+void OS_Windows::print_error(const char* p_function, const char* p_file, int p_line, const char* p_code, const char* p_rationale, ErrorType p_type) {
- print("\E[1;31;40mERROR: %s: \E[1;37;40m%s\n",p_function,p_rationale);
- print("\E[0;31;40m At: %s:%i.\E[0;0;37m\n",p_file,p_line);
+ HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (!hCon || hCon == INVALID_HANDLE_VALUE) {
- } else {
- print("\E[1;31;40mERROR: %s: \E[1;37;40m%s\n",p_function,p_code);
- print("\E[0;31;40m At: %s:%i.\E[0;0;37m\n",p_file,p_line);
+ const char* err_details;
+ if (p_rationale && p_rationale[0])
+ err_details = p_rationale;
+ else
+ err_details = p_code;
+ switch(p_type) {
+ case ERR_ERROR:
+ print("ERROR: %s: %s\n", p_function, err_details);
+ print(" At: %s:%i\n", p_file, p_line);
+ break;
+ case ERR_WARNING:
+ print("WARNING: %s: %s\n", p_function, err_details);
+ print(" At: %s:%i\n", p_file, p_line);
+ break;
+ case ERR_SCRIPT:
+ print("SCRIPT ERROR: %s: %s\n", p_function, err_details);
+ print(" At: %s:%i\n", p_file, p_line);
+ break;
}
+
} else {
CONSOLE_SCREEN_BUFFER_INFO sbi; //original
- GetConsoleScreenBufferInfo(hCon,&sbi);
-
- SetConsoleTextAttribute(hCon,sbi.wAttributes);
+ GetConsoleScreenBufferInfo(hCon, &sbi);
+ WORD current_fg = sbi.wAttributes & (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
+ WORD current_bg = sbi.wAttributes & (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
-
- uint32_t basecol=0;
+ uint32_t basecol = 0;
switch(p_type) {
case ERR_ERROR: basecol = FOREGROUND_RED; break;
- case ERR_WARNING: basecol = FOREGROUND_RED|FOREGROUND_GREEN; break;
- case ERR_SCRIPT: basecol = FOREGROUND_GREEN; break;
+ case ERR_WARNING: basecol = FOREGROUND_RED | FOREGROUND_GREEN; break;
+ case ERR_SCRIPT: basecol = FOREGROUND_RED | FOREGROUND_BLUE; break;
}
- if (p_rationale && p_rationale[0]) {
-
- SetConsoleTextAttribute(hCon,basecol|FOREGROUND_INTENSITY);
+ basecol |= current_bg;
+ if (p_rationale && p_rationale[0]) {
+ SetConsoleTextAttribute(hCon, basecol | FOREGROUND_INTENSITY);
switch(p_type) {
case ERR_ERROR: print("ERROR: "); break;
case ERR_WARNING: print("WARNING: "); break;
case ERR_SCRIPT: print("SCRIPT ERROR: "); break;
}
- SetConsoleTextAttribute(hCon,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
- print(" %s\n",p_rationale);
- SetConsoleTextAttribute(hCon,basecol);
- print("At: ");
- SetConsoleTextAttribute(hCon,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN);
- print(" %s:%i\n",p_file,p_line);
+ SetConsoleTextAttribute(hCon, current_fg | current_bg | FOREGROUND_INTENSITY);
+ print("%s\n", p_rationale);
+
+ SetConsoleTextAttribute(hCon, basecol);
+ switch (p_type) {
+ case ERR_ERROR: print(" At: "); break;
+ case ERR_WARNING: print(" At: "); break;
+ case ERR_SCRIPT: print(" At: "); break;
+ }
+ SetConsoleTextAttribute(hCon, current_fg | current_bg);
+ print("%s:%i\n", p_file, p_line);
} else {
- SetConsoleTextAttribute(hCon,basecol|FOREGROUND_INTENSITY);
+
+ SetConsoleTextAttribute(hCon, basecol | FOREGROUND_INTENSITY);
switch(p_type) {
- case ERR_ERROR: print("ERROR: %s: ",p_function); break;
- case ERR_WARNING: print("WARNING: %s: ",p_function); break;
- case ERR_SCRIPT: print("SCRIPT ERROR: %s: ",p_function); break;
+ case ERR_ERROR: print("ERROR: %s: ", p_function); break;
+ case ERR_WARNING: print("WARNING: %s: ", p_function); break;
+ case ERR_SCRIPT: print("SCRIPT ERROR: %s: ", p_function); break;
}
- SetConsoleTextAttribute(hCon,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
- print(" %s\n",p_code);
- SetConsoleTextAttribute(hCon,basecol);
- print("At: ");
- SetConsoleTextAttribute(hCon,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN);
- print(" %s:%i\n",p_file,p_line);
+
+ SetConsoleTextAttribute(hCon, current_fg | current_bg | FOREGROUND_INTENSITY);
+ print("%s\n", p_code);
+
+ SetConsoleTextAttribute(hCon, basecol);
+ switch (p_type) {
+ case ERR_ERROR: print(" At: "); break;
+ case ERR_WARNING: print(" At: "); break;
+ case ERR_SCRIPT: print(" At: "); break;
+ }
+
+ SetConsoleTextAttribute(hCon, current_fg | current_bg);
+ print("%s:%i\n", p_file, p_line);
}
- SetConsoleTextAttribute(hCon,sbi.wAttributes);
+ SetConsoleTextAttribute(hCon, sbi.wAttributes);
}
-
}
diff --git a/platform/windows/packet_peer_udp_winsock.cpp b/platform/windows/packet_peer_udp_winsock.cpp
index aff92b8fc8..0ca2d358af 100644
--- a/platform/windows/packet_peer_udp_winsock.cpp
+++ b/platform/windows/packet_peer_udp_winsock.cpp
@@ -121,7 +121,7 @@ Error PacketPeerUDPWinsock::_poll(bool p_wait) {
struct sockaddr_in from = {0};
int len = sizeof(struct sockaddr_in);
int ret;
- while ( (ret = recvfrom(sockfd, (char*)recv_buffer, MIN(sizeof(recv_buffer),rb.data_left()-12), 0, (struct sockaddr*)&from, &len)) > 0) {
+ while ( (ret = recvfrom(sockfd, (char*)recv_buffer, MIN((int)sizeof(recv_buffer),MAX(rb.space_left()-12, 0)), 0, (struct sockaddr*)&from, &len)) > 0) {
rb.write((uint8_t*)&from.sin_addr, 4);
uint32_t port = ntohs(from.sin_port);
rb.write((uint8_t*)&port, 4);
@@ -132,8 +132,25 @@ Error PacketPeerUDPWinsock::_poll(bool p_wait) {
++queue_count;
};
+ if (ret == SOCKET_ERROR){
+ int error = WSAGetLastError();
+
+ if (error == WSAEWOULDBLOCK){
+ // Expected when doing non-blocking sockets, retry later.
+ }
+ else if (error == WSAECONNRESET){
+ // If the remote target does not accept messages, this error may occur, but is harmless.
+ // Once the remote target gets available, this message will disappear for new messages.
+ }
+ else
+ {
+ close();
+ return FAILED;
+ }
+ }
+
- if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) ) {
+ if (ret == 0) {
close();
return FAILED;
};
diff --git a/platform/winrt/os_winrt.cpp b/platform/winrt/os_winrt.cpp
index 3e06d9d59b..24be2f47e7 100644
--- a/platform/winrt/os_winrt.cpp
+++ b/platform/winrt/os_winrt.cpp
@@ -326,10 +326,11 @@ void OSWinrt::finalize() {
//if (debugger_connection_console) {
// memdelete(debugger_connection_console);
//}
+
+ memdelete(sample_manager);
audio_server->finish();
memdelete(audio_server);
- memdelete(sample_manager);
memdelete(input);
@@ -422,17 +423,27 @@ void OSWinrt::get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen) con
}
-void OSWinrt::print_error(const char* p_function,const char* p_file,int p_line,const char *p_code,const char*p_rationale,ErrorType p_type) {
-
- if (p_rationale && p_rationale[0]) {
-
- print("\E[1;31;40mERROR: %s: \E[1;37;40m%s\n",p_function,p_rationale);
- print("\E[0;31;40m At: %s:%i.\E[0;0;37m\n",p_file,p_line);
+void OSWinrt::print_error(const char* p_function, const char* p_file, int p_line, const char* p_code, const char* p_rationale, ErrorType p_type) {
- } else {
- print("\E[1;31;40mERROR: %s: \E[1;37;40m%s\n",p_function,p_code);
- print("\E[0;31;40m At: %s:%i.\E[0;0;37m\n",p_file,p_line);
+ const char* err_details;
+ if (p_rationale && p_rationale[0])
+ err_details = p_rationale;
+ else
+ err_details = p_code;
+ switch(p_type) {
+ case ERR_ERROR:
+ print("ERROR: %s: %s\n", p_function, err_details);
+ print(" At: %s:%i\n", p_file, p_line);
+ break;
+ case ERR_WARNING:
+ print("WARNING: %s: %s\n", p_function, err_details);
+ print(" At: %s:%i\n", p_file, p_line);
+ break;
+ case ERR_SCRIPT:
+ print("SCRIPT ERROR: %s: %s\n", p_function, err_details);
+ print(" At: %s:%i\n", p_file, p_line);
+ break;
}
}
diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp
index 34bd1184a1..74ebad748a 100644
--- a/platform/x11/os_x11.cpp
+++ b/platform/x11/os_x11.cpp
@@ -34,7 +34,7 @@
#include <stdlib.h>
#include "print_string.h"
#include "servers/physics/physics_server_sw.h"
-
+#include "errno.h"
#include "X11/Xutil.h"
@@ -452,9 +452,10 @@ void OS_X11::finalize() {
// memdelete(debugger_connection_console);
//}
+ memdelete(sample_manager);
+
audio_server->finish();
memdelete(audio_server);
- memdelete(sample_manager);
visual_server->finish();
memdelete(visual_server);