1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 Copyright (C) 2000 Kh. Naba Kumar Singh
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include <libanjuta/resources.h>
29 #include <libanjuta/anjuta-shell.h>
31 #include "utilities.h"
32 #include "sharedlib.h"
37 SHL_COLUMN_SHARED_OBJECT
,
45 on_sharedlibs_delete_event (GtkWidget
* w
, GdkEvent
*event
, gpointer data
)
47 Sharedlibs
* sl
= data
;
53 on_sharedlibs_key_press_event (GtkWidget
*widget
, GdkEventKey
*event
,
56 if (event
->keyval
== GDK_KEY_Escape
)
58 Sharedlibs
* sl
= data
;
67 sharedlibs_update (const GList
*lines
, gpointer data
)
70 gchar obj
[512], from
[32], to
[32], read
[32];
75 sl
= (Sharedlibs
*)data
;
77 list
= gdb_util_remove_blank_lines(lines
);
79 if(g_list_length(list
) < 2 ){g_list_free(list
); return;}
82 node
= g_list_next (node
);
85 count
= sscanf((char*)node
->data
, "~%s %s %s %s", from
,to
,read
,obj
);
86 node
= g_list_next(node
);
87 if(count
!= 4) continue;
88 gtk_list_store_append (sl
->widgets
.store
, &iter
);
89 gtk_list_store_set (sl
->widgets
.store
, &iter
,
90 SHL_COLUMN_SHARED_OBJECT
, g_path_get_basename (obj
),
91 SHL_COLUMN_FROM
, from
,
93 SHL_COLUMN_SYM_READ
, strcmp(read
, "Yes") == 0,
100 on_sharedlibs_update_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
102 Sharedlibs
*sl
= (Sharedlibs
*)user_data
;
104 dma_queue_info_sharedlib (
106 (IAnjutaDebuggerCallback
)sharedlibs_update
,
111 sharedlibs_update_controls (Sharedlibs
* sl
)
115 R
= dma_debugger_queue_get_state (sl
->debugger
) == IANJUTA_DEBUGGER_PROGRAM_STOPPED
;
117 gtk_action_group_set_sensitive (sl
->action_group
, R
);
121 on_sharedlibs_event (GtkWidget
*widget
, GdkEvent
*event
, gpointer user_data
)
123 GdkEventButton
*bevent
;
124 Sharedlibs
*ew
= (Sharedlibs
*)user_data
;
126 if (event
->type
!= GDK_BUTTON_PRESS
)
128 if (((GdkEventButton
*)event
)->button
!= 3)
130 bevent
= (GdkEventButton
*)event
;
132 sharedlibs_update_controls(ew
);
133 gtk_menu_popup (GTK_MENU(ew
->widgets
.menu
), NULL
,
135 bevent
->button
, bevent
->time
);
139 static GtkActionEntry sharedlibs_menu_actions
[] =
142 "ActionDmaSharedlibsUpdate",
146 G_CALLBACK (on_sharedlibs_update_activate
)
151 sharedlibs_ui_create_treeview_and_store (Sharedlibs
*sl
)
155 GtkCellRenderer
*renderer
;
156 GtkTreeViewColumn
*column
;
158 store
= gtk_list_store_new (SHL_COLUMN_COUNT
,
163 treeview
= gtk_tree_view_new_with_model (GTK_TREE_MODEL (store
));
165 renderer
= gtk_cell_renderer_text_new ();
166 column
= gtk_tree_view_column_new_with_attributes (_("Shared Object"),
168 "text", SHL_COLUMN_SHARED_OBJECT
,
170 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview
), column
);
172 renderer
= gtk_cell_renderer_text_new ();
173 column
= gtk_tree_view_column_new_with_attributes (_("From"),
175 "text", SHL_COLUMN_FROM
,
177 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview
), column
);
179 renderer
= gtk_cell_renderer_text_new ();
180 column
= gtk_tree_view_column_new_with_attributes (_("To"),
182 "text", SHL_COLUMN_TO
,
184 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview
), column
);
186 renderer
= gtk_cell_renderer_toggle_new ();
187 column
= gtk_tree_view_column_new_with_attributes (_("Symbols read"),
189 "active", SHL_COLUMN_SYM_READ
,
191 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview
), column
);
193 sl
->widgets
.treeview
= treeview
;
194 sl
->widgets
.store
= store
;
200 destroy_sharedlibs_gui (Sharedlibs
*sl
)
206 create_sharedlibs_gui (Sharedlibs
*sl
)
209 GtkWidget
*scrolledwindow4
;
213 window3
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
214 gtk_window_set_title (GTK_WINDOW (window3
), _("Shared libraries"));
215 gtk_window_set_wmclass (GTK_WINDOW (window3
), "sharedlibs", "Anjuta");
216 gtk_window_set_default_size (GTK_WINDOW (window3
), 240, 230);
218 scrolledwindow4
= gtk_scrolled_window_new (NULL
, NULL
);
219 gtk_widget_show (scrolledwindow4
);
220 gtk_container_add (GTK_CONTAINER (window3
), scrolledwindow4
);
221 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4
),
222 GTK_POLICY_AUTOMATIC
,
223 GTK_POLICY_AUTOMATIC
);
225 treeview
= sharedlibs_ui_create_treeview_and_store (sl
);
226 gtk_widget_show (treeview
);
227 gtk_container_add (GTK_CONTAINER (scrolledwindow4
), treeview
);
229 g_signal_connect (G_OBJECT (window3
), "delete_event",
230 G_CALLBACK (on_sharedlibs_delete_event
), sl
);
231 g_signal_connect (G_OBJECT (window3
), "key-press-event",
232 G_CALLBACK (on_sharedlibs_key_press_event
), sl
);
234 g_signal_connect (G_OBJECT (treeview
), "event",
235 G_CALLBACK (on_sharedlibs_event
),
238 sl
->widgets
.window
= window3
;
239 sl
->widgets
.treeview
= treeview
;
240 ui
= anjuta_shell_get_ui (sl
->plugin
->shell
, NULL
);
241 sl
->widgets
.menu
= gtk_ui_manager_get_widget (GTK_UI_MANAGER (ui
),
244 sl
->is_showing
= FALSE
;
246 sl
->win_height
= 370;
252 on_program_unloaded (Sharedlibs
*sl
)
254 g_signal_handlers_disconnect_by_func (sl
->plugin
, G_CALLBACK (on_program_unloaded
), sl
);
256 destroy_sharedlibs_gui(sl
);
260 on_program_loaded (Sharedlibs
*sl
)
262 create_sharedlibs_gui(sl
);
264 g_signal_connect_swapped (sl
->plugin
, "program-unloaded", G_CALLBACK (on_program_unloaded
), sl
);
268 *---------------------------------------------------------------------------*/
271 sharedlibs_clear (Sharedlibs
*sl
)
273 g_return_if_fail (sl
->widgets
.store
!= NULL
);
274 g_return_if_fail (GTK_IS_LIST_STORE (sl
->widgets
.store
));
276 gtk_list_store_clear (sl
->widgets
.store
);
280 sharedlibs_show (Sharedlibs
* sl
)
286 gdk_window_raise(gtk_widget_get_window (sl
->widgets
.window
));
290 gtk_window_move(GTK_WINDOW(sl
->widgets
.window
), sl
->win_pos_x
,
292 gtk_window_set_default_size(GTK_WINDOW(sl
->widgets
.window
),
293 sl
->win_width
, sl
->win_height
);
294 gtk_widget_show(sl
->widgets
.window
);
295 sl
->is_showing
= TRUE
;
296 dma_queue_info_sharedlib (
298 (IAnjutaDebuggerCallback
)sharedlibs_update
,
305 sharedlibs_hide (Sharedlibs
* sl
)
311 if(sl
->is_showing
== FALSE
) return;
312 window
= gtk_widget_get_window (sl
->widgets
.window
);
313 gdk_window_get_root_origin (window
,
314 &sl
->win_pos_x
, &sl
->win_pos_y
);
315 gdk_window_get_geometry (window
, NULL
, NULL
,
316 &sl
->win_width
, &sl
->win_height
);
317 gtk_widget_hide(sl
->widgets
.window
);
318 sl
->is_showing
= FALSE
;
322 /* Constructor & Destructor
323 *---------------------------------------------------------------------------*/
326 sharedlibs_new (DebugManagerPlugin
*plugin
)
331 sl
= g_new0 (Sharedlibs
, 1);
332 g_return_val_if_fail (sl
!= NULL
, NULL
);
334 sl
->plugin
= ANJUTA_PLUGIN (plugin
);
335 sl
->debugger
= dma_debug_manager_get_queue (plugin
);
337 ui
= anjuta_shell_get_ui (ANJUTA_PLUGIN(plugin
)->shell
, NULL
);
339 anjuta_ui_add_action_group_entries (ui
,
340 "ActionGroupSharedlibs",
341 _("Shared library operations"),
342 sharedlibs_menu_actions
,
343 G_N_ELEMENTS(sharedlibs_menu_actions
),
344 GETTEXT_PACKAGE
, TRUE
, sl
);
346 g_signal_connect_swapped (plugin
, "program-loaded", G_CALLBACK (on_program_loaded
), sl
);
352 sharedlibs_free(Sharedlibs
* sl
)
356 g_return_if_fail (sl
!= NULL
);
358 /* Disconnect from debugger */
359 g_signal_handlers_disconnect_matched (sl
->plugin
, G_SIGNAL_MATCH_DATA
, 0, 0, NULL
, NULL
, sl
);
361 /* Remove menu actions */
362 ui
= anjuta_shell_get_ui (sl
->plugin
->shell
, NULL
);
363 anjuta_ui_remove_action_group (ui
, sl
->action_group
);
366 destroy_sharedlibs_gui (sl
);