Added byline
[anjuta.git] / plugins / debug-manager / sharedlib.c
bloba4dace94f76c3646fe0cbde9885e5b8b480d82b4
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 sharedlibs.c
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
20 #ifdef HAVE_CONFIG_H
21 # include <config.h>
22 #endif
24 #include <sys/stat.h>
25 #include <unistd.h>
26 #include <string.h>
28 #include <libanjuta/resources.h>
29 #include <libanjuta/anjuta-shell.h>
31 #include "utilities.h"
32 #include "sharedlib.h"
33 #include "queue.h"
35 enum
37 SHL_COLUMN_SHARED_OBJECT,
38 SHL_COLUMN_FROM,
39 SHL_COLUMN_TO,
40 SHL_COLUMN_SYM_READ,
41 SHL_COLUMN_COUNT
44 static gint
45 on_sharedlibs_delete_event (GtkWidget* w, GdkEvent *event, gpointer data)
47 Sharedlibs* sl = data;
48 sharedlibs_hide(sl);
49 return TRUE;
52 static gboolean
53 on_sharedlibs_key_press_event (GtkWidget *widget, GdkEventKey *event,
54 gpointer data)
56 if (event->keyval == GDK_KEY_Escape)
58 Sharedlibs* sl = data;
59 sharedlibs_hide(sl);
60 return TRUE;
62 return FALSE;
66 static void
67 sharedlibs_update (const GList *lines, gpointer data)
69 Sharedlibs *sl;
70 gchar obj[512], from[32], to[32], read[32];
71 gint count;
72 GList *list, *node;
73 GtkTreeIter iter;
75 sl = (Sharedlibs*)data;
77 list = gdb_util_remove_blank_lines(lines);
78 sharedlibs_clear(sl);
79 if(g_list_length(list) < 2 ){g_list_free(list); return;}
80 node = list->next;
81 if (node)
82 node = g_list_next (node);
83 while(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,
92 SHL_COLUMN_TO, to,
93 SHL_COLUMN_SYM_READ, strcmp(read, "Yes") == 0,
94 -1);
96 g_list_free(list);
99 static void
100 on_sharedlibs_update_activate (GtkMenuItem *menuitem, gpointer user_data)
102 Sharedlibs *sl = (Sharedlibs *)user_data;
104 dma_queue_info_sharedlib (
105 sl->debugger,
106 (IAnjutaDebuggerCallback)sharedlibs_update,
107 sl);
110 static void
111 sharedlibs_update_controls (Sharedlibs* sl)
113 gboolean R;
115 R = dma_debugger_queue_get_state (sl->debugger) == IANJUTA_DEBUGGER_PROGRAM_STOPPED;
117 gtk_action_group_set_sensitive (sl->action_group, R);
120 static gboolean
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)
127 return FALSE;
128 if (((GdkEventButton *)event)->button != 3)
129 return FALSE;
130 bevent = (GdkEventButton *)event;
131 bevent->button = 1;
132 sharedlibs_update_controls(ew);
133 gtk_menu_popup (GTK_MENU(ew->widgets.menu), NULL,
134 NULL, NULL, NULL,
135 bevent->button, bevent->time);
136 return TRUE;
139 static GtkActionEntry sharedlibs_menu_actions[] =
142 "ActionDmaSharedlibsUpdate",
143 GTK_STOCK_REFRESH,
144 N_("Update"),
145 NULL, NULL,
146 G_CALLBACK (on_sharedlibs_update_activate)
150 static GtkWidget*
151 sharedlibs_ui_create_treeview_and_store (Sharedlibs *sl)
153 GtkWidget *treeview;
154 GtkListStore *store;
155 GtkCellRenderer *renderer;
156 GtkTreeViewColumn *column;
158 store = gtk_list_store_new (SHL_COLUMN_COUNT,
159 G_TYPE_STRING,
160 G_TYPE_STRING,
161 G_TYPE_STRING,
162 G_TYPE_BOOLEAN);
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"),
167 renderer,
168 "text", SHL_COLUMN_SHARED_OBJECT,
169 NULL);
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"),
174 renderer,
175 "text", SHL_COLUMN_FROM,
176 NULL);
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"),
181 renderer,
182 "text", SHL_COLUMN_TO,
183 NULL);
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"),
188 renderer,
189 "active", SHL_COLUMN_SYM_READ,
190 NULL);
191 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
193 sl->widgets.treeview = treeview;
194 sl->widgets.store = store;
196 return treeview;
199 static void
200 destroy_sharedlibs_gui (Sharedlibs *sl)
205 static void
206 create_sharedlibs_gui (Sharedlibs *sl)
208 GtkWidget *window3;
209 GtkWidget *scrolledwindow4;
210 GtkWidget *treeview;
211 AnjutaUI *ui;
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),
236 sl);
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),
242 "/PopupSharedlibs");
244 sl->is_showing = FALSE;
245 sl->win_width = 410;
246 sl->win_height = 370;
247 sl->win_pos_x = 120;
248 sl->win_pos_y = 140;
251 static void
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);
259 static void
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);
267 /* Public functions
268 *---------------------------------------------------------------------------*/
270 void
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);
279 void
280 sharedlibs_show (Sharedlibs* sl)
282 if(sl)
284 if(sl->is_showing)
286 gdk_window_raise(gtk_widget_get_window (sl->widgets.window));
288 else
290 gtk_window_move(GTK_WINDOW(sl->widgets.window), sl->win_pos_x,
291 sl->win_pos_y);
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 (
297 sl->debugger,
298 (IAnjutaDebuggerCallback)sharedlibs_update,
299 sl);
304 void
305 sharedlibs_hide (Sharedlibs* sl)
307 GdkWindow *window;
309 if(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 *---------------------------------------------------------------------------*/
325 Sharedlibs*
326 sharedlibs_new (DebugManagerPlugin *plugin)
328 Sharedlibs* sl;
329 AnjutaUI *ui;
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);
338 sl->action_group =
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);
348 return sl;
351 void
352 sharedlibs_free(Sharedlibs* sl)
354 AnjutaUI *ui;
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);
365 /* Destroy GUI */
366 destroy_sharedlibs_gui (sl);
368 g_free (sl);