[Bf-blender-cvs] [fb53f46184c] soc-2020-info-editor: WIP: enable/disable loggers from user preferences

Mateusz Grzeliński noreply at git.blender.org
Thu Jul 30 17:38:25 CEST 2020


Commit: fb53f46184cd94a250c05d520fb4170c80eb34f9
Author: Mateusz Grzeliński
Date:   Thu Jul 30 17:38:19 2020 +0200
Branches: soc-2020-info-editor
https://developer.blender.org/rBfb53f46184cd94a250c05d520fb4170c80eb34f9

WIP: enable/disable loggers from user preferences

===================================================================

M	intern/clog/CLG_log.h
M	intern/clog/clog.c
M	release/datafiles/userdef/userdef_default.c
M	release/scripts/startup/bl_ui/space_userpref.py
M	source/blender/editors/space_info/space_info.c
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_userdef.c
M	source/creator/creator_args.c

===================================================================

diff --git a/intern/clog/CLG_log.h b/intern/clog/CLG_log.h
index 99604574730..af65febc59a 100644
--- a/intern/clog/CLG_log.h
+++ b/intern/clog/CLG_log.h
@@ -182,7 +182,10 @@ void CLG_output_use_timestamp_set(int value);
 void CLG_fatal_fn_set(void (*fatal_fn)(void *file_handle));
 void CLG_backtrace_fn_set(void (*fatal_fn)(void *file_handle));
 
+void CLG_type_filter_set(const char *glob_str);
+int CLG_type_filter_get(char *buff, int buff_len);
 void CLG_type_filter_include(const char *type_filter, int type_filter_len);
+void CLG_type_filters_clear(void);
 void CLG_type_filter_exclude(const char *type_filter, int type_filter_len);
 
 enum CLG_Severity CLG_severity_level_get(void);
diff --git a/intern/clog/clog.c b/intern/clog/clog.c
index 7d8c18a3706..8ce91d0b2ad 100644
--- a/intern/clog/clog.c
+++ b/intern/clog/clog.c
@@ -724,6 +724,56 @@ static void CLG_ctx_type_filter_include(CLogContext *ctx,
   clg_ctx_type_filter_append(&ctx->filters[1], type_match, type_match_len);
 }
 
+static void CLG_ctx_type_filters_clear(CLogContext *ctx)
+{
+  for (uint i = 0; i < 2; i++) {
+    while (ctx->filters[i] != NULL) {
+      CLG_IDFilter *item = ctx->filters[i];
+      ctx->filters[i] = item->next;
+      MEM_freeN(item);
+    }
+  }
+}
+
+static void CLG_ctx_type_filter_set(CLogContext *ctx, const char *glob_str)
+{
+  CLG_ctx_type_filters_clear(ctx);
+  const char *str_step = glob_str;
+  while (*str_step) {
+    const char *str_step_end = strchr(str_step, ',');
+    int str_step_len = str_step_end ? (str_step_end - str_step) : strlen(str_step);
+
+    if (str_step[0] == '^') {
+      CLG_ctx_type_filter_exclude(ctx, str_step + 1, str_step_len - 1);
+    }
+    else {
+      CLG_ctx_type_filter_include(ctx, str_step, str_step_len);
+    }
+
+    if (str_step_end) {
+      /* Typically only be one, but don't fail on multiple. */
+      while (*str_step_end == ',') {
+        str_step_end++;
+      }
+      str_step = str_step_end;
+    }
+    else {
+      break;
+    }
+  }
+
+  CLG_LogType *log_type_iter = ctx->types;
+  while (log_type_iter) {
+    if (clg_ctx_filter_check(ctx, log_type_iter->identifier)) {
+      log_type_iter->flag |= CLG_FLAG_USE;
+    }
+    else {
+      log_type_iter->flag &= ~CLG_FLAG_USE;
+    }
+    log_type_iter = log_type_iter->next;
+  }
+}
+
 static enum CLG_Severity CLG_ctx_severity_level_get(CLogContext *ctx)
 {
   return ctx->default_type.severity_level;
@@ -784,19 +834,15 @@ static void CLG_ctx_free(CLogContext *ctx)
   ctx->log_records.first = NULL;
   ctx->log_records.last = NULL;
 
+  /* unregister all types */
   while (ctx->types != NULL) {
     CLG_LogType *item = ctx->types;
     ctx->types = item->next;
     MEM_freeN(item);
   }
 
-  for (uint i = 0; i < 2; i++) {
-    while (ctx->filters[i] != NULL) {
-      CLG_IDFilter *item = ctx->filters[i];
-      ctx->filters[i] = item->next;
-      MEM_freeN(item);
-    }
-  }
+  CLG_ctx_type_filters_clear(ctx);
+
 #ifdef WITH_CLOG_PTHREADS
   pthread_mutex_destroy(&ctx->types_lock);
 #endif
@@ -881,11 +927,52 @@ void CLG_type_filter_exclude(const char *type_match, int type_match_len)
   CLG_ctx_type_filter_exclude(g_ctx, type_match, type_match_len);
 }
 
+void CLG_type_filter_set(const char *glob_str)
+{
+  CLG_ctx_type_filter_set(g_ctx, glob_str);
+}
+
+int CLG_type_filter_get(char *buff, int buff_len)
+{
+  int written = 0;
+  CLG_IDFilter *filters_iter = g_ctx->filters[0]; /* exclude filters */
+  while (filters_iter) {
+    if (filters_iter->next == NULL) {
+      written += sprintf(buff, "^%s", filters_iter->match);
+    }
+    else {
+      written += sprintf(buff, "^%s,", filters_iter->match);
+    }
+    filters_iter = filters_iter->next;
+  }
+
+  filters_iter = g_ctx->filters[1]; /* include filters */
+  if (written != 0 && buff[written - 1] != ',') {
+    written += sprintf(buff, ",");
+  }
+  while (filters_iter) {
+    if (filters_iter->next == NULL) {
+      written += sprintf(buff, "%s", filters_iter->match);
+    }
+    else {
+      written += sprintf(buff, "%s,", filters_iter->match);
+    }
+    filters_iter = filters_iter->next;
+  }
+  assert(written <= buff_len);
+  return written;
+}
+
 void CLG_type_filter_include(const char *type_match, int type_match_len)
 {
   CLG_ctx_type_filter_include(g_ctx, type_match, type_match_len);
 }
 
+void CLG_type_filters_clear()
+{
+  CLG_ctx_type_filters_clear(g_ctx);
+}
+
 void CLG_severity_level_set(enum CLG_Severity level)
 {
   CLG_ctx_severity_level_set(g_ctx, level);
diff --git a/release/datafiles/userdef/userdef_default.c b/release/datafiles/userdef/userdef_default.c
index df1be29f642..b1bd043e906 100644
--- a/release/datafiles/userdef/userdef_default.c
+++ b/release/datafiles/userdef/userdef_default.c
@@ -230,6 +230,7 @@ const UserDef U_default = {
     .collection_instance_empty_size = 1.0f,
 
     .statusbar_flag = STATUSBAR_SHOW_VERSION,
+    .log_filter = "",
 
     .runtime =
         {
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index e51db930efe..37b67016e9d 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -651,6 +651,7 @@ class USERPREF_PT_system_logging(SystemPanel, CenterAlignMixIn, Panel):
         prefs = context.preferences
         system = prefs.system
 
+        layout.prop(system, "log_filter")
         layout.prop(system, "log_use_basename")
         layout.prop(system, "log_use_timestamp")
         layout.prop(system, "verbose")
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
index 4834fd1d27c..63e9f47a302 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -261,7 +261,7 @@ static void info_main_region_listener(wmWindow *UNUSED(win),
         ED_region_tag_redraw(region);
       }
       else if (wmn->data == ND_SPACE_INFO_CHANGE_REPORT_SOURCE) {
-        // todo this is very bad
+        /* TODO (grzelins) this is very bad */
         Main *bmain = G_MAIN;
         wmWindowManager *wm = bmain->wm.first;
         info_report_source_update(wm, sinfo);
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index b5a0664112d..13da7be7043 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -893,6 +893,8 @@ typedef struct UserDef {
 
   UserDef_Experimental experimental;
 
+  char log_filter[256];
+
   /** Runtime data (keep last). */
   UserDef_Runtime runtime;
 } UserDef;
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index f68ad2da46f..ea914cb1021 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1097,6 +1097,35 @@ static void rna_clog_log_verbosity_set(PointerRNA *UNUSED(ptr), int value)
   CLG_verbosity_level_set(value);
 }
 
+static void rna_Userdef_log_filter_update(struct Main *main,
+                                          struct Scene *scene,
+                                          struct PointerRNA *ptr)
+{
+  printf("Update!\n");
+}
+
+static void rna_clog_log_filter_get(PointerRNA *ptr, char *value)
+{
+  UserDef *userdef = (UserDef *)ptr->data;
+
+  char *dummy_buff = MEM_callocN(255, __func__);
+  int written = CLG_type_filter_get(dummy_buff, 255);
+  // memset(value, 0, 256);
+  // memcpy(value, dummy_buff, written + 1);
+
+  /* TODO (grzelins) how to init Userdef with command line value? */
+  BLI_strncpy(value, userdef->log_filter, 255);
+
+  MEM_freeN(dummy_buff);
+}
+
+static void rna_clog_log_filter_set(PointerRNA *ptr, const char *value)
+{
+  UserDef *userdef = (UserDef *)ptr->data;
+  BLI_strncpy(userdef->log_filter, value, 255);
+  CLG_type_filter_set(value);
+}
+
 static bool rna_clog_log_use_basename_get(PointerRNA *UNUSED(ptr))
 {
   return CLG_output_use_basename_get();
@@ -5735,14 +5764,12 @@ static void rna_def_userdef_system(BlenderRNA *brna)
       prop, "rna_clog_log_verbosity_get", "rna_clog_log_verbosity_set", NULL);
   RNA_def_property_ui_text(prop, "Log Verbosity", "Log level, when severity is set to verbose");
 
-  /* filters are implemented in strange way, it is not worth to implement it now
-    prop = RNA_def_property(srna, "log_filter_include", PROP_STRING, PROP_NONE);
-    RNA_def_property_string_funcs(prop,
-                                  "rna_clog_log_filter_include_get",
-                                  "rna_clog_log_filter_include_length",
-                                  "rna_clog_log_filter_include_set");
-    prop = RNA_def_property(srna, "log_filter_exclude", PROP_STRING, PROP_NONE);
-  */
+  prop = RNA_def_property(srna, "log_filter", PROP_STRING, PROP_NONE);
+  RNA_def_property_string_sdna(prop, NULL, "log_filter");
+  //  RNA_def_property_update(prop, 0, "rna_Userdef_log_filter_update");
+  RNA_def_property_string_funcs(prop, "rna_clog_log_filter_get", NULL, "rna_clog_log_filter_set");
+  RNA_def_property_ui_text(prop, "Log Filter", "Enable loggers based on this glob fliter");
+
   prop = RNA_def_property(srna, "log_use_basename", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_funcs(
       prop, "rna_clog_log_use_basename_get", "rna_clog_log_use_basename_set");
diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c
index ce46edd05c8..1b6f0a68013 100644
--- a/source/creator/creator_args.c
+++ b/source/creator/creator_args.c
@@ -879,29 +879,7 @@ static int arg_handle_log_set(int argc, const char **argv, void *UNUSED(data))
 {
   const char *arg_id = "--log";
   if (argc > 1) {
-    const char *str_step = argv[1];
-    while (*str_step) {
-      const char *str_step_end = strchr(str_step, ',');
-      int str_step_len = str_step_end ? (str_step_end - str_step) : strlen(str_step);
-
-      if (str_step[0] == '^') {
-        CLG_type_filter_exclude(str_step + 1, str_step_len - 1);
-      }
-      else {
-        CLG_type_filter_include(str_step, str_step_len);
-      }
-
-      if (str_step_end) {
-        /* Typically only be one, but don't fail on multiple. */
-        while (*str_step_end == ',') {
-          str_step

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list