From: Jan W. <ja...@ea...> - 2001-08-28 15:53:42
|
On Tue, 28 Aug 2001, Thomas Leonard wrote: > There should be some programs around to show them if you want them > visible, or someone could write one quite easily (panel applet, anyone?) A while back I have tried to make something like that. Well, infact I was doing it just for learning about gtk ;-) I had studied the source of "fspanel" and then created an applet that shows the running programs on the ROX-panel. It is not very usefull at the moment. Maybe I can try to improve it, but I don't have much experience with gtk-programming. ----------------------------------------------------------------------------- #include <gtk/gtk.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> static guint update_tag; static GtkWidget *zero = NULL; GtkWidget *window; GtkWidget *applet; GtkWidget *applet1; GtkWidget *applet2; GtkWidget *applet3; GtkWidget *button; Display *dd; Window root_win; int scr_screen; int scr_depth; int scr_width; int scr_height; int start; char *atom_names[] = { "KWM_WIN_ICON", "WM_STATE", "WM_NAME", "WM_HINTS", "_MOTIF_WM_HINTS", "_WIN_WORKSPACE", "_WIN_HINTS", "_WIN_LAYER", "_WIN_CLIENT_LIST", "_WIN_WORKSPACE_COUNT", "_WIN_STATE" }; Atom atoms[sizeof (atom_names) / sizeof (atom_names[0])]; #define atom_KWM_WIN_ICON atoms[0] #define atom_WM_STATE atoms[1] #define atom_WM_NAME atoms[2] #define atom_WM_HINTS atoms[3] #define atom__MOTIF_WM_HINTS atoms[4] #define atom__WIN_WORKSPACE atoms[5] #define atom__WIN_HINTS atoms[6] #define atom__WIN_LAYER atoms[7] #define atom__WIN_CLIENT_LIST atoms[8] #define atom__WIN_WORKSPACE_COUNT atoms[9] #define atom__WIN_STATE atoms[10] void * get_prop_data (Window win, Atom prop, Atom type, int *size_ret) { Atom type_ret; int format_ret; unsigned long items_ret; unsigned long after_ret; unsigned char *prop_data; prop_data = 0; XGetWindowProperty (dd, win, prop, 0, 0x7fffffff, False, type, &type_ret, &format_ret, &items_ret, &after_ret, &prop_data); if (size_ret) *size_ret = items_ret * 4; return prop_data; } void destroy (GtkWidget * widget, gpointer data) { gtk_main_quit (); } static gboolean teken (void) { int i, x; Window *xwin; Atom type_ret; int format_ret; int num, size; unsigned long items_ret; unsigned long after_ret; unsigned char *name; if (start == 1) { gtk_container_remove (GTK_CONTAINER (window), applet); } else { start = 1; } applet = gtk_vbox_new (FALSE, 0); /* num = aantal programma's die lopen op X */ xwin = get_prop_data (root_win, atom__WIN_CLIENT_LIST, XA_CARDINAL, &size); if (!xwin) { puts ("oeps"); exit (0); } num = size / sizeof (Window); gtk_container_add (GTK_CONTAINER (window), applet); applet1 = gtk_hbox_new (FALSE, 0); applet2 = gtk_hbox_new (FALSE, 0); applet3 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (applet), applet1, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (applet), applet2, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (applet), applet3, FALSE, FALSE, 0); x = 0; for (i = 0; i < num; i++) { /* geeft naam van win */ XGetWindowProperty (dd, xwin[i], atom_WM_NAME, 0, 0x7fffffff, False, XA_STRING, &type_ret, &format_ret, &items_ret, &after_ret, &name); button = gtk_button_new_with_label (name); switch (x) { case 0: gtk_box_pack_start (GTK_BOX (applet1), button, TRUE, TRUE, 0); x++; break; case 1: gtk_box_pack_start (GTK_BOX (applet2), button, TRUE, TRUE, 0); x++; break; case 2: gtk_box_pack_start (GTK_BOX (applet3), button, TRUE, TRUE, 0); x = 0; } gtk_widget_show (button); XFree (name); } XFree (xwin); gtk_widget_show (applet1); gtk_widget_show (applet2); gtk_widget_show (applet3); gtk_widget_show (applet); gtk_widget_show (window); } int main (int argc, char *argv[]) { int xfd; dd = XOpenDisplay (NULL); root_win = RootWindow (dd, scr_screen); start = 0; xfd = 0; do { atoms[xfd] = XInternAtom (dd, atom_names[xfd], False); xfd++; } while (xfd < (sizeof (atom_names) / sizeof (char *))); gtk_init (&argc, &argv); window = gtk_plug_new (atol (argv[1])); /* window=gtk_window_new (GTK_WINDOW_TOPLEVEL); */ gtk_widget_set_usize (window, 350, 60); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy), NULL); update_tag = gtk_timeout_add (2000, (GtkFunction) teken, zero); gtk_main (); return (0); } ----------------------------------------------------------------------------- gcc applet.c -o applet `gtk-config --cflags --libs` Met vriendelijke groetjes - Jan Wagemakers - ... When we speak of free software, we are referring to freedom, not price. -- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 |