Mercurial > grim > libgnt
changeset 1289:c170d9e55711
Merged in default (pull request #63)
Macro-ify and slightly simplify GntWM
Approved-by: Gary Kramlich
author | Gary Kramlich <grim@reaperworld.com> |
---|---|
date | Sat, 11 May 2019 01:00:16 +0000 |
parents | 9992e39d2493 (current diff) 960964d9add2 (diff) |
children | b54ec8c74501 7def12661316 ce8c67239424 b153641cfe45 |
files | |
diffstat | 2 files changed, 73 insertions(+), 104 deletions(-) [+] |
line wrap: on
line diff
--- a/gntwm.c Fri May 10 20:14:59 2019 -0400 +++ b/gntwm.c Sat May 11 01:00:16 2019 +0000 @@ -132,8 +132,8 @@ static void gnt_wm_win_resized(GntWM *wm, GntNode *node); static void gnt_wm_win_moved(GntWM *wm, GntNode *node); static void gnt_wm_give_focus(GntWM *wm, GntWidget *widget); -static void update_window_in_list(GntWM *wm, GntWidget *wid); -static void shift_window(GntWM *wm, GntWidget *widget, int dir); +static void update_window_in_list(GntWMPrivate *priv, GntWidget *wid); +static void shift_window(GntWMPrivate *priv, GntWidget *widget, int dir); static gboolean workspace_next(GntBindable *wm, GList *n); static gboolean workspace_prev(GntBindable *wm, GList *n); @@ -141,7 +141,7 @@ static int widestringwidth(wchar_t *wide); #endif -static void ensure_normal_mode(GntWM *wm); +static void ensure_normal_mode(GntWMPrivate *priv); static gboolean write_already(gpointer data); static int write_timeout; static time_t last_active_time; @@ -278,10 +278,8 @@ } static gboolean -update_screen(GntWM *wm) +update_screen(GntWMPrivate *priv) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - if (priv->mode == GNT_KP_MODE_WAIT_ON_CHILD) { return TRUE; } @@ -376,9 +374,8 @@ } static void -read_window_positions(GntWM *wm) +read_window_positions(GntWMPrivate *priv) { - 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); GError *error = NULL; @@ -451,8 +448,9 @@ priv->nodes = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_node); 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); + if (gnt_style_get_bool(GNT_STYLE_REMPOS, TRUE)) { + read_window_positions(priv); + } g_timeout_add_seconds(IDLE_CHECK_INTERVAL, check_idle, NULL); time(&last_active_time); gnt_wm_switch_workspace(wm, 0); @@ -475,7 +473,7 @@ } if (priv->mode != GNT_KP_MODE_NORMAL) { - ensure_normal_mode(wm); + ensure_normal_mode(priv); } w = gnt_ws_get_top_widget(priv->cws); @@ -560,7 +558,7 @@ if (node->scroll) { node->scroll--; gnt_wm_copy_win(window, node); - update_screen(wm); + update_screen(priv); } return TRUE; } @@ -587,7 +585,7 @@ if (h - node->scroll > getmaxy(node->window)) { node->scroll++; gnt_wm_copy_win(window, node); - update_screen(wm); + update_screen(priv); } return TRUE; } @@ -604,30 +602,27 @@ if (!gnt_ws_is_empty(priv->cws)) { gnt_widget_destroy(gnt_ws_get_top_widget(priv->cws)); - ensure_normal_mode(wm); + ensure_normal_mode(priv); } return TRUE; } static void -destroy__list(G_GNUC_UNUSED GntWidget *widget, GntWM *wm) +destroy__list(G_GNUC_UNUSED GntWidget *widget, GntWMPrivate *priv) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); - priv->list.window = NULL; priv->list.tree = NULL; priv->windows = NULL; priv->actions = NULL; - update_screen(wm); + update_screen(priv); } static void -setup__list(GntWM *wm) +setup__list(GntWMPrivate *priv) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GntWidget *tree, *win; - ensure_normal_mode(wm); + ensure_normal_mode(priv); 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); @@ -636,7 +631,7 @@ 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); + g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(destroy__list), priv); } static void @@ -659,9 +654,8 @@ } static void -populate_window_list(GntWM *wm, gboolean workspace) +populate_window_list(GntWMPrivate *priv, gboolean workspace) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GList *iter; GntTree *tree = GNT_TREE(priv->windows->tree); if (!workspace) { @@ -673,7 +667,7 @@ gnt_tree_create_row(tree, gnt_box_get_title(box)), NULL); - update_window_in_list(wm, GNT_WIDGET(box)); + update_window_in_list(priv, GNT_WIDGET(box)); } } else { GList *ws = priv->workspaces; @@ -689,17 +683,15 @@ gnt_tree_create_row( tree, gnt_box_get_title(box)), ws->data); - update_window_in_list(wm, GNT_WIDGET(box)); + update_window_in_list(priv, GNT_WIDGET(box)); } } } } static gboolean -window_list_key_pressed(GntWidget *widget, const char *text, GntWM *wm) +window_list_key_pressed(GntWidget *widget, const char *text, GntWMPrivate *priv) { - 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)); switch (text[0]) { @@ -708,20 +700,20 @@ if (GNT_IS_WS(sel)) { /* reorder the workspace. */ } else - shift_window(wm, GNT_WIDGET(sel), -1); + shift_window(priv, GNT_WIDGET(sel), -1); break; case '=': case '.': if (GNT_IS_WS(sel)) { /* reorder the workspace. */ } else - shift_window(wm, GNT_WIDGET(sel), 1); + shift_window(priv, GNT_WIDGET(sel), 1); break; default: return FALSE; } gnt_tree_remove_all(GNT_TREE(widget)); - populate_window_list(wm, GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "workspace"))); + populate_window_list(priv, GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "workspace"))); gnt_tree_set_selected(GNT_TREE(widget), sel); return TRUE; } @@ -733,7 +725,7 @@ { GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GntWidget *tree, *win; - setup__list(wm); + setup__list(priv); priv->windows = &priv->list; win = priv->windows->window; @@ -741,7 +733,7 @@ gnt_box_set_title(GNT_BOX(win), workspace ? "Workspace List" : "Window List"); - populate_window_list(wm, workspace); + populate_window_list(priv, workspace); if (!gnt_ws_is_empty(priv->cws)) { gnt_tree_set_selected(GNT_TREE(tree), gnt_ws_get_top_widget(priv->cws)); @@ -750,7 +742,7 @@ } g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(window_list_activate), wm); - g_signal_connect(G_OBJECT(tree), "key_pressed", G_CALLBACK(window_list_key_pressed), wm); + g_signal_connect(G_OBJECT(tree), "key_pressed", G_CALLBACK(window_list_key_pressed), priv); g_object_set_data(G_OBJECT(tree), "workspace", GINT_TO_POINTER(workspace)); gnt_tree_set_col_width(GNT_TREE(tree), 0, getmaxx(stdscr) / 3); @@ -946,9 +938,8 @@ } static void -shift_window(GntWM *wm, GntWidget *widget, int dir) +shift_window(GntWMPrivate *priv, GntWidget *widget, int dir) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GList *all = gnt_ws_get_list(priv->cws); GList *list = g_list_find(all, widget); int length, pos; @@ -994,7 +985,7 @@ return TRUE; } - shift_window(wm, gnt_ws_get_top_widget(priv->cws), -1); + shift_window(priv, gnt_ws_get_top_widget(priv->cws), -1); return TRUE; } @@ -1012,14 +1003,13 @@ return TRUE; } - shift_window(wm, gnt_ws_get_top_widget(priv->cws), 1); + shift_window(priv, gnt_ws_get_top_widget(priv->cws), 1); return TRUE; } static void -action_list_activate(GntTree *tree, GntWM *wm) +action_list_activate(GntTree *tree, GntWMPrivate *priv) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GntAction *action = gnt_tree_get_selection_data(tree); action->callback(); gnt_widget_destroy(priv->list.window); @@ -1051,7 +1041,7 @@ return TRUE; } - setup__list(wm); + setup__list(priv); priv->actions = &priv->list; win = priv->actions->window; @@ -1067,7 +1057,7 @@ 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); + g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(action_list_activate), priv); n = g_list_length(priv->acts); gnt_widget_set_size(tree, 0, n); gnt_widget_set_position(win, 0, getmaxy(stdscr) - 3 - n); @@ -1118,9 +1108,8 @@ } static void -window_reverse(GntWidget *win, gboolean set, GntWM *wm) +window_reverse(GntWidget *win, gboolean set, GntWMPrivate *priv) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); int i; int w, h; WINDOW *d; @@ -1145,17 +1134,15 @@ for (i = 0; i < h; i += reverse_char(d, i, w-1, set)); gnt_wm_copy_win(win, g_hash_table_lookup(priv->nodes, win)); - update_screen(wm); + update_screen(priv); } static void -ensure_normal_mode(GntWM *wm) +ensure_normal_mode(GntWMPrivate *priv) { - 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); + window_reverse(gnt_ws_get_top_widget(priv->cws), FALSE, priv); } priv->mode = GNT_KP_MODE_NORMAL; } @@ -1175,7 +1162,7 @@ } priv->mode = GNT_KP_MODE_MOVE; - window_reverse(gnt_ws_get_top_widget(priv->cws), TRUE, wm); + window_reverse(gnt_ws_get_top_widget(priv->cws), TRUE, priv); return TRUE; } @@ -1194,7 +1181,7 @@ } priv->mode = GNT_KP_MODE_RESIZE; - window_reverse(gnt_ws_get_top_widget(priv->cws), TRUE, wm); + window_reverse(gnt_ws_get_top_widget(priv->cws), TRUE, priv); return TRUE; } @@ -1239,7 +1226,7 @@ } gnt_ws_draw_taskbar(priv->cws, TRUE); - update_screen(wm); + update_screen(priv); curs_set(0); /* endwin resets the cursor to normal */ keypad(stdscr, 1); @@ -1296,7 +1283,7 @@ link = g_list_find(priv->tagged, widget); if (link) { priv->tagged = g_list_delete_link(priv->tagged, link); - remove_tag(widget, wm); + remove_tag(widget, NULL); return TRUE; } @@ -1318,7 +1305,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, priv->cws, widget); - remove_tag(widget, wm); + remove_tag(widget, NULL); } priv->tagged = NULL; @@ -1753,13 +1740,13 @@ if (priv->list.window) { gnt_widget_destroy(priv->list.window); } - ensure_normal_mode(wm); + ensure_normal_mode(priv); gnt_ws_hide(priv->cws, priv->nodes); priv->cws = s; gnt_ws_show(priv->cws, priv->nodes); gnt_ws_draw_taskbar(priv->cws, TRUE); - update_screen(wm); + update_screen(priv); if (!gnt_ws_is_empty(priv->cws)) { gnt_wm_raise_window(wm, gnt_ws_get_top_widget(priv->cws)); } @@ -1874,9 +1861,8 @@ } static void -update_window_in_list(GntWM *wm, GntWidget *wid) +update_window_in_list(GntWMPrivate *priv, GntWidget *wid) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); GntTextFormatFlags flag = 0; if (priv->windows == NULL) { @@ -2006,7 +1992,7 @@ if (!gnt_widget_get_visible(widget) || g_hash_table_lookup(priv->nodes, widget)) { - update_screen(wm); + update_screen(priv); return; } @@ -2037,16 +2023,18 @@ "workspace") ? priv->cws : NULL); - update_window_in_list(wm, widget); + update_window_in_list(priv, widget); } } gnt_ws_draw_taskbar(priv->cws, FALSE); - update_screen(wm); + update_screen(priv); } void gnt_wm_window_decorate(GntWM *wm, GntWidget *widget) { + g_return_if_fail(GNT_IS_WM(wm)); + g_signal_emit(wm, signals[SIG_DECORATE_WIN], 0, widget); } @@ -2089,19 +2077,23 @@ } gnt_ws_draw_taskbar(priv->cws, FALSE); - update_screen(wm); + update_screen(priv); } -time_t gnt_wm_get_idle_time() +time_t +gnt_wm_get_idle_time(void) { return time(NULL) - last_active_time; } gboolean gnt_wm_process_input(GntWM *wm, const char *keys) { - GntWMPrivate *priv = gnt_wm_get_instance_private(wm); + GntWMPrivate *priv = NULL; gboolean ret = FALSE; + g_return_val_if_fail(GNT_IS_WM(wm), FALSE); + priv = gnt_wm_get_instance_private(wm); + keys = gnt_bindable_remap_keys(GNT_BINDABLE(wm), keys); idle_update = TRUE; @@ -2149,7 +2141,7 @@ } if (ox != x || oy != y) { gnt_screen_move_widget(widget, x, y); - window_reverse(widget, TRUE, wm); + window_reverse(widget, TRUE, priv); return TRUE; } } else if (priv->mode == GNT_KP_MODE_RESIZE) { @@ -2166,12 +2158,12 @@ } if (oh != h || ow != w) { gnt_screen_resize_widget(widget, w, h); - window_reverse(widget, TRUE, wm); + window_reverse(widget, TRUE, priv); return TRUE; } } if (strcmp(keys, "\r") == 0 || strcmp(keys, "\033") == 0) { - window_reverse(widget, FALSE, wm); + window_reverse(widget, FALSE, priv); priv->mode = GNT_KP_MODE_NORMAL; } return TRUE; @@ -2264,7 +2256,7 @@ g_signal_emit(wm, signals[SIG_RESIZED], 0, node); show_panel(node->panel); - update_screen(wm); + update_screen(priv); } static void @@ -2341,7 +2333,7 @@ } } - update_screen(wm); + update_screen(priv); } static void @@ -2367,7 +2359,7 @@ top_panel(nd->panel); } gnt_ws_draw_taskbar(priv->cws, FALSE); - update_screen(wm); + update_screen(priv); } void gnt_wm_update_window(GntWM *wm, GntWidget *widget) @@ -2396,7 +2388,7 @@ if (ws == priv->cws || gnt_widget_get_transient(widget)) { gnt_wm_copy_win(widget, node); gnt_ws_draw_taskbar(priv->cws, FALSE); - update_screen(wm); + update_screen(priv); } 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); @@ -2407,6 +2399,9 @@ gboolean gnt_wm_process_click(GntWM *wm, GntMouseEvent event, int x, int y, GntWidget *widget) { gboolean ret = TRUE; + + g_return_val_if_fail(GNT_IS_WM(wm), FALSE); + idle_update = TRUE; g_signal_emit(wm, signals[SIG_MOUSE_CLICK], 0, event, x, y, widget, &ret); return ret;
--- a/gntwm.h Fri May 10 20:14:59 2019 -0400 +++ b/gntwm.h Sat May 11 01:00:16 2019 +0000 @@ -37,12 +37,7 @@ #include <panel.h> #include <time.h> -#define GNT_TYPE_WM (gnt_wm_get_type()) -#define GNT_WM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_WM, GntWM)) -#define GNT_WM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_WM, GntWMClass)) -#define GNT_IS_WM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_WM)) -#define GNT_IS_WM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_WM)) -#define GNT_WM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_WM, GntWMClass)) +#define GNT_TYPE_WM gnt_wm_get_type() typedef struct _GntNode GntNode; @@ -56,8 +51,6 @@ GntWS *ws; }; -typedef struct _GntWM GntWM; - typedef struct _GntPosition { int x; @@ -75,24 +68,14 @@ void (*callback)(void); } GntAction; +G_BEGIN_DECLS + /** - * GntWM: + * gnt_wm_get_type: * - * Access to any fields is deprecated. See inline comments for replacements. - * + * Returns: GType for GntWM. */ -struct _GntWM -{ - GntBindable inherit; - - /*< private >*/ - void *res1; - void *res2; - void *res3; - void *res4; -}; - -typedef struct _GntWMClass GntWMClass; +G_DECLARE_DERIVABLE_TYPE(GntWM, gnt_wm, GNT, WM, GntBindable) struct _GntWMClass { @@ -149,15 +132,6 @@ void (*res3)(void); }; -G_BEGIN_DECLS - -/** - * gnt_wm_get_type: - * - * Returns: GType for GntWM. - */ -GType gnt_wm_get_type(void); - /** * gnt_wm_get_current_workspace: * @wm: The window-manager.