Branch: refs/heads/master
Author: Colomban Wendling <ban(a)herbesfolles.org>
Committer: Colomban Wendling <ban(a)herbesfolles.org>
Date: Sun, 26 Jan 2014 22:25:58 UTC
Commit: 48b607c181646064eb00abc54178c3fb2cac8c22
https://github.com/geany/geany-plugins/commit/48b607c181646064eb00abc54178c…
Log Message:
-----------
spellcheck: Fix crash when closing a document quickly after adding data to it
When using timeout callbacks, we need to check the documents are still valid
in the callbacks, in the case they e.g. have been closed since the timeout
started.
Modified Paths:
--------------
spellcheck/src/gui.c
Modified: spellcheck/src/gui.c
27 files changed, 16 insertions(+), 11 deletions(-)
===================================================================
@@ -412,21 +412,26 @@ static void indicator_clear_on_line(GeanyDocument *doc, gint line_number)
static gboolean check_lines(gpointer data)
{
GeanyDocument *doc = check_line_data.doc;
- gchar *line;
- gint line_number = check_line_data.line_number;
- gint line_count = check_line_data.line_count;
- gint i;
- for (i = 0; i < line_count; i++)
+ /* since we're in an timeout callback, the document may have been closed */
+ if (DOC_VALID (doc))
{
- line = sci_get_line(doc->editor->sci, line_number);
- indicator_clear_on_line(doc, line_number);
- if (sc_speller_process_line(doc, line_number, line) != 0)
+ gchar *line;
+ gint line_number = check_line_data.line_number;
+ gint line_count = check_line_data.line_count;
+ gint i;
+
+ for (i = 0; i < line_count; i++)
{
- if (sc_info->use_msgwin)
- msgwin_switch_tab(MSG_MESSAGE, FALSE);
+ line = sci_get_line(doc->editor->sci, line_number);
+ indicator_clear_on_line(doc, line_number);
+ if (sc_speller_process_line(doc, line_number, line) != 0)
+ {
+ if (sc_info->use_msgwin)
+ msgwin_switch_tab(MSG_MESSAGE, FALSE);
+ }
+ g_free(line);
}
- g_free(line);
}
check_line_data.check_while_typing_idle_source_id = 0;
return FALSE;
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
Branch: refs/heads/master
Author: Frank Lanitz <frank(a)frank.uvena.de>
Committer: Frank Lanitz <frank(a)frank.uvena.de>
Date: Mon, 13 Jan 2014 17:20:26 UTC
Commit: 36e85e4176781eddc1b2082705b7b2e6f50e1e0d
https://github.com/geany/geany-plugins/commit/36e85e4176781eddc1b2082705b7b…
Log Message:
-----------
GeanyLipsum: Fix Loremipsum text
Modified Paths:
--------------
geanylipsum/src/geanylipsum.c
Modified: geanylipsum/src/geanylipsum.c
11 files changed, 7 insertions(+), 4 deletions(-)
===================================================================
@@ -45,10 +45,13 @@
static GtkWidget *main_menu_item = NULL;
static gchar *lipsum = NULL;
static const gchar *default_loremipsum = "\
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy\
-eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam\
-voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet \
-clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. ";
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do\
+eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\
+aliquip ex ea commodo consequat. Duis aute irure dolor in\
+reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\
+pariatur. Excepteur sint occaecat cupidatat non proident, sunt in\
+culpa qui officia deserunt mollit anim id est laborum.";
/* Doing some basic keybinding stuff */
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
Branch: refs/heads/master
Author: Dimitar Zhekov <dimitar.zhekov(a)gmail.com>
Committer: Dimitar Zhekov <dimitar.zhekov(a)gmail.com>
Date: Mon, 06 Jan 2014 18:50:59 UTC
Commit: 601b1cf5c611aaad0bfb8210396a3991e03c8f78
https://github.com/geany/geany-plugins/commit/601b1cf5c611aaad0bfb8210396a3…
Log Message:
-----------
breakpoint improvements and other changes, version 0.93.1
Modified Paths:
--------------
scope/ChangeLog
scope/NEWS
scope/data/scope.glade
scope/docs/codes.html
scope/docs/scope.html
scope/src/break.c
scope/src/debug.c
scope/src/gtk216.c
scope/src/inspect.c
scope/src/scope.c
scope/src/watch.c
Modified: scope/ChangeLog
33 files changed, 30 insertions(+), 3 deletions(-)
===================================================================
@@ -1,9 +1,36 @@
+2013-01-06 Dimitar Zhekov <dimitar.zhekov(a)gmail.com>
+
+ * data/scope.glade, src/break.c:
+ Show breakpoint origin in the type column, with tooltip.
+ * data/scope.glade, docs/scope.html:
+ "Temporary breakpoint at" -> "Temporary breakpoint on load at".
+ * docs/scope.html:
+ Some improvements and clarifications.
+ * src/break.c:
+ Remove the "Temporary breakpoint on load" only on unload, not on
+ hit or when resetting the program state.
+ Show catchpoint condition (depends on the gdb version).
+ * src/break.c, src/debug.c, src/inspect.c:
+ Apply any unapplied breakpoints/inspects marked as "Apply on run"
+ on each run (only important if "Auto run/exit" is off).
+ * src/gtk216.c:
+ Make sort_column_ids[] const.
+ * src/scope.c, src/watch.c:
+ Unify GPOINTER_TO_INT(FALSE) handling.
+ * src/scope.c:
+ Emit a message to Geany log if scope.glade can't be loaded, by
+ Enrico Tröger.
+ Removed static last_statusbar_state, unused since ScpTreeStore
+ dynamic registration.
+ * docs/scope.html, src/scope.c:
+ Increased version to 0.93.1.
+
2013-10-26 Dimitar Zhekov <dimitar.zhekov(a)gmail.com>
* src/memory.c:
- Handle offset (albeit it seems that gdb just adds it to start).
- Fix count for memory block with holes.
- Use g_ascii_strtoull() instead of sscanf.
+ Handle offset (although it seems that gdb just adds it to start).
+ Fix counting for memory block with holes.
+ sscanf() -> g_ascii_strtoull().
* src/prefs.c:
Removed an unused structure.
Modified: scope/NEWS
10 files changed, 10 insertions(+), 0 deletions(-)
===================================================================
@@ -1,3 +1,13 @@
+Scope 0.93.1 (2014-01-06):
+
+ * Show breakpoint origin in the type column, with tooltip.
+
+ * Show catchpoint condition (depends on the gdb version).
+
+ * Apply any unapplied breakpoints/inspects marked as "Apply on
+ run" on each run (only important if "Auto run/exit" is off).
+
+
Scope 0.92 (2013-09-07)
* Better support for Geany message window on right, but don't
Modified: scope/data/scope.glade
4 files changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -1416,7 +1416,7 @@
<!-- column-name break_store_temporary -->
<column type="gboolean"/>
<!-- column-name break_store_discard -->
- <column type="gboolean"/>
+ <column type="gint"/>
<!-- column-name break_store_missing -->
<column type="gboolean"/>
</columns>
@@ -2801,7 +2801,7 @@
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="program_temp_breakpoint">
- <property name="label" translatable="yes">_Temporary breakpoint at:</property>
+ <property name="label" translatable="yes">_Temporary breakpoint on load at:</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
Modified: scope/docs/codes.html
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -60,7 +60,7 @@
<td class="tab">full breakpoint list refresh (without token is partial)</td></tr>
<tr><td class="nowrap">02-break-insert -t</td>
- <td class="tab">Insert <em>Temporary breakpoint at</em></td>
+ <td class="tab"><em>Temporary breakpoint on load at</em></td>
<td class="tab">mark for discard</td></tr>
<tr><td class="nowrap">020-break-insert -t</td>
Modified: scope/docs/scope.html
128 files changed, 69 insertions(+), 59 deletions(-)
===================================================================
@@ -8,7 +8,6 @@
<style type="text/css">
.tab { padding-left:1em; }
.tab1 { padding-left:1.5em; }
- .tab2 { padding-left:2em; }
</style>
</head>
@@ -80,7 +79,7 @@
<p>Scope is a graphical <a href="http://www.gnu.org/software/gdb">GDB</a> front-end with the
normal functions you would expect (stepping, breakpoints...), and a few notable features:</p>
<ul>
-<li>The comminication between Scope and gdb is asynchronous.</li>
+<li>The entire comminication between Scope and gdb is asynchronous.</li>
<li>You can enter any gdb command, at any time (of course, for the command to be executed,
gdb must be[come] available).</li>
<li>All gdb I/O (along with some other messages) is displayed in a terminal-like "Debug
@@ -102,11 +101,13 @@
<h3><a name="requirements">Requirements</a></h3>
-<p>Geany 1.22 or later and the respective libraries, including VTE under *nix.</p>
+<p>Geany 1.22 or later and the respective libraries.</p>
<p>GDB 7.3 or later.</p>
-<p>win~1: XP or later.</p>
+<p>*nix only: VTE library.</p>
+
+<p>Windows only: XP or later.</p>
<p>GDB manual (recommended).</p>
@@ -117,7 +118,7 @@
<p>From the main Geany menu, invoke <em>Debug --> Setup Program</em> (or <em>Tools -->
Debug --> Setup Program</em>, if there's no <em>Debug</em> in the main menu).<br>
Choose some small executable file compiled with gdb debug information.<br>
-Check <em>Temporary breakpoint at</em> and press <em>OK</em>.<br>
+Check <em>Temporary breakpoint on load at</em> and press <em>OK</em>.<br>
Invoke <em>Debug --> Run/Continue</em>.</p>
<div>If everything went all right, several things will happen:</div>
@@ -128,7 +129,7 @@
neccessary<br>
- The first line of code will be marked with brown arrow in the markers margin, or with brown
background<br>
-- All source files will be marked as read-only (their tabs will turn green)<br>
+- All source files will be marked as read-only (their tab text will become green)<br>
- The <em>Load</em> label will be replaced with a color-less <em>Debug</em>.
</div>
@@ -143,11 +144,12 @@
<ul>
<li>Debug menu in the main Geany menu, containing the most commonly used commands (running,
-stepping, toggle breakpoint etc.) If Scope can't access the main menu, it'll place Debug under
-Tools.</li>
+stepping, toggle breakpoint etc.)<br>
+If Scope can't access the main menu, it'll place Debug under Tools.</li>
<li>Debug page in the lower panel, with subpages that display the program output, threads,
breakpoints etc.</li>
-<li>Inspect and Registers page in the side panel.</li>
+<li>Inspect and Registers pages in the side panel.</li>
+<li>Local menus for the Debug subpages, Inspect and Registers.</li>
<li>Toolbar items - identical to their Debug menu counterparts.</li>
<li>Command Dialog - to enter gdb commands. Will be closed automatically if gdb exits.</li>
<li>A small label on the right of your Geany status bar, which displays the current debugging
@@ -170,12 +172,11 @@
program is not started yet, or is already terminated. Scope will automatically switch to this
state in some situations.</td></tr>
<tr><td>(blinking)</td><td class="tab"></td><td class="tab">Loading a program, signal
-received, error parsing gdb output, the requested action can not be performed in the current
-debug state etc.</td></tr>
+received, error parsing gdb output etc.</td></tr>
</table>
The bracketed letters are used to indicate the states supported by a command. For example,
-[RH] means "available in Ready and Hang states only". Debug and Assem are states are almost
-identical in this aspect and share [D].</li>
+[RH] means "available in Ready and Hang states only". Debug and Assem are almost identical in
+this aspect and share [D].</li>
</ul>
<h3><a name="debug_menu">Debug menu</a></h3>
@@ -187,30 +188,30 @@
<p><em>Arguments</em> are in gdb syntax.</p>
-<p><em>Environment</em> is one var=value per line.</p>
+<p><em>Environment</em> is one varname=value per line.</p>
-<p><em>Load script</em> is a gdb script file to be executed when gdb is loaded, before
-running the program (see <a href="#run_continue">Run/Continue</a>). If this script contains a
-gdb run command, it should contain at least one breakpoint command as well, because all Scope
-breakpoints are applied after the program is loaded - and it may be loaded by the script.</p>
+<p><em>Load script</em> is a gdb script, executed when gdb is loaded. May be used to setup the
+program. If no <em>Executable</em> is specified, Scope will assume that the script, if any,
+loads the program.</p>
<p><em><a name="auto_run_exit">Auto run program/exit gdb</a></em> - with this box unchecked,
the first <a href="#run_continue">Run/Continue</a> will load and setup the program without
-running it; and when the program terminates, gdb will not be unloaded. This is useful if you
-want to run a program several times without reloading, for example to run it unmodified with
-different sets of input data.</p>
+running it, and when the program terminates, gdb will not be unloaded. Useful if you want to
+run a program several times without reloading, for example to run it unmodified with different
+sets of input data.</p>
<p><em>Non-stop mode</em> - gdb non-stop mode. You'd better activate gdb asynchronous mode
from Scope preferences to take advantage of this.</p>
-<p><em>Temporary breakpoint at</em> - set a temporary breakpoint after the program is loaded.
-If you leave the text field empty, Scope will try to detect the 1st line of code and place a
-breakpoint on it. Any breakpoint options and location are allowed, for example <em>main</em>
-for C/C++ programs. Since setting a breakpoint requires a program, temporary breakpoint will
-be disabled if both <em>Executable</em> and <em>Load script</em> are empty.</p>
+<p><em>Temporary breakpoint on load at</em> - set a temporary breakpoint when the program is
+loaded. If you leave the text field empty, Scope will try to detect the 1st line of code and
+place a breakpoint on it. Any breakpoint options and location are allowed in the text, for
+example <em>main</em> for C/C++ programs. Since setting a breakpoint requires a program, the
+temporary breakpoint on load will be disabled if both <em>Executable</em> and <em>Load
+script</em> are empty. </p>
<p><em>Delete all breakpoints, watches and inspects</em> - usually when setting up a new
-program. Scope will ask you to confirm.</p>
+program. Scope will ask for confirmation.</p>
<p><em>Update all views</em> - update all relevant debug subpages when the current thread
stops, or a different thread is selected. By default, only the current subpage is updated.</p>
@@ -227,34 +228,30 @@
<p>When you start Geany, or open/close a project, Scope will try to load the debugging
settings for a program that matches the second <em>Execute</em> command, if any [N]. The
-command will not be expanded. Letter case will be ignored under win~1.</p>
+command will not be expanded. Letter case will be ignored under Windows.</p>
<p><b><a name="run_continue">Run/Continue</a></b> [NHD]</p>
<div>Not debugging state (first run):</div>
<div class="tab">
-- Checks the <em>Program</em> and <em>Working dir</em>, if any - they must exist and be
-user-executable at this point<br>
-- Checks the <em>Load script</em>, if any - it must exist and be readable<br>
-- Loads gdb<br>
-- Setups the asynchronous and/or non-stop modes<br>
-- Loads the <em>Program</em>, if any<br>
-- Executes the <em>Load script</em>, if any<br>
-- If either a program was loaded, or a load script was executed without errors:<br>
+- Load and setup gdb<br>
+- Load the <em>Executable</em> and execute the <em>Load script</em>, if any<br>
+- If an executable and/or a load script was processed, and there were no errors so far:<br>
<div class="tab1">
- • applies any breakpoints and inspects marked as <em>Apply on Run</em><br>
- • applies the temporary breakpoint, if any<br>
- • runs the program if, and only if:
- <div class="tab2">
- - <em>Auto run/exit</em> is checked<br>
- - at least 1 breakpoint was applied<br>
- - there were no errors in any of the previous steps.
- </div>
+ • apply any points and inspects marked as <em>Apply on Run</em> and create the
+ <em>Temporary breakpoint on load</em><br>
+ • run the program if <em>Auto run/exit</em> is checked, at least 1 breakpoint was
+ applied, and there weren't any errors.
</div>
</div>
-<p>Hang state: -exec-run. The temporary breakpoint, if any, will not be applied.<br>
-Debug/Assem: -exec-continue.</p>
+<p>On errors, Scope will enter Hang state, letting you execute commands manually, and fix or
+recreate any points or inspects if needed.</p>
+
+<p>Hang state: try to apply any unapplied points or inspects marked as <em>Apply on Run</em>,
+and -exec-run despite any errors.</p>
+
+<p>Debug/Assem: -exec-continue.</p>
<p><b><a name="goto_cursor">Run to Cursor</a></b> [D]</p>
@@ -272,11 +269,11 @@
<p><b><a name="terminate">Terminate</a></b> [^N]</p>
-<p>Busy state: kill gdb, even if <a href="#auto_run_exit">Auto Run/exit is unchecked</a>. If
-you want to kill the program only, switch to <em>Threads</em> and use <em>Terminate</em> or
-<em>Send Signal</em>.</p>
+<p>Busy state: terminate gdb, even if <em>Auto Run/exit</em> is unchecked.<br>
+If you want to terminate the program without unloading gdb, switch to <em>Threads</em> and
+invoke <em>Terminate</em> or <em>Send Signal</em>.</p>
-<p>Debug or Ready state with <em>Auto Run/Exit</em> off: gdb kill command.</p>
+<p>Debug or Ready state with <em>Auto Run/Exit</em> off: (gdb) kill.</p>
<p>Otherwise: -gdb-exit.</p>
@@ -284,6 +281,8 @@
<p>Commands starting with 0<digit> are used internally by Scope and will be blocked.</p>
+<p>Both MI and CLI commands are supported.</p>
+
<p>Scope tries to keep track of the current gdb thread, and to emit a -thread-select command
on <em>Send</em>/<em>Busy</em> if the gdb thread does not match the one (if any) selected in
<em>Threads</em>. Tracking the current gdb frame asynchronously is impossible, so you must use
@@ -293,7 +292,7 @@
<p><b><a name="reset markers">Reset Markers</a></b></p>
-<p>Synchronizes the breakpoint and execution point markers for the current file with the Scope
+<p>Synchronize the breakpoint and execution point markers for the current file with the Scope
data. They can become out of sync if you <em>Save as</em> a file with markers, set a source
file type to non-source and edit it, and possibly in other situations.</p>
@@ -363,11 +362,22 @@
Breakpoint</em>, edit the <em>Ignore</em>, <em>Condition</em> and <em>Script</em> columns, or
invoke <em>Add Break / Add Watch</em> [HRD], which brings up the command dialog.</p>
-<div>Only points created with MI commands are kept in the list permanently.<br>
-Due to MI limitations and deficiencies:</div>
+<p>Breakpoints created with MI commands are kept in the list permanently. When a temporary MI
+breakpoint is hit, it's Id column is cleared. <em>Toggle breakpoint</em>, <em>Add Break</em>
+and <em>Add Watch</em> use MI commands.</p>
+
+<p>Breakpoints created with CLI commands (from scripts or <em>GDB Command</em>) are removed
+when the program is unloaded. When a temporary CLI breakpoint is hit, it's removed. If a MI
+command produces none or invalid output, and the breapoint appears later (from Refresh or
+async message), Scope will consider it CLI.</p>
+
+<p>The above paragraphs apply to watchpoints and tracepoints as well.</p>
+
+<div>Due to MI limitations and deficiencies:</div>
<div class="tab">
-- The catchpoints are displayed incompletely<br>
-- Disposition "dis" is ignored, and "del" is saved for breakpoints and tracepoints only<br>
+- The catchpoints are displayed incompletely and removed on program unload<br>
+- Disposition "dis" is ignored, and "del" (i.e. temporary) is saved for break and trace points
+only<br>
- The difference between software and hardware watchpoints is ignored, but gdb will create
hardware watchpoints as needed.</div>
@@ -396,8 +406,8 @@
<p>For multi-address breakpoints, the individual locations are not loaded or saved, and are
deleted as soon as the program is unloaded, so you may prefer to turn <em>Auto run/exit</em>
off when using them. When a breakpoint is disabled, GDB treats all it's locations as disabled,
-despite their individual state. However, with at least enabled location for a file:line, the
-marker for enabled breakpoint will be used for that line.</p>
+despite their individual state. However, with at least one enabled location for a file:line,
+the marker for enabled breakpoint will be used for that line.</p>
<p><b><a name="stack">Stack</a></b></p>
@@ -584,7 +594,7 @@
<h3><a name="notes">Notes</a></h3>
-<p>Debug Console ignores VTE foreground color, except for the cursor.</p>
+<p>Changes in Geany VTE preferences will be applied when Scope is restarted.</p>
<p>Locale/UTF-8 conversion is fully supported for values only. Filenames not matching your
locale and non-ascii identifiers are not guaranteed to work.</p>
@@ -748,7 +758,7 @@
<b><a name="copyright">Copyright</a></b>
-<p>Scope 0.93, Copyright (C) 2013 Dimitar Toshkov Zhekov</p>
+<p>Scope 0.93.1, 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/break.c
221 files changed, 154 insertions(+), 67 deletions(-)
===================================================================
@@ -74,11 +74,12 @@ static gint break_location_compare(ScpTreeStore *store, GtkTreeIter *a, GtkTreeI
}
static const char
- *const BP_CHARS = "bhtfwwwaarrc?",
+ *const BP_TYPES = "bhtfwwwaarrc?",
*const BP_BREAKS = "bh",
*const BP_TRACES = "tf",
*const BP_HARDWS = "hf",
*const BP_BORTS = "bhtf",
+ *const BP_WHATS = "warc",
*const BP_KNOWNS = "btfwar",
*const BP_WATCHES = "war",
*const BP_WATOPTS = "ar";
@@ -87,38 +88,79 @@ static gint break_location_compare(ScpTreeStore *store, GtkTreeIter *a, GtkTreeI
{
const char *text;
const char *type;
+ const gchar *desc;
} BreakType;
static const BreakType break_types[] =
{
- { "breakpoint", "break" },
- { "hw breakpoint", "hbreak" },
- { "tracepoint", "trace" },
- { "fast tracepoint", "ftrace" },
- { "wpt", "watch" },
- { "watchpoint", "watch" },
- { "hw watchpoint", "watch" },
- { "hw-awpt", "access" },
- { "acc watchpoint", "access" },
- { "hw-rwpt", "read" },
- { "read watchpoint", "read" },
- { "catchpoint", "catch" },
- { NULL, "??" }
+ { "breakpoint", "break", N_("breakpoint") },
+ { "hw breakpoint", "hbreak", N_("hardware breakpoint")},
+ { "tracepoint", "trace", N_("tracepoint") },
+ { "fast tracepoint", "ftrace", N_("fast tracepoint") },
+ { "wpt", "watch", N_("write watchpoint") },
+ { "watchpoint", "watch", NULL },
+ { "hw watchpoint", "watch", NULL },
+ { "hw-awpt", "access", N_("access watchpoint") },
+ { "acc watchpoint", "access", NULL },
+ { "hw-rwpt", "read", N_("read watchpoint") },
+ { "read watchpoint", "read", NULL },
+ { "catchpoint", "catch", N_("catchpoint") },
+ { NULL, "??", NULL }
+};
+
+typedef enum _BreakStage
+{
+ BG_PERSIST,
+ BG_DISCARD,
+ BG_UNKNOWN,
+ BG_PARTLOC,
+ BG_APPLY,
+ BG_FOLLOW,
+ BG_ONLOAD,
+ BG_RUNTO,
+ BG_COUNT
+} BreakStage;
+
+typedef struct _BreakInfo
+{
+ char info;
+ const char *text;
+} BreakInfo;
+
+static const BreakInfo break_infos[BG_COUNT] =
+{
+ { '\0', NULL },
+ { 'c', N_("CLI") },
+ { 'u', N_("unsupported MI") },
+ { '\0', NULL },
+ { '\0', NULL },
+ { 'c', N_("CLI") },
+ { 'l', N_("on load") },
+ { 'r', N_("Run to Cursor") }
};
static void break_type_set_data_func(G_GNUC_UNUSED GtkTreeViewColumn *column,
GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter,
G_GNUC_UNUSED gpointer gdata)
{
- char type;
+ char type, info;
+ gint discard;
gboolean temporary;
GString *string = g_string_sized_new(0x0F);
- gtk_tree_model_get(model, iter, BREAK_TYPE, &type, BREAK_TEMPORARY, &temporary, -1);
- g_string_append(string, break_types[strchr(BP_CHARS, type) - BP_CHARS].type);
+ gtk_tree_model_get(model, iter, BREAK_TYPE, &type, BREAK_TEMPORARY, &temporary,
+ BREAK_DISCARD, &discard, -1);
+ g_string_append(string, break_types[strchr(BP_TYPES, type) - BP_TYPES].type);
+ info = break_infos[discard].info;
- if (temporary)
- g_string_append(string, ",t");
+ if (info || temporary)
+ {
+ g_string_append_c(string, ',');
+ if (info)
+ g_string_append_c(string, info);
+ if (temporary)
+ g_string_append_c(string, 't');
+ }
g_object_set(cell, "text", string->str, NULL);
g_string_free(string, TRUE);
@@ -249,15 +291,6 @@ static void append_script_command(const ParseNode *node, GString *string)
}
}
-typedef enum _BreakStage
-{
- BG_PERSIST,
- BG_DISCARD,
- BG_APPLY,
- BG_GOTO,
- BG_NEXT
-} BreakStage;
-
typedef struct _BreakData
{
GtkTreeIter iter;
@@ -333,9 +366,9 @@ static void break_node_parse(const ParseNode *node, BreakData *bd)
if (!strcmp(text_type, bt->text))
break;
- type = BP_CHARS[bt - break_types];
+ type = BP_TYPES[bt - break_types];
- if (leading || bd->stage != BG_NEXT || type != '?')
+ if (leading || bd->stage != BG_FOLLOW || type != '?')
bd->type = type;
else
type = bd->type;
@@ -358,7 +391,6 @@ static void break_node_parse(const ParseNode *node, BreakData *bd)
const char *location = parse_find_locale(nodes, "original-location");
char *original = g_strdup(location);
gchar *display;
- gboolean persist = leading && bd->stage == BG_PERSIST;
gboolean pending = parse_find_locale(nodes, "pending") != NULL;
if (original)
@@ -377,7 +409,7 @@ static void break_node_parse(const ParseNode *node, BreakData *bd)
loc.line = atoi(split);
}
}
- else if (strchr(BP_WATCHES, type))
+ else if (strchr(BP_WHATS, type))
{
if ((location = parse_find_locale(nodes, "exp")) == NULL)
location = parse_find_locale(nodes, "what");
@@ -385,7 +417,9 @@ static void break_node_parse(const ParseNode *node, BreakData *bd)
if (!location || !strchr(BP_KNOWNS, type))
{
- persist = FALSE; /* can't create apply command */
+ if (bd->stage == BG_PERSIST)
+ bd->stage = BG_UNKNOWN; /* can't create apply command */
+
if (!location)
location = loc.func;
}
@@ -405,9 +439,9 @@ static void break_node_parse(const ParseNode *node, BreakData *bd)
scp_tree_store_set(store, iter, BREAK_SCID, ++scid_gen, BREAK_TYPE,
type, BREAK_DISPLAY, display, BREAK_PENDING, pending,
BREAK_LOCATION, location, BREAK_RUN_APPLY, leading && borts,
- BREAK_DISCARD, !persist, -1);
+ BREAK_DISCARD, leading ? bd->stage : BG_PARTLOC, -1);
- if (persist)
+ if (leading && bd->stage == BG_PERSIST)
utils_tree_set_cursor(selection, iter, 0.5);
g_free(original);
@@ -455,10 +489,10 @@ static void break_node_parse(const ParseNode *node, BreakData *bd)
if (bd->stage == BG_APPLY)
break_iter_applied(iter, id);
- else if (bd->stage == BG_GOTO)
+ else if (bd->stage == BG_RUNTO)
debug_send_thread("-exec-continue");
- bd->stage = BG_NEXT;
+ bd->stage = BG_FOLLOW;
}
}
@@ -472,7 +506,7 @@ void on_break_inserted(GArray *nodes)
if (token)
{
if (*token == '0')
- bd.stage = BG_GOTO;
+ bd.stage = BG_RUNTO;
else if (*token)
{
iff (store_find(store, &bd.iter, BREAK_SCID, token), "%s: b_scid not found",
@@ -482,7 +516,7 @@ void on_break_inserted(GArray *nodes)
}
}
else
- bd.stage = BG_DISCARD;
+ bd.stage = BG_ONLOAD;
}
parse_foreach(nodes, (GFunc) break_node_parse, &bd);
@@ -570,7 +604,7 @@ static gboolean break_remove_all(const char *pref, gboolean force)
while (valid)
{
const char *id;
- gboolean discard;
+ gint discard;
scp_tree_store_get(store, &iter, BREAK_ID, &id, BREAK_DISCARD, &discard, -1);
@@ -578,7 +612,7 @@ static gboolean break_remove_all(const char *pref, gboolean force)
{
found = TRUE;
- if (discard || force)
+ if (discard % BG_ONLOAD || force)
{
valid = break_remove(&iter);
continue;
@@ -638,14 +672,15 @@ static void breaks_missing(void)
while (valid)
{
const char *id;
- gboolean discard, missing;
+ gint discard;
+ gboolean missing;
scp_tree_store_get(store, &iter, BREAK_ID, &id, BREAK_DISCARD, &discard,
BREAK_MISSING, &missing, -1);
if (id && missing)
{
- if (discard)
+ if (discard % BG_ONLOAD)
{
valid = break_remove(&iter);
continue;
@@ -760,7 +795,7 @@ void breaks_clear(void)
while (valid)
{
- gboolean discard;
+ gint discard;
scp_tree_store_get(store, &iter, BREAK_DISCARD, &discard, -1);
@@ -786,11 +821,12 @@ void breaks_reset(void)
static void break_iter_apply(GtkTreeIter *iter, G_GNUC_UNUSED gpointer gdata)
{
+ const char *id;
gboolean run_apply;
- scp_tree_store_get(store, iter, BREAK_RUN_APPLY, &run_apply, -1);
+ scp_tree_store_get(store, iter, BREAK_ID, &id, BREAK_RUN_APPLY, &run_apply, -1);
- if (run_apply)
+ if (run_apply && !id)
break_apply(iter, FALSE);
}
@@ -1014,7 +1050,7 @@ void breaks_load(GKeyFile *config)
static gboolean break_save(GKeyFile *config, const char *section, GtkTreeIter *iter)
{
- gboolean discard;
+ gint discard;
scp_tree_store_get(store, iter, BREAK_DISCARD, &discard, -1);
@@ -1090,41 +1126,91 @@ static void on_break_selection_changed(GtkTreeSelection *selection,
}
static GtkTreeView *tree;
+static GtkTreeViewColumn *break_type_column;
+static GtkTreeViewColumn *break_display_column;
static gboolean on_break_query_tooltip(G_GNUC_UNUSED GtkWidget *widget, gint x, gint y,
- gboolean keyboard_tip, GtkTooltip *tooltip, GtkTreeViewColumn *break_display_column)
+ gboolean keyboard_tip, GtkTooltip *tooltip, G_GNUC_UNUSED gpointer gdata)
{
+ GtkTreePath *path;
GtkTreeIter iter;
gboolean has_tip = FALSE;
- if (gtk_tree_view_get_tooltip_context(tree, &x, &y, keyboard_tip, NULL, NULL, &iter))
+ if (gtk_tree_view_get_tooltip_context(tree, &x, &y, keyboard_tip, NULL, &path, &iter))
{
- const char *file, *func;
- gint line;
GString *text = g_string_sized_new(0xFF);
+ GtkTreeViewColumn *tip_column = NULL;
- gtk_tree_view_set_tooltip_cell(tree, tooltip, NULL, break_display_column, NULL);
- scp_tree_store_get(store, &iter, BREAK_FILE, &file, BREAK_LINE, &line, BREAK_FUNC,
- &func, -1);
-
- if (file)
+ if (keyboard_tip)
+ gtk_tree_view_get_cursor(tree, NULL, &tip_column);
+ else
{
- g_string_append(text, file);
- if (line)
- g_string_append_printf(text, ":%d", line);
- has_tip = TRUE;
+ GdkRectangle rect;
+ GdkRegion *region;
+
+ gtk_tree_view_get_background_area(tree, path, break_type_column, &rect);
+ region = gdk_region_rectangle(&rect);
+ tip_column = gdk_region_point_in(region, x, y) ? break_type_column : NULL;
+ gdk_region_destroy(region);
+
+ if (!tip_column)
+ {
+ gtk_tree_view_get_background_area(tree, path, break_display_column,
+ &rect);
+ region = gdk_region_rectangle(&rect);
+ if (gdk_region_point_in(region, x, y))
+ tip_column = break_display_column;
+ gdk_region_destroy(region);
+ }
}
- if (func)
+ if (tip_column == break_type_column)
{
- if (has_tip)
- g_string_append(text, ", ");
- g_string_append_printf(text, "%s()", func);
+ char type;
+ gint discard;
+ gboolean temporary;
+
+ gtk_tree_view_set_tooltip_cell(tree, tooltip, NULL, tip_column, NULL);
+ scp_tree_store_get(store, &iter, BREAK_TYPE, &type, BREAK_TEMPORARY,
+ &temporary, BREAK_DISCARD, &discard, -1);
+ g_string_append(text, break_types[strchr(BP_TYPES, type) - BP_TYPES].desc);
has_tip = TRUE;
+
+ if (break_infos[discard].text)
+ g_string_append_printf(text, _(", %s"), break_infos[discard].text);
+
+ if (temporary)
+ g_string_append(text, ", temporary");
+ }
+ else if (tip_column == break_display_column)
+ {
+ const char *file, *func;
+ gint line;
+
+ gtk_tree_view_set_tooltip_cell(tree, tooltip, NULL, tip_column, NULL);
+ scp_tree_store_get(store, &iter, BREAK_FILE, &file, BREAK_LINE, &line,
+ BREAK_FUNC, &func, -1);
+
+ if (file)
+ {
+ g_string_append(text, file);
+ if (line)
+ g_string_append_printf(text, ":%d", line);
+ has_tip = TRUE;
+ }
+
+ if (func)
+ {
+ if (has_tip)
+ g_string_append(text, ", ");
+ g_string_append_printf(text, _("func %s"), func);
+ has_tip = TRUE;
+ }
}
gtk_tooltip_set_text(tooltip, text->str);
g_string_free(text, TRUE);
+ gtk_tree_path_free(path);
}
return has_tip;
@@ -1288,8 +1374,10 @@ void break_init(void)
GtkWidget *menu;
guint i;
+ break_type_column = get_column("break_type_column");
+ break_display_column = get_column("break_display_column");
tree = view_connect("break_view", &store, &selection, break_cells, "break_window", NULL);
- gtk_tree_view_column_set_cell_data_func(get_column("break_type_column"),
+ gtk_tree_view_column_set_cell_data_func(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);
@@ -1301,8 +1389,7 @@ void break_init(void)
block_cells[i] = get_object(break_cells[i + 1].name);
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),
- get_column("break_display_column"));
+ g_signal_connect(tree, "query-tooltip", G_CALLBACK(on_break_query_tooltip), NULL);
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/debug.c
4 files changed, 4 insertions(+), 0 deletions(-)
===================================================================
@@ -630,7 +630,11 @@ void on_debug_run_continue(G_GNUC_UNUSED const MenuItem *menu_item)
else if (thread_count)
debug_send_thread("-exec-continue");
else
+ {
+ breaks_apply();
+ inspects_apply();
debug_send_command(N, "-exec-run");
+ }
}
void on_debug_goto_cursor(G_GNUC_UNUSED const MenuItem *menu_item)
Modified: scope/src/gtk216.c
4 files changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -35,7 +35,7 @@ void gtk_widget_set_visible(GtkWidget *widget, gboolean visible)
gint sort_column_id;
} SortColumnId;
-static SortColumnId sort_column_ids[] =
+static const SortColumnId sort_column_ids[] =
{
{ "thread_id_column", 0 },
{ "thread_pid_column", 3 },
@@ -71,7 +71,7 @@ void gtk_widget_set_visible(GtkWidget *widget, gboolean visible)
void gtk216_init(void)
{
- SortColumnId *scd;
+ const SortColumnId *scd;
for (scd = sort_column_ids; scd->id; scd++)
gtk_tree_view_column_set_sort_column_id(get_column(scd->id), scd->sort_column_id);
Modified: scope/src/inspect.c
8 files changed, 4 insertions(+), 4 deletions(-)
===================================================================
@@ -569,13 +569,13 @@ gboolean inspects_update(void)
static void inspect_iter_apply(GtkTreeIter *iter, G_GNUC_UNUSED gpointer gdata)
{
- const char *frame;
+ const char *var1, *frame;
gboolean run_apply;
- scp_tree_store_get(store, iter, INSPECT_FRAME, &frame, INSPECT_RUN_APPLY, &run_apply,
- -1);
+ scp_tree_store_get(store, iter, INSPECT_VAR1, &var1, INSPECT_FRAME, &frame,
+ INSPECT_RUN_APPLY, &run_apply, -1);
- if (run_apply && !isdigit(*frame))
+ if (run_apply && !var1 && !isdigit(*frame))
inspect_apply(iter);
}
Modified: scope/src/scope.c
5 files changed, 2 insertions(+), 3 deletions(-)
===================================================================
@@ -214,8 +214,6 @@ static void toolbar_update_state(DebugState state)
static GtkWidget *debug_statusbar;
static GtkLabel *debug_state_label;
-static DebugState last_statusbar_state;
-
void statusbar_update_state(DebugState state)
{
static DebugState last_state = DS_INACTIVE;
@@ -326,7 +324,7 @@ static gboolean settings_saved(gpointer gdata)
SCI_GETREADONLY, 0, 0);
}
- if (GPOINTER_TO_INT(gdata))
+ if (gdata)
{
conterm_load_config();
conterm_apply_config();
@@ -550,6 +548,7 @@ void plugin_init(G_GNUC_UNUSED GeanyData *gdata)
if (!gtk_builder_add_from_file(builder, gladefile, &gerror))
{
msgwin_status_add(_("Scope: %s."), gerror->message);
+ g_warning(_("Scope: %s."), gerror->message);
g_error_free(gerror);
g_object_unref(builder);
builder = NULL;
Modified: scope/src/watch.c
4 files changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -57,7 +57,7 @@ static void watch_iter_update(GtkTreeIter *iter, gpointer gdata)
scp_tree_store_get(store, iter, WATCH_EXPR, &expr, WATCH_SCID, &scid, WATCH_ENABLED,
&enabled, -1);
- if (enabled || GPOINTER_TO_INT(gdata))
+ if (enabled || gdata)
g_free(debug_send_evaluate('6', scid, expr));
}
@@ -147,7 +147,7 @@ gboolean watches_update(void)
if (view_frame_update())
return FALSE;
- store_foreach(store, (GFunc) watch_iter_update, GPOINTER_TO_INT(FALSE));
+ store_foreach(store, (GFunc) watch_iter_update, NULL);
return TRUE;
}
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).