[geany/geany-plugins] 554167: scope - added memory view, fixed glib compatibility

Dimitar Zhekov git-noreply at geany.org
Tue Jan 15 17:42:58 UTC 2013


Branch:      refs/heads/master
Author:      Dimitar Zhekov <dimitar.zhekov at gmail.com>
Committer:   Dimitar Zhekov <dimitar.zhekov at gmail.com>
Date:        Tue, 15 Jan 2013 17:42:58 UTC
Commit:      5541671bdc4ebb4ea65bd89d2f12583a2de5d0fa
             https://github.com/geany/geany-plugins/commit/5541671bdc4ebb4ea65bd89d2f12583a2de5d0fa

Log Message:
-----------
scope - added memory view, fixed glib compatibility


Modified Paths:
--------------
    scope/ChangeLog
    scope/NEWS
    scope/data/scope.glade
    scope/docs/codes.html
    scope/docs/scope.html
    scope/src/Makefile.am
    scope/src/break.c
    scope/src/common.h
    scope/src/conterm.c
    scope/src/conterm.h
    scope/src/debug.c
    scope/src/gtk216.c
    scope/src/gtk216.h
    scope/src/inspect.c
    scope/src/menu.c
    scope/src/parse.c
    scope/src/plugme.c
    scope/src/prefs.c
    scope/src/prefs.h
    scope/src/scope.c
    scope/src/scope.h
    scope/src/stack.c
    scope/src/thread.c
    scope/src/tooltip.c
    scope/src/utils.c
    scope/src/utils.h
    scope/src/views.c
    scope/src/views.h

Modified: scope/ChangeLog
43 files changed, 42 insertions(+), 1 deletions(-)
===================================================================
@@ -1,6 +1,47 @@
+2013-01-15  Dimitar Zhekov  <dimitar.zhekov at gmail.com>
+
+ * data/scope.glade, docs/codes.html, docs/scope.html, src/common.h,
+   src/Makefile.am, src/memory.c, src/memory.h, src/parse.c,
+   src/prefs.c, src/prefs.h, src/scope.c, src/views.c, src/views.h:
+   Added Memory subpage.
+ * data/scope.glade, src/conterm.c:
+   GtkTextView "debug_console" -> "debug_context".
+ * src/break.c, src/gtk216.c, src/scope.h, src/stack.c, src/thread.c,
+   src/views.c:
+   GTK_TREE_COLUMN(get_object(name)) -> get_column(name).
+ * src/conterm.c, src/menu.c, src/views.c:
+   Handle GDK_KP_Insert/GDK_KP_Delete/GTK_ISO_Space.
+ * src/conterm.c:
+   Don't invoke console on Ctrl/Alt/Mod ASCII characters.
+   Don't set debug_context properties already defined in scope.glade.
+ * src/conterm.h:
+   Properly declare dc_output/dc_output_nl as extern.
+ * src/debug.c, src/scope.c:
+   Invoke finalizers in (hopefully) proper order instead of processing
+   pending gtk+ events on finalize.
+ * src/debug.c:
+   Small initial wait for gdb kill in finalize instead of waiting
+   gdb_wait_death + 1.
+ * src/gtk216.c, src/gtk216.h, src/scope.c:
+   Emulate g_array_get_element_size() under glib 2.20.
+ * src/menu.c, src/plugme.c, src/utils.c, src/utils.h, src/views.c:
+   utils_str_replace_all() -> utils_strchrepl().
+ * src/scope.c:
+   Properly initialize inspects state.
+ * src/stack.c:
+   Select and focus the current frame instead of simply selecting.
+ * src/tooltip.c:
+   Unlimited toolbar length on pref_tooltips_length = 0, as described
+   in scope.html.
+ * src/utils.c:
+   Invoke g_array_get_element_size() only once in array_save().
+ * docs/scope.html, src/scope.c:
+   Increased version to 0.82.
+
+
 2013-01-03  Dimitar Zhekov  <dimitar.zhekov at gmail.com>
 
- * src/debug.c, src/scope.c
+ * src/debug.c, src/scope.c:
    Ask user whether to terminate debugging on build actions.
 
  * src/debug.c:


Modified: scope/NEWS
7 files changed, 7 insertions(+), 0 deletions(-)
===================================================================
@@ -1,3 +1,10 @@
+Scope 0.82 (2013-01-15)
+
+    * Added Memory subpage.
+
+    * Fixed compatibility with glib-2.20.
+
+
 Scope 0.80 (2013-01-02)
 
    * Mark all data views for update when a value is modified.


Modified: scope/data/scope.glade
186 files changed, 177 insertions(+), 9 deletions(-)
===================================================================
@@ -122,6 +122,11 @@
     <property name="stock">gtk-find</property>
     <property name="icon-size">1</property>
   </object>
+  <object class="GtkImage" id="memory_read_icon">
+    <property name="visible">True</property>
+    <property name="stock">gtk-jump-to</property>
+    <property name="icon-size">1</property>
+  </object>
   <object class="GtkImage" id="command_send_icon">
     <property name="visible">True</property>
     <property name="stock">gtk-ok</property>
@@ -910,6 +915,93 @@
       </object>
     </child>
   </object>
+  <object class="GtkMenu" id="memory_menu">
+    <child>
+      <object class="GtkImageMenuItem" id="memory_refresh">
+        <property name="label">gtk-refresh</property>
+        <property name="visible">True</property>
+        <property name="use_underline">True</property>
+        <property name="use_stock">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="memory_separator1">
+        <property name="visible">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkImageMenuItem" id="memory_read">
+        <property name="label" translatable="yes">R_ead</property>
+        <property name="visible">True</property>
+        <property name="use_underline">True</property>
+        <property name="image">memory_read_icon</property>
+        <property name="use_stock">False</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkImageMenuItem" id="memory_copy">
+        <property name="label">gtk-copy</property>
+        <property name="visible">True</property>
+        <property name="use_underline">True</property>
+        <property name="use_stock">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkImageMenuItem" id="memory_clear">
+        <property name="label">gtk-clear</property>
+        <property name="visible">True</property>
+        <property name="use_underline">True</property>
+        <property name="use_stock">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="memory_separator2">
+        <property name="visible">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="memory_group">
+        <property name="visible">True</property>
+        <property name="label" translatable="yes">_Group by</property>
+        <property name="use_underline">True</property>
+        <child type="submenu">
+          <object class="GtkMenu" id="memory_group_menu">
+            <child>
+              <object class="GtkRadioMenuItem" id="memory_group_1">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_1</property>
+                <property name="use_underline">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkRadioMenuItem" id="memory_group_2">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_2</property>
+                <property name="use_underline">True</property>
+                <property name="group">memory_group_1</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkRadioMenuItem" id="memory_group_4">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_4</property>
+                <property name="use_underline">True</property>
+                <property name="group">memory_group_1</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkRadioMenuItem" id="memory_group_8">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_8</property>
+                <property name="use_underline">True</property>
+                <property name="group">memory_group_1</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
   <object class="GtkMenu" id="console_menu">
     <child>
       <object class="GtkImageMenuItem" id="console_copy">
@@ -1257,6 +1349,16 @@
       <column type="gboolean"/>
     </columns>
   </object>
+  <object class="GtkListStore" id="memory_store">
+    <columns>
+      <!-- column-name memory_store_addr -->
+      <column type="gchararray"/>
+      <!-- column-name memory_store_bytes -->
+      <column type="gchararray"/>
+      <!-- column-name memory_store_ascii -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkTreeStore" id="inspect_store">
     <columns>
       <!-- column-name inspect_store_var1 -->
@@ -1844,22 +1946,85 @@
       </packing>
     </child>
     <child>
-      <object class="GtkScrolledWindow" id="debug_window">
+      <object class="GtkScrolledWindow" id="memory_window">
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="hscrollbar_policy">automatic</property>
+        <property name="vscrollbar_policy">automatic</property>
+        <child>
+          <object class="GtkTreeView" id="memory_view">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="model">memory_store</property>
+            <property name="headers_visible">False</property>
+            <property name="headers_clickable">False</property>
+            <child>
+              <object class="GtkTreeViewColumn" id="memory_addr_column">
+                <property name="resizable">True</property>
+                <child>
+                  <object class="GtkCellRendererText" id="memory_addr"/>
+                  <attributes>
+                    <attribute name="text">0</attribute>
+                  </attributes>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="memory_bytes_column">
+                <property name="resizable">True</property>
+                <child>
+                  <object class="GtkCellRendererText" id="memory_bytes"/>
+                  <attributes>
+                    <attribute name="text">1</attribute>
+                  </attributes>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="memory_ascii_column">
+                <property name="resizable">True</property>
+                <child>
+                  <object class="GtkCellRendererText" id="memory_ascii"/>
+                  <attributes>
+                    <attribute name="text">2</attribute>
+                  </attributes>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="position">6</property>
       </packing>
     </child>
     <child type="tab">
+      <object class="GtkLabel" id="memory_view_label">
+        <property name="visible">True</property>
+        <property name="label" translatable="yes">Memory</property>
+      </object>
+      <packing>
+        <property name="position">6</property>
+        <property name="tab_fill">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkScrolledWindow" id="debug_window">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="hscrollbar_policy">automatic</property>
+      </object>
+      <packing>
+        <property name="position">7</property>
+      </packing>
+    </child>
+    <child type="tab">
       <object class="GtkLabel" id="debug_console_label">
         <property name="visible">True</property>
         <property name="label" translatable="yes">Debug Console</property>
       </object>
       <packing>
-        <property name="position">6</property>
+        <property name="position">7</property>
         <property name="tab_fill">False</property>
       </packing>
     </child>
@@ -2607,6 +2772,9 @@
                                       </packing>
                                     </child>
                                   </object>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
                                 </child>
                               </object>
                             </child>
@@ -2880,10 +3048,10 @@
                                             <property name="visible">True</property>
                                             <property name="can_focus">True</property>
                                             <property name="activates_default">True</property>
+                                            <property name="width_chars">7</property>
                                             <property name="adjustment">option_inspect_count_adjustment</property>
                                             <property name="climb_rate">1</property>
                                             <property name="numeric">True</property>
-                                            <property name="width_chars">7</property>
                                           </object>
                                         </child>
                                       </object>
@@ -3548,7 +3716,7 @@
       </object>
     </child>
   </object>
-  <object class="GtkTextView" id="debug_console">
+  <object class="GtkTextView" id="debug_context">
     <property name="visible">True</property>
     <property name="can_focus">True</property>
     <property name="editable">False</property>
@@ -3566,17 +3734,17 @@
   </object>
   <object class="GtkSizeGroup" id="program_size_group">
     <widgets>
-      <widget name="program_executable_label"/>
-      <widget name="program_arguments_label"/>
-      <widget name="program_environment_label"/>
-      <widget name="program_working_dir_label"/>
       <widget name="program_load_script_label"/>
+      <widget name="program_working_dir_label"/>
+      <widget name="program_environment_label"/>
+      <widget name="program_arguments_label"/>
+      <widget name="program_executable_label"/>
     </widgets>
   </object>
   <object class="GtkSizeGroup" id="inspect_size_group">
     <widgets>
-      <widget name="inspect_expr_label"/>
       <widget name="inspect_name_label"/>
+      <widget name="inspect_expr_label"/>
     </widgets>
   </object>
 </interface>


Modified: scope/docs/codes.html
26 files changed, 17 insertions(+), 9 deletions(-)
===================================================================
@@ -41,11 +41,11 @@
 
 <tr><td class="nowrap">022<id>-break-condition</td>
 	<td class="tab">breakpoint <em>Condition</em> column edited</td>
-	<td class="tab">-''-</td></tr>
+	<td class="tab"><id>-break-info</td></tr>
 
 <tr><td class="nowrap">022<id>-break-commands</td>
 	<td class="tab">breakpoint <em>Script</em> column edited</td>
-	<td class="tab">-''-</td></tr>
+	<td class="tab"><id>-break-info</td></tr>
 
 <tr><td class="nowrap">023<id>-break-delete</td>
 	<td class="tab"><em>Delete</em> or un-<em>Toggle breakpoint</em></td>
@@ -131,6 +131,10 @@
 	<td class="tab">views idle update</td>
 	<td class="tab">same as 02<tid>-stack-list-variables</td></tr>
 
+<tr><td class="nowrap">04-data-read-memory-bytes</td>
+	<td class="tab">views idle update</td>
+	<td class="tab">fill <em>Memory</em> with data</td></tr>
+
 <tr><td class="nowrap">04<tid>-stack-info-frame</td>
 	<td class="tab">at stopped thread without address</td>
 	<td class="tab">fill the thread columns</td></tr>
@@ -141,13 +145,13 @@
 	<td class="tab">gdb startup if autorun</td>
 	<td class="tab">-exec-run if active breaks & no errors</td></tr>
 
-<tr><td class="nowrap">-''-</td>
+<tr><td class="nowrap">05</td>
 	<td class="tab">after temp break insert <em>location</em></td>
-	<td class="tab">-''-</td></tr>
+	<td class="tab">-exec-run if active breaks & no errors</td></tr>
 
-<tr><td class="nowrap">-''-</td>
+<tr><td class="nowrap">05</td>
 	<td class="tab">after temp break insert <em>1st loc</em></td>
-	<td class="tab">-''-</td></tr>
+	<td class="tab">-exec-run if active breaks & no errors</td></tr>
 
 <tr><td class="nowrap">05-list-features</td>
 	<td class="tab">first time gdb startup</td>
@@ -183,11 +187,15 @@
 
 <tr><td class="nowrap">07-gdb-set</td>
 	<td class="tab">local <em>Modify</em> / <em>Value</em> column edited</td>
-	<td class="tab">-''-</td></tr>
+	<td class="tab">mark data views as dirty</td></tr>
 
-<tr><td class="nowrap">-''-</td>
+<tr><td class="nowrap">07-gdb-set</td>
 	<td class="tab">watch <em>Modify</em> / <em>Value</em> column edited</td>
-	<td class="tab">-''-</td></tr>
+	<td class="tab">mark data views as dirty</td></tr>
+
+<tr><td class="nowrap">07-data-write-memory-bytes</td>
+	<td class="tab">memory hex values column edited</td>
+	<td class="tab">mark data views as dirty</td></tr>
 
 <tr><td class="nowrap">070<scid>-var-delete</td>
 	<td class="tab">un-<em>Apply</em> inspect</td>


Modified: scope/docs/scope.html
5 files changed, 3 insertions(+), 2 deletions(-)
===================================================================
@@ -534,7 +534,8 @@
 <p><em>tooltips_send_delay</em> - increase this setting to reduce the CPU time and GDB traffic
 used by the tooltips, or decrease it if they appear slower than your gtk+ setting.</p>
 
-<p><em>pref_tooltips_length</em> - maximum length of a tooltip message, 0 = unlimited.</p>
+<p><em>pref_tooltips_length</em> - maximum length of a tooltip message, 0 = unlimited.
+Default = 2048.</p>
 
 <p>[terminal] (*nix only)</p>
 
@@ -685,7 +686,7 @@
 
 <b><a name="copyright">Copyright</a></b>
 
-<p>Scope 0.80, Copyright (C) 2012 Dimitar Toshkov Zhekov</p>
+<p>Scope 0.82, Copyright (C) 2013 Dimitar Toshkov Zhekov</p>
 
 <p>The menu and toolbar icons are from <a href="http://netbeans.org">Netbeans</a>, except for
 BreakPoint.</p>


Modified: scope/src/Makefile.am
2 files changed, 2 insertions(+), 0 deletions(-)
===================================================================
@@ -19,6 +19,8 @@ scope_la_SOURCES = \
 	inspect.h \
 	local.c \
 	local.h \
+	memory.c \
+	memory.h \
 	menu.c \
 	menu.h \
 	parse.c \


Modified: scope/src/break.c
7 files changed, 3 insertions(+), 4 deletions(-)
===================================================================
@@ -214,7 +214,7 @@ static void on_break_column_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
 }
 
 static void on_break_ignore_editing_started(G_GNUC_UNUSED GtkCellRenderer *cell,
-	GtkCellEditable *editable, G_GNUC_UNUSED const gchar *path, gpointer G_GNUC_UNUSED gdata)
+	GtkCellEditable *editable, G_GNUC_UNUSED const gchar *path, G_GNUC_UNUSED gpointer gdata)
 {
 	if (GTK_IS_EDITABLE(editable))
 		validator_attach(GTK_EDITABLE(editable), VALIDATOR_NUMERIC);
@@ -1295,14 +1295,13 @@ static void on_break_apply_button_release(GtkWidget *widget, GdkEventButton *eve
 
 void break_init(void)
 {
-	GObject *break_type_column = get_object("break_type_column");
 	GtkWidget *menu;
 	guint i;
 
 	tree = view_connect("break_view", &model, &selection, break_cells, "break_window", NULL);
 	store = GTK_LIST_STORE(model);
 	sortable = GTK_TREE_SORTABLE(store);
-	gtk_tree_view_column_set_cell_data_func(GTK_TREE_VIEW_COLUMN(break_type_column),
+	gtk_tree_view_column_set_cell_data_func(get_column("break_type_column"),
 		GTK_CELL_RENDERER(get_object("break_type")), break_type_set_data_func, NULL, NULL);
 	g_signal_connect(get_object("break_ignore"), "editing-started",
 		G_CALLBACK(on_break_ignore_editing_started), NULL);
@@ -1315,7 +1314,7 @@ void break_init(void)
 	g_signal_connect(selection, "changed", G_CALLBACK(on_break_selection_changed), NULL);
 	gtk_widget_set_has_tooltip(GTK_WIDGET(tree), TRUE);
 	g_signal_connect(tree, "query-tooltip", G_CALLBACK(on_break_query_tooltip),
-		GTK_TREE_VIEW_COLUMN(get_object("break_display_column")));
+		get_column("break_display_column"));
 
 	menu = menu_select("break_menu", &break_menu_info, selection);
 	g_signal_connect(tree, "key-press-event", G_CALLBACK(on_break_key_press), NULL);


Modified: scope/src/common.h
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -31,6 +31,7 @@
 #include "gtk216.h"
 #include "inspect.h"
 #include "local.h"
+#include "memory.h"
 #include "menu.h"
 #include "parse.h"
 #include "plugme.h"


Modified: scope/src/conterm.c
15 files changed, 7 insertions(+), 8 deletions(-)
===================================================================
@@ -349,10 +349,13 @@ static void on_console_clear(G_GNUC_UNUSED const MenuItem *menu_item)
 static gboolean on_console_key_press(G_GNUC_UNUSED GtkWidget *widget,
 	GdkEventKey *event, G_GNUC_UNUSED gpointer gdata)
 {
-	if (event->keyval == GDK_Insert || (event->keyval >= 0x21 && event->keyval <= 0x7F))
+	gboolean insert = event->keyval == GDK_Insert || event->keyval == GDK_KP_Insert;
+
+	if (insert || (event->keyval >= 0x21 && event->keyval <= 0x7F &&
+		event->state <= GDK_SHIFT_MASK))
 	{
 		char command[2] = { event->keyval, '\0' };
-		view_command_line(event->keyval == GDK_Insert ? NULL : command, NULL, NULL, TRUE);
+		view_command_line(insert ? NULL : command, NULL, NULL, TRUE);
 	}
 
 	return FALSE;
@@ -487,7 +490,7 @@ void conterm_init(void)
 			"#C0C0C0", "#C000C0" };
 		guint i;
 
-		console = get_widget("debug_console");
+		console = get_widget("debug_context");
 		gtk_widget_modify_base(console, GTK_STATE_NORMAL, &pref_vte_colour_back);
 		gtk_widget_modify_cursor(console, &pref_vte_colour_fore, &pref_vte_colour_back);
 		ui_widget_modify_font_from_string(console, pref_vte_font);
@@ -495,12 +498,8 @@ void conterm_init(void)
 		debug_context = GTK_TEXT_VIEW(console);
 		dc_output = context_output;
 		dc_output_nl = context_output_nl;
-		gtk_text_view_set_editable(debug_context, FALSE);
-		gtk_text_view_set_wrap_mode(debug_context, GTK_WRAP_CHAR);
-		gtk_text_view_set_left_margin(debug_context, 2);
-		gtk_text_view_set_right_margin(debug_context, 2);
-
 		context = gtk_text_view_get_buffer(debug_context);
+
 		for (i = 0; i < NFD; i++)
 		{
 			fd_tags[i] = gtk_text_buffer_create_tag(context, NULL, "foreground",


Modified: scope/src/conterm.h
4 files changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -30,8 +30,8 @@
 #endif  /* G_OS_UNIX */
 
 /* pseudo-fd; 3 = prompt, 4 = scope error */
-void (*dc_output)(int fd, const char *text, gint length);
-void (*dc_output_nl)(int fd, const char *text, gint length);
+extern void (*dc_output)(int fd, const char *text, gint length);
+extern void (*dc_output_nl)(int fd, const char *text, gint length);
 void dc_error(const char *format, ...) G_GNUC_PRINTF(1, 2);
 
 void dc_clear(void);


Modified: scope/src/debug.c
8 files changed, 4 insertions(+), 4 deletions(-)
===================================================================
@@ -748,9 +748,6 @@ void debug_finalize(void)
 	{
 		signal(SIGINT, SIG_DFL);
 		g_source_remove(source_id);
-		/* avoid faults in g_main_context_dispatch() */
-		while (gtk_events_pending())
-			gtk_main_iteration();
 	}
 
 	if (gdb_state != INACTIVE)
@@ -758,8 +755,11 @@ void debug_finalize(void)
 		gint count = 0;
 
 		if (kill(gdb_pid, SIGKILL) == 0)
-			while (waitpid(gdb_pid, NULL, WNOHANG) == 0 && count++ <= pref_gdb_wait_death)
+		{
+			g_usleep(G_USEC_PER_SEC / 1000);
+			while (waitpid(gdb_pid, NULL, WNOHANG) == 0 && count++ < pref_gdb_wait_death)
 				g_usleep(G_USEC_PER_SEC / 100);
+		}
 
 		free_gdb();  /* may be still alive, but we can't do anything more */
 		statusbar_update_state(DS_INACTIVE);


Modified: scope/src/gtk216.c
64 files changed, 60 insertions(+), 4 deletions(-)
===================================================================
@@ -19,6 +19,54 @@
 
 #include "common.h"
 
+#if !GLIB_CHECK_VERSION(2, 20, 0)
+/* :-( */
+typedef struct _ArraySize
+{
+	GArray *array;
+	guint element_size;
+} ArraySize;
+
+GArray *array_sizes;
+
+static ArraySize *find_array_size(GArray *array)
+{
+	guint i;
+	gchar *data = array_sizes->data;
+
+	for (i = 0; i < array_sizes->len; i++, data += sizeof(ArraySize))
+		if (*(GArray **) data == array)
+			return (ArraySize *) data;
+
+	return NULL;
+}
+
+#undef g_array_sized_new
+GArray *scope_array_sized_new(gboolean zero_terminated, gboolean clear, guint element_size,
+	guint reserved_size)
+{
+	GArray *array = g_array_sized_new(zero_terminated, clear, element_size, reserved_size);
+	ArraySize array_size = { array, element_size };
+
+	g_array_append_val(array_sizes, array_size);
+	return array;
+}
+
+guint scope_array_get_element_size(GArray *array)
+{
+	return find_array_size(array)->element_size;
+}
+
+#undef g_array_free
+gchar *scope_array_free(GArray *array, gboolean free_segment)
+{
+	g_array_remove_index(array_sizes,
+		find_array_size(array) - (ArraySize *) array_sizes->data);
+
+	return g_array_free(array, free_segment);
+}
+#endif  /* GLIB 2.20.0 */
+
 #if !GTK_CHECK_VERSION(2, 18, 0)
 void gtk_widget_set_visible(GtkWidget *widget, gboolean visible)
 {
@@ -74,8 +122,16 @@ void gtk216_init(void)
 	SortColumnId *scd;
 
 	for (scd = sort_column_ids; scd->id; scd++)
-	{
-		GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(get_object(scd->id));
-		gtk_tree_view_column_set_sort_column_id(column, scd->sort_column_id);
-	}
+		gtk_tree_view_column_set_sort_column_id(get_column(scd->id), scd->sort_column_id);
+
+#if !GLIB_CHECK_VERSION(2, 20, 0)
+	array_sizes = g_array_sized_new(FALSE, FALSE, sizeof(ArraySize), 0x10);
+#endif
+}
+
+void gtk216_finalize(void)
+{
+#if !GLIB_CHECK_VERSION(2, 20, 0)
+	g_array_free(array_sizes, TRUE);
+#endif
 }


Modified: scope/src/gtk216.h
14 files changed, 14 insertions(+), 0 deletions(-)
===================================================================
@@ -19,6 +19,19 @@
 
 #ifndef GTK216_H
 
+#if !GLIB_CHECK_VERSION(2, 20, 0)
+GArray *scope_array_sized_new(gboolean zero_terminated, gboolean clear, guint element_size,
+	guint reserved_size);
+#define g_array_sized_new(zero_terminated, clear, element_size, reserved_size) \
+	scope_array_sized_new((zero_terminated), (clear), (element_size), (reserved_size))
+#define g_array_new(zero_terminated, clear, elt_size) \
+	g_array_sized_new((zero_terminated), (clear), (elt_size), 0)
+guint scope_array_get_element_size(GArray *array);
+#define g_array_get_element_size(array) scope_array_get_element_size(array)
+gchar *scope_array_free(GArray *array, gboolean free_segment);
+#define g_array_free(array, free_segment) scope_array_free((array), (free_segment))
+#endif  /* GLIB 2.20.0 */
+
 #if !GTK_CHECK_VERSION(2, 18, 0)
 #define gtk_widget_get_visible(widget) GTK_WIDGET_VISIBLE(widget)
 #define gtk_widget_get_sensitive(widget) GTK_WIDGET_SENSITIVE(widget)
@@ -26,6 +39,7 @@
 #endif
 
 void gtk216_init(void);
+void gtk216_finalize(void);
 
 #define GTK216_H 1
 #endif


Modified: scope/src/inspect.c
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -397,7 +397,7 @@ void on_inspect_ndeleted(GArray *nodes)
 	iff (*token <= '1', "%s: invalid i_oper", token)
 	{
 		GtkTreeIter iter;
-		
+
 		if (inspect_find(&iter, FALSE, token + 1))
 		{
 			if (*token == '0')


Modified: scope/src/menu.c
6 files changed, 3 insertions(+), 3 deletions(-)
===================================================================
@@ -65,9 +65,9 @@ gboolean menu_insert_delete(const GdkEventKey *event, const MenuInfo *menu_info,
 {
 	const char *name;
 
-	if (event->keyval == GDK_Insert)
+	if (event->keyval == GDK_Insert || event->keyval == GDK_KP_Insert)
 		name = insert_name;
-	else if (event->keyval == GDK_Delete)
+	else if (event->keyval == GDK_Delete || event->keyval == GDK_KP_Delete)
 		name = delete_name;
 	else
 		return FALSE;
@@ -348,7 +348,7 @@ static void menu_evaluate_modify(const gchar *expr, const char *value, const gch
 	if (gtk_dialog_run(GTK_DIALOG(modify_dialog)) == GTK_RESPONSE_ACCEPT)
 	{
 		text = utils_text_buffer_get_text(modify_text, -1);
-		utils_str_replace_all(&text, "\n", " ");
+		utils_strchrepl(text, '\n', ' ');
 
 		if (validate_column(text, TRUE))
 		{


Modified: scope/src/parse.c
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -93,6 +93,7 @@ static void on_data_modified(G_GNUC_UNUSED GArray *nodes)
 	{ "^done,ndeleted=\"",            on_inspect_ndeleted,     '7',  '\0', 0 },
 	{ "^done,path_expr=\"",           on_inspect_path_expr,    '4',  '\0', 1 },
 	{ "^done,changelist=[",           on_inspect_changelist,   '\0', '\0', 1 },
+	{ "^done,memory=[",               on_memory_read_bytes,    '\0', '\0', 1 },
 	{ "^done,features=[",             on_break_features,       '5',  '\0', 1 },
 	{ "^done,features=[",             on_target_features,      '7',  '\0', 1 },
 	{ "^running",                     on_debug_loaded,         '1',  '\0', 0 },


Modified: scope/src/plugme.c
16 files changed, 0 insertions(+), 16 deletions(-)
===================================================================
@@ -205,19 +205,3 @@ GtkWidget *plugme_ui_add_config_file_menu_item(const gchar *real_path, const gch
 
 	return item;
 }
-
-#ifndef utils_str_replace_all
-void utils_str_replace_all(gchar **haystack, const gchar *needle, const gchar *replacement)
-{
-	GString *str;
-
-	g_return_if_fail(*haystack != NULL);
-
-	str = g_string_new(*haystack);
-
-	g_free(*haystack);
-	utils_string_replace_all(str, needle, replacement);
-
-	*haystack = g_string_free(str, FALSE);
-}
-#endif  /* utils_str_replace_all */


Modified: scope/src/prefs.c
9 files changed, 7 insertions(+), 2 deletions(-)
===================================================================
@@ -58,6 +58,9 @@
 gint pref_tooltips_send_delay;
 gint pref_tooltips_length;
 
+gint pref_memory_bytes_per_line;
+gchar *pref_memory_font;
+
 #ifdef G_OS_UNIX
 static gboolean pref_terminal_save_pos;
 gboolean pref_terminal_padding;
@@ -265,7 +268,7 @@ void prefs_init(void)
 	group = stash_group_new("scope");
 	stash_group_add_string(group, &pref_gdb_executable, "gdb_executable", "gdb");
 	stash_group_add_boolean(group, &pref_gdb_async_mode, "gdb_async_mode", FALSE);
-	stash_group_add_integer(group, &pref_gdb_buffer_length, "gdb_buffer_length", 0x3FFF);
+	stash_group_add_integer(group, &pref_gdb_buffer_length, "gdb_buffer_length", 16383);
 	stash_group_add_integer(group, &pref_gdb_wait_death, "gdb_wait_death", 20);
 #ifndef G_OS_UNIX
 	stash_group_add_integer(group, &pref_gdb_send_interval, "gdb_send_interval", 5);
@@ -289,7 +292,9 @@ void prefs_init(void)
 	stash_group_add_integer(group, &pref_show_toolbar_items, "show_toolbar_items", 0xFF);
 	stash_group_add_integer(group, &pref_tooltips_fail_action, "tooltips_fail_action", 25);
 	stash_group_add_integer(group, &pref_tooltips_send_delay, "tooltips_send_delay", 25);
-	stash_group_add_integer(group, &pref_tooltips_length, "tooltips_length", 0x7FF);
+	stash_group_add_integer(group, &pref_tooltips_length, "tooltips_length", 2048);
+	stash_group_add_integer(group, &pref_memory_bytes_per_line, "memory_line_bytes", 16);
+	stash_group_add_string(group, &pref_memory_font, "memory_font", "");
 	scope_group = group;
 
 #ifdef stash_tree_setup


Modified: scope/src/prefs.h
3 files changed, 3 insertions(+), 0 deletions(-)
===================================================================
@@ -50,6 +50,9 @@
 extern gint pref_tooltips_send_delay;
 extern gint pref_tooltips_length;
 
+extern gint pref_memory_bytes_per_line;
+extern gchar *pref_memory_font;
+
 #ifdef G_OS_UNIX
 extern gboolean pref_terminal_padding;
 extern gint pref_terminal_window_x;


Modified: scope/src/scope.c
15 files changed, 9 insertions(+), 6 deletions(-)
===================================================================
@@ -32,7 +32,7 @@
 PLUGIN_VERSION_CHECK(215)
 
 PLUGIN_SET_TRANSLATABLE_INFO(LOCALEDIR, GETTEXT_PACKAGE, _("Scope Debugger"),
-	_("Simple GDB front-end."), "0.80" , "Dimitar Toshkov Zhekov <dimitar.zhekov at gmail.com>")
+	_("Simple GDB front-end."), "0.82" , "Dimitar Toshkov Zhekov <dimitar.zhekov at gmail.com>")
 
 /* Keybinding(s) */
 enum
@@ -553,6 +553,7 @@ void plugin_init(G_GNUC_UNUSED GeanyData *gdata)
 	watch_init();
 	stack_init();
 	local_init();
+	memory_init();
 	menu_init();
 	menu_set_popup_keybindings(item);
 
@@ -572,7 +573,7 @@ void plugin_init(G_GNUC_UNUSED GeanyData *gdata)
 	}
 
 	toolbar_update_state(DS_INACTIVE);
-	watches_update_state(DS_INACTIVE);
+	views_update_state(DS_INACTIVE);
 	scope_configure();
 
 	g_signal_connect(debug_panel, "switch-page", G_CALLBACK(on_view_changed), NULL);
@@ -588,7 +589,6 @@ void plugin_cleanup(void)
 		return;
 
 	gtk_widget_destroy(debug_item);
-	gtk_widget_destroy(debug_statusbar);
 	gtk_widget_destroy(debug_panel);
 
 	for (item = toolbar_items; item->index != -1; item++)
@@ -601,12 +601,15 @@ void plugin_cleanup(void)
 	inspect_finalize();
 	thread_finalize();
 	break_finalize();
-	utils_finalize();
+	memory_finalize();
+	menu_finalize();
 	views_finalize();
-	debug_finalize();
+	utils_finalize();
 	parse_finalize();
 	prefs_finalize();
-	menu_finalize();
+	debug_finalize();
+	gtk216_finalize();
 
+	gtk_widget_destroy(debug_statusbar);
 	g_object_unref(builder);
 }


Modified: scope/src/scope.h
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -25,6 +25,7 @@
 void update_state(DebugState state);
 GObject *get_object(const char *name);
 GtkWidget *get_widget(const char *name);
+#define get_column(name) GTK_TREE_VIEW_COLUMN(get_object(name))
 #define find_widget(parent, name) GTK_WIDGET(g_object_get_data(G_OBJECT(parent), (name)))
 void open_debug_panel(void);
 void scope_configure(void);


Modified: scope/src/stack.c
8 files changed, 4 insertions(+), 4 deletions(-)
===================================================================
@@ -59,7 +59,7 @@ static void stack_node_location(const ParseNode *node, const char *fid)
 			parse_location_free(&loc);
 
 			if (!g_strcmp0(id, fid))
-				gtk_tree_selection_select_iter(selection, &iter);
+				utils_tree_set_cursor(selection, &iter, -1);
 		}
 	}
 }
@@ -81,7 +81,7 @@ void on_stack_frames(GArray *nodes)
 			GtkTreeIter iter;
 
 			if (gtk_tree_model_get_iter_first(model, &iter))
-				gtk_tree_selection_select_iter(selection, &iter);
+				utils_tree_set_cursor(selection, &iter, -1);
 		}
 	}
 }
@@ -286,7 +286,7 @@ static void on_stack_show_entry(const MenuItem *menu_item)
 	do
 	{
 		const char *func1;
-		
+
 		gtk_tree_model_get(model, &iter, STACK_FUNC, &func1, -1);
 		if (!strcmp(func, func1))
 		{
@@ -366,7 +366,7 @@ void stack_init(void)
 	view_set_line_data_func("stack_line_column", "stack_line", STACK_LINE);
 	gtk_widget_set_has_tooltip(GTK_WIDGET(tree), TRUE);
 	g_signal_connect(tree, "query-tooltip", G_CALLBACK(on_view_query_tooltip),
-		GTK_TREE_VIEW_COLUMN(get_object("stack_base_name_column")));
+		get_column("stack_base_name_column"));
 
 	g_signal_connect(tree, "key-press-event", G_CALLBACK(on_view_key_press),
 		stack_seek_selected);


Modified: scope/src/thread.c
4 files changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -481,7 +481,7 @@ void on_thread_exited(GArray *nodes)
 
 		if (!g_strcmp0(tid, gdb_thread))
 			set_gdb_thread(NULL, FALSE);
-		
+
 		if (find_thread(tid, &iter))
 		{
 			gboolean was_selected = !g_strcmp0(tid, thread_id);
@@ -897,7 +897,7 @@ void thread_init(void)
 	view_set_sort_func(sortable, THREAD_TARGET_ID, thread_ident_compare);
 	gtk_widget_set_has_tooltip(GTK_WIDGET(tree), TRUE);
 	g_signal_connect(tree, "query-tooltip", G_CALLBACK(on_view_query_tooltip),
-		GTK_TREE_VIEW_COLUMN(get_object("thread_base_name_column")));
+		get_column("thread_base_name_column"));
 
 	thread_groups = array_new(ThreadGroup, 0x10);
 	RUNNING = _("Running");


Modified: scope/src/tooltip.c
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -56,7 +56,7 @@ static void tooltip_set(gchar *text)
 
 	if (show)
 	{
-		if (strlen(output) > (guint) pref_tooltips_length + 3)
+		if (pref_tooltips_length && strlen(output) > (size_t) pref_tooltips_length + 3)
 			strcpy(output + pref_tooltips_length, "...");
 
 		tooltip_trigger();


Modified: scope/src/utils.c
26 files changed, 24 insertions(+), 2 deletions(-)
===================================================================
@@ -113,6 +113,27 @@ const gchar *utils_skip_spaces(const gchar *text)
 	return text;
 }
 
+void utils_strchrepl(char *text, char c, char rep)
+{
+	char *p = text;
+
+	while (*text)
+	{
+		if (*text == c)
+		{
+			if (rep)
+				*text = rep;
+		}
+		else if (!rep)
+			*p++ = *text;
+
+		text++;
+	}
+
+	if (!rep)
+		*p = '\0';
+}
+
 gchar *array_append(GArray *array)
 {
 	g_array_set_size(array, array->len + 1);
@@ -194,8 +215,9 @@ void array_save(GArray *array, GKeyFile *config, const gchar *prefix, ASaveFunc
 {
 	guint i, n = 0;
 	gchar *data = array->data;
+	guint size = g_array_get_element_size(array);
 
-	for (i = 0; i < array->len; i++, data += g_array_get_element_size(array))
+	for (i = 0; i < array->len; i++, data += size)
 	{
 		char *section = g_strdup_printf("%s_%d", prefix, n);
 		n += save_func(config, section, data);
@@ -663,7 +685,7 @@ static void on_insert_text(GtkEditable *editable, gchar *new_text, gint new_text
 	G_GNUC_UNUSED gint *position, gpointer gdata)
 {
 	gboolean valid = TRUE;
-	
+
 	if (new_text_length == -1)
 		new_text_length = (gint) strlen(new_text);
 


Modified: scope/src/utils.h
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -27,6 +27,7 @@
 void utils_handle_button_release(GtkWidget *widget, GdkEventButton *event);
 gboolean utils_check_path(const char *pathname, gboolean file, int mode);  /* "" ok */
 const gchar *utils_skip_spaces(const gchar *text);
+void utils_strchrepl(char *text, char c, char repl);
 
 #define array_new(type, start) g_array_sized_new(FALSE, FALSE, sizeof(type), (start))
 gchar *array_append(GArray *array);


Modified: scope/src/views.c
13 files changed, 8 insertions(+), 5 deletions(-)
===================================================================
@@ -40,6 +40,7 @@
 	{ FALSE, stack_clear,    stack_update,    TRUE,  DS_DEBUG },
 	{ FALSE, locals_clear,   locals_update,   TRUE,  DS_DEBUG },
 	{ FALSE, watches_clear,  watches_update,  TRUE,  DS_DEBUG },
+	{ FALSE, memory_clear,   memory_update,   FALSE, DS_SENDABLE },
 	{ FALSE, NULL,           dc_update,       FALSE, DS_DEBUG },
 	{ FALSE, inspects_clear, inspects_update, FALSE, DS_DEBUG },
 	{ FALSE, tooltip_clear,  tooltip_update,  FALSE, DS_SENDABLE },
@@ -56,6 +57,7 @@ void views_data_dirty(void)
 	view_dirty(VIEW_STACK);
 	view_dirty(VIEW_LOCALS);
 	view_dirty(VIEW_WATCHES);
+	view_dirty(VIEW_MEMORY);
 	view_dirty(VIEW_INSPECT);
 	view_dirty(VIEW_TOOLTIP);
 }
@@ -171,7 +173,7 @@ gboolean on_view_key_press(G_GNUC_UNUSED GtkWidget *widget, GdkEventKey *event,
 	/* from msgwindow.c */
 	gboolean enter_or_return = ui_is_keyval_enter_or_return(event->keyval);
 
-	if (enter_or_return || event->keyval == GDK_space)
+	if (enter_or_return || event->keyval == GDK_space || event->keyval == GDK_KP_Space)
 		seeker(enter_or_return);
 
 	return FALSE;
@@ -316,7 +318,7 @@ static void view_line_cell_data_func(G_GNUC_UNUSED GtkTreeViewColumn *column,
 
 void view_set_line_data_func(const char *column, const char *cell, gint column_id)
 {
-	gtk_tree_view_column_set_cell_data_func(GTK_TREE_VIEW_COLUMN(get_object(column)),
+	gtk_tree_view_column_set_cell_data_func(get_column(column),
 		GTK_CELL_RENDERER(get_object(cell)), view_line_cell_data_func,
 		GINT_TO_POINTER(column_id), NULL);
 }
@@ -337,7 +339,7 @@ void view_display_edited(GtkTreeModel *model, gboolean condition, const gchar *p
 			gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, COLUMN_HB_MODE,
 				&hb_mode, -1);
 			locale = utils_get_locale_from_display(new_text, hb_mode);
-			utils_str_replace_all(&locale, "\n", " ");
+			utils_strchrepl(locale, '\n', ' ');
 			debug_send_format(F, format, name, locale);
 			g_free(locale);
 		}
@@ -348,7 +350,7 @@ void view_display_edited(GtkTreeModel *model, gboolean condition, const gchar *p
 
 void view_column_set_visible(const char *name, gboolean visible)
 {
-	gtk_tree_view_column_set_visible(GTK_TREE_VIEW_COLUMN(get_object(name)), visible);
+	gtk_tree_view_column_set_visible(get_column(name), visible);
 }
 
 void view_seek_selected(GtkTreeSelection *selection, gboolean focus, SeekerType seeker)
@@ -467,7 +469,8 @@ static void on_command_send_button_clicked(G_GNUC_UNUSED GtkButton *button,
 	char *locale;
 
 	thread_synchronize();
-	utils_str_replace_all(&text, "\n", " ");
+	utils_strchrepl(text, '\n', ' ');
+	gtk_text_buffer_set_text(command_text, text, -1);
 	start = utils_skip_spaces(text);
 	locale = gtk_toggle_button_get_active(command_locale) ?
 		utils_get_locale_from_utf8(start) : strdup(start);


Modified: scope/src/views.h
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -27,6 +27,7 @@
 	VIEW_STACK,
 	VIEW_LOCALS,
 	VIEW_WATCHES,
+	VIEW_MEMORY,
 	VIEW_CONSOLE,
 	VIEW_INSPECT,
 	VIEW_TOOLTIP,



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list