Revision: 2116 http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2116&view=re... Author: cesspit Date: 2011-08-02 21:05:20 +0000 (Tue, 02 Aug 2011)
Log Message: ----------- debugger runtime calltips appearance improving
Modified Paths: -------------- trunk/geany-plugins/debugger/src/Makefile.am trunk/geany-plugins/debugger/src/callbacks.c trunk/geany-plugins/debugger/src/dbm_gdb.c trunk/geany-plugins/debugger/src/debug.c trunk/geany-plugins/debugger/src/debug.h
Added Paths: ----------- trunk/geany-plugins/debugger/src/calltip.c trunk/geany-plugins/debugger/src/calltip.h
Modified: trunk/geany-plugins/debugger/src/Makefile.am =================================================================== --- trunk/geany-plugins/debugger/src/Makefile.am 2011-08-02 14:03:25 UTC (rev 2115) +++ trunk/geany-plugins/debugger/src/Makefile.am 2011-08-02 21:05:20 UTC (rev 2116) @@ -15,6 +15,8 @@ breakpoints.h \ callbacks.c \ callbacks.h \ + calltip.c \ + calltip.h \ dbm_gdb.c \ debug.c \ debug.h \
Modified: trunk/geany-plugins/debugger/src/callbacks.c =================================================================== --- trunk/geany-plugins/debugger/src/callbacks.c 2011-08-02 14:03:25 UTC (rev 2115) +++ trunk/geany-plugins/debugger/src/callbacks.c 2011-08-02 21:05:20 UTC (rev 2116) @@ -33,6 +33,7 @@ #include "keys.h" #include "tpage.h" #include "stree.h" +#include "markers.h" #include "utils.h"
extern GeanyFunctions *geany_functions; @@ -87,6 +88,9 @@ /*set dwell interval*/ scintilla_send_message(doc->editor->sci, SCI_SETMOUSEDWELLTIME, 500, 0);
+ /* set tab size for calltips */ + scintilla_send_message(doc->editor->sci, SCI_CALLTIPUSESTYLE, 20, NULL); + /* set caret policy */ scintilla_send_message(doc->editor->sci, SCI_SETYCARETPOLICY, CARET_SLOP | CARET_JUMPS | CARET_EVEN , 3); @@ -139,15 +143,11 @@
if (word->len) { - /* evaluate expression */ - gchar *value = debug_evaluate_expression (word->str); - if (value) + GString *calltip = debug_get_calltip_for_expression(word->str); + if (calltip) { - /* create and show calltip */ - gchar* msg = g_strdup_printf("%s = %s", word->str, value) ; - scintilla_send_message (editor->sci, SCI_CALLTIPSHOW, nt->position, (long)msg); - g_free(msg); - g_free(value); + scintilla_send_message (editor->sci, SCI_CALLTIPSHOW, nt->position, (long)calltip->str); + g_string_free(calltip, TRUE); } } @@ -157,6 +157,9 @@ } case SCN_DWELLEND: { + if (DBS_STOPPED != debug_get_state ()) + break; + scintilla_send_message (editor->sci, SCI_CALLTIPCANCEL, 0, 0); break; }
Added: trunk/geany-plugins/debugger/src/calltip.c =================================================================== --- trunk/geany-plugins/debugger/src/calltip.c (rev 0) +++ trunk/geany-plugins/debugger/src/calltip.c 2011-08-02 21:05:20 UTC (rev 2116) @@ -0,0 +1,72 @@ +/* + * calltip.c + * + * Copyright 2011 Alexander Petukhov <devel(at)apetukhov(dot)ru> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +/* + * Formatting calltip text. + */ + +#include <gtk/gtk.h> + +#include "breakpoint.h" +#include "debug_module.h" +#include "calltip.h" + +#define FIRST_LINE "\002\t%s = (%s) %s" +#define FIRST_LINE_NO_CHILDERN "%s = (%s) %s" +#define REST_LINES "\t▸\t%s = (%s) %s" +#define REST_LINES_NO_CHILDERN "\t\t%s = (%s) %s" + +/* + * creates text for a tooltip taking list or variables + */ +GString* get_calltip_line(variable *var, gboolean firstline) +{ + GString *calltip = NULL; + if (var && var->evaluated) + { + calltip = g_string_new(""); + if (firstline) + { + g_string_append_printf(calltip, + var->has_children ? FIRST_LINE : FIRST_LINE_NO_CHILDERN, + var->name->str, + var->type->str, + var->value->str); + } + else + { + g_string_append_printf(calltip, + var->has_children ? REST_LINES : REST_LINES_NO_CHILDERN, + var->name->str, + var->type->str, + var->value->str); + } + + if (calltip->len > MAX_CALLTIP_LENGTH) + { + g_string_truncate(calltip, MAX_CALLTIP_LENGTH); + g_string_append(calltip, " ..."); + } + } + + return calltip; +} +
Added: trunk/geany-plugins/debugger/src/calltip.h =================================================================== --- trunk/geany-plugins/debugger/src/calltip.h (rev 0) +++ trunk/geany-plugins/debugger/src/calltip.h 2011-08-02 21:05:20 UTC (rev 2116) @@ -0,0 +1,25 @@ +/* + * calltip.h + * + * Copyright 2010 Alexander Petukhov <Alexander(dot)Petukhov(at)mail(dot)ru> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#define MAX_CALLTIP_LENGTH 140 +#define MAX_CALLTIP_HEIGHT 20 + +GString* get_calltip_line(variable *var, gboolean firstline);
Modified: trunk/geany-plugins/debugger/src/dbm_gdb.c =================================================================== --- trunk/geany-plugins/debugger/src/dbm_gdb.c 2011-08-02 14:03:25 UTC (rev 2115) +++ trunk/geany-plugins/debugger/src/dbm_gdb.c 2011-08-02 21:05:20 UTC (rev 2116) @@ -1430,16 +1430,16 @@ /* * remove watch */ -void remove_watch(gchar* path) +void remove_watch(gchar* internal) { GList *iter = watches; while (iter) { variable *var = (variable*)iter->data; - if (!strcmp(var->name->str, path)) + if (!strcmp(var->internal->str, internal)) { gchar command[1000]; - sprintf(command, "-var-delete %s", var->internal->str); + sprintf(command, "-var-delete %s", internal); exec_sync_command(command, TRUE, NULL); watches = g_list_delete_link(watches, iter); }
Modified: trunk/geany-plugins/debugger/src/debug.c =================================================================== --- trunk/geany-plugins/debugger/src/debug.c 2011-08-02 14:03:25 UTC (rev 2115) +++ trunk/geany-plugins/debugger/src/debug.c 2011-08-02 21:05:20 UTC (rev 2116) @@ -52,7 +52,14 @@ #include "wtree.h" #include "ltree.h" #include "tpage.h" +#include "calltip.h"
+/* + * calltip size + */ +#define CALLTIP_HEIGHT 20 +#define CALLTIP_WIDTH 200 + /* module description structure (name/module pointer) */ typedef struct _module_description { gchar *title; @@ -162,6 +169,12 @@ &iter, W_NAME, &oldvalue, -1); + gchar *internal = NULL; + gtk_tree_model_get ( + wmodel, + &iter, + W_INTERNAL, &internal, + 1);
/* check if it is empty row */ gboolean is_empty_row = !gtk_tree_path_compare (tree_path, wtree_empty_path()); @@ -175,7 +188,7 @@ * offer to delete watch */ gtk_tree_store_remove(wstore, &iter); if (DBS_STOPPED == debug_state) - active_module->remove_watch(oldvalue); + active_module->remove_watch(internal); } else if (strcmp(oldvalue, striped)) { @@ -192,7 +205,7 @@ /* if debug is active - remove old watch and add new one */ if (DBS_STOPPED == debug_state) { - active_module->remove_watch(oldvalue); + active_module->remove_watch(internal); variable *newvar = active_module->add_watch(striped); change_watch(GTK_TREE_VIEW(wtree), is_empty_row ? &newiter : &iter, newvar); } @@ -211,6 +224,7 @@ /* free resources */ gtk_tree_path_free(tree_path); g_free(oldvalue); + g_free(internal); g_free(striped); }
@@ -350,16 +364,16 @@ if (DBS_STOPPED == debug_state) {
- gchar *name = NULL; + gchar *internal = NULL; gtk_tree_model_get ( wmodel, &titer, - W_NAME, &name, + W_INTERNAL, &internal, -1);
- active_module->remove_watch(name); + active_module->remove_watch(internal);
- g_free(name); + g_free(internal); }
@@ -556,8 +570,8 @@ /* get current stack trace and put in the tree view */ GList* stack = active_module->get_stack();
- /* if upper frame has source file - remember file anf line for - current instruction marker */ + /* if upper frame has source file - remember the file and the line for + the current instruction marker */ frame *f = (frame*)stack->data; if (f->have_source) { @@ -828,7 +842,7 @@ /* create debug terminal page */ terminal = vte_terminal_new(); /* create PTY */ - int res = openpty(&pty_master, &pty_slave, NULL, + openpty(&pty_master, &pty_slave, NULL, NULL, NULL); grantpt(pty_master); @@ -862,7 +876,6 @@ GTK_POLICY_AUTOMATIC); hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(sview)); vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sview)); - GtkWidget* viewport = gtk_viewport_new(hadj, vadj); debugger_messages_textview = gtk_text_view_new(); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(debugger_messages_textview), GTK_WRAP_CHAR); @@ -1144,6 +1157,48 @@ }
/* + * return list of strings for the calltip + * first line is a header, others should be shifted right with tab + */ +GString* debug_get_calltip_for_expression(gchar* expression) +{ + GString *calltip = NULL; + + variable *var = active_module->add_watch(expression); + if (var) + { + calltip = get_calltip_line(var, TRUE); + if (var->has_children) + { + int lines_left = MAX_CALLTIP_HEIGHT - 1; + GList* children = active_module->get_children(var->internal->str); + GList* child = children; + while(child && lines_left) + { + variable *varchild = (variable*)child->data; + GString *child_string = get_calltip_line(varchild, FALSE); + g_string_append_printf(calltip, "\n%s", child_string->str); + g_string_free(child_string, TRUE); + + child = child->next; + lines_left--; + } + if (!lines_left && child) + { + g_string_append(calltip, "\n\t\t........"); + } + g_list_foreach(children, (GFunc)variable_free, NULL); + g_list_free(children); + } + + active_module->remove_watch(var->internal->str); + variable_free(var); + } + + return calltip; +} + +/* * check whether source for the current instruction * is avaiable */
Modified: trunk/geany-plugins/debugger/src/debug.h =================================================================== --- trunk/geany-plugins/debugger/src/debug.h 2011-08-02 14:03:25 UTC (rev 2115) +++ trunk/geany-plugins/debugger/src/debug.h 2011-08-02 21:05:20 UTC (rev 2116) @@ -20,6 +20,7 @@ */
#include "debug_module.h" +#include "markers.h"
/* debug states enumeration */ enum dbs { @@ -53,4 +54,5 @@ gboolean debug_current_instruction_have_sources(); void debug_jump_to_current_instruction(); void debug_on_file_open(GeanyDocument *doc); +GString* debug_get_calltip_for_expression(gchar* expression);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.