fbdbg  3.0
FreeBASIC Debugger
source.bas
Go to the documentation of this file.
1 
9 
10 
11 SUB view_mark_clicked CDECL( _
12  BYVAL AS GtkSourceView PTR _
13  , BYVAL AS GtkTextIter PTR _
14  , BYVAL AS GdkEvent PTR _
15  , BYVAL AS GtkSourceBuffer PTR)
16 
17 
18 
32 CONSTRUCTOR SrcNotebook()
33 '' get the widgets from the ui file
34  MenuSrc = gtk_builder_get_object(GUI.XML, "menu40")
35  BuffCur = gtk_builder_get_object(GUI.XML, "srcbuffCur")
36  ViewCur = GTK_WIDGET(gtk_builder_get_object(GUI.XML, "viewSrcCur"))
37  NoteBok = GTK_NOTEBOOK(gtk_builder_get_object(GUI.XML, "nbookSrc"))
38  CBMarks = GTK_COMBO_BOX_TEXT(gtk_builder_get_object(GUI.XML, "comboBookmarks"))
39 
40 '' prepare managers for syntax highlighting
41  VAR lm = gtk_source_language_manager_get_default()
42  LmPaths = MKI(CAST(INTEGER, @"dat"))
43  VAR ind = 0 _
44  , array = gtk_source_language_manager_get_search_path(lm)
45  WHILE array[ind]
46  LmPaths &= MKI(CAST(INTEGER, array[ind]))
47  ind += 1
48  WEND : LmPaths &= MKI(0)
49  gtk_source_language_manager_set_search_path(lm, CAST(gchar PTR PTR, SADD(LmPaths)))
50 
51 '' load syntax highlighting language
52  Lang = gtk_source_language_manager_get_language(lm, "fbc")
53 
54  IF 0 = Lang THEN
55  ?PROJ_NAME & ": " & *__("language fbc not available -> no syntax highlighting")
56  ELSE
57  gtk_source_buffer_set_language(GTKSOURCE_SOURCE_BUFFER(BuffCur), Lang)
58  END IF
59  gtk_source_buffer_set_highlight_matching_brackets(GTKSOURCE_SOURCE_BUFFER(BuffCur), FALSE)
60 
61  Attr0 = getAttr("img/brkd.png")
62  Attr1 = getAttr("img/brkt.png")
63  Attr2 = getAttr("img/brkp.png")
64  Attr3 = getAttr("img/book.png")
65  'gtk_combo_box_text_insert(CBMarks, 0, NULL, __("No bookmark"))
66  'g_object_set(CBMarks, "active", CAST(gint, 0), NULL)
67  initCombo(__("No bookmark"))
68 
69 
70 ?" CONSTRUCTOR SrcNotebook"
71 END CONSTRUCTOR
72 
73 
74 
81 DESTRUCTOR SrcNotebook()
82  IF Font THEN pango_font_description_free(Font)
83  g_object_unref(Attr3)
84  g_object_unref(Attr2)
85  g_object_unref(Attr1)
86  g_object_unref(Attr0)
87 END DESTRUCTOR
88 
89 
90 
100 FUNCTION SrcNotebook.addBas(BYVAL Label AS gchar PTR, BYVAL Cont AS gchar PTR) AS GtkWidget PTR
101 ?" SrcNotebook.addBas: " & *Label
102 
103  VAR labl = gtk_label_new(Label) _
104  , buff = gtk_source_buffer_new_with_language(Lang) _
105  , srcv = gtk_source_view_new_with_buffer(buff) _
106  , widg = gtk_scrolled_window_new(NULL, NULL)
107 
108  gtk_source_buffer_set_style_scheme(buff, Schema)
109  gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buff), Cont, -1)
110  gtk_container_add(GTK_CONTAINER(widg), srcv)
111 
112  gtk_widget_override_font(srcv, Font)
113  gtk_text_view_set_editable(GTK_TEXT_VIEW(srcv), FALSE)
114  gtk_source_view_set_show_line_marks(GTKSOURCE_SOURCE_VIEW(srcv), TRUE)
115 
116  gtk_source_view_set_mark_attributes(GTKSOURCE_SOURCE_VIEW(srcv), "fbdbg-brkd", Attr0, 999)
117  gtk_source_view_set_mark_attributes(GTKSOURCE_SOURCE_VIEW(srcv), "fbdbg-brkt", Attr1, 999)
118  gtk_source_view_set_mark_attributes(GTKSOURCE_SOURCE_VIEW(srcv), "fbdbg-brkp", Attr2, 999)
119  gtk_source_view_set_mark_attributes(GTKSOURCE_SOURCE_VIEW(srcv), "fbdbg-book", Attr3, 909)
120  g_signal_connect(srcv, "line-mark-activated" _
121  , G_CALLBACK(@view_mark_clicked), buff)
122 
123  WITH *INI
124  gtk_source_buffer_set_highlight_syntax(buff, .Bool(.FSH))
125  gtk_source_view_set_show_line_numbers(GTKSOURCE_SOURCE_VIEW(srcv), .Bool(.FLN))
126  END WITH
127  g_signal_connect(srcv, "button-press-event" _
128  , G_CALLBACK(@menu_button3_event), MenuSrc)
129 
130  g_object_set_data(G_OBJECT(widg), "SrcView", srcv)
131  g_object_set_data_full(G_OBJECT(widg), "Buffer", buff, @g_object_unref)
132  gtk_widget_show_all(widg)
133 
134  VAR i = gtk_notebook_append_page(NoteBok, widg, labl)
135  gtk_notebook_set_current_page(NoteBok, i)
136  Pages += 1 : RETURN widg
137 END FUNCTION
138 
139 
140 
150 SUB SrcNotebook.scroll(BYVAL Lnr AS gint, BYVAL Widg AS GtkWidget PTR, BYVAL Mo AS guint32 = 1)
151  IF Pages < 1 THEN /' no page, do nothing '/ EXIT SUB
152  IF 0 = Widg THEN Widg = ScrWidg : Lnr = ScrLine
153 
154  VAR page = gtk_notebook_page_num(NoteBok, Widg)
155  IF page < 0 THEN /' no such page '/ EXIT SUB
156  gtk_notebook_set_current_page(NoteBok, page)
157 
158  VAR buff = GTK_TEXT_BUFFER(g_object_get_data(G_OBJECT(Widg), "Buffer")) _
159  , srcv = GTK_TEXT_VIEW(g_object_get_data(G_OBJECT(Widg), "SrcView")) _
160 
161  DIM AS GtkTextIter iter
162  gtk_text_buffer_get_iter_at_line(buff, @iter, Lnr - 1)
163  gtk_text_view_scroll_to_iter(srcv, @iter, .0, TRUE, .0, ScrPos)
164  IF 0 = Mo THEN EXIT SUB
165 
166  VAR txt = getBuffLine(buff, @iter)
167  gtk_text_buffer_set_text(GTK_TEXT_BUFFER(BuffCur), txt, LEN(txt))
168  ScrWidg = Widg
169  ScrLine = Lnr
170 END SUB
171 
172 
173 
182 SUB SrcNotebook.addBookmark(BYVAL Lnr AS gint, BYVAL Widg AS GtkWidget PTR)
183  VAR buff = g_object_get_data(G_Object(Widg), "Buffer")
184 
185  DIM AS GtkTextIter iter
186  gtk_text_buffer_get_iter_at_line(GTK_TEXT_BUFFER(buff), @iter, Lnr - 1)
187 
188  VAR id = STR(Lnr) & "&h" & HEX(CAST(INTEGER, Widg)) _
189  , txt = *gtk_notebook_get_tab_label_text(NoteBok, Widg) _
190  & "(" & Lnr & "): " _
191  & getBuffLine(buff, @iter) _
192  , p = 0, n = 0 _
193  , model = gtk_combo_box_get_model(GTK_COMBO_BOX(CBMarks)) _
194 , column = gtk_combo_box_get_id_column(GTK_COMBO_BOX(CBMarks))
195 
196  DIM AS GtkTreeIter tri
197  gtk_tree_model_get_iter_first(model, @tri) ' skip first
198  WHILE gtk_tree_model_iter_next(model, @tri)
199  DIM AS gchar PTR dat
200  gtk_tree_model_get(model, @tri, column, @dat, -1)
201  n += 1 : IF 0 = dat THEN CONTINUE WHILE
202 
203  VAR l = CAST(gint, VALUINT(*dat)) _
204  , w = VALUINT(MID(*dat, INSTR(*dat, "&h")))
205  g_free(dat)
206 
207  IF Widg <> w then if p THEN exit while else CONTINUE WHILE
208  IF Lnr > l THEN p = n ELSE p = iif(p, p, n - 1) : EXIT WHILE
209  WEND
210  IF 0 = BkMarks THEN initCombo(__("Select bookmark"))
211  gtk_combo_box_text_insert(CBMarks, p + 1, id, txt)
212  BkMarks += 1
213 END SUB
214 
215 
216 
225 SUB SrcNotebook.delBookmark(BYVAL Lnr AS gint, BYVAL Widg AS GtkWidget PTR)
226  DIM AS GtkTreeIter iter
227  VAR id = STR(Lnr) & "&h" & HEX(CAST(INTEGER, Widg)) _
228  , model = gtk_combo_box_get_model(GTK_COMBO_BOX(CBMarks)) _
229 , column = gtk_combo_box_get_id_column(GTK_COMBO_BOX(CBMarks))
230 
231  IF 0 = gtk_tree_model_get_iter_first(model, @iter) THEN EXIT SUB
232  DO
233  DIM AS gchar PTR dat
234  gtk_tree_model_get(model, @iter, column, @dat, -1)
235  IF 0 = dat THEN CONTINUE DO
236  VAR r = *dat <> id
237  g_free(dat) : IF r THEN CONTINUE DO
238  gtk_list_store_remove(GTK_LIST_STORE(model), @iter) : BkMarks -= 1
239  IF 0 = BkMarks THEN initCombo(__("No bookmark"))
240  EXIT SUB
241  LOOP UNTIL 0 = gtk_tree_model_iter_next(model, @iter)
242 END SUB
243 
244 
245 
253 FUNCTION SrcNotebook.getAttr(BYVAL Nam AS gchar PTR) AS GtkSourceMarkAttributes PTR
254  DIM AS GError PTR errr
255  VAR size = 10 _
256  , attr = gtk_source_mark_attributes_new() _
257  , pixbuf = gdk_pixbuf_new_from_file_at_size(Nam, size, size, @errr)
258  IF 0 = pixbuf THEN ?PROJ_NAME & ": missing file " & *Nam : RETURN attr
259 
260  gtk_source_mark_attributes_set_pixbuf(attr, pixbuf)
261  g_object_unref(pixbuf)
262 
263  gtk_source_mark_attributes_render_icon(attr, ViewCur, size) : RETURN attr
264 END FUNCTION
265 
266 
267 
277 FUNCTION SrcNotebook.getBuffLine( _
278  BYVAL Buff AS GtkTextBuffer PTR _
279  , BYVAL Iter AS GtkTextIter PTR) AS STRING
280 
281  VAR i2 = gtk_text_iter_copy(Iter)
282  gtk_text_iter_forward_line(i2)
283  gtk_text_iter_backward_char(i2)
284 
285  gtk_text_buffer_place_cursor(Buff, Iter)
286  gtk_text_buffer_select_range(Buff, Iter, i2)
287 
288  VAR cont = gtk_text_buffer_get_text(Buff, Iter, i2, TRUE) _
289  , r = *cont
290  gtk_text_iter_free(i2)
291  g_free(cont)
292 
293  IF LEN(r) > LenCur _
294  THEN r = LEFT(r, LenCur - 4) & " ..." _
295  ELSE IF 0 = LEN(r) THEN r = " "
296 
297  RETURN r
298 END FUNCTION
299 
300 
301 
309 SUB SrcNotebook.remove(BYVAL Widg AS GtkWidget PTR)
310  VAR page = gtk_notebook_page_num(NoteBok, Widg)
311 ?" SrcNotebook.remove: "; Widg, page
312  IF page < 0 THEN /' invalid widget '/ EXIT SUB
313  IF page = gtk_notebook_get_current_page(NoteBok) THEN _
314  gtk_text_buffer_set_text(GTK_TEXT_BUFFER(BuffCur), "", 0)
315 
316  Pages -= 1
317  gtk_notebook_remove_page(NoteBok, page)
318 END SUB
319 
320 
321 
327 SUB SrcNotebook.removeAll(BYVAL Mo AS guint = 0)
328  IF Pages < 1 THEN /' no page, do nothing '/ EXIT SUB
329 
330  VAR n = gtk_notebook_get_n_pages(NoteBok)
331  FOR i AS gint = n - 1 TO 0 STEP -1
332  gtk_notebook_remove_page(NoteBok, i)
333  NEXT
334 
335  Pages = 0
336  gtk_text_buffer_set_text(GTK_TEXT_BUFFER(BuffCur), "", 0)
337  IF Mo THEN EXIT SUB
338  initCombo(__("No bookmark"))
339 END SUB
340 
341 
342 
343 
350 SUB SrcNotebook.initCombo(BYVAL Txt AS gchar PTR)
351  gtk_combo_box_text_remove_all(CBMarks) : BkMarks = 0
352  gtk_combo_box_text_insert(CBMarks, 0, NULL, Txt)
353  g_object_set(CBMarks, "active", CAST(gint, 0), NULL)
354 END SUB
355 
356 
357 
364 PROPERTY SrcNotebook.ScrollPos(BYVAL Posi AS gdouble)
365  ScrPos = Posi
366 END PROPERTY
367 
368 
369 
376 PROPERTY SrcNotebook.SchemeID(BYVAL Snam AS CONST gchar PTR)
377  Schema = gtk_source_style_scheme_manager_get_scheme(Manager, Snam)
378  gtk_source_buffer_set_style_scheme(GTKSOURCE_SOURCE_BUFFER(BuffCur), Schema)
379 END PROPERTY
380 
381 
382 
392 PROPERTY SrcNotebook.FontID(BYVAL Fnam AS CONST gchar PTR)
393  IF Font THEN pango_font_description_free(Font)
394  Font = pango_font_description_from_string(Fnam)
395  gtk_widget_override_font(ViewCur, Font)
396 
397 '' compute maximal len of current source view line (ToDo)
398  LenCur = 80
399 END PROPERTY
400 
401 
402 
409  IF Pages < 1 THEN /' no page, do nothing '/ EXIT SUB
410 
411  WITH *INI
412  gtk_source_buffer_set_highlight_syntax(GTKSOURCE_SOURCE_BUFFER(BuffCur), .Bool(.FSH))
413 
414  VAR n = gtk_notebook_get_n_pages(NoteBok)
415  FOR i AS gint = n - 1 TO 0 STEP -1
416  VAR widg = gtk_notebook_get_nth_page(NoteBok, i) _
417  , buff = g_object_get_data(G_Object(widg), "Buffer") _
418  , srcv = g_object_get_data(G_Object(widg), "SrcView") _
419  , mark = gtk_text_buffer_get_insert(buff)
420  gtk_widget_override_font(srcv, Font)
421  gtk_source_buffer_set_style_scheme(buff, Schema)
422  gtk_source_buffer_set_highlight_syntax(GTKSOURCE_SOURCE_BUFFER(buff), .Bool(.FSH))
423  gtk_source_view_set_show_line_numbers(GTKSOURCE_SOURCE_VIEW(srcv), .Bool(.FLN))
424  gtk_text_view_scroll_to_mark(srcv, mark, .0, TRUE, .0, ScrPos)
425  NEXT
426  END WITH
427 
428 END SUB
429 
430 
431 
455  BYVAL Lnr AS gint _
456  , BYVAL Widg AS GtkWidget PTR _
457  , BYREF Mo AS STRING = "")
458  IF Pages < 1 THEN /' no page, do nothing '/ EXIT SUB
459 
460  VAR page = gtk_notebook_page_num(NoteBok, Widg)
461  IF page < 0 THEN /' no such page '/ EXIT SUB
462 
463  DIM AS GtkTextIter iter
464  DIM AS GdkEventButton event
465  VAR buff = g_object_get_data(G_OBJECT(Widg), "Buffer") _
466  , srcv = g_object_get_data(G_OBJECT(Widg), "SrcView")
467  gtk_text_buffer_get_iter_at_line(GTK_TEXT_BUFFER(buff), @iter, Lnr - 1)
468 
469  WITH event
470  .state = FIX_GDKEVENT_STATE
471 
472  SELECT CASE Mo
473  CASE "book" : .button = 1 : .state += 3
474  CASE "boo" : .button = 3 : .state += 3
475  CASE "brkp" : .button = 1
476  CASE "brkt" : .button = 1 : .state += 1
477  CASE "brkd" : .button = 1 : .state += 4
478  CASE "brk" : .button = 3
479  CASE ELSE : .button = 3
480  view_mark_clicked(srcv, @iter, CAST(GdkEvent PTR, @event), GTKSOURCE_SOURCE_BUFFER(buff))
481  .state += 3
482  END SELECT
483  view_mark_clicked(srcv, @iter, CAST(GdkEvent PTR, @event), GTKSOURCE_SOURCE_BUFFER(buff))
484  END WITH
485 END SUB
486 
487 
488 
495 DIM SHARED AS SrcNotebook PTR SRC
496 
497 
498 
519 SUB view_mark_clicked CDECL( _
520  BYVAL SView AS GtkSourceView PTR _
521  , BYVAL Iter AS GtkTextIter PTR _
522  , BYVAL Event AS GdkEvent PTR _
523  , BYVAL Buff AS GtkSourceBuffer PTR)
524 
525  WITH *CAST(GdkEventButton PTR, Event)
526 ?" --> callback view_mark_clicked: ";.button,.state
527  SELECT CASE AS CONST .Button
528  CASE 1
529  VAR mark = "fbdbg-____"
530  SELECT CASE AS CONST .state - FIX_GDKEVENT_STATE ' set mark, delete existend (if any)
531  CASE 0 : MID(mark, 7, 4) = "brkp"
532  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, "fbdbg-brkd")
533  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, "fbdbg-brkt")
534  VAR list = gtk_source_buffer_get_source_marks_at_iter(Buff, Iter, mark)
535  IF list THEN
536  g_slist_free(list)
537  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, mark) : EXIT SUB
538  END IF
539  CASE GDK_SHIFT_MASK : MID(mark, 7, 4) = "brkt"
540  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, "fbdbg-brkd")
541  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, "fbdbg-brkp")
542  VAR list = gtk_source_buffer_get_source_marks_at_iter(Buff, Iter, mark)
543  IF list THEN
544  g_slist_free(list)
545  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, mark) : EXIT SUB
546  END IF
547  CASE GDK_CONTROL_MASK : MID(mark, 7, 4) = "brkd"
548  VAR list = gtk_source_buffer_get_source_marks_at_iter(Buff, Iter, "fbdbg-brkp")
549  IF list THEN
550  g_slist_free(list)
551  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, "fbdbg-brkp")
552  ' permanent was set before, new mark is DP type
553  EXIT SELECT
554  END IF
555  list = gtk_source_buffer_get_source_marks_at_iter(Buff, Iter, "fbdbg-brkt")
556  IF list THEN
557  g_slist_free(list)
558  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, "fbdbg-brkt")
559  ' temporary was set before, new mark is DT type
560  EXIT SELECT
561  END IF
562  list = gtk_source_buffer_get_source_marks_at_iter(Buff, Iter, mark)
563  IF 0 = list THEN /' new mark is DP type '/ EXIT SELECT
564  g_slist_free(list)
565  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, mark)
566  ' restore disabled here, set either ASC("p") or ASC("t")
567  mark[9] = ASC("p")
568  CASE ELSE : MID(mark, 7, 4) = "book"
569  VAR list = gtk_source_buffer_get_source_marks_at_iter(Buff, Iter, mark) _
570  , widg = gtk_widget_get_parent(GTK_WIDGET(SView)) _
571  , lnr = gtk_text_iter_get_line(Iter) + 1
572  IF list THEN
573  g_slist_free(list)
574  SRC->delBookmark(lnr, widg)
575  gtk_source_buffer_remove_source_marks(Buff, Iter, Iter, mark) : EXIT SUB
576  END IF
577  SRC->addBookmark(lnr, widg)
578  END SELECT
579  gtk_source_buffer_create_source_mark(Buff, NULL, mark, Iter)
580  CASE 3
581  ?" --> right mouse click here"
582  CASE ELSE
583  END SELECT
584  END WITH
585 END SUB
586 
587 
588 
598 SUB on_comboBookmark_changed CDECL ALIAS "on_comboBookmark_changed" ( _
599  BYVAL Widget AS GtkWidget PTR, _
600  BYVAL user_data AS gpointer) EXPORT ' Standard-Parameterliste
601 
602  VAR id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(Widget))
603  IF id = NULL THEN EXIT SUB
604 
605  VAR lnr = CAST(gint, VALUINT(*id)) _
606  , widg = GTK_WIDGET(0 + VALUINT(MID(*id, INSTR(*id, "&h"))))
607  SRC->scroll(lnr, widg, 0)
608 
609  gtk_combo_box_set_active(GTK_COMBO_BOX(Widget), 0) ' this invoces the signal (itself) again!
610 
611 END SUB
612 
613 
614 
622 SUB on_CurSrc_clicked CDECL ALIAS "on_CurSrc_clicked" ( _
623  BYVAL Butt AS GtkButton PTR, _
624  BYVAL user_data AS gpointer) EXPORT
625 
626 ?" --> callback on_CurSrc_clicked"
627  SRC->scroll(0, 0)
628 
629 END SUB
630 
631