fbdbg  3.0
FreeBASIC Debugger
settings.bas
Go to the documentation of this file.
1 
9 
10 
11 
12 ENUM
15  STYLE_FONT
19 END ENUM
20 
21 
22 
30 FUNCTION colTrans(BYVAL Col AS GdkRGBA PTR) AS guint32
31  RETURN _
32  CUSHORT(255 * Col->red) SHL 16 _
33  + CUSHORT(255 * Col->green) SHL 8 _
34  + CUSHORT(255 * Col->blue)
35 END FUNCTION
36 
37 
38 
49 FUNCTION updateScheme(BYVAL Array AS GObject PTR PTR) AS gchar PTR
50  IF NAME("dat/fbdebugger.xml", "dat/fbdebugger.tmp") THEN _
51  RETURN __("Cannot rename dat/fbdebugger.xml")
52  VAR f_in = FREEFILE
53  IF OPEN("dat/fbdebugger.tmp" FOR INPUT AS f_in) THEN _
54  RETURN __("Cannot read dat/fbdebugger.tmp")
55  VAR fout = FREEFILE
56  IF OPEN("dat/fbdebugger.xml" FOR OUTPUT AS fout) THEN _
57  CLOSE #f_in : RETURN __("Cannot write dat/fbdebugger.xml")
58 
59  VAR allready_done = 0, l = ""
60  WHILE NOT EOF(f_in)
61  LINE INPUT #f_in, l
62  IF INSTR(l, "<color ") THEN
63  IF allready_done THEN CONTINUE WHILE
64  allready_done += 1
65  DIM AS GdkRGBA PTR col
66 
67 #DEFINE COL_OUT(_I_,_N_) _
68  g_object_get(Array[_I_], "rgba", @col, NULL) : _
69  PRINT #fout, !"\t<color name='" & _N_ & "' value='#" & HEX(colTrans(col), 6) & "'/>"
70 
71  COL_OUT( 0,"text_fg")
72  COL_OUT( 1,"text_bg")
73  COL_OUT( 2,"line_highlight")
74  COL_OUT( 3,"line_no_bg")
75  COL_OUT( 4,"keyword_color")
76  COL_OUT( 5,"string_color")
77  COL_OUT( 6,"prepro_color")
78  COL_OUT( 7,"comment_color")
79  COL_OUT( 8,"number_color")
80  COL_OUT( 9,"escape_color")
81  COL_OUT(10,"error_color")
82  ELSE
83  PRINT #fout, l
84  END IF
85  WEND : CLOSE #f_in : CLOSE #fout
86  WITH *SRC
87  gtk_source_style_scheme_manager_force_rescan(.Manager)
88  .SchemeID = @"fbdebugger"
89  END WITH
90  IF KILL("dat/fbdebugger.tmp") THEN _
91  RETURN __("Cannot remove dat/fbdebugger.tmp")
92  RETURN NULL
93 END FUNCTION
94 
95 
96 
116 SUB SettingsForm(BYVAL Mo AS gint = 1)
117  STATIC AS GObject PTR _
118  colForegr, colBackgr, colBackgrCur, colLineNo _ ', colBreak, colBreakTmp _
119  , colKeyword, colStrings, colPrepro, colComment, colNumbers, colEscape, colCursor _
120  , boolTooltips, boolVerbose, boolScreen, boolFileLog _
121  , boolProctrace, boolLinetrace _
122  , boolLineno, boolSyntax _
123  , entryFbc, entryIDE, entryCmdl, entryDbg, entryLogfile _
124  , numDelay, numCurpos, fontSource, boxSchema _
125  , array(11)
126 
127  IF 0 = fontSource THEN ' initial get objects from GUI description
128  VAR xml = GUI.XML ' the style scheme combobox text gets handled in SrcNotebook
129  'colBreak = gtk_builder_get_object(xml, "colorbutton511")
130  'colBreakTmp = gtk_builder_get_object(xml, "colorbutton512")
131  colBackgrCur = gtk_builder_get_object(xml, "colorbutton510")
132  colForegr = gtk_builder_get_object(xml, "colorbutton501")
133  colBackgr = gtk_builder_get_object(xml, "colorbutton509")
134  colLineNo = gtk_builder_get_object(xml, "colorbutton502")
135  colKeyword = gtk_builder_get_object(xml, "colorbutton513")
136  colStrings = gtk_builder_get_object(xml, "colorbutton514")
137  colPrepro = gtk_builder_get_object(xml, "colorbutton515")
138  colComment = gtk_builder_get_object(xml, "colorbutton516")
139  colNumbers = gtk_builder_get_object(xml, "colorbutton517")
140  colEscape = gtk_builder_get_object(xml, "colorbutton518")
141  colCursor = gtk_builder_get_object(xml, "colorbutton519")
142 
143  boolSyntax = gtk_builder_get_object(xml, "checkbutton501")
144  boolVerbose = gtk_builder_get_object(xml, "checkbutton502")
145  boolScreen = gtk_builder_get_object(xml, "checkbutton503")
146  boolFileLog = gtk_builder_get_object(xml, "checkbutton504")
147  boolLinetrace = gtk_builder_get_object(xml, "checkbutton505")
148  boolProctrace = gtk_builder_get_object(xml, "checkbutton506")
149  boolTooltips = gtk_builder_get_object(xml, "checkbutton507")
150  boolLineno = gtk_builder_get_object(xml, "checkbutton508")
151 
152  entryFbc = gtk_builder_get_object(xml, "entry501")
153  entryIde = gtk_builder_get_object(xml, "entry502")
154  entryCmdl = gtk_builder_get_object(xml, "entry503")
155  entryDbg = gtk_builder_get_object(xml, "entry504")
156  entryLogfile = gtk_builder_get_object(xml, "entry505")
157  fontSource = gtk_builder_get_object(xml, "fontbutton502")
158 
159  numDelay = gtk_builder_get_object(xml, "adjustment501")
160  numCurpos = gtk_builder_get_object(xml, "adjustment502")
161  boxSchema = gtk_builder_get_object(xml, "comboboxtext501")
162 
163 '' load syntax highlighting style schemes
164  WITH *SRC
165  .Manager = gtk_source_style_scheme_manager_get_default()
166  gtk_source_style_scheme_manager_prepend_search_path(.Manager, @"dat")
167 
168  VAR list = gtk_source_style_scheme_manager_get_scheme_ids(.Manager) _
169  , i = 0
170  WHILE list[i]
171  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(boxSchema), list[i], list[i])
172  i += 1
173  WEND
174  END WITH
175 
176  g_object_set_data( colForegr, "TestId", CAST(gpointer, STYLE_COLOR))
177  g_object_set_data( colBackgr, "TestId", CAST(gpointer, STYLE_COLOR))
178  g_object_set_data(colBackgrCur, "TestId", CAST(gpointer, STYLE_COLOR))
179  g_object_set_data( colLineNo, "TestId", CAST(gpointer, STYLE_COLOR))
180  g_object_set_data( colKeyword, "TestId", CAST(gpointer, STYLE_COLOR))
181  g_object_set_data( colStrings, "TestId", CAST(gpointer, STYLE_COLOR))
182  g_object_set_data( colPrepro, "TestId", CAST(gpointer, STYLE_COLOR))
183  g_object_set_data( colComment, "TestId", CAST(gpointer, STYLE_COLOR))
184  g_object_set_data( colNumbers, "TestId", CAST(gpointer, STYLE_COLOR))
185  g_object_set_data( colEscape, "TestId", CAST(gpointer, STYLE_COLOR))
186  g_object_set_data( colCursor, "TestId", CAST(gpointer, STYLE_COLOR))
187  g_object_set_data( boolSyntax, "TestId", CAST(gpointer, STYLE_SYNTAX))
188  g_object_set_data( boolLineno, "TestId", CAST(gpointer, STYLE_LINENO))
189  g_object_set_data( fontSource, "TestId", CAST(gpointer, STYLE_FONT))
190  g_object_set_data( numCurpos, "TestId", CAST(gpointer, STYLE_SCROLL))
191  g_object_set_data( boxSchema, "TestId", CAST(gpointer, STYLE_SCHEME))
192 
193  array( 0) = colForegr
194  array( 1) = colBackgr
195  array( 2) = colBackgrCur
196  array( 3) = colLineNo
197  array( 4) = colKeyword
198  array( 5) = colStrings
199  array( 6) = colPrepro
200  array( 7) = colComment
201  array( 8) = colNumbers
202  array( 9) = colEscape
203  array(10) = colCursor
204  array(11) = NULL
205  g_object_set_data(boxSchema, "WidgetArray", @array(0))
206  END IF
207 
208 WITH *INI
209  SELECT CASE AS CONST Mo
210  CASE 0 ' dialog --> INI
211  DIM AS GdkRGBA PTR col ' passing a pointer, remember to free the data
212  g_object_get( colForegr, "rgba", @col, NULL) : .ColForegr = colTrans(col) : gdk_rgba_free(col)
213  g_object_get( colBackgr, "rgba", @col, NULL) : .ColBackgr = colTrans(col) : gdk_rgba_free(col)
214  g_object_get(colBackgrCur, "rgba", @col, NULL) : .ColBackgrCur = colTrans(col) : gdk_rgba_free(col)
215  'g_object_get( colBreak, "rgba", @col, NULL) : .ColBreak = colTrans(col) : gdk_rgba_free(col)
216  'g_object_get( colBreakTmp, "rgba", @col, NULL) : .ColBreakTmp = colTrans(col) : gdk_rgba_free(col)
217  g_object_get( colLineNo, "rgba", @col, NULL) : .ColLineNo = colTrans(col) : gdk_rgba_free(col)
218  g_object_get( colKeyword, "rgba", @col, NULL) : .ColKeyword = colTrans(col) : gdk_rgba_free(col)
219  g_object_get( colStrings, "rgba", @col, NULL) : .ColStrings = colTrans(col) : gdk_rgba_free(col)
220  g_object_get( colPrepro, "rgba", @col, NULL) : .ColPrepro = colTrans(col) : gdk_rgba_free(col)
221  g_object_get( colComment, "rgba", @col, NULL) : .ColComment = colTrans(col) : gdk_rgba_free(col)
222  g_object_get( colNumbers, "rgba", @col, NULL) : .ColNumbers = colTrans(col) : gdk_rgba_free(col)
223  g_object_get( colEscape, "rgba", @col, NULL) : .ColEscape = colTrans(col) : gdk_rgba_free(col)
224  g_object_get( colCursor, "rgba", @col, NULL) : .ColCursor = colTrans(col) : gdk_rgba_free(col)
225 
226  DIM AS gboolean bool
227  g_object_get( boolTooltips, "active", @bool, NULL) : .Bool(.FTT) = bool
228  g_object_get( boolVerbose, "active", @bool, NULL) : .Bool(.FVM) = bool
229  g_object_get( boolScreen, "active", @bool, NULL) : .Bool(.FSL) = bool
230  g_object_get( boolFileLog, "active", @bool, NULL) : .Bool(.FFL) = bool
231  g_object_get(boolProctrace, "active", @bool, NULL) : .Bool(.FPT) = bool
232  g_object_get(boolLinetrace, "active", @bool, NULL) : .Bool(.FLT) = bool
233  g_object_get( boolLineno, "active", @bool, NULL) : .Bool(.FLN) = bool
234  g_object_get( boolSyntax, "active", @bool, NULL) : .Bool(.FSH) = bool
235 
236  DIM AS gchar PTR char ' passing a pointer, remember to free the data
237  g_object_get( entryFbc, "text", @char, NULL) : .FbcExe = *char : g_free(char)
238  g_object_get( entryIde, "text", @char, NULL) : .IdeExe = *char : g_free(char)
239  g_object_get( entryCmdl, "text", @char, NULL) : .CmdlFbc = *char : g_free(char)
240  g_object_get( entryDbg, "text", @char, NULL) : .CmdExe(0) = *char : g_free(char)
241  g_object_get( entryLogfile, "text", @char, NULL) : .FnamLog = *char : g_free(char)
242  g_object_get( fontSource, "font", @char, NULL) : .FontSrc = *char : g_free(char)
243  g_object_get(boxSchema, "active-id", @char, NULL) : .StlSchm = *char : g_free(char)
244 
245  DIM AS gdouble num
246  g_object_get( numDelay, "value", @num, NULL) : .DelVal = CAST(guint32, num)
247  g_object_get( numCurpos, "value", @num, NULL) : .CurPos = CAST(guint32, num * 1000)
248 
249  VAR r = .saveIni() : IF r THEN ?PROJ_NAME & ": " & *r
250  SRC->ScrollPos = 1. / 99000 * .CurPos
251  SRC->settingsChanged()
252  CASE ELSE ' INI --> dialog
253  DIM AS GdkRGBA col
254  gdk_rgba_parse(@col, "#" & HEX( .ColForegr, 6)) : g_object_set( colForegr, "rgba", @col, NULL)
255  gdk_rgba_parse(@col, "#" & HEX( .ColBackgr, 6)) : g_object_set( colBackgr, "rgba", @col, NULL)
256  gdk_rgba_parse(@col, "#" & HEX(.ColBackgrCur, 6)) : g_object_set(colBackgrCur, "rgba", @col, NULL)
257  'gdk_rgba_parse(@col, "#" & HEX( .ColBreak, 6)) : g_object_set( colBreak, "rgba", @col, NULL)
258  'gdk_rgba_parse(@col, "#" & HEX( .ColBreakTmp, 6)) : g_object_set( colBreakTmp, "rgba", @col, NULL)
259  gdk_rgba_parse(@col, "#" & HEX( .ColLineNo, 6)) : g_object_set( colLineNo, "rgba", @col, NULL)
260  gdk_rgba_parse(@col, "#" & HEX( .ColKeyword, 6)) : g_object_set( colKeyword, "rgba", @col, NULL)
261  gdk_rgba_parse(@col, "#" & HEX( .ColStrings, 6)) : g_object_set( colStrings, "rgba", @col, NULL)
262  gdk_rgba_parse(@col, "#" & HEX( .ColPrepro, 6)) : g_object_set( colPrepro, "rgba", @col, NULL)
263  gdk_rgba_parse(@col, "#" & HEX( .ColComment, 6)) : g_object_set( colComment, "rgba", @col, NULL)
264  gdk_rgba_parse(@col, "#" & HEX( .ColNumbers, 6)) : g_object_set( colNumbers, "rgba", @col, NULL)
265  gdk_rgba_parse(@col, "#" & HEX( .ColEscape, 6)) : g_object_set( colEscape, "rgba", @col, NULL)
266  gdk_rgba_parse(@col, "#" & HEX( .ColCursor, 6)) : g_object_set( colCursor, "rgba", @col, NULL)
267 
268  g_object_set( boolTooltips, "active", .Bool(.FTT), NULL)
269  g_object_set( boolVerbose, "active", .Bool(.FVM), NULL)
270  g_object_set( boolScreen, "active", .Bool(.FSL), NULL)
271  g_object_set( boolFileLog, "active", .Bool(.FFL), NULL)
272  g_object_set(boolProctrace, "active", .Bool(.FPT), NULL)
273  g_object_set(boolLinetrace, "active", .Bool(.FLT), NULL)
274  g_object_set( boolLineno, "active", .Bool(.FLN), NULL)
275  g_object_set( boolSyntax, "active", .Bool(.FSH), NULL)
276 
277  g_object_set( entryFbc, "text", IIF(LEN( .FbcExe), SADD(.FbcExe), @""), NULL)
278  g_object_set( entryIde, "text", IIF(LEN( .IdeExe), SADD(.IdeExe), @""), NULL)
279  g_object_set( entryCmdl, "text", IIF(LEN(.CmdlFbc), SADD(.CmdlFbc), @""), NULL)
280  g_object_set( entryDbg, "text", IIF(LEN(.CmdExe(0)), SADD(.CmdExe(0)), @""), NULL)
281  g_object_set( entryLogfile, "text", IIF(LEN(.FnamLog), SADD(.FnamLog), @""), NULL)
282 
283  g_object_set( fontSource, "font", IIF(LEN(.FontSrc), SADD(.FontSrc), @""), NULL)
284  g_object_set( numDelay, "value", CAST(gdouble, .DelVal), NULL)
285  g_object_set( numCurpos, "value", CAST(gdouble, .CurPos / 1000), NULL)
286 
287  IF gtk_combo_box_set_active_id(GTK_COMBO_BOX(boxSchema), SADD(INI->StlSchm)) THEN
288  INI->StlSchm = "fbdebugger" '' fallback, if scheme not available
289  gtk_combo_box_set_active_id(GTK_COMBO_BOX(boxSchema), SADD(INI->StlSchm))
290  END IF
291 
292  VAR bool = IIF(.StlSchm = "fbdebugger", TRUE, FALSE)
293  VAR i = 0
294  WHILE array(i)
295  gtk_widget_set_sensitive(GTK_WIDGET(array(i)), bool)
296  i += 1
297  WEND
298  IF bool THEN updateScheme(@array(0)) _ '' ToDo handle error messages
299  ELSE SRC->SchemeID = SADD(.StlSchm)
300  SRC->FontID = .FontSrc
301  SRC->ScrollPos = 1. / 99000 * .CurPos
302  SRC->settingsChanged()
303  END SELECT
304 END WITH
305 END SUB
306 
307 
308 
318 SUB act_Settings CDECL ALIAS "act_Settings" ( _
319  BYVAL action AS GtkAction PTR, _
320  BYVAL user_data AS gpointer) EXPORT
321 
322  ?" --> callback act_Settings"
323  SELECT CASE AS CONST gtk_dialog_run(user_data)
324  CASE 0
325  ?" --> callback act_Settings -> save dialog settings"
326  SettingsForm(0) ' load from form
327  CASE ELSE
328  ?" --> callback act_Settings -> dialog canceled, restore form"
329  SettingsForm(1) ' restore form, because user canceled
330  END SELECT
331  gtk_widget_hide(user_data)
332 
333 END SUB
334 
335 
336 
350 SUB on_entry_icon_save CDECL ALIAS "on_entry_icon_save" ( _
351  BYVAL Entry AS GtkEntry PTR, _
352  BYVAL IconPos AS GtkEntryIconPosition, _
353  BYVAL Event AS GdkEvent PTR, _
354  BYVAL user_data AS gpointer) EXPORT
355 
356  IF IconPos <> GTK_ENTRY_ICON_SECONDARY THEN EXIT SUB
357 
358  VAR fnam = *gtk_entry_get_text(Entry) ' don't free this one!
359  VAR dia = DBG_FILE_SAVE("Select log file name")
360  'gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dia), TRUE)
361  gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dia), fnam)
362 
363  IF GTK_RESPONSE_ACCEPT = gtk_dialog_run(GTK_DIALOG(dia)) THEN
364  VAR fnam = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dia))
365  gtk_entry_set_text(Entry, fnam)
366  g_free (fnam)
367  END IF
368 
369  gtk_widget_destroy(dia)
370 END SUB
371 
372 
373 
386 SUB on_entry_icon_load CDECL ALIAS "on_entry_icon_load" ( _
387  BYVAL Entry AS GtkEntry PTR, _
388  BYVAL IconPos AS GtkEntryIconPosition, _
389  BYVAL Event AS GdkEvent PTR, _
390  BYVAL user_data AS gpointer) EXPORT
391 
392  IF IconPos <> GTK_ENTRY_ICON_SECONDARY THEN EXIT SUB
393 
394  VAR dia = DBG_FILE_OPEN("Select executable")
395  gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dia), dbg_exe_filter())
396 
397  IF GTK_RESPONSE_ACCEPT = gtk_dialog_run(GTK_DIALOG(dia)) THEN
398  VAR fnam = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dia))
399  gtk_entry_set_text(Entry, fnam)
400  g_free(fnam)
401  END IF
402 
403  gtk_widget_destroy(dia)
404 END SUB
405 
406 
407 
416 SUB on_settings_changed CDECL ALIAS "on_settings_changed" ( _
417  BYVAL Objct AS GObject PTR, _
418  BYVAL user_data AS gpointer) EXPORT
419 
420 ?" --> callback on_settings_changed"
421 
422  WITH *SRC
423  VAR page = gtk_notebook_get_current_page(GTK_NOTEBOOK(.NoteBok)) _
424  , widg = gtk_notebook_get_nth_page(GTK_NOTEBOOK(.NoteBok), page)
425 
426  SELECT CASE AS CONST g_object_get_data(Objct, "TestId")
427  CASE STYLE_SYNTAX
428  DIM AS gboolean fsh
429  g_object_get(Objct, "active", @fsh, NULL)
430 
431  VAR buff = g_object_get_data(G_Object(widg), "Buffer")
432  gtk_source_buffer_set_highlight_syntax(GTKSOURCE_SOURCE_BUFFER(.BuffCur), fsh)
433  gtk_source_buffer_set_highlight_syntax(buff, fsh)
434  CASE STYLE_LINENO
435  DIM AS gboolean fln
436  g_object_get(Objct, "active", @fln, NULL)
437 
438  VAR srcv = g_object_get_data(G_Object(widg), "SrcView")
439  gtk_source_view_set_show_line_numbers(GTKSOURCE_SOURCE_VIEW(srcv), fLn)
440  CASE STYLE_FONT
441  DIM AS gchar PTR fontsrc
442  g_object_get(Objct, "font", @fontsrc, NULL)
443 
444  .FontID = *fontsrc
445  g_free(fontsrc)
446 
447  VAR srcv = g_object_get_data(G_Object(widg), "SrcView")
448  gtk_widget_override_font(GTK_WIDGET(srcv), .Font)
449  CASE STYLE_SCROLL
450  DIM AS gdouble scroll
451  g_object_get(Objct, "value", @scroll, NULL)
452 
453  VAR buff = g_object_get_data(G_Object(widg), "Buffer") _
454  , srcv = g_object_get_data(G_Object(widg), "SrcView") _
455  , mark = gtk_text_buffer_get_insert(buff)
456  gtk_text_view_scroll_to_mark(srcv, mark, .0, TRUE, .0, 1. / 99 * scroll)
457  CASE STYLE_COLOR
458  updateScheme(g_object_get_data(user_data, "WidgetArray")) '' ToDo handle error messages
459 
460  VAR buff = g_object_get_data(G_Object(widg), "Buffer")
461  gtk_source_buffer_set_style_scheme(buff, .Schema)
462  CASE STYLE_SCHEME
463  DIM AS gchar PTR stlschm
464  DIM AS GtkWidget PTR PTR array = g_object_get_data(Objct, "WidgetArray")
465 
466  g_object_get(Objct, "active-id", @stlschm, NULL)
467  VAR bool = IIF(*stlschm = "fbdebugger", TRUE, FALSE)
468  .SchemeID = stlschm
469  g_free(stlschm)
470 
471  VAR i = 0
472  WHILE array[i]
473  gtk_widget_set_sensitive(array[i], bool)
474  i += 1
475  WEND
476 
477  VAR buff = g_object_get_data(G_Object(widg), "Buffer")
478  gtk_source_buffer_set_style_scheme(buff, .Schema)
479  END SELECT
480  END WITH
481 END SUB
482 
483 
484 ' Here we initialize the dialog context (before starting the main window)
485 SettingsForm()
486