/* selectwm - X11 window manager selector
*
* Copyright (C) 1999-2003 Luc Dufresne - luc@ordiluc.net
* 26, rue des Comices
* 59650 Villeneuve d'Ascq
* FRANCE
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* See the file COPYING
*/
#include "define.h"
#include <gtk/gtk.h>
#include "misc.h"
#include "modify.h"
#include "miscui.h"
static struct WM {
gchar *name;
gchar *command;
} wm [] = {
{"Gnome", "gnome-session"},
{"kde", "startkde"},
{"Window Maker", "wmaker"},
{"Enlightenment", "enlightenment"},
{"Blackbox", "blackbox"},
{"xfce", "xfwm"},
{"Sawfish", "sawfish"},
{"Fluxbox", "fluxbox"},
{"Icewm", "icewm"},
{"fvwm", "fvwm"},
{"mwm", "mwm"},
{"mlvwm", "mlvwm"},
{"Afterstep", "afterstep"},
{"ctwm", "ctwm"},
{"flwm", "flwm"},
{"pwm", "pwm"},
{"vtwm", "vtwm"},
{"twm", "twm"},
{"xterm", "xterm"},
{"rxvt", "rxvt"},
{"", ""}
};
static gchar * path [] = {
"/usr/local/bin/",
"/usr/bin/X11/",
"/usr/bin/",
""
};
enum
{
COLUMN_CMD,
COLUMN_DESC,
COLUMN_EDITABLE,
NUM_COLUMNS
};
static void add_wms (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) {
gchar *cmd, *dsc;
config *selectwm_config = (config *) data;
gtk_tree_model_get (model, iter, COLUMN_CMD, &cmd,COLUMN_DESC, &dsc , -1);
insert_item (selectwm_config, cmd, dsc);
g_free (cmd);
g_free (dsc);
}
static void add_columns (GtkTreeView *treeview) {
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkTreeModel *model = gtk_tree_view_get_model (treeview);
renderer = gtk_cell_renderer_text_new ();
g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (cell_edited), model);
column = gtk_tree_view_column_new_with_attributes (_("Command"), renderer, "text", COLUMN_CMD, "editable", COLUMN_EDITABLE, NULL);
g_object_set_data (G_OBJECT (renderer), "column", (gint *) COLUMN_CMD);
gtk_tree_view_append_column (treeview, column);
renderer = gtk_cell_renderer_text_new ();
g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (cell_edited), model);
column = gtk_tree_view_column_new_with_attributes (_("Description"), renderer, "text", COLUMN_DESC, "editable", COLUMN_EDITABLE, NULL);
g_object_set_data (G_OBJECT (renderer), "column", (gint *) COLUMN_DESC);
gtk_tree_view_append_column (treeview, column);
}
static GtkTreeModel * create_model (void) {
GtkListStore *store;
GtkTreeIter iter;
gint i, j;
GString *command;
store = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
i = 0;
while (wm[i].command != "") {
j = 0;
while (path[j] != "") {
command = g_string_new ("");
g_string_printf (command, "%s%s", path[j], wm[i].command);
if (g_file_test (command->str, G_FILE_TEST_IS_EXECUTABLE)) {
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, COLUMN_CMD, command->str, COLUMN_DESC, wm[i].name, COLUMN_EDITABLE, TRUE, -1);
}
g_string_free (command, TRUE);
j++;
}
i++;
}
return GTK_TREE_MODEL (store);
}
void find_wm (config *selectwm_config) {
GtkWidget *treeview, *sw, *find_window;
GtkTreeModel *model;
model = create_model ();
find_window = gtk_dialog_new_with_buttons (_("Window Managers found"), NULL, GTK_DIALOG_MODAL, GTK_STOCK_ADD, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
gtk_window_set_position (GTK_WINDOW (find_window), GTK_WIN_POS_MOUSE);
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (find_window)->vbox), sw, TRUE, TRUE, 0);
treeview = gtk_tree_view_new_with_model (model);
gtk_widget_set_size_request (treeview, 350, 200);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), GTK_SELECTION_MULTIPLE);
add_columns (GTK_TREE_VIEW (treeview));
gtk_tree_selection_select_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)));
g_object_unref (G_OBJECT (model));
gtk_container_add (GTK_CONTAINER (sw), treeview);
gtk_widget_show_all (find_window);
if (GTK_RESPONSE_OK == gtk_dialog_run (GTK_DIALOG (find_window))) {
gtk_tree_selection_selected_foreach (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), add_wms, selectwm_config);
}
gtk_widget_destroy (find_window);
}
syntax highlighted by Code2HTML, v. 0.9.1