3 Copyright (C) 2000 Kh. Naba Kumar Singh
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 #include <libanjuta/resources.h>
36 #include "compiler_options.h"
44 GtkWidget
*supp_clist
;
48 GtkWidget
*lib_paths_clist
;
49 GtkWidget
*lib_paths_entry
;
52 GtkWidget
*lib_stock_clist
;
56 GtkWidget
*def_stock_clist
;
59 GtkWidget
*warnings_clist
;
60 GtkWidget
*optimize_button
[4];
61 GtkWidget
*other_button
[2];
63 GtkWidget
*other_c_flags_entry
;
64 GtkWidget
*other_l_flags_entry
;
65 GtkWidget
*other_l_libs_entry
;
68 struct _CompilerOptionsPriv
71 CompilerOptionsGui widgets
;
75 gint win_pos_x
, win_pos_y
;
77 /* This property database is not the one
78 * from which compiler options will be loaded
79 * or saved, but the one in which option
80 * variables will be set for the commands
86 static void create_compiler_options_gui (CompilerOptions
*co
);
87 static void on_remove_from_clist_clicked (GtkButton
* button
, gpointer data
);
89 #define ANJUTA_SUPPORTS_END_STRING "SUPPORTS_END"
90 #define ANJUTA_SUPPORTS_END \
92 ANJUTA_SUPPORTS_END_STRING, NULL, NULL, \
93 NULL, NULL, NULL, NULL, NULL, NULL, NULL \
96 gchar
*anjuta_supports
[][ANJUTA_SUPPORT_END_MARK
] = {
99 "[gtk+ 1.2] Glib library for most C utilities",
101 "AM_MISSING_PROG(GLIB_CONFIG, glib-config, $mising_dir)\n",
102 "`glib-config --cflags`",
103 "`glib-config --libs`",
104 "`glib-config --cflags`",
105 "`glib-config --libs`",
107 "glib-config --version"}
111 "[gtk+ 1.2] Gimp Toolkit library for GUI development",
114 "gtk-config --cflags",
116 "`gtk-config --cflags`",
117 "`gtk-config --libs`",
119 "gtk-config --version"}
123 "[gnome 1.4] GNOME is Computing Made Easy",
126 "$(GNOME_INCLUDESDIR)",
127 "$(GNOME_LIBDIR) $(GNOME_LIBS)",
128 "`gnome-config --cflags glib gtk gnome gnomeui`",
129 "`gnome-config --libs glib gtk gnome gnomeui`",
131 "gnome-config --version"}
135 "[gnome 1.4] GNOME Bonobo component for fast integration",
140 "`gnome-config --cflags glib gtk gnome gnomeui bonobo`",
141 "`gnome-config --libs glib gtk gnome gnomeui bonobo`",
143 "gnome-config --version"}
147 "[gtk+ 1.2] C++ Bindings for GTK",
152 "`gtkmm-config --cflags`",
153 "`gtkmm-config --libs`",
155 "gtkmm-config --version"}
159 "[gnome 1.4] C++ bindings for GNOME",
164 "`gnome-config --cflags gnomemm`",
165 "`gnome-config --libs gnomemm`",
167 "gnome-config --version"}
171 "[gnome 1.4] C program using libglade",
174 "$(LIBGLADE_CFLAGS)",
176 "`libglade-config --cflags gnome`",
177 "`libglade-config --libs gnome`",
179 "libglade-config --version"}
183 "[gtk+ 1.2] C++ program using wxWindows (wxGTK) toolkit",
188 "`wx-config --cxxflags`",
189 "`wx-config --libs`",
191 "wx-config --version"}
196 static gchar
*anjuta_warnings
[] = {
197 " -Werror", "Consider warnings as errors",
198 " -w", "No warnings",
199 " -Wall", "Enable most warnings",
200 " -Wimplicit", "Warning for implicit declarations",
201 " -Wreturn-type", "Warning for mismatched return types",
202 " -Wunused", "Warning for unused variables",
203 " -Wswitch", "Warning for unhandled switch case with enums",
204 " -Wcomment", "Warning for nested comments",
205 " -Wuninitialized", "Warning for uninitialized variable use",
206 " -Wparentheses", "Warning for missing parentheses",
207 " -Wtraditional", "Warning for differences to traditionanl syntax",
208 " -Wshadow", "Warning for variable shadowing",
209 " -Wpointer-arith", "Warning for missing prototypes",
210 " -Wmissing-prototypes", "Warning for suspected pointer arithmetic",
211 " -Winline", "Warning if declarations cannot be inlined",
212 " -Woverloaded-virtual", "Warning for overloaded virtuals",
216 static gchar
*anjuta_defines
[] = {
225 static gchar
*optimize_button_option
[] = {
232 static gchar
*other_button_option
[] = {
240 SUPP_DESCRIPTION_COLUMN
,
241 SUPP_PKGCONFIG_COLUMN
,
263 LIB_STOCK_DES_COLUMN
,
279 WARNINGS_TOGGLE_COLUMN
,
286 static void compiler_options_set_in_properties (CompilerOptions
* co
,
290 populate_stock_libs (GtkListStore
*tmodel
)
298 /* Now read the stock libraries */
300 g_strconcat (app
->dirs
->data
, "/stock_libs.anj",
302 fp
= fopen (stock_file
, "r");
308 /* Skip the first line which is comment */
317 while (feof (fp
) == FALSE
)
321 /* Read a line at a time */
322 fscanf (fp
, "%s", lib_name
); /* The lib name */
324 /* Followed by description */
330 goto down
; /* Done when eof */
331 desbuff
[i
] = (gchar
) ch
;
338 gtk_list_store_append (tmodel
, &iter
);
339 gtk_list_store_set (tmodel
, &iter
,
340 LIB_STOCK_COLUMN
, lib_name
,
341 LIB_STOCK_DES_COLUMN
, desbuff
,
351 populate_supports (GtkListStore
*tmodel
)
362 /* Now setup all the available supports */
363 while (strcmp (anjuta_supports
[i
][ANJUTA_SUPPORT_ID
],
364 ANJUTA_SUPPORTS_END_STRING
) != 0)
366 gtk_list_store_append (tmodel
, &iter
);
367 gtk_list_store_set (tmodel
, &iter
,
368 SUPP_TOGGLE_COLUMN
, FALSE
,
369 SUPP_NAME_COLUMN
, anjuta_supports
[i
][0],
370 SUPP_DESCRIPTION_COLUMN
, anjuta_supports
[i
][1],
371 SUPP_PKGCONFIG_COLUMN
, FALSE
,
375 /* Now setup all the pkg-config supports */
376 tmpfile
= get_a_tmp_file ();
377 pkg_cmd
= g_strconcat ("pkg-config --list-all > ", tmpfile
,
378 " 2>/dev/null", NULL
);
380 pkg_fd
= fopen (tmpfile
, "r");
383 g_warning ("Can not open %s for reading", tmpfile
);
388 while (getline (&line
, &length
, pkg_fd
) > 0)
399 while (!isspace(*name_end
))
401 desc_start
= name_end
;
402 while (isspace(*desc_start
))
405 name
= g_strndup (line
, name_end
-line
);
406 description
= g_strndup (desc_start
, strlen (desc_start
)-1);
408 gtk_list_store_append (tmodel
, &iter
);
409 gtk_list_store_set (tmodel
, &iter
,
410 SUPP_TOGGLE_COLUMN
, FALSE
,
411 SUPP_NAME_COLUMN
, name
,
412 SUPP_DESCRIPTION_COLUMN
, description
,
413 SUPP_PKGCONFIG_COLUMN
, TRUE
,
424 populate_stock_defs (GtkListStore
*tmodel
)
426 /* Now setup buildin defines */
428 while (anjuta_defines
[i
])
431 gtk_list_store_append (tmodel
, &iter
);
432 gtk_list_store_set (tmodel
, &iter
,
433 DEF_STOCK_COLUMN
, anjuta_defines
[i
],
440 populate_warnings (GtkListStore
*tmodel
)
442 /* Now setup buildin defines */
444 while (anjuta_warnings
[i
])
447 gtk_list_store_append (tmodel
, &iter
);
448 gtk_list_store_set (tmodel
, &iter
,
449 WARNINGS_TOGGLE_COLUMN
, FALSE
,
450 WARNINGS_COLUMN
, anjuta_warnings
[i
],
451 WARNINGS_DES_COLUMN
, anjuta_warnings
[i
+1],
469 static EntrySignalInfo
*
470 entry_signal_info_new (CompilerOptions
*co
, GtkWidget
*tree
, GtkWidget
*entry
,
473 EntrySignalInfo
*info
;
474 g_return_val_if_fail ((GTK_IS_TREE_VIEW (tree
) && GTK_IS_ENTRY (entry
)),
476 info
= g_new0 (EntrySignalInfo
, 1);
478 info
->tree
= GTK_TREE_VIEW (tree
);
479 info
->entry
= GTK_ENTRY (entry
);
484 static ToggleSignalInfo
*
485 toggle_signal_info_new (CompilerOptions
*co
, gint col
)
487 ToggleSignalInfo
*info
;
489 info
= g_new0 (ToggleSignalInfo
, 1);
496 on_comp_finish (CompilerOptions
* co
)
498 gboolean should_rebuild
;
500 if (co
->priv
->dirty
&&
501 app
->project_dbase
->project_is_open
)
503 gchar
* msg
= _("You have changed some of the compiler options of the project,\n"
504 "would you like the next build action to perform a complete\n"
505 "rebuild of the project?");
506 should_rebuild
= anjuta_boolean_question (msg
);
508 app
->project_dbase
->clean_before_build
= TRUE
;
510 app
->project_dbase
->clean_before_build
= FALSE
;
512 co
->priv
->dirty
= FALSE
;
513 app
->project_dbase
->clean_before_build
= FALSE
;
515 compiler_options_set_in_properties(co
, co
->priv
->props
);
516 project_dbase_save_project (app
->project_dbase
);
520 on_compt_delete_event (GtkWidget
*widget
, GdkEvent
*event
, gpointer data
)
522 CompilerOptions
*co
= data
;
523 g_return_val_if_fail (co
, TRUE
);
526 compiler_options_hide(co
);
531 on_compt_response (GtkWidget
*widget
, gint response
, gpointer data
)
533 CompilerOptions
*co
= data
;
534 g_return_if_fail (co
);
538 case GTK_RESPONSE_HELP
:
539 /* FIXME: Add help for compiler options here */
541 case GTK_RESPONSE_CLOSE
:
543 compiler_options_hide (co
);
549 on_toggle_clist_row_activated (GtkTreeView
*treeview
,
551 GtkTreeViewColumn
*arg2
,
557 ToggleSignalInfo
* info
= (ToggleSignalInfo
*) data
;
559 model
= gtk_tree_view_get_model (treeview
);
560 if (gtk_tree_model_get_iter (model
, &iter
, arg1
))
562 gtk_tree_model_get (model
, &iter
, info
->col
, &value
, -1);
563 value
= value
? FALSE
: TRUE
;
564 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, info
->col
, value
, -1);
565 compiler_options_set_dirty_flag (info
->co
, TRUE
);
570 on_update_selection_changed (GtkTreeSelection
*sel
, EntrySignalInfo
*info
)
575 GtkEntry
*entry
= info
->entry
;
576 gint col
= info
->col
;
577 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
579 gtk_tree_model_get (model
, &iter
, col
, &text
, -1);
580 gtk_entry_set_text (entry
, text
);
581 compiler_options_set_dirty_flag (info
->co
, TRUE
);
587 on_button_selection_changed (GtkToggleButton
*togglebutton
, gpointer user_data
)
589 CompilerOptions
*co
= (CompilerOptions
*) user_data
;
590 compiler_options_set_dirty_flag (co
, TRUE
);
594 on_entry_changed (GtkEntry
*togglebutton
, gpointer user_data
)
596 CompilerOptions
*co
= (CompilerOptions
*) user_data
;
597 compiler_options_set_dirty_flag (co
, TRUE
);
603 verify_new_entry (GtkTreeView
*tree
, const gchar
*str
, gint col
)
609 model
= gtk_tree_view_get_model (GTK_TREE_VIEW(tree
));
611 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
615 gtk_tree_model_get (model
, &iter
, col
, &text
, -1);
616 if (strcmp(str
, text
) == 0)
618 valid
= gtk_tree_model_iter_next (model
, &iter
);
624 on_add_to_clist_clicked (GtkButton
* button
, gpointer data
)
630 EntrySignalInfo
*info
= data
;
631 GtkTreeView
*tree
= info
->tree
;
632 GtkEntry
*entry
= info
->entry
;
633 gint col
= info
->col
;
635 str
= g_strdup (gtk_entry_get_text (GTK_ENTRY (entry
)));
636 text
= g_strstrip (str
);
637 if (strlen (text
) == 0)
642 if (verify_new_entry (tree
, text
, col
) == FALSE
)
644 gtk_entry_set_text (GTK_ENTRY (entry
), "");
648 model
= gtk_tree_view_get_model (GTK_TREE_VIEW(tree
));
650 gtk_list_store_append (GTK_LIST_STORE (model
), &iter
);
651 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
, col
, text
, -1);
652 if (col
!= 0) /* Also enable it */
653 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
, 0, TRUE
, -1);
654 gtk_entry_set_text (GTK_ENTRY (entry
), "");
656 compiler_options_set_dirty_flag (info
->co
, TRUE
);
660 on_update_in_clist_clicked (GtkButton
* button
, gpointer data
)
663 GtkTreeSelection
*sel
;
666 EntrySignalInfo
*info
= data
;
667 GtkTreeView
*tree
= info
->tree
;
668 GtkEntry
*entry
= info
->entry
;
669 gint col
= info
->col
;
671 str
= g_strdup (gtk_entry_get_text (GTK_ENTRY (entry
)));
672 text
= g_strstrip(str
);
673 if (strlen (text
) == 0)
678 if (verify_new_entry (tree
, text
, col
) == FALSE
)
680 gtk_entry_set_text (GTK_ENTRY (entry
), "");
684 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW(tree
));
685 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
687 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
, col
, text
, -1);
688 gtk_entry_set_text (GTK_ENTRY (entry
), "");
691 compiler_options_set_dirty_flag (info
->co
, TRUE
);
695 on_remove_from_clist_clicked (GtkButton
* button
, gpointer data
)
699 GtkTreeSelection
*sel
;
700 EntrySignalInfo
*info
= data
;
701 GtkTreeView
*tree
= info
->tree
;
702 GtkEntry
*entry
= info
->entry
;
704 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW(tree
));
705 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
707 gtk_list_store_remove (GTK_LIST_STORE(model
), &iter
);
708 gtk_entry_set_text (GTK_ENTRY (entry
), "");
709 compiler_options_set_dirty_flag (info
->co
, TRUE
);
714 on_clear_clist_clicked (GtkButton
* button
, gpointer data
)
717 GtkWidget
*top_level
;
718 EntrySignalInfo
*info
= data
;
719 GtkTreeView
*tree
= info
->tree
;
720 GtkListStore
*model
= GTK_LIST_STORE (gtk_tree_view_get_model (tree
));
721 top_level
= gtk_widget_get_toplevel (GTK_WIDGET (tree
));
722 win
= gtk_message_dialog_new (GTK_WINDOW (top_level
),
723 GTK_DIALOG_DESTROY_WITH_PARENT
,
724 GTK_MESSAGE_QUESTION
,
726 _("Do you want to clear the list?"));
727 gtk_dialog_add_buttons (GTK_DIALOG (win
),
728 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
729 GTK_STOCK_CLEAR
, GTK_RESPONSE_YES
,
731 if (gtk_dialog_run (GTK_DIALOG (win
)) == GTK_RESPONSE_YES
)
733 gtk_list_store_clear (GTK_LIST_STORE (model
));
734 compiler_options_set_dirty_flag (info
->co
, TRUE
);
736 gtk_widget_destroy (win
);
739 #define BUTTON_SIGNAL_CONNECT(w, f, d) \
740 g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (f), d);
743 void create_compiler_options_gui (CompilerOptions
*co
)
746 GtkTreeViewColumn
*column
;
747 GtkTreeSelection
*selection
;
749 GtkCellRenderer
*renderer
;
753 /* Compiler Options Dialog */
754 co
->priv
->gxml
= glade_xml_new (GLADE_FILE_ANJUTA
, "compiler_options_dialog", NULL
);
755 co
->priv
->widgets
.window
= glade_xml_get_widget (co
->priv
->gxml
, "compiler_options_dialog");
756 gtk_widget_hide (co
->priv
->widgets
.window
);
757 gtk_window_set_transient_for (GTK_WINDOW (co
->priv
->widgets
.window
),
759 co
->priv
->widgets
.supp_clist
= glade_xml_get_widget (co
->priv
->gxml
, "supp_clist");
760 co
->priv
->widgets
.inc_clist
= glade_xml_get_widget (co
->priv
->gxml
, "inc_clist");
761 co
->priv
->widgets
.inc_entry
= glade_xml_get_widget (co
->priv
->gxml
, "inc_entry");
762 co
->priv
->widgets
.lib_paths_clist
= glade_xml_get_widget (co
->priv
->gxml
, "lib_paths_clist");
763 co
->priv
->widgets
.lib_paths_entry
= glade_xml_get_widget (co
->priv
->gxml
, "lib_paths_entry");
764 co
->priv
->widgets
.lib_clist
= glade_xml_get_widget (co
->priv
->gxml
, "lib_clist");
765 co
->priv
->widgets
.lib_stock_clist
= glade_xml_get_widget (co
->priv
->gxml
, "lib_stock_clist");
766 co
->priv
->widgets
.lib_entry
= glade_xml_get_widget (co
->priv
->gxml
, "lib_entry");
767 co
->priv
->widgets
.def_clist
= glade_xml_get_widget (co
->priv
->gxml
, "def_clist");
768 co
->priv
->widgets
.def_stock_clist
= glade_xml_get_widget (co
->priv
->gxml
, "def_stock_clist");
769 co
->priv
->widgets
.def_entry
= glade_xml_get_widget (co
->priv
->gxml
, "def_entry");
770 co
->priv
->widgets
.warnings_clist
= glade_xml_get_widget (co
->priv
->gxml
, "warnings_clist");
771 co
->priv
->widgets
.optimize_button
[0] = glade_xml_get_widget (co
->priv
->gxml
, "optimization_b_1");
772 co
->priv
->widgets
.optimize_button
[1] = glade_xml_get_widget (co
->priv
->gxml
, "optimization_b_2");
773 co
->priv
->widgets
.optimize_button
[2] = glade_xml_get_widget (co
->priv
->gxml
, "optimization_b_3");
774 co
->priv
->widgets
.optimize_button
[3] = glade_xml_get_widget (co
->priv
->gxml
, "optimization_b_4");
775 co
->priv
->widgets
.other_button
[0] = glade_xml_get_widget (co
->priv
->gxml
, "debugging_b");
776 co
->priv
->widgets
.other_button
[1] = glade_xml_get_widget (co
->priv
->gxml
, "profiling_b");
777 co
->priv
->widgets
.other_c_flags_entry
= glade_xml_get_widget (co
->priv
->gxml
, "other_c_flags_entry");
778 co
->priv
->widgets
.other_l_flags_entry
= glade_xml_get_widget (co
->priv
->gxml
, "other_l_flags_entry");
779 co
->priv
->widgets
.other_l_libs_entry
= glade_xml_get_widget (co
->priv
->gxml
, "other_l_libs_entry");
781 /* Add supports tree model */
782 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.supp_clist
);
783 store
= gtk_list_store_new (N_SUPP_COLUMNS
,
788 gtk_tree_view_set_model (clist
, GTK_TREE_MODEL(store
));
790 /* Add supports columns */
791 renderer
= gtk_cell_renderer_toggle_new ();
792 column
= gtk_tree_view_column_new_with_attributes ("", renderer
,
796 gtk_tree_view_append_column (clist
, column
);
797 renderer
= gtk_cell_renderer_text_new ();
798 column
= gtk_tree_view_column_new_with_attributes (_("Name"),
803 gtk_tree_view_append_column (clist
, column
);
804 renderer
= gtk_cell_renderer_text_new ();
805 column
= gtk_tree_view_column_new_with_attributes (_("Description"),
808 SUPP_DESCRIPTION_COLUMN
,
810 gtk_tree_view_append_column (clist
, column
);
811 populate_supports (store
);
812 g_object_unref (G_OBJECT(store
));
814 /* Add "includes" tree model */
815 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.inc_clist
);
816 store
= gtk_list_store_new (N_INC_COLUMNS
, G_TYPE_STRING
);
817 gtk_tree_view_set_model (clist
, GTK_TREE_MODEL(store
));
819 renderer
= gtk_cell_renderer_text_new ();
820 column
= gtk_tree_view_column_new_with_attributes (_("Include paths"),
825 gtk_tree_view_append_column (clist
, column
);
826 g_object_unref (G_OBJECT(store
));
828 /* Add "libraries paths" model */
829 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.lib_paths_clist
);
830 store
= gtk_list_store_new (N_LIB_PATHS_COLUMN
, G_TYPE_STRING
);
831 gtk_tree_view_set_model (clist
, GTK_TREE_MODEL(store
));
833 /* Add "libraries paths" columns */
834 renderer
= gtk_cell_renderer_text_new ();
835 column
= gtk_tree_view_column_new_with_attributes (_("Libraries paths"),
840 gtk_tree_view_append_column (clist
, column
);
841 g_object_unref (G_OBJECT(store
));
843 /* Add "includes" tree model */
844 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.lib_clist
);
845 store
= gtk_list_store_new (N_LIB_COLUMNS
, G_TYPE_BOOLEAN
,
847 gtk_tree_view_set_model (clist
, GTK_TREE_MODEL(store
));
849 /* Add "libraries paths" columns */
850 renderer
= gtk_cell_renderer_toggle_new ();
851 column
= gtk_tree_view_column_new_with_attributes ("", renderer
,
855 gtk_tree_view_append_column (clist
, column
);
856 renderer
= gtk_cell_renderer_text_new ();
858 gtk_tree_view_column_new_with_attributes (_("Libraries and modules"),
863 gtk_tree_view_append_column (clist
, column
);
864 g_object_unref (G_OBJECT(store
));
866 /* Add "Libraries stock" model */
867 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.lib_stock_clist
);
868 store
= gtk_list_store_new (N_LIB_STOCK_COLUMNS
, G_TYPE_STRING
,
870 gtk_tree_view_set_model (clist
, GTK_TREE_MODEL(store
));
872 /* Add "Libraries stock" column */
873 renderer
= gtk_cell_renderer_text_new ();
874 column
= gtk_tree_view_column_new_with_attributes (_("Stock"),
879 gtk_tree_view_append_column (clist
, column
);
880 renderer
= gtk_cell_renderer_text_new ();
881 column
= gtk_tree_view_column_new_with_attributes (_("Description"),
884 LIB_STOCK_DES_COLUMN
,
886 gtk_tree_view_append_column (clist
, column
);
887 populate_stock_libs (store
);
888 g_object_unref (G_OBJECT(store
));
890 /* Add "Defines" model */
891 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.def_clist
);
892 store
= gtk_list_store_new (N_DEF_COLUMNS
, G_TYPE_BOOLEAN
,
894 gtk_tree_view_set_model (clist
, GTK_TREE_MODEL(store
));
896 /* Add defines columns */
897 renderer
= gtk_cell_renderer_toggle_new ();
898 column
= gtk_tree_view_column_new_with_attributes ("", renderer
,
902 gtk_tree_view_append_column (clist
, column
);
903 renderer
= gtk_cell_renderer_text_new ();
904 column
= gtk_tree_view_column_new_with_attributes (_("Description"),
909 gtk_tree_view_append_column (clist
, column
);
910 g_object_unref (G_OBJECT(store
));
912 /* Add "Defines stock" model */
913 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.def_stock_clist
);
914 store
= gtk_list_store_new (N_DEF_STOCK_COLUMNS
, G_TYPE_STRING
);
915 gtk_tree_view_set_model (clist
, GTK_TREE_MODEL(store
));
917 /* Add defines columns */
918 renderer
= gtk_cell_renderer_text_new ();
919 column
= gtk_tree_view_column_new_with_attributes (_("Stock Defines"),
924 gtk_tree_view_append_column (clist
, column
);
925 populate_stock_defs (store
);
926 g_object_unref (G_OBJECT(store
));
928 /* Add "warnings" model */
929 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.warnings_clist
);
930 store
= gtk_list_store_new (N_WARNINGS_COLUMNS
, G_TYPE_BOOLEAN
,
931 G_TYPE_STRING
, G_TYPE_STRING
);
932 gtk_tree_view_set_model (clist
, GTK_TREE_MODEL(store
));
934 /* Add "warnings" columns */
935 renderer
= gtk_cell_renderer_toggle_new ();
936 column
= gtk_tree_view_column_new_with_attributes ("", renderer
,
938 WARNINGS_TOGGLE_COLUMN
,
940 gtk_tree_view_append_column (clist
, column
);
941 renderer
= gtk_cell_renderer_text_new ();
942 column
= gtk_tree_view_column_new_with_attributes (_("Warning"),
947 gtk_tree_view_append_column (clist
, column
);
948 renderer
= gtk_cell_renderer_text_new ();
949 column
= gtk_tree_view_column_new_with_attributes (_("Description"),
954 gtk_tree_view_append_column (clist
, column
);
955 populate_warnings (store
);
956 g_object_unref (G_OBJECT(store
));
958 /* Connect window signals */
959 g_signal_connect (G_OBJECT (co
->priv
->widgets
.window
), "delete_event",
960 G_CALLBACK (on_compt_delete_event
), co
);
961 g_signal_connect (G_OBJECT (co
->priv
->widgets
.window
), "response",
962 G_CALLBACK (on_compt_response
), co
);
964 /* Connect toggle signals */
965 g_signal_connect (G_OBJECT (co
->priv
->widgets
.supp_clist
), "row_activated",
966 G_CALLBACK (on_toggle_clist_row_activated
),
967 toggle_signal_info_new(co
,SUPP_TOGGLE_COLUMN
));
968 g_signal_connect (G_OBJECT (co
->priv
->widgets
.lib_clist
), "row_activated",
969 G_CALLBACK (on_toggle_clist_row_activated
),
970 toggle_signal_info_new(co
,LIB_TOGGLE_COLUMN
));
971 g_signal_connect (G_OBJECT (co
->priv
->widgets
.def_clist
), "row_activated",
972 G_CALLBACK (on_toggle_clist_row_activated
),
973 toggle_signal_info_new(co
,DEF_TOGGLE_COLUMN
));
974 g_signal_connect (G_OBJECT (co
->priv
->widgets
.warnings_clist
), "row_activated",
975 G_CALLBACK (on_toggle_clist_row_activated
),
976 toggle_signal_info_new(co
,WARNINGS_TOGGLE_COLUMN
));
978 /* Connect Entry update signals */
979 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.inc_clist
);
980 selection
= gtk_tree_view_get_selection (clist
);
981 g_signal_connect (G_OBJECT (selection
), "changed",
982 G_CALLBACK (on_update_selection_changed
),
983 entry_signal_info_new (co
,
984 co
->priv
->widgets
.inc_clist
,
985 co
->priv
->widgets
.inc_entry
,
987 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.lib_clist
);
988 selection
= gtk_tree_view_get_selection (clist
);
989 g_signal_connect (G_OBJECT (selection
), "changed",
990 G_CALLBACK (on_update_selection_changed
),
991 entry_signal_info_new (co
, co
->priv
->widgets
.lib_clist
,
992 co
->priv
->widgets
.lib_entry
,
994 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.lib_stock_clist
);
995 selection
= gtk_tree_view_get_selection (clist
);
996 g_signal_connect (G_OBJECT (selection
), "changed",
997 G_CALLBACK (on_update_selection_changed
),
998 entry_signal_info_new (co
, co
->priv
->widgets
.lib_stock_clist
,
999 co
->priv
->widgets
.lib_entry
,
1001 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.lib_paths_clist
);
1002 selection
= gtk_tree_view_get_selection (clist
);
1003 g_signal_connect (G_OBJECT (selection
), "changed",
1004 G_CALLBACK (on_update_selection_changed
),
1005 entry_signal_info_new (co
, co
->priv
->widgets
.lib_paths_clist
,
1006 co
->priv
->widgets
.lib_paths_entry
,
1008 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.def_clist
);
1009 selection
= gtk_tree_view_get_selection (clist
);
1010 g_signal_connect (G_OBJECT (selection
), "changed",
1011 G_CALLBACK (on_update_selection_changed
),
1012 entry_signal_info_new (co
, co
->priv
->widgets
.def_clist
,
1013 co
->priv
->widgets
.def_entry
,
1014 DEF_DEFINE_COLUMN
));
1015 clist
= GTK_TREE_VIEW (co
->priv
->widgets
.def_stock_clist
);
1016 selection
= gtk_tree_view_get_selection (clist
);
1017 g_signal_connect (G_OBJECT (selection
), "changed",
1018 G_CALLBACK (on_update_selection_changed
),
1019 entry_signal_info_new (co
, co
->priv
->widgets
.def_stock_clist
,
1020 co
->priv
->widgets
.def_entry
,
1023 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_c_flags_entry
), "changed",
1024 G_CALLBACK (on_entry_changed
), co
);
1026 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_l_flags_entry
), "changed",
1027 G_CALLBACK (on_entry_changed
), co
);
1029 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_l_libs_entry
), "changed",
1030 G_CALLBACK (on_entry_changed
), co
);
1032 /* optimization buttons */
1033 for (i
= 0 ; i
< 4 ; i
++)
1034 g_signal_connect (GTK_TOGGLE_BUTTON (co
->priv
->widgets
.optimize_button
[i
]),
1035 "toggled", G_CALLBACK (on_button_selection_changed
),co
);
1037 /* debug and profile */
1038 for (i
= 0 ; i
< 2 ; i
++)
1039 g_signal_connect (GTK_TOGGLE_BUTTON (co
->priv
->widgets
.other_button
[i
]),
1040 "toggled", G_CALLBACK (on_button_selection_changed
),co
);
1042 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_c_flags_entry
), "changed",
1043 G_CALLBACK (on_entry_changed
), co
);
1045 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_l_flags_entry
), "changed",
1046 G_CALLBACK (on_entry_changed
), co
);
1048 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_l_libs_entry
), "changed",
1049 G_CALLBACK (on_entry_changed
), co
);
1051 /* optimization buttons */
1052 for (i
= 0 ; i
< 4 ; i
++)
1053 g_signal_connect (GTK_TOGGLE_BUTTON (co
->priv
->widgets
.optimize_button
[i
]),
1054 "toggled", G_CALLBACK (on_button_selection_changed
),co
);
1056 /* debug and profile */
1057 for (i
= 0 ; i
< 2 ; i
++)
1058 g_signal_connect (GTK_TOGGLE_BUTTON (co
->priv
->widgets
.other_button
[i
]),
1059 "toggled", G_CALLBACK (on_button_selection_changed
),co
);
1061 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_c_flags_entry
), "changed",
1062 G_CALLBACK (on_entry_changed
), co
);
1064 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_l_flags_entry
), "changed",
1065 G_CALLBACK (on_entry_changed
), co
);
1067 g_signal_connect (G_OBJECT (co
->priv
->widgets
.other_l_libs_entry
), "changed",
1068 G_CALLBACK (on_entry_changed
), co
);
1070 /* optimization buttons */
1071 for (i
= 0 ; i
< 4 ; i
++)
1072 g_signal_connect (GTK_TOGGLE_BUTTON (co
->priv
->widgets
.optimize_button
[i
]),
1073 "toggled", G_CALLBACK (on_button_selection_changed
),co
);
1075 /* debug and profile */
1076 for (i
= 0 ; i
< 2 ; i
++)
1077 g_signal_connect (GTK_TOGGLE_BUTTON (co
->priv
->widgets
.other_button
[i
]),
1078 "toggled", G_CALLBACK (on_button_selection_changed
),co
);
1080 /* Connect editiong button signals */
1081 button
= glade_xml_get_widget (co
->priv
->gxml
, "inc_add_b");
1082 BUTTON_SIGNAL_CONNECT (button
, on_add_to_clist_clicked
,
1083 entry_signal_info_new (co
, co
->priv
->widgets
.inc_clist
,
1084 co
->priv
->widgets
.inc_entry
,
1086 button
= glade_xml_get_widget (co
->priv
->gxml
, "inc_update_b");
1087 BUTTON_SIGNAL_CONNECT (button
, on_update_in_clist_clicked
,
1088 entry_signal_info_new (co
, co
->priv
->widgets
.inc_clist
,
1089 co
->priv
->widgets
.inc_entry
,
1091 button
= glade_xml_get_widget (co
->priv
->gxml
, "inc_remove_b");
1092 BUTTON_SIGNAL_CONNECT (button
, on_remove_from_clist_clicked
,
1093 entry_signal_info_new (co
, co
->priv
->widgets
.inc_clist
,
1094 co
->priv
->widgets
.inc_entry
,
1096 button
= glade_xml_get_widget (co
->priv
->gxml
, "inc_clear_b");
1097 BUTTON_SIGNAL_CONNECT (button
, on_clear_clist_clicked
,
1098 entry_signal_info_new (co
, co
->priv
->widgets
.inc_clist
,
1099 co
->priv
->widgets
.inc_entry
,
1102 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_add_b");
1103 BUTTON_SIGNAL_CONNECT (button
, on_add_to_clist_clicked
,
1104 entry_signal_info_new (co
, co
->priv
->widgets
.lib_clist
,
1105 co
->priv
->widgets
.lib_entry
,
1107 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_update_b");
1108 BUTTON_SIGNAL_CONNECT (button
, on_update_in_clist_clicked
,
1109 entry_signal_info_new (co
, co
->priv
->widgets
.lib_clist
,
1110 co
->priv
->widgets
.lib_entry
,
1112 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_remove_b");
1113 BUTTON_SIGNAL_CONNECT (button
, on_remove_from_clist_clicked
,
1114 entry_signal_info_new (co
, co
->priv
->widgets
.lib_clist
,
1115 co
->priv
->widgets
.lib_entry
,
1117 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_clear_b");
1118 BUTTON_SIGNAL_CONNECT (button
, on_clear_clist_clicked
,
1119 entry_signal_info_new (co
, co
->priv
->widgets
.lib_clist
,
1120 co
->priv
->widgets
.lib_entry
,
1123 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_paths_add_b");
1124 BUTTON_SIGNAL_CONNECT (button
, on_add_to_clist_clicked
,
1125 entry_signal_info_new (co
, co
->priv
->widgets
.lib_paths_clist
,
1126 co
->priv
->widgets
.lib_paths_entry
,
1128 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_paths_update_b");
1129 BUTTON_SIGNAL_CONNECT (button
, on_update_in_clist_clicked
,
1130 entry_signal_info_new (co
, co
->priv
->widgets
.lib_paths_clist
,
1131 co
->priv
->widgets
.lib_paths_entry
,
1133 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_paths_remove_b");
1134 BUTTON_SIGNAL_CONNECT (button
, on_remove_from_clist_clicked
,
1135 entry_signal_info_new (co
, co
->priv
->widgets
.lib_paths_clist
,
1136 co
->priv
->widgets
.lib_paths_entry
,
1138 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_paths_clear_b");
1139 BUTTON_SIGNAL_CONNECT (button
, on_clear_clist_clicked
,
1140 entry_signal_info_new (co
, co
->priv
->widgets
.lib_paths_clist
,
1141 co
->priv
->widgets
.lib_paths_entry
,
1144 button
= glade_xml_get_widget (co
->priv
->gxml
, "def_add_b");
1145 BUTTON_SIGNAL_CONNECT (button
, on_add_to_clist_clicked
,
1146 entry_signal_info_new (co
, co
->priv
->widgets
.def_clist
,
1147 co
->priv
->widgets
.def_entry
,
1148 DEF_DEFINE_COLUMN
));
1149 button
= glade_xml_get_widget (co
->priv
->gxml
, "def_update_b");
1150 BUTTON_SIGNAL_CONNECT (button
, on_update_in_clist_clicked
,
1151 entry_signal_info_new (co
, co
->priv
->widgets
.def_clist
,
1152 co
->priv
->widgets
.def_entry
,
1153 DEF_DEFINE_COLUMN
));
1154 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_paths_remove_b");
1155 BUTTON_SIGNAL_CONNECT (button
, on_remove_from_clist_clicked
,
1156 entry_signal_info_new (co
, co
->priv
->widgets
.def_clist
,
1157 co
->priv
->widgets
.def_entry
,
1158 DEF_DEFINE_COLUMN
));
1159 button
= glade_xml_get_widget (co
->priv
->gxml
, "lib_paths_clear_b");
1160 BUTTON_SIGNAL_CONNECT (button
, on_clear_clist_clicked
,
1161 entry_signal_info_new (co
, co
->priv
->widgets
.def_clist
,
1162 co
->priv
->widgets
.def_entry
,
1163 DEF_DEFINE_COLUMN
));
1164 gtk_widget_ref (co
->priv
->widgets
.window
);
1165 gtk_widget_ref (co
->priv
->widgets
.warnings_clist
);
1166 for (i
= 0; i
< 4; i
++)
1167 gtk_widget_ref (co
->priv
->widgets
.optimize_button
[i
]);
1168 for (i
= 0; i
< 2; i
++)
1169 gtk_widget_ref (co
->priv
->widgets
.other_button
[i
]);
1171 gtk_widget_ref (co
->priv
->widgets
.inc_clist
);
1172 gtk_widget_ref (co
->priv
->widgets
.inc_entry
);
1173 gtk_widget_ref (co
->priv
->widgets
.lib_paths_clist
);
1174 gtk_widget_ref (co
->priv
->widgets
.lib_paths_entry
);
1175 gtk_widget_ref (co
->priv
->widgets
.lib_clist
);
1176 gtk_widget_ref (co
->priv
->widgets
.lib_stock_clist
);
1177 gtk_widget_ref (co
->priv
->widgets
.lib_entry
);
1178 gtk_widget_ref (co
->priv
->widgets
.def_clist
);
1179 gtk_widget_ref (co
->priv
->widgets
.def_stock_clist
);
1180 gtk_widget_ref (co
->priv
->widgets
.def_entry
);
1181 gtk_widget_ref (co
->priv
->widgets
.other_c_flags_entry
);
1182 gtk_widget_ref (co
->priv
->widgets
.other_l_flags_entry
);
1183 gtk_widget_ref (co
->priv
->widgets
.other_l_libs_entry
);
1184 gtk_widget_ref (co
->priv
->widgets
.supp_clist
);
1188 compiler_options_new (PropsID props
)
1190 CompilerOptions
*co
= g_new0 (CompilerOptions
, 1);
1192 co
->priv
= g_new0 (CompilerOptionsPriv
, 1);
1193 co
->priv
->is_showing
= FALSE
;
1194 co
->priv
->win_pos_x
= 100;
1195 co
->priv
->win_pos_y
= 100;
1196 co
->priv
->props
= props
;
1197 create_compiler_options_gui (co
);
1198 co
->priv
->dirty
= FALSE
;
1204 compiler_options_destroy (CompilerOptions
* co
)
1207 g_return_if_fail (co
);
1209 gtk_widget_unref (co
->priv
->widgets
.window
);
1210 gtk_widget_unref (co
->priv
->widgets
.warnings_clist
);
1211 for (i
= 0; i
< 4; i
++)
1212 gtk_widget_unref (co
->priv
->widgets
.optimize_button
[i
]);
1213 for (i
= 0; i
< 2; i
++)
1214 gtk_widget_unref (co
->priv
->widgets
.other_button
[i
]);
1216 gtk_widget_unref (co
->priv
->widgets
.inc_clist
);
1217 gtk_widget_unref (co
->priv
->widgets
.inc_entry
);
1218 gtk_widget_unref (co
->priv
->widgets
.lib_paths_clist
);
1219 gtk_widget_unref (co
->priv
->widgets
.lib_paths_entry
);
1220 gtk_widget_unref (co
->priv
->widgets
.lib_clist
);
1221 gtk_widget_unref (co
->priv
->widgets
.lib_stock_clist
);
1222 gtk_widget_unref (co
->priv
->widgets
.lib_entry
);
1223 gtk_widget_unref (co
->priv
->widgets
.def_clist
);
1224 gtk_widget_unref (co
->priv
->widgets
.def_stock_clist
);
1225 gtk_widget_unref (co
->priv
->widgets
.def_entry
);
1226 gtk_widget_unref (co
->priv
->widgets
.other_c_flags_entry
);
1227 gtk_widget_unref (co
->priv
->widgets
.other_l_flags_entry
);
1228 gtk_widget_unref (co
->priv
->widgets
.other_l_libs_entry
);
1229 gtk_widget_unref (co
->priv
->widgets
.supp_clist
);
1231 if (co
->priv
->widgets
.window
)
1232 gtk_widget_destroy (co
->priv
->widgets
.window
);
1233 g_object_unref (co
->priv
->gxml
);
1239 gboolean
compiler_options_save_yourself (CompilerOptions
* co
, FILE * stream
)
1241 if (stream
== NULL
|| co
== NULL
)
1243 fprintf (stream
, "compiler.options.win.pos.x=%d\n", co
->priv
->win_pos_x
);
1244 fprintf (stream
, "compiler.options.win.pos.y=%d\n", co
->priv
->win_pos_y
);
1248 gint
compiler_options_save (CompilerOptions
* co
, FILE * s
)
1253 GtkTreeModel
*model
;
1256 g_return_val_if_fail (co
!= NULL
, FALSE
);
1257 g_return_val_if_fail (s
!= NULL
, FALSE
);
1259 /* Save support list */
1261 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.supp_clist
));
1262 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1263 fprintf (s
, "compiler.options.supports=");
1268 gtk_tree_model_get (model
, &iter
, SUPP_TOGGLE_COLUMN
, &state
,
1269 SUPP_NAME_COLUMN
, &name
, -1);
1272 if (fprintf (s
, "%s ", name
) <1)
1275 valid
= gtk_tree_model_iter_next (model
, &iter
);
1279 /* Save include paths list */
1281 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.inc_clist
));
1282 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1283 fprintf (s
, "compiler.options.include.paths=");
1287 gtk_tree_model_get (model
, &iter
, INC_PATHS_COLUMN
, &path
, -1);
1288 if (fprintf (s
, "\\\n\t%s", path
) <1)
1290 valid
= gtk_tree_model_iter_next (model
, &iter
);
1294 /* Save library paths list */
1296 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.lib_paths_clist
));
1297 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1298 fprintf (s
, "compiler.options.library.paths=");
1302 gtk_tree_model_get (model
, &iter
, LIB_PATHS_COLUMN
, &path
, -1);
1303 if (fprintf (s
, "\\\n\t%s", path
) <1)
1305 valid
= gtk_tree_model_iter_next (model
, &iter
);
1309 /* Save libraries list */
1311 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.lib_clist
));
1312 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1313 fprintf (s
, "compiler.options.libraries=");
1317 gtk_tree_model_get (model
, &iter
, LIB_COLUMN
, &name
, -1);
1318 if (fprintf (s
, "\\\n\t%s", name
) <1)
1320 valid
= gtk_tree_model_iter_next (model
, &iter
);
1325 /* Save selected libraries list */
1327 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.lib_clist
));
1328 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1329 fprintf (s
, "compiler.options.libraries.selected=");
1333 gtk_tree_model_get (model
, &iter
, LIB_TOGGLE_COLUMN
, &state
, -1);
1334 if (fprintf (s
, "%d ", state
) <1)
1336 valid
= gtk_tree_model_iter_next (model
, &iter
);
1340 /* Save defines list */
1342 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.def_clist
));
1343 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1344 fprintf (s
, "compiler.options.defines=");
1348 gtk_tree_model_get (model
, &iter
, DEF_DEFINE_COLUMN
, &name
, -1);
1349 if (fprintf (s
, "\\\n\t%s", name
) <1)
1351 valid
= gtk_tree_model_iter_next (model
, &iter
);
1356 /* Save selected defines list */
1358 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.lib_clist
));
1359 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1360 fprintf (s
, "compiler.options.defines.selected=");
1364 gtk_tree_model_get (model
, &iter
, DEF_TOGGLE_COLUMN
, &state
, -1);
1365 if (fprintf (s
, "%d ", state
) <1)
1367 valid
= gtk_tree_model_iter_next (model
, &iter
);
1372 /* Save warnings list */
1374 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.warnings_clist
));
1375 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1376 fprintf (s
, "compiler.options.warning.buttons=");
1380 gtk_tree_model_get (model
, &iter
, WARNINGS_TOGGLE_COLUMN
, &state
, -1);
1381 if (fprintf (s
, "%d ", state
) <1)
1383 valid
= gtk_tree_model_iter_next (model
, &iter
);
1387 fprintf (s
, "compiler.options.optimize.buttons=");
1388 for (i
= 0; i
< 4; i
++)
1391 state
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(co
->priv
->
1392 widgets
.optimize_button
[i
]));
1393 fprintf (s
, "%d ", (int) state
);
1397 fprintf (s
, "compiler.options.other.buttons=");
1398 for (i
= 0; i
< 2; i
++)
1401 state
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(co
->priv
->
1402 widgets
.other_button
[i
]));
1403 fprintf (s
, "%d ", (int) state
);
1407 text
= gtk_entry_get_text (GTK_ENTRY (co
->priv
->widgets
.other_c_flags_entry
));
1408 fprintf (s
, "compiler.options.other.c.flags=%s\n", text
);
1410 text
= gtk_entry_get_text (GTK_ENTRY (co
->priv
->widgets
.other_l_flags_entry
));
1411 fprintf (s
, "compiler.options.other.l.flags=%s\n", text
);
1413 text
= gtk_entry_get_text (GTK_ENTRY (co
->priv
->widgets
.other_l_libs_entry
));
1414 fprintf (s
, "compiler.options.other.l.libs=%s\n", text
);
1420 gboolean
compiler_options_load_yourself (CompilerOptions
* co
, PropsID props
)
1424 co
->priv
->win_pos_x
=
1425 prop_get_int (props
, "compiler.options.win.pos.x", 100);
1426 co
->priv
->win_pos_y
=
1427 prop_get_int (props
, "compiler.options.win.pos.y", 100);
1431 #define CLIST_CLEAR_ALL(widget) \
1432 model = gtk_tree_view_get_model (GTK_TREE_VIEW(widget)); \
1434 if (model) gtk_list_store_clear (GTK_LIST_STORE (model));
1436 #define CLIST_APPEND_STRING_ALL(property, widget, col) \
1437 list = glist_from_data (props, property); \
1438 model = gtk_tree_view_get_model (GTK_TREE_VIEW(widget)); \
1443 gtk_list_store_append (GTK_LIST_STORE(model), &iter); \
1444 gtk_list_store_set (GTK_LIST_STORE(model), \
1445 &iter, col, node->data, -1); \
1446 node = g_list_next (node); \
1448 glist_strings_free (list);
1450 #define CLIST_UPDATE_BOOLEAN_ALL(property, widget, col) \
1451 list = glist_from_data (props, property); \
1452 model = gtk_tree_view_get_model (GTK_TREE_VIEW(widget)); \
1454 valid = gtk_tree_model_get_iter_first (model, &iter); \
1456 while (node && valid) \
1458 int value = atoi(node->data); \
1459 gtk_list_store_set (GTK_LIST_STORE(model), &iter, col, value, -1); \
1460 node = g_list_next (node); \
1461 valid = gtk_tree_model_iter_next (model, &iter); \
1463 glist_strings_free (list);
1467 compiler_options_clear(CompilerOptions
*co
)
1470 GtkTreeModel
* model
;
1474 g_return_if_fail (co
!= NULL
);
1476 gtk_widget_set_sensitive (co
->priv
->widgets
.supp_clist
, TRUE
);
1478 model
= gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.supp_clist
));
1481 /* Clear all supports */
1482 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1485 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
1486 SUPP_TOGGLE_COLUMN
, FALSE
, -1);
1487 valid
= gtk_tree_model_iter_next (model
, &iter
);
1490 CLIST_CLEAR_ALL(co
->priv
->widgets
.inc_clist
);
1491 CLIST_CLEAR_ALL(co
->priv
->widgets
.lib_paths_clist
);
1492 CLIST_CLEAR_ALL(co
->priv
->widgets
.lib_clist
);
1493 CLIST_CLEAR_ALL(co
->priv
->widgets
.def_clist
);
1495 gtk_entry_set_text (GTK_ENTRY (co
->priv
->widgets
.inc_entry
), "");
1496 gtk_entry_set_text (GTK_ENTRY (co
->priv
->widgets
.lib_paths_entry
), "");
1497 gtk_entry_set_text (GTK_ENTRY (co
->priv
->widgets
.lib_entry
), "");
1498 gtk_entry_set_text (GTK_ENTRY (co
->priv
->widgets
.def_entry
), "");
1500 for (i
= 0; i
< 4; i
++)
1501 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(co
->priv
->widgets
.optimize_button
[i
]), FALSE
);
1502 for (i
= 0; i
< 2; i
++)
1503 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(co
->priv
->widgets
.other_button
[i
]), FALSE
);
1505 model
= gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.warnings_clist
));
1507 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1510 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
, 0, FALSE
, -1);
1511 valid
= gtk_tree_model_iter_next (model
, &iter
);
1514 gtk_entry_set_text (GTK_ENTRY(co
->priv
->widgets
.other_c_flags_entry
), "");
1515 gtk_entry_set_text (GTK_ENTRY(co
->priv
->widgets
.other_l_flags_entry
), "");
1516 gtk_entry_set_text (GTK_ENTRY(co
->priv
->widgets
.other_l_libs_entry
), "");
1517 compiler_options_set_in_properties(co
, co
->priv
->props
);
1520 #define ASSIGN_PROPERTY_VALUE_TO_ENTRY(props, key, entry) \
1522 gchar *str = prop_get ((props), (key)); \
1524 gtk_entry_set_text (GTK_ENTRY((entry)), str); \
1527 gtk_entry_set_text (GTK_ENTRY((entry)), ""); \
1532 compiler_options_load (CompilerOptions
* co
, PropsID props
)
1534 GtkTreeModel
*model
;
1540 g_return_if_fail (co
!= NULL
);
1542 compiler_options_clear (co
);
1544 /* Read all available supports for the project */
1545 list
= glist_from_data (props
, "compiler.options.supports");
1553 clist
= GTK_TREE_VIEW(co
->priv
->widgets
.supp_clist
);
1554 model
= gtk_tree_view_get_model (clist
);
1556 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1560 gtk_tree_model_get (model
, &iter
, SUPP_NAME_COLUMN
, &name
, -1);
1561 if (strcasecmp (name
, node
->data
)==0)
1563 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
1564 SUPP_TOGGLE_COLUMN
, TRUE
, -1);
1567 valid
= gtk_tree_model_iter_next (model
, &iter
);
1570 node
= g_list_next (node
);
1572 glist_strings_free (list
);
1574 /* For now, disable supports for projects. */
1575 if (app
->project_dbase
->project_is_open
== TRUE
)
1577 gtk_widget_set_sensitive (co
->priv
->widgets
.supp_clist
, FALSE
);
1580 CLIST_APPEND_STRING_ALL ("compiler.options.include.paths",
1581 co
->priv
->widgets
.inc_clist
, INC_PATHS_COLUMN
);
1582 CLIST_APPEND_STRING_ALL ("compiler.options.library.paths",
1583 co
->priv
->widgets
.lib_paths_clist
,
1585 CLIST_APPEND_STRING_ALL ("compiler.options.libraries",
1586 co
->priv
->widgets
.lib_clist
, LIB_COLUMN
);
1587 CLIST_UPDATE_BOOLEAN_ALL ("compiler.options.libraries.selected",
1588 co
->priv
->widgets
.lib_clist
, LIB_TOGGLE_COLUMN
);
1589 CLIST_APPEND_STRING_ALL ("compiler.options.defines",
1590 co
->priv
->widgets
.def_clist
, DEF_DEFINE_COLUMN
);
1591 CLIST_UPDATE_BOOLEAN_ALL ("compiler.options.defines.selected",
1592 co
->priv
->widgets
.def_clist
, DEF_TOGGLE_COLUMN
);
1593 CLIST_UPDATE_BOOLEAN_ALL ("compiler.options.warning.buttons",
1594 co
->priv
->widgets
.warnings_clist
,
1595 WARNINGS_TOGGLE_COLUMN
);
1597 list
= glist_from_data (props
, "compiler.options.optimize.buttons");
1602 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(co
->priv
->
1603 widgets
.optimize_button
[i
]),
1605 node
= g_list_next (node
);
1608 glist_strings_free (list
);
1610 list
= glist_from_data (props
, "compiler.options.other.buttons");
1614 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(co
->priv
->
1615 widgets
.other_button
[i
]),
1617 node
= g_list_next (node
);
1620 glist_strings_free (list
);
1622 ASSIGN_PROPERTY_VALUE_TO_ENTRY(props
, "compiler.options.other.c.flags",
1623 co
->priv
->widgets
.other_c_flags_entry
);
1624 ASSIGN_PROPERTY_VALUE_TO_ENTRY(props
, "compiler.options.other.l.flags",
1625 co
->priv
->widgets
.other_l_flags_entry
);
1626 ASSIGN_PROPERTY_VALUE_TO_ENTRY(props
, "compiler.options.other.l.libs",
1627 co
->priv
->widgets
.other_l_libs_entry
);
1629 compiler_options_set_in_properties (co
, co
->priv
->props
);
1631 compiler_options_set_dirty_flag (co
, FALSE
);
1635 compiler_options_show (CompilerOptions
* co
)
1637 if (co
->priv
->is_showing
)
1639 gdk_window_raise (co
->priv
->widgets
.window
->window
);
1642 gtk_widget_set_uposition (co
->priv
->widgets
.window
, co
->priv
->win_pos_x
,
1643 co
->priv
->win_pos_y
);
1644 gtk_widget_show (co
->priv
->widgets
.window
);
1645 co
->priv
->is_showing
= TRUE
;
1649 compiler_options_hide (CompilerOptions
* co
)
1653 if (co
->priv
->is_showing
== FALSE
)
1655 gdk_window_get_root_origin (co
->priv
->widgets
.window
->window
,
1656 &co
->priv
->win_pos_x
, &co
->priv
->win_pos_y
);
1657 gtk_widget_hide (co
->priv
->widgets
.window
);
1658 co
->priv
->is_showing
= FALSE
;
1661 #define GET_ALL_STRING_DATA(widget, str, separator, col) \
1663 GtkTreeModel *model; \
1667 model = gtk_tree_view_get_model (GTK_TREE_VIEW(widget)); \
1669 valid = gtk_tree_model_get_iter_first(model, &iter); \
1673 gtk_tree_model_get (model, &iter, col, &text, -1); \
1674 tmp = g_strconcat (str, separator, text, NULL); \
1677 valid = gtk_tree_model_iter_next (model, &iter); \
1682 get_supports (CompilerOptions
*co
, gint item
, gchar
*separator
)
1684 GtkTreeModel
*model
;
1690 gboolean has_pkg_modules
= FALSE
;
1692 str
= g_strdup ("");
1693 pkg_modules
= g_strdup ("");
1696 gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.supp_clist
));
1698 valid
= gtk_tree_model_get_iter_first(model
, &iter
);
1702 gboolean value
, pkgconfig
;
1703 gchar
*text
, *tmp
, *name
;
1705 gtk_tree_model_get (model
, &iter
,
1706 SUPP_TOGGLE_COLUMN
, &value
,
1707 SUPP_PKGCONFIG_COLUMN
, &pkgconfig
,
1708 SUPP_NAME_COLUMN
, &name
, -1);
1709 valid
= gtk_tree_model_iter_next (model
, &iter
);
1717 text
= anjuta_supports
[i
][item
];
1718 tmp
= g_strconcat (str
, text
, separator
, NULL
);
1724 has_pkg_modules
= TRUE
;
1726 pkg_modules
= g_strconcat (tmp
, " ", name
, NULL
);
1733 if (has_pkg_modules
)
1739 case ANJUTA_SUPPORT_FILE_CFLAGS
:
1740 text
= g_strconcat ("`pkg-config --cflags", pkg_modules
, "`", NULL
);
1742 case ANJUTA_SUPPORT_FILE_LIBS
:
1743 text
= g_strconcat ("`pkg-config --libs", pkg_modules
, "`", NULL
);
1745 case ANJUTA_SUPPORT_PRJ_CFLAGS
:
1746 text
= g_strconcat ("`pkg-config --cflags", pkg_modules
, "`", NULL
);
1748 case ANJUTA_SUPPORT_PRJ_LIBS
:
1749 text
= g_strconcat ("`pkg-config --libs", pkg_modules
, "`", NULL
);
1751 case ANJUTA_SUPPORT_MACROS
:
1752 text
= g_strdup (""); //FIXME.
1756 str
= g_strconcat (tmp
, " ", text
, NULL
);
1760 g_free (pkg_modules
);
1765 get_include_paths (CompilerOptions
* co
, gboolean with_support
)
1769 str
= g_strdup ("");
1770 GET_ALL_STRING_DATA (co
->priv
->widgets
.inc_clist
,
1771 str
, " -I", INC_PATHS_COLUMN
);
1775 gchar
*supports
= get_supports (co
, ANJUTA_SUPPORT_FILE_CFLAGS
, " ");
1776 gchar
*tmp
= g_strconcat (str
, supports
, NULL
);
1785 get_library_paths (CompilerOptions
* co
)
1789 str
= g_strdup ("");
1790 GET_ALL_STRING_DATA (co
->priv
->widgets
.lib_paths_clist
, str
,
1791 " -L", LIB_PATHS_COLUMN
);
1796 get_libraries (CompilerOptions
* co
, gboolean with_support
)
1798 GtkTreeModel
*model
;
1804 str
= g_strdup ("");
1805 model
= gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->widgets
.lib_clist
));
1807 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1812 gtk_tree_model_get (model
, &iter
, LIB_TOGGLE_COLUMN
,
1813 &value
, LIB_COLUMN
, &text
, -1);
1814 valid
= gtk_tree_model_iter_next (model
, &iter
);
1818 /* If it starts with '*' then consider it as an object file
1819 * and not a lib file
1822 /* Remove the '*' and put the rest */
1823 tmp
= g_strconcat (str
, " ", &text
[1], NULL
);
1825 tmp
= g_strconcat (str
, " -l", text
, NULL
);
1831 gchar
*supports
= get_supports (co
, ANJUTA_SUPPORT_FILE_LIBS
, " ");
1832 gchar
*tmp
= g_strconcat (str
, supports
, NULL
);
1841 get_defines (CompilerOptions
* co
)
1844 str
= g_strdup ("");
1845 GET_ALL_STRING_DATA (co
->priv
->widgets
.def_clist
, str
,
1846 " -D", DEF_DEFINE_COLUMN
);
1851 get_warnings(CompilerOptions
*co
)
1853 GtkTreeModel
*model
;
1859 str
= g_strdup ("");
1860 model
= gtk_tree_view_get_model (GTK_TREE_VIEW(co
->priv
->
1861 widgets
.warnings_clist
));
1863 valid
= gtk_tree_model_get_iter_first (model
, &iter
);
1868 gtk_tree_model_get (model
, &iter
, WARNINGS_TOGGLE_COLUMN
,
1870 valid
= gtk_tree_model_iter_next (model
, &iter
);
1877 str
= g_strconcat (tmp
, anjuta_warnings
[i
], NULL
);
1885 get_optimization (CompilerOptions
*co
)
1890 str
= g_strdup ("");
1891 for (i
= 0; i
< 4; i
++)
1897 b
= GTK_TOGGLE_BUTTON (co
->priv
->widgets
.optimize_button
[i
]);
1898 state
= gtk_toggle_button_get_active (b
);
1902 str
= g_strconcat (tmp
, optimize_button_option
[i
], NULL
);
1910 get_others (CompilerOptions
*co
)
1915 str
= g_strdup ("");
1916 for (i
= 0; i
< 2; i
++)
1922 b
= GTK_TOGGLE_BUTTON (co
->priv
->widgets
.other_button
[i
]);
1923 state
= gtk_toggle_button_get_active (b
);
1927 str
= g_strconcat (tmp
, other_button_option
[i
], NULL
);
1935 compiler_options_set_in_properties (CompilerOptions
* co
, PropsID props
)
1939 buff
= get_include_paths (co
, TRUE
);
1940 prop_set_with_key (props
, "anjuta.compiler.includes", buff
);
1943 buff
= get_library_paths (co
);
1944 prop_set_with_key (props
, "anjuta.linker.library.paths", buff
);
1947 buff
= get_libraries (co
, TRUE
);
1948 prop_set_with_key (props
, "anjuta.linker.libraries", buff
);
1951 buff
= get_defines (co
);
1952 prop_set_with_key (props
, "anjuta.compiler.defines", buff
);
1955 buff
= get_warnings(co
);
1956 prop_set_with_key (props
, "anjuta.compiler.warning.flags", buff
);
1960 buff
= get_optimization(co
);
1961 prop_set_with_key (props
, "anjuta.compiler.optimization.flags", buff
);
1964 buff
= get_others(co
);
1965 prop_set_with_key (props
, "anjuta.compiler.other.flags", buff
);
1968 prop_set_with_key (props
, "anjuta.compiler.additional.flags",
1969 gtk_entry_get_text (GTK_ENTRY (co
->priv
->widgets
.other_c_flags_entry
)));
1970 prop_set_with_key (props
, "anjuta.linker.additional.flags",
1971 gtk_entry_get_text (GTK_ENTRY (co
->priv
->widgets
.other_l_flags_entry
)));
1972 prop_set_with_key (props
, "anjuta.linker.additional.libs",
1973 gtk_entry_get_text (GTK_ENTRY (co
->priv
->widgets
.other_l_libs_entry
)));
1975 prop_set_with_key (props
, "anjuta.compiler.flags",
1976 "$(anjuta.compiler.includes) $(anjuta.compiler.defines) "
1977 "$(anjuta.compiler.warning.flags) "
1978 "$(anjuta.compiler.optimization.flags) "
1979 "$(anjuta.compiler.other.flags) "
1980 "$(anjuta.compiler.additional.flags)");
1982 prop_set_with_key (props
, "anjuta.linker.flags",
1983 "$(anjuta.linker.library.paths) $(anjuta.linker.libraries) "
1984 "$(anjuta.linker.additional.flags) $(anjuta.linker.additional.libs)");
1987 #define PRINT_TO_STREAM(stream, format, buff) \
1990 if (strlen (buff)) \
1992 fprintf (fp, "\\\n\t%s", buff); \
1996 #define PRINT_TO_STREAM_AND_FREE(stream, format, buff) \
1999 if (strlen (buff)) \
2001 fprintf (fp, "\\\n\t%s", buff); \
2007 compiler_options_set_prjincl_in_file (CompilerOptions
* co
, FILE* fp
)
2010 buff
= get_include_paths (co
, FALSE
);
2011 PRINT_TO_STREAM_AND_FREE(fp
, "\\\n\t%s", buff
);
2015 compiler_options_set_prjcflags_in_file (CompilerOptions
* co
, FILE* fp
)
2019 buff = get_supports (co, ANJUTA_SUPPORT_PRJ_CFLAGS, " ");
2020 PRINT_TO_STREAM_AND_FREE (fp, "\\\n\t%s", buff);
2022 buff
= get_defines (co
);
2023 PRINT_TO_STREAM_AND_FREE (fp
, "\\\n\t%s", buff
);
2025 buff
= (gchar
*)gtk_entry_get_text (GTK_ENTRY(co
->priv
->widgets
.other_c_flags_entry
));
2026 PRINT_TO_STREAM (fp
, "\\\n\t%s", buff
);
2028 buff
= get_warnings(co
);
2029 PRINT_TO_STREAM_AND_FREE(fp
, "\\\n\t%s", buff
);
2031 buff
= get_optimization(co
);
2032 PRINT_TO_STREAM_AND_FREE(fp
, "\\\n\t%s", buff
);
2034 buff
= get_others(co
);
2035 PRINT_TO_STREAM_AND_FREE(fp
, "\\\n\t%s", buff
);
2039 compiler_options_set_prjlibs_in_file (CompilerOptions
* co
, FILE* fp
)
2043 buff
= get_libraries (co
, FALSE
);
2044 PRINT_TO_STREAM_AND_FREE(fp
, "\\\n\t%s", buff
);
2046 buff
= (gchar
*)gtk_entry_get_text (GTK_ENTRY(co
->priv
->widgets
.other_l_libs_entry
));
2047 PRINT_TO_STREAM (fp
, "\\\n\t%s", buff
);
2051 compiler_options_set_prjlflags_in_file (CompilerOptions
* co
, FILE* fp
)
2055 buff
= (gchar
*)gtk_entry_get_text (GTK_ENTRY(co
->priv
->widgets
.other_l_flags_entry
));
2056 PRINT_TO_STREAM (fp
, "\\\n\t%s", buff
);
2058 buff
= get_library_paths (co
);
2059 PRINT_TO_STREAM_AND_FREE (fp
, "\\\n\t%s", buff
);
2062 buff = get_supports (co, ANJUTA_SUPPORT_PRJ_LIBS, " ");
2063 PRINT_TO_STREAM_AND_FREE (fp, "\\\n\t%s", buff);
2068 compiler_options_set_prjmacros_in_file (CompilerOptions
* co
, FILE* fp
)
2072 buff
= get_supports (co
, ANJUTA_SUPPORT_MACROS
, "\n");
2073 PRINT_TO_STREAM_AND_FREE (fp
, "\\\n\t%s", buff
);
2078 compiler_options_set_dirty_flag (CompilerOptions
* co
, gboolean is_dirty
)
2080 co
->priv
->dirty
= is_dirty
&& app
->project_dbase
->project_is_open
;