--- a/gntwm.c Fri May 10 23:13:35 2019 +0000
+++ b/gntwm.c Fri May 10 23:31:00 2019 +0000
@@ -63,17 +63,51 @@
#include "gntboxprivate.h"
#include "gntmenuprivate.h"
#include "gntwidgetprivate.h"
+#include "gntwmprivate.h" #include "gntwsprivate.h"
#define IDLE_CHECK_INTERVAL 5 /* 5 seconds */
+typedef struct _GntListWindow GList *tagged; /* tagged windows */
GntListWindow *windows; /* Window-list window */
GntListWindow *actions; /* Action-list window */
+ GHashTable *nodes; /* GntWidget -> GntNode */ + GHashTable *name_places; /* window name -> ws */ + GHashTable *title_places; /* window title -> ws */ + GList *acts; /* List of actions */ + /* Currently active menu. There can be at most one menu at a time on + * the screen. If there is a menu being displayed, then all the + * keystrokes will be sent to the menu until it is closed, either when + * the user activates a menuitem, or presses Escape to cancel the menu. + /* Will be set to %TRUE when a user-event, ie. a mouse-click or a + * key-press is being processed. This variable will be used to + * determine whether to give focus to a new window. @@ -129,6 +163,7 @@
gnt_wm_copy_win(GntWidget *widget, GntNode *node)
@@ -245,13 +280,16 @@
- if (wm->mode == GNT_KP_MODE_WAIT_ON_CHILD)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->mode == GNT_KP_MODE_WAIT_ON_CHILD) {
- GntMenu *top = wm->menu;
+ GntMenu *top = priv->menu; - GntNode *node = g_hash_table_lookup(wm->nodes, top);
+ GntNode *node = g_hash_table_lookup(priv->nodes, top); top = gnt_menu_get_submenu(top);
@@ -340,6 +378,7 @@
read_window_positions(GntWM *wm)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GKeyFile *gfile = g_key_file_new();
char *filename = g_build_filename(gnt_get_config_dir(), ".gntpositions", NULL);
@@ -369,7 +408,7 @@
GntPosition *p = g_new0(GntPosition, 1);
- g_hash_table_replace(wm->positions, g_strdup(title + 1), p);
+ g_hash_table_replace(priv->positions, g_strdup(title + 1), p); gnt_warning("Invalid number of arguments (%" G_GSIZE_FORMAT
") for positioning a window.", l);
@@ -398,18 +437,20 @@
GntWMPrivate *priv = gnt_wm_get_instance_private(wm);
- wm->name_places = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
- wm->title_places = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+ g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); gnt_style_read_workspaces(wm);
if (priv->workspaces == NULL) {
- wm->cws = gnt_ws_new("default");
- gnt_wm_add_workspace(wm, wm->cws);
+ priv->cws = gnt_ws_new("default"); + gnt_wm_add_workspace(wm, priv->cws); - wm->cws = priv->workspaces->data;
+ priv->cws = priv->workspaces->data; - wm->event_stack = FALSE;
- wm->nodes = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_node);
- wm->positions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+ priv->nodes = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, + priv->positions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); if (gnt_style_get_bool(GNT_STYLE_REMPOS, TRUE))
read_window_positions(wm);
g_timeout_add_seconds(IDLE_CHECK_INTERVAL, check_idle, NULL);
@@ -420,23 +461,25 @@
switch_window(GntWM *wm, int direction, gboolean urgent)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GntWidget *w = NULL, *wid = NULL;
- if (wm->_list.window || wm->menu)
+ if (priv->list.window || priv->menu) {
- if (gnt_ws_is_empty(wm->cws) || gnt_ws_is_single(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws) || gnt_ws_is_single(priv->cws)) { - if (wm->mode != GNT_KP_MODE_NORMAL) {
+ if (priv->mode != GNT_KP_MODE_NORMAL) { - w = gnt_ws_get_top_widget(wm->cws);
- list = gnt_ws_get_list(wm->cws);
+ w = gnt_ws_get_top_widget(priv->cws); + list = gnt_ws_get_list(priv->cws); orgpos = pos = g_list_index(list, w);
g_return_if_fail(pos >= 0);
@@ -477,10 +520,11 @@
switch_window_n(GntBindable *bind, GList *list)
GntWM *wm = GNT_WM(bind);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - if (gnt_ws_is_empty(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws)) { @@ -489,7 +533,7 @@
- if ((l = g_list_nth(gnt_ws_get_list(wm->cws), n)) != NULL) {
+ if ((l = g_list_nth(gnt_ws_get_list(priv->cws), n)) != NULL) { gnt_wm_raise_window(wm, l->data);
@@ -500,15 +544,16 @@
window_scroll_up(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - if (gnt_ws_is_empty(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws)) { - window = gnt_ws_get_top_widget(wm->cws);
- node = g_hash_table_lookup(wm->nodes, window);
+ window = gnt_ws_get_top_widget(priv->cws); + node = g_hash_table_lookup(priv->nodes, window); @@ -524,16 +569,17 @@
window_scroll_down(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - if (gnt_ws_is_empty(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws)) { - window = gnt_ws_get_top_widget(wm->cws);
- node = g_hash_table_lookup(wm->nodes, window);
+ window = gnt_ws_get_top_widget(priv->cws); + node = g_hash_table_lookup(priv->nodes, window); @@ -550,12 +596,14 @@
window_close(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->list.window) {
- if (!gnt_ws_is_empty(wm->cws)) {
- gnt_widget_destroy(gnt_ws_get_top_widget(wm->cws));
+ if (!gnt_ws_is_empty(priv->cws)) { + gnt_widget_destroy(gnt_ws_get_top_widget(priv->cws)); @@ -566,8 +614,9 @@
destroy__list(G_GNUC_UNUSED GntWidget *widget, GntWM *wm)
GntWMPrivate *priv = gnt_wm_get_instance_private(wm);
- wm->_list.window = NULL;
+ priv->list.window = NULL; + priv->list.tree = NULL; @@ -576,14 +625,15 @@
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - win = wm->_list.window = gnt_box_new(FALSE, FALSE);
+ win = priv->list.window = gnt_box_new(FALSE, FALSE); gnt_box_set_toplevel(GNT_BOX(win), TRUE);
gnt_box_set_pad(GNT_BOX(win), 0);
gnt_widget_set_transient(win, TRUE);
- tree = wm->_list.tree = gnt_tree_new();
+ tree = priv->list.tree = gnt_tree_new(); gnt_box_add_widget(GNT_BOX(win), tree);
g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(destroy__list), wm);
@@ -595,7 +645,7 @@
GntWMPrivate *priv = gnt_wm_get_instance_private(wm);
GntBindable *sel = gnt_tree_get_selection_data(GNT_TREE(tree));
- gnt_widget_destroy(wm->_list.window);
+ gnt_widget_destroy(priv->list.window); @@ -615,7 +665,7 @@
GntTree *tree = GNT_TREE(priv->windows->tree);
- for (iter = gnt_ws_get_list(wm->cws); iter; iter = iter->next) {
+ for (iter = gnt_ws_get_list(priv->cws); iter; iter = iter->next) { GntBox *box = GNT_BOX(iter->data);
@@ -648,7 +698,9 @@
window_list_key_pressed(GntWidget *widget, const char *text, GntWM *wm)
- if (text[1] == 0 && !gnt_ws_is_empty(wm->cws)) {
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (text[1] == 0 && !gnt_ws_is_empty(priv->cws)) { GntBindable *sel = gnt_tree_get_selection_data(GNT_TREE(widget));
@@ -682,7 +734,7 @@
GntWMPrivate *priv = gnt_wm_get_instance_private(wm);
- priv->windows = &wm->_list;
+ priv->windows = &priv->list; win = priv->windows->window;
tree = priv->windows->tree;
@@ -691,10 +743,10 @@
populate_window_list(wm, workspace);
- if (!gnt_ws_is_empty(wm->cws)) {
- gnt_tree_set_selected(GNT_TREE(tree), gnt_ws_get_top_widget(wm->cws));
+ if (!gnt_ws_is_empty(priv->cws)) { + gnt_tree_set_selected(GNT_TREE(tree), gnt_ws_get_top_widget(priv->cws)); - gnt_tree_set_selected(GNT_TREE(tree), wm->cws);
+ gnt_tree_set_selected(GNT_TREE(tree), priv->cws); g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(window_list_activate), wm);
@@ -712,11 +764,13 @@
window_list(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
- if (wm->_list.window || wm->menu)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->list.window || priv->menu) {
- if (gnt_ws_is_empty(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws)) { @@ -894,7 +948,8 @@
shift_window(GntWM *wm, GntWidget *widget, int dir)
- GList *all = gnt_ws_get_list(wm->cws);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + GList *all = gnt_ws_get_list(priv->cws); GList *list = g_list_find(all, widget);
@@ -914,11 +969,11 @@
all = g_list_insert(all, widget, pos);
all = g_list_delete_link(all, list);
- gnt_ws_set_list(wm->cws, all);
- gnt_ws_draw_taskbar(wm->cws, FALSE);
- if (!gnt_ws_is_empty(wm->cws)) {
- GntWidget *w = gnt_ws_get_top_widget(wm->cws);
- GntNode *node = g_hash_table_lookup(wm->nodes, w);
+ gnt_ws_set_list(priv->cws, all); + gnt_ws_draw_taskbar(priv->cws, FALSE); + if (!gnt_ws_is_empty(priv->cws)) { + GntWidget *w = gnt_ws_get_top_widget(priv->cws); + GntNode *node = g_hash_table_lookup(priv->nodes, w); @@ -929,14 +984,17 @@
shift_left(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
- if (gnt_ws_is_empty(wm->cws)) {
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->list.window) { - shift_window(wm, gnt_ws_get_top_widget(wm->cws), -1);
+ if (gnt_ws_is_empty(priv->cws)) { + shift_window(wm, gnt_ws_get_top_widget(priv->cws), -1); @@ -944,24 +1002,27 @@
shift_right(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
- if (gnt_ws_is_empty(wm->cws)) {
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->list.window) { - shift_window(wm, gnt_ws_get_top_widget(wm->cws), 1);
+ if (gnt_ws_is_empty(priv->cws)) { + shift_window(wm, gnt_ws_get_top_widget(priv->cws), 1); action_list_activate(GntTree *tree, GntWM *wm)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GntAction *action = gnt_tree_get_selection_data(tree);
- gnt_widget_destroy(wm->_list.window);
+ gnt_widget_destroy(priv->list.window); @@ -981,14 +1042,17 @@
GntWM *wm = GNT_WM(bindable);
GntWMPrivate *priv = gnt_wm_get_instance_private(wm);
- if (wm->_list.window || wm->menu)
+ if (priv->list.window || priv->menu) {
+ if (priv->acts == NULL) { - priv->actions = &wm->_list;
+ priv->actions = &priv->list; win = priv->actions->window;
tree = priv->actions->tree;
@@ -998,13 +1062,13 @@
/* XXX: Do we really want this? */
gnt_tree_set_compare_func(GNT_TREE(tree), compare_action);
- for (iter = wm->acts; iter; iter = iter->next) {
+ for (iter = priv->acts; iter; iter = iter->next) { GntAction *action = iter->data;
gnt_tree_add_row_last(GNT_TREE(tree), action,
gnt_tree_create_row(GNT_TREE(tree), action->label), NULL);
g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(action_list_activate), wm);
- n = g_list_length(wm->acts);
+ n = g_list_length(priv->acts); gnt_widget_set_size(tree, 0, n);
gnt_widget_set_position(win, 0, getmaxy(stdscr) - 3 - n);
@@ -1056,6 +1120,7 @@
window_reverse(GntWidget *win, gboolean set, GntWM *wm)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); @@ -1079,18 +1144,20 @@
for (i = 0; i < h; i += reverse_char(d, i, 0, set));
for (i = 0; i < h; i += reverse_char(d, i, w-1, set));
- gnt_wm_copy_win(win, g_hash_table_lookup(wm->nodes, win));
+ gnt_wm_copy_win(win, g_hash_table_lookup(priv->nodes, win)); ensure_normal_mode(GntWM *wm)
- if (wm->mode != GNT_KP_MODE_NORMAL) {
- if (!gnt_ws_is_empty(wm->cws)) {
- window_reverse(gnt_ws_get_top_widget(wm->cws), FALSE, wm);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->mode != GNT_KP_MODE_NORMAL) { + if (!gnt_ws_is_empty(priv->cws)) { + window_reverse(gnt_ws_get_top_widget(priv->cws), FALSE, wm); - wm->mode = GNT_KP_MODE_NORMAL;
+ priv->mode = GNT_KP_MODE_NORMAL; @@ -1098,14 +1165,17 @@
start_move(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
- if (wm->_list.window || wm->menu)
- if (gnt_ws_is_empty(wm->cws)) {
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->list.window || priv->menu) {
- wm->mode = GNT_KP_MODE_MOVE;
- window_reverse(gnt_ws_get_top_widget(wm->cws), TRUE, wm);
+ if (gnt_ws_is_empty(priv->cws)) { + priv->mode = GNT_KP_MODE_MOVE; + window_reverse(gnt_ws_get_top_widget(priv->cws), TRUE, wm); @@ -1114,14 +1184,17 @@
start_resize(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
- if (wm->_list.window || wm->menu)
- if (gnt_ws_is_empty(wm->cws)) {
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->list.window || priv->menu) {
- wm->mode = GNT_KP_MODE_RESIZE;
- window_reverse(gnt_ws_get_top_widget(wm->cws), TRUE, wm);
+ if (gnt_ws_is_empty(priv->cws)) { + priv->mode = GNT_KP_MODE_RESIZE; + window_reverse(gnt_ws_get_top_widget(priv->cws), TRUE, wm); @@ -1130,9 +1203,11 @@
wm_quit(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - g_main_loop_quit(wm->loop);
+ g_main_loop_quit(priv->loop); @@ -1147,21 +1222,23 @@
refresh_screen(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - g_hash_table_foreach(wm->nodes, (GHFunc)refresh_node, GINT_TO_POINTER(TRUE));
+ g_hash_table_foreach(priv->nodes, (GHFunc)refresh_node, + GINT_TO_POINTER(TRUE)); g_signal_emit(wm, signals[SIG_TERMINAL_REFRESH], 0);
- for (iter = gnt_ws_get_last(wm->cws); iter; iter = iter->prev) {
+ for (iter = gnt_ws_get_last(priv->cws); iter; iter = iter->prev) { GntWidget *w = iter->data;
- GntNode *node = g_hash_table_lookup(wm->nodes, w);
+ GntNode *node = g_hash_table_lookup(priv->nodes, w); - gnt_ws_draw_taskbar(wm->cws, TRUE);
+ gnt_ws_draw_taskbar(priv->cws, TRUE); curs_set(0); /* endwin resets the cursor to normal */
@@ -1211,10 +1288,10 @@
- if (gnt_ws_is_empty(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws)) { - widget = gnt_ws_get_top_widget(wm->cws);
+ widget = gnt_ws_get_top_widget(priv->cws); link = g_list_find(priv->tagged, widget);
@@ -1240,7 +1317,7 @@
for (iter = priv->tagged; iter; iter = g_list_delete_link(iter, iter)) {
GntWidget *widget = GNT_WIDGET(iter->data);
- gnt_wm_widget_move_workspace(wm, wm->cws, widget);
+ gnt_wm_widget_move_workspace(wm, priv->cws, widget); @@ -1252,9 +1329,11 @@
workspace_list(GntBindable *b, G_GNUC_UNUSED GList *params)
- if (wm->_list.window || wm->menu)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (priv->list.window || priv->menu) { list_of_windows(wm, TRUE);
@@ -1276,8 +1355,10 @@
ignore_keys_start(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
- if(!wm->menu && !wm->_list.window && wm->mode == GNT_KP_MODE_NORMAL){
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + if (!priv->menu && !priv->list.window && + priv->mode == GNT_KP_MODE_NORMAL) { @@ -1380,13 +1461,14 @@
help_for_window(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - if (gnt_ws_is_empty(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws)) { - widget = gnt_ws_get_top_widget(wm->cws);
+ widget = gnt_ws_get_top_widget(priv->cws); return help_for_bindable(wm,GNT_BINDABLE(widget));
@@ -1395,13 +1477,14 @@
help_for_widget(GntBindable *bindable, G_GNUC_UNUSED GList *params)
GntWM *wm = GNT_WM(bindable);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - if (gnt_ws_is_empty(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws)) { - widget = gnt_ws_get_top_widget(wm->cws);
+ widget = gnt_ws_get_top_widget(priv->cws); @@ -1425,10 +1508,10 @@
- g_hash_table_foreach(wm->nodes, (GHFunc)accumulate_windows, &list);
+ g_hash_table_foreach(priv->nodes, (GHFunc)accumulate_windows, &list); g_list_free_full(list, (GDestroyNotify)gnt_widget_destroy);
- g_hash_table_destroy(wm->nodes);
+ g_hash_table_destroy(priv->nodes); g_list_free_full(priv->workspaces, g_object_unref);
@@ -1631,6 +1714,17 @@
/******************************************************************************
*****************************************************************************/
+gnt_wm_get_current_workspace(GntWM *wm) + GntWMPrivate *priv = NULL; + g_return_val_if_fail(GNT_IS_WM(wm), NULL); + priv = gnt_wm_get_instance_private(wm); gnt_wm_add_workspace(GntWM *wm, GntWS *ws)
@@ -1656,22 +1750,22 @@
- if (wm->_list.window) {
- gnt_widget_destroy(wm->_list.window);
+ if (priv->list.window) { + gnt_widget_destroy(priv->list.window); - gnt_ws_hide(wm->cws, wm->nodes);
- gnt_ws_show(wm->cws, wm->nodes);
- gnt_ws_draw_taskbar(wm->cws, TRUE);
+ gnt_ws_hide(priv->cws, priv->nodes); + gnt_ws_show(priv->cws, priv->nodes); + gnt_ws_draw_taskbar(priv->cws, TRUE); - if (!gnt_ws_is_empty(wm->cws)) {
- gnt_wm_raise_window(wm, gnt_ws_get_top_widget(wm->cws));
+ if (!gnt_ws_is_empty(priv->cws)) { + gnt_wm_raise_window(wm, gnt_ws_get_top_widget(priv->cws)); - if (act && g_list_find(act, wm->cws)) {
- act = g_list_remove(act, wm->cws);
+ if (act && g_list_find(act, priv->cws)) { + act = g_list_remove(act, priv->cws); @@ -1686,7 +1780,7 @@
g_return_val_if_fail(GNT_IS_WM(wm), FALSE);
priv = gnt_wm_get_instance_private(wm);
- n = g_list_index(priv->workspaces, wm->cws);
+ n = g_list_index(priv->workspaces, priv->cws); return gnt_wm_switch_workspace(wm, --n);
@@ -1699,7 +1793,7 @@
g_return_val_if_fail(GNT_IS_WM(wm), FALSE);
priv = gnt_wm_get_instance_private(wm);
- n = g_list_index(priv->workspaces, wm->cws);
+ n = g_list_index(priv->workspaces, priv->cws); return gnt_wm_switch_workspace(wm, ++n);
@@ -1718,11 +1812,17 @@
gnt_wm_widget_move_workspace(GntWM *wm, GntWS *neww, GntWidget *widget)
- GntWS *oldw = gnt_wm_widget_find_workspace(wm, widget);
+ GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); + oldw = gnt_wm_widget_find_workspace(wm, widget); if (!oldw || oldw == neww)
- node = g_hash_table_lookup(wm->nodes, widget);
+ node = g_hash_table_lookup(priv->nodes, widget); if (node && node->ws == neww)
@@ -1731,10 +1831,10 @@
gnt_ws_remove_widget(oldw, widget);
gnt_ws_add_widget(neww, widget);
- gnt_ws_widget_show(widget, wm->nodes);
+ if (neww == priv->cws) { + gnt_ws_widget_show(widget, priv->nodes); - gnt_ws_widget_hide(widget, wm->nodes);
+ gnt_ws_widget_hide(widget, priv->nodes); @@ -1783,7 +1883,7 @@
- if (gnt_ws_is_top_widget(wm->cws, wid)) {
+ if (gnt_ws_is_top_widget(priv->cws, wid)) { flag |= GNT_TEXT_FLAG_DIM;
} else if (gnt_widget_get_is_urgent(wid)) {
flag |= GNT_TEXT_FLAG_BOLD;
@@ -1803,26 +1903,28 @@
new_widget_find_workspace(GntWM *wm, GntWidget *widget)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); const gchar *name, *title;
title = gnt_box_get_title(GNT_BOX(widget));
- ret = g_hash_table_find(wm->title_places, (GHRFunc)match_title,
+ ret = g_hash_table_find(priv->title_places, + (GHRFunc)match_title, (gpointer)title); name = gnt_widget_get_name(widget);
- ret = g_hash_table_find(wm->name_places, (GHRFunc)match_title,
+ ret = g_hash_table_find(priv->name_places, (GHRFunc)match_title, - return ret ? ret : wm->cws;
+ return ret ? ret : priv->cws; gnt_wm_new_window_real(GntWM *wm, GntWidget *widget)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); gboolean transient = FALSE;
@@ -1834,7 +1936,7 @@
- g_hash_table_replace(wm->nodes, widget, node);
+ g_hash_table_replace(priv->nodes, widget, node); refresh_node(widget, node, GINT_TO_POINTER(TRUE));
@@ -1870,8 +1972,8 @@
set_panel_userptr(node->panel, node);
- if (node->me != wm->_list.window) {
+ if (!gnt_wm_is_list_window(wm, node->me)) { if (GNT_IS_BOX(widget)) {
ws = new_widget_find_workspace(wm, widget);
@@ -1879,15 +1981,16 @@
gnt_ws_append_widget(ws, widget);
- if (wm->event_stack || node->me == wm->_list.window ||
- gnt_ws_is_top_widget(ws, node->me)) {
+ if (priv->event_stack || gnt_wm_is_list_window(wm, node->me) || + gnt_ws_is_top_widget(ws, node->me)) { gnt_wm_raise_window(wm, node->me);
bottom_panel(node->panel); /* New windows should not grab focus */
gnt_widget_set_focus(node->me, FALSE);
gnt_widget_set_urgent(node->me);
- gnt_ws_widget_hide(widget, wm->nodes);
+ gnt_ws_widget_hide(widget, priv->nodes); @@ -1902,7 +2005,7 @@
widget = gnt_widget_get_toplevel(widget);
if (!gnt_widget_get_visible(widget) ||
- g_hash_table_lookup(wm->nodes, widget)) {
+ g_hash_table_lookup(priv->nodes, widget)) { @@ -1910,7 +2013,7 @@
if (GNT_IS_BOX(widget)) {
const gchar *title = gnt_box_get_title(GNT_BOX(widget));
- if (title && (p = g_hash_table_lookup(wm->positions, title)) != NULL) {
+ if (title && (p = g_hash_table_lookup(priv->positions, title)) != NULL) { sanitize_position(widget, &p->x, &p->y, TRUE);
gnt_widget_set_position(widget, p->x, p->y);
mvwin(gnt_widget_get_window(widget), p->y, p->x);
@@ -1923,7 +2026,7 @@
if (priv->windows && !gnt_widget_get_transient(widget)) {
if ((GNT_IS_BOX(widget) &&
gnt_box_get_title(GNT_BOX(widget))) &&
- wm->_list.window != widget &&
+ !gnt_wm_is_list_window(wm, widget) && gnt_widget_get_take_focus(widget)) {
GNT_TREE(priv->windows->tree), widget,
@@ -1932,13 +2035,13 @@
gnt_box_get_title(GNT_BOX(widget))),
g_object_get_data(G_OBJECT(priv->windows->tree),
update_window_in_list(wm, widget);
- gnt_ws_draw_taskbar(wm->cws, FALSE);
+ gnt_ws_draw_taskbar(priv->cws, FALSE); @@ -1961,11 +2064,11 @@
s = gnt_wm_widget_find_workspace(wm, widget);
- if (g_hash_table_lookup(wm->nodes, widget) == NULL)
+ if (g_hash_table_lookup(priv->nodes, widget) == NULL) g_signal_emit(wm, signals[SIG_CLOSE_WIN], 0, widget);
- g_hash_table_remove(wm->nodes, widget);
+ g_hash_table_remove(priv->nodes, widget); gnt_tree_remove(GNT_TREE(priv->windows->tree), widget);
@@ -1977,15 +2080,15 @@
gnt_ws_remove_widget(s, widget);
- if (!gnt_ws_is_empty(s) && wm->cws == s) {
+ if (!gnt_ws_is_empty(s) && priv->cws == s) { gnt_wm_raise_window(wm, gnt_ws_get_top_widget(s));
- } else if (transient && wm->cws && !gnt_ws_is_empty(wm->cws)) {
- gnt_wm_update_window(wm, gnt_ws_get_top_widget(wm->cws));
+ } else if (transient && priv->cws && !gnt_ws_is_empty(priv->cws)) { + gnt_wm_update_window(wm, gnt_ws_get_top_widget(priv->cws)); - gnt_ws_draw_taskbar(wm->cws, FALSE);
+ gnt_ws_draw_taskbar(priv->cws, FALSE); @@ -1996,6 +2099,7 @@
gboolean gnt_wm_process_input(GntWM *wm, const char *keys)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); keys = gnt_bindable_remap_keys(GNT_BINDABLE(wm), keys);
@@ -2007,10 +2111,10 @@
- if (gnt_ws_is_empty(wm->cws)) {
+ if (gnt_ws_is_empty(priv->cws)) { - return gnt_widget_key_pressed(gnt_ws_get_top_widget(wm->cws), keys);
+ return gnt_widget_key_pressed(gnt_ws_get_top_widget(priv->cws), keys); if (gnt_bindable_perform_action_key(GNT_BINDABLE(wm), keys)) {
@@ -2018,10 +2122,10 @@
/* Do some manual checking */
- if (!gnt_ws_is_empty(wm->cws) && wm->mode != GNT_KP_MODE_NORMAL) {
+ if (!gnt_ws_is_empty(priv->cws) && priv->mode != GNT_KP_MODE_NORMAL) { int xmin = 0, ymin = 0, xmax = getmaxx(stdscr), ymax = getmaxy(stdscr) - 1;
- GntWidget *widget = gnt_ws_get_top_widget(wm->cws);
+ GntWidget *widget = gnt_ws_get_top_widget(priv->cws); gnt_widget_get_position(widget, &x, &y);
@@ -2029,7 +2133,7 @@
- if (wm->mode == GNT_KP_MODE_MOVE) {
+ if (priv->mode == GNT_KP_MODE_MOVE) { if (strcmp(keys, GNT_KEY_LEFT) == 0) {
@@ -2048,7 +2152,7 @@
window_reverse(widget, TRUE, wm);
- } else if (wm->mode == GNT_KP_MODE_RESIZE) {
+ } else if (priv->mode == GNT_KP_MODE_RESIZE) { if (strcmp(keys, GNT_KEY_LEFT) == 0) {
} else if (strcmp(keys, GNT_KEY_RIGHT) == 0) {
@@ -2068,15 +2172,15 @@
if (strcmp(keys, "\r") == 0 || strcmp(keys, "\033") == 0) {
window_reverse(widget, FALSE, wm);
- wm->mode = GNT_KP_MODE_NORMAL;
+ priv->mode = GNT_KP_MODE_NORMAL; /* Escape to close the window-list or action-list window */
if (strcmp(keys, "\033") == 0) {
- if (wm->_list.window) {
- gnt_widget_destroy(wm->_list.window);
+ if (priv->list.window) { + gnt_widget_destroy(priv->list.window); } else if (keys[0] == '\033' && isdigit(keys[1]) && keys[2] == '\0') {
@@ -2093,12 +2197,12 @@
- ret = gnt_widget_key_pressed(GNT_WIDGET(wm->menu), keys);
- else if (wm->_list.window)
- ret = gnt_widget_key_pressed(wm->_list.window, keys);
- else if (!gnt_ws_is_empty(wm->cws)) {
- GntWidget *win = gnt_ws_get_top_widget(wm->cws);
+ ret = gnt_widget_key_pressed(GNT_WIDGET(priv->menu), keys); + } else if (priv->list.window) { + ret = gnt_widget_key_pressed(priv->list.window, keys); + } else if (!gnt_ws_is_empty(priv->cws)) { + GntWidget *win = gnt_ws_get_top_widget(priv->cws); if (GNT_IS_WINDOW(win)) {
GntMenu *menu = gnt_window_get_menu(GNT_WINDOW(win));
@@ -2130,12 +2234,16 @@
void gnt_wm_resize_window(GntWM *wm, GntWidget *widget, int width, int height)
+ GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); widget = gnt_widget_get_toplevel(widget);
- node = g_hash_table_lookup(wm->nodes, widget);
+ node = g_hash_table_lookup(priv->nodes, widget); @@ -2169,6 +2277,7 @@
write_already(gpointer data)
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); @@ -2179,7 +2288,7 @@
gnt_warning("error opening file (%s) to save positions", filename);
fprintf(file, "[positions]\n");
- g_hash_table_foreach(wm->positions, (GHFunc)write_gdi, file);
+ g_hash_table_foreach(priv->positions, (GHFunc)write_gdi, file); @@ -2200,11 +2309,15 @@
void gnt_wm_move_window(GntWM *wm, GntWidget *widget, int x, int y)
+ GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); widget = gnt_widget_get_toplevel(widget);
- node = g_hash_table_lookup(wm->nodes, widget);
+ node = g_hash_table_lookup(priv->nodes, widget); @@ -2223,7 +2336,7 @@
GntPosition *p = g_new0(GntPosition, 1);
GntWidget *wid = node->me;
gnt_widget_get_position(wid, &p->x, &p->y);
- g_hash_table_replace(wm->positions, g_strdup(title), p);
+ g_hash_table_replace(priv->positions, g_strdup(title), p); write_positions_to_file(wm);
@@ -2234,32 +2347,38 @@
gnt_wm_give_focus(GntWM *wm, GntWidget *widget)
- GntNode *node = g_hash_table_lookup(wm->nodes, widget);
+ GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + GntNode *node = g_hash_table_lookup(priv->nodes, widget); gnt_widget_set_is_urgent(widget, FALSE);
- if (widget != wm->_list.window && !GNT_IS_MENU(widget)) {
- gnt_ws_bring_to_front(wm->cws, widget);
+ if (!gnt_wm_is_list_window(wm, widget) && !GNT_IS_MENU(widget)) { + gnt_ws_bring_to_front(priv->cws, widget); - if (wm->_list.window) {
- GntNode *nd = g_hash_table_lookup(wm->nodes, wm->_list.window);
+ if (priv->list.window) { + g_hash_table_lookup(priv->nodes, priv->list.window); - gnt_ws_draw_taskbar(wm->cws, FALSE);
+ gnt_ws_draw_taskbar(priv->cws, FALSE); void gnt_wm_update_window(GntWM *wm, GntWidget *widget)
+ GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); widget = gnt_widget_get_toplevel(widget);
if (!GNT_IS_MENU(widget)) {
@@ -2268,17 +2387,17 @@
ws = gnt_wm_widget_find_workspace(wm, widget);
- node = g_hash_table_lookup(wm->nodes, widget);
+ node = g_hash_table_lookup(priv->nodes, widget); gnt_wm_new_window(wm, widget);
g_signal_emit(wm, signals[SIG_UPDATE_WIN], 0, node);
- if (ws == wm->cws || gnt_widget_get_transient(widget)) {
+ if (ws == priv->cws || gnt_widget_get_transient(widget)) { gnt_wm_copy_win(widget, node);
- gnt_ws_draw_taskbar(wm->cws, FALSE);
+ gnt_ws_draw_taskbar(priv->cws, FALSE); - } else if (ws && ws != wm->cws && gnt_widget_get_is_urgent(widget)) {
+ } else if (ws && ws != priv->cws && gnt_widget_get_is_urgent(widget)) { if (!act || (act && !g_list_find(act, ws)))
act = g_list_prepend(act, ws);
@@ -2303,18 +2422,166 @@
ws = gnt_wm_widget_find_workspace(wm, widget);
gnt_wm_switch_workspace(wm, g_list_index(priv->workspaces, ws));
- g_return_if_fail(wm->cws != NULL);
- gnt_ws_bring_to_front(wm->cws, widget);
+ g_return_if_fail(priv->cws != NULL); + gnt_ws_bring_to_front(priv->cws, widget); g_signal_emit(wm, signals[SIG_GIVE_FOCUS], 0, widget);
-void gnt_wm_set_event_stack(GntWM *wm, gboolean set)
+gnt_wm_foreach(GntWM *wm, GHFunc func, gpointer user_data) + GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); + g_hash_table_foreach(priv->nodes, func, user_data); +gnt_wm_has_window_position(GntWM *wm, const gchar *title) + GntWMPrivate *priv = NULL; + g_return_val_if_fail(GNT_IS_WM(wm), FALSE); + priv = gnt_wm_get_instance_private(wm); + return g_hash_table_lookup(priv->positions, title) != NULL; +gnt_wm_set_mainloop(GntWM *wm, GMainLoop *loop) + GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); +gnt_wm_is_list_window(GntWM *wm, GntWidget *widget) + GntWMPrivate *priv = NULL; + g_return_val_if_fail(GNT_IS_WM(wm), FALSE); + priv = gnt_wm_get_instance_private(wm); + return priv->list.window == widget; +gnt_wm_set_place_by_name(GntWM *wm, const gchar *name, GntWS *ws) + GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); + g_hash_table_replace(priv->name_places, g_strdup(name), ws); +gnt_wm_set_place_by_title(GntWM *wm, const gchar *title, GntWS *ws) + GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); + g_hash_table_replace(priv->title_places, g_strdup(title), ws); +gnt_wm_add_action(GntWM *wm, GntAction *action)
+ GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); + priv->acts = g_list_append(priv->acts, action); +gnt_wm_get_menu(GntWM *wm) + GntWMPrivate *priv = NULL; + g_return_val_if_fail(GNT_IS_WM(wm), NULL); + priv = gnt_wm_get_instance_private(wm); +gnt_wm_set_menu(GntWM *wm, GntMenu *menu) + GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm);
+gnt_wm_get_event_stack(GntWM *wm) + GntWMPrivate *priv = NULL; + g_return_val_if_fail(GNT_IS_WM(wm), FALSE); + priv = gnt_wm_get_instance_private(wm); + return priv->event_stack; +gnt_wm_set_event_stack(GntWM *wm, gboolean set) + GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm); + priv->event_stack = set; +gnt_wm_get_keypress_mode(GntWM *wm) + GntWMPrivate *priv = NULL; + g_return_val_if_fail(GNT_IS_WM(wm), GNT_KP_MODE_NORMAL); + priv = gnt_wm_get_instance_private(wm); +gnt_wm_set_keypress_mode(GntWM *wm, GntKeyPressMode mode) + GntWMPrivate *priv = NULL; + g_return_if_fail(GNT_IS_WM(wm)); + priv = gnt_wm_get_instance_private(wm);