[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32569] trunk/blender/source/blender/ windowmanager: Add operator for toggling cmd box on Windows.

Nathan Letwory nathan at letworyinteractive.com
Mon Oct 18 22:41:53 CEST 2010


Revision: 32569
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32569
Author:   jesterking
Date:     2010-10-18 22:41:52 +0200 (Mon, 18 Oct 2010)

Log Message:
-----------
Add operator for toggling cmd box on Windows.

Use through search menu (Toggle System Console) or
call bpy.ops.wm.toggle_console().

This is based on patch [#6927] Optional Console for Windows
by Fahrezal Effendi, submitted on July 10th, 2007 (!)

This paves the way for adding a command-line option to Blender to
toggle this cmd console, and for having a user preference option
for this. Command-line option I haven't added yet, as there seemed
to be problems with Python interpreter initialization (read: crashes).

This works by redirecting stdout and stderr to blenderlog.txt in user
temp directory (most likely %TEMP%\blenderlog.txt). When python problem
is fixed we can use this to always redirect stdout and stderr to this
logfile, making it also easier for us to ask users for this file in 
bugreports.

Modified Paths:
--------------
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2010-10-18 20:40:43 UTC (rev 32568)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2010-10-18 20:41:52 UTC (rev 32569)
@@ -119,7 +119,7 @@
 wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap, char *idname, int type,
 								 int val, int modifier, int keymodifier);
 
-void         WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
+void		WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
 char		 *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len);
 
 wmKeyMap	*WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regionid);
@@ -220,7 +220,7 @@
 int			WM_operator_poll		(struct bContext *C, struct wmOperatorType *ot);
 int			WM_operator_call		(struct bContext *C, struct wmOperator *op);
 int			WM_operator_repeat		(struct bContext *C, struct wmOperator *op);
-int         WM_operator_name_call	(struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
+int			WM_operator_name_call	(struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
 int			WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, int context, struct PointerRNA *properties, struct ReportList *reports);
 
 void		WM_operator_properties_alloc(struct PointerRNA **ptr, struct IDProperty **properties, const char *opstring); /* used for keymap and macro items */
@@ -342,6 +342,11 @@
 void		WM_progress_set(struct wmWindow *win, float progress);
 void		WM_progress_clear(struct wmWindow *win);
 
+#ifdef WIN32
+			/* Windows System Console */
+void		WM_toggle_console(struct bContext *C, short show);
+#endif
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2010-10-18 20:40:43 UTC (rev 32568)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2010-10-18 20:41:52 UTC (rev 32569)
@@ -31,8 +31,11 @@
 #include <ctype.h>
 #include <stdio.h>
 #include <stddef.h>
+#ifdef WIN32
+#include <windows.h>
+#include <io.h>
+#endif
 
-
 #include "DNA_ID.h"
 #include "DNA_object_types.h"
 #include "DNA_screen_types.h"
@@ -2007,6 +2010,60 @@
 	ot->poll= WM_operator_winactive;
 }
 
+/* *********************** */
+#ifdef WIN32
+static int console= 1;
+void WM_toggle_console(bContext *C, short show)
+{
+	if(show) {
+		FILE *fp;
+		char fn[FILE_MAX];
+		char tmp[FILE_MAXDIR];
+		BLI_where_is_temp(tmp, 1);
+		BLI_make_file_string("/", fn, tmp, "blenderlog.txt");
+		/* open the console */
+		AllocConsole();
+		
+		/* redirect stdin */
+		fp= freopen(fn, "r", stdin);
+		SetStdHandle(STD_INPUT_HANDLE, (HANDLE)_get_osfhandle(_fileno(stdin)));
+		/* redirect stdout */
+		fp= freopen(fn, "w", stdout);
+		SetStdHandle(STD_OUTPUT_HANDLE, (HANDLE)_get_osfhandle(_fileno(stdout)));
+		/* redirect stderr */
+		fp= freopen(fn, "w", stderr);
+		SetStdHandle(STD_ERROR_HANDLE, (HANDLE)_get_osfhandle(_fileno(stderr)));
+		
+		console= 1;
+	}
+	else {
+		FreeConsole();
+		console= 0;
+	}
+}
+
+static int wm_toggle_console_op(bContext *C, wmOperator *op)
+{
+	if(console) {
+		WM_toggle_console(C, 0);
+	}
+	else {
+		WM_toggle_console(C, 1);
+	}
+	return OPERATOR_FINISHED;
+}
+
+static void WM_OT_toggle_console(wmOperatorType *ot)
+{
+	ot->name= "Toggle System Console";
+	ot->idname= "WM_OT_toggle_console";
+	ot->description= "Toggle System Console";
+	
+	ot->exec= wm_toggle_console_op;
+	ot->poll= WM_operator_winactive;
+}
+#endif
+
 /* ************ default paint cursors, draw always around cursor *********** */
 /*
  - returns handler to free 
@@ -3079,6 +3136,9 @@
 	WM_operatortype_append(WM_OT_splash);
 	WM_operatortype_append(WM_OT_search_menu);
 	WM_operatortype_append(WM_OT_call_menu);
+#ifdef WIN32
+	WM_operatortype_append(WM_OT_toggle_console);
+#endif
 
 #ifdef WITH_COLLADA
 	/* XXX: move these */





More information about the Bf-blender-cvs mailing list