From 3409148047e2d179fbe9fc5ef194253cc0f0ad85 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 5 May 2007 18:19:26 +0000 Subject: [PATCH] fixes to the properties and net_supported. a bunch weren't supported. better checking at runtime to make sure everything is in the atom. --- openbox/client.c | 10 +++---- openbox/event.c | 2 +- openbox/frame.c | 2 ++ openbox/openbox.c | 2 +- openbox/prop.c | 10 ++++--- openbox/prop.h | 68 +++++++++++++++++++++++++++-------------------- openbox/screen.c | 26 ++++++++++++++---- 7 files changed, 76 insertions(+), 44 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index eb0289ac..741d74de 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1103,7 +1103,7 @@ static void client_get_state(ObClient *self) self->below = TRUE; else if (state[i] == prop_atoms.net_wm_state_demands_attention) self->demands_attention = TRUE; - else if (state[i] == prop_atoms.ob_wm_state_undecorated) + else if (state[i] == prop_atoms.openbox_wm_state_undecorated) self->undecorated = TRUE; } @@ -2105,7 +2105,7 @@ static void client_change_state(ObClient *self) if (self->demands_attention) netstate[num++] = prop_atoms.net_wm_state_demands_attention; if (self->undecorated) - netstate[num++] = prop_atoms.ob_wm_state_undecorated; + netstate[num++] = prop_atoms.openbox_wm_state_undecorated; PROP_SETA32(self->window, net_wm_state, atom, netstate, num); if (self->frame) @@ -3053,7 +3053,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) action = self->demands_attention ? prop_atoms.net_wm_state_remove : prop_atoms.net_wm_state_add; - else if (state == prop_atoms.ob_wm_state_undecorated) + else if (state == prop_atoms.openbox_wm_state_undecorated) action = undecorated ? prop_atoms.net_wm_state_remove : prop_atoms.net_wm_state_add; } @@ -3083,7 +3083,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) self->below = TRUE; } else if (state == prop_atoms.net_wm_state_demands_attention) { demands_attention = TRUE; - } else if (state == prop_atoms.ob_wm_state_undecorated) { + } else if (state == prop_atoms.openbox_wm_state_undecorated) { undecorated = TRUE; } @@ -3110,7 +3110,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) self->below = FALSE; } else if (state == prop_atoms.net_wm_state_demands_attention) { demands_attention = FALSE; - } else if (state == prop_atoms.ob_wm_state_undecorated) { + } else if (state == prop_atoms.openbox_wm_state_undecorated) { undecorated = FALSE; } } diff --git a/openbox/event.c b/openbox/event.c index 793a6fcd..faa1a264 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -570,7 +570,7 @@ static void event_handle_root(XEvent *e) screen_set_num_desktops(d); } else if (msgtype == prop_atoms.net_showing_desktop) { screen_show_desktop(e->xclient.data.l[0] != 0, TRUE); - } else if (msgtype == prop_atoms.ob_control) { + } else if (msgtype == prop_atoms.openbox_control) { if (e->xclient.data.l[0] == 1) ob_reconfigure(); else if (e->xclient.data.l[0] == 2) diff --git a/openbox/frame.c b/openbox/frame.c index f93becb5..0ea6e75a 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -508,6 +508,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, vals[3] = self->size.bottom; PROP_SETA32(self->client->window, net_frame_extents, cardinal, vals, 4); + PROP_SETA32(self->client->window, kde_net_wm_frame_strut, + cardinal, vals, 4); } /* if this occurs while we are focus cycling, the indicator needs to diff --git a/openbox/openbox.c b/openbox/openbox.c index 052929a5..832c2329 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -137,7 +137,7 @@ gint main(gint argc, gchar **argv) * remote_control = 1 -> reconfigure * remote_control = 2 -> restart */ PROP_MSG(RootWindow(ob_display, ob_screen), - ob_control, remote_control, 0, 0, 0); + openbox_control, remote_control, 0, 0, 0); XCloseDisplay(ob_display); exit(EXIT_SUCCESS); } diff --git a/openbox/prop.c b/openbox/prop.c index e622c7dd..9f2d48b4 100644 --- a/openbox/prop.c +++ b/openbox/prop.c @@ -64,6 +64,7 @@ void prop_startup() CREATE(net_current_desktop, "_NET_CURRENT_DESKTOP"); CREATE(net_desktop_names, "_NET_DESKTOP_NAMES"); CREATE(net_active_window, "_NET_ACTIVE_WINDOW"); +/* CREATE(net_restack_window, "_NET_RESTACK_WINDOW");*/ CREATE(net_workarea, "_NET_WORKAREA"); CREATE(net_supporting_wm_check, "_NET_SUPPORTING_WM_CHECK"); CREATE(net_desktop_layout, "_NET_DESKTOP_LAYOUT"); @@ -89,6 +90,7 @@ void prop_startup() /* CREATE(net_wm_pid, "_NET_WM_PID"); */ CREATE(net_wm_allowed_actions, "_NET_WM_ALLOWED_ACTIONS"); CREATE(net_wm_user_time, "_NET_WM_USER_TIME"); + CREATE(kde_net_wm_frame_strut, "_KDE_NET_WM_FRAME_STRUT"); CREATE(net_frame_extents, "_NET_FRAME_EXTENTS"); /* CREATE(net_wm_ping, "_NET_WM_PING"); */ @@ -129,7 +131,7 @@ void prop_startup() CREATE(net_wm_action_change_desktop, "_NET_WM_ACTION_CHANGE_DESKTOP"); CREATE(net_wm_action_close, "_NET_WM_ACTION_CLOSE"); CREATE(net_wm_state_modal, "_NET_WM_STATE_MODAL"); - CREATE(net_wm_state_sticky, "_NET_WM_STATE_STICKY"); +/* CREATE(net_wm_state_sticky, "_NET_WM_STATE_STICKY");*/ CREATE(net_wm_state_maximized_vert, "_NET_WM_STATE_MAXIMIZED_VERT"); CREATE(net_wm_state_maximized_horz, "_NET_WM_STATE_MAXIMIZED_HORZ"); CREATE(net_wm_state_shaded, "_NET_WM_STATE_SHADED"); @@ -155,13 +157,15 @@ void prop_startup() CREATE(kde_wm_change_state, "_KDE_WM_CHANGE_STATE"); CREATE(kde_net_wm_window_type_override,"_KDE_NET_WM_WINDOW_TYPE_OVERRIDE"); +/* CREATE(rootpmapid, "_XROOTPMAP_ID"); CREATE(esetrootid, "ESETROOT_PMAP_ID"); +*/ CREATE(openbox_pid, "_OPENBOX_PID"); CREATE(openbox_rc, "_OPENBOX_RC"); - CREATE(ob_wm_state_undecorated, "_OB_WM_STATE_UNDECORATED"); - CREATE(ob_control, "_OB_CONTROL"); + CREATE(openbox_wm_state_undecorated, "_OB_WM_STATE_UNDECORATED"); + CREATE(openbox_control, "_OB_CONTROL"); } #include diff --git a/openbox/prop.h b/openbox/prop.h index 49c342f6..4ae9e775 100644 --- a/openbox/prop.h +++ b/openbox/prop.h @@ -58,7 +58,33 @@ typedef struct Atoms { /* NETWM atoms */ - Atom net_wm_full_placement; + /* Atoms that are used inside messages - these don't go in net_supported */ + + Atom net_wm_moveresize_size_topleft; + Atom net_wm_moveresize_size_top; + Atom net_wm_moveresize_size_topright; + Atom net_wm_moveresize_size_right; + Atom net_wm_moveresize_size_bottomright; + Atom net_wm_moveresize_size_bottom; + Atom net_wm_moveresize_size_bottomleft; + Atom net_wm_moveresize_size_left; + Atom net_wm_moveresize_move; + Atom net_wm_moveresize_size_keyboard; + Atom net_wm_moveresize_move_keyboard; + Atom net_wm_moveresize_cancel; + + Atom net_wm_state_add; + Atom net_wm_state_remove; + Atom net_wm_state_toggle; + + Atom net_wm_orientation_horz; + Atom net_wm_orientation_vert; + Atom net_wm_topleft; + Atom net_wm_topright; + Atom net_wm_bottomright; + Atom net_wm_bottomleft; + + /* Everything below here must go in net_supported on the root window */ /* root window properties */ Atom net_supported; @@ -70,15 +96,20 @@ typedef struct Atoms { Atom net_current_desktop; Atom net_desktop_names; Atom net_active_window; +/* Atom net_restack_window;*/ Atom net_workarea; Atom net_supporting_wm_check; Atom net_desktop_layout; Atom net_showing_desktop; + /* root window messages */ Atom net_close_window; Atom net_wm_moveresize; Atom net_moveresize_window; + /* helpful hints to apps that aren't used for anything */ + Atom net_wm_full_placement; + /* startup-notification extension */ Atom net_startup_id; @@ -115,19 +146,6 @@ typedef struct Atoms { Atom net_wm_window_type_dialog; Atom net_wm_window_type_normal; - Atom net_wm_moveresize_size_topleft; - Atom net_wm_moveresize_size_top; - Atom net_wm_moveresize_size_topright; - Atom net_wm_moveresize_size_right; - Atom net_wm_moveresize_size_bottomright; - Atom net_wm_moveresize_size_bottom; - Atom net_wm_moveresize_size_bottomleft; - Atom net_wm_moveresize_size_left; - Atom net_wm_moveresize_move; - Atom net_wm_moveresize_size_keyboard; - Atom net_wm_moveresize_move_keyboard; - Atom net_wm_moveresize_cancel; - Atom net_wm_action_move; Atom net_wm_action_resize; Atom net_wm_action_minimize; @@ -139,7 +157,7 @@ typedef struct Atoms { Atom net_wm_action_close; Atom net_wm_state_modal; - Atom net_wm_state_sticky; +/* Atom net_wm_state_sticky;*/ Atom net_wm_state_maximized_vert; Atom net_wm_state_maximized_horz; Atom net_wm_state_shaded; @@ -151,31 +169,23 @@ typedef struct Atoms { Atom net_wm_state_below; Atom net_wm_state_demands_attention; - Atom net_wm_state_add; - Atom net_wm_state_remove; - Atom net_wm_state_toggle; - - Atom net_wm_orientation_horz; - Atom net_wm_orientation_vert; - Atom net_wm_topleft; - Atom net_wm_topright; - Atom net_wm_bottomright; - Atom net_wm_bottomleft; - - /* Extra atoms */ + /* KDE atoms */ Atom kde_wm_change_state; + Atom kde_net_wm_frame_strut; Atom kde_net_wm_window_type_override; +/* Atom rootpmapid; Atom esetrootid; +*/ /* Openbox specific atoms */ + Atom openbox_wm_state_undecorated; Atom openbox_pid; Atom openbox_rc; - Atom ob_wm_state_undecorated; - Atom ob_control; + Atom openbox_control; } Atoms; Atoms prop_atoms; diff --git a/openbox/screen.c b/openbox/screen.c index 8fdbe096..b305e685 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -157,6 +157,7 @@ gboolean screen_annex() XSetWindowAttributes attrib; pid_t pid; gint i, num_support; + Atom *prop_atoms_start, *wm_supported_pos; gulong *supported; /* create the netwm support window */ @@ -205,12 +206,15 @@ gboolean screen_annex() window, screen_support_win); /* set the _NET_SUPPORTED_ATOMS hint */ - num_support = 55; -#ifdef SYNC - num_support += 2; -#endif + + /* this is all the atoms after net_supported in the prop_atoms struct */ + prop_atoms_start = (Atom*)&prop_atoms; + wm_supported_pos = (Atom*)&(prop_atoms.net_supported); + num_support = sizeof(prop_atoms) / sizeof(Atom) - + (wm_supported_pos - prop_atoms_start) - 1; i = 0; supported = g_new(gulong, num_support); + supported[i++] = prop_atoms.net_supporting_wm_check; supported[i++] = prop_atoms.net_wm_full_placement; supported[i++] = prop_atoms.net_current_desktop; supported[i++] = prop_atoms.net_number_of_desktops; @@ -230,6 +234,9 @@ gboolean screen_annex() supported[i++] = prop_atoms.net_wm_visible_icon_name; supported[i++] = prop_atoms.net_wm_desktop; supported[i++] = prop_atoms.net_wm_strut; + supported[i++] = prop_atoms.net_wm_strut_partial; + supported[i++] = prop_atoms.net_wm_icon; + supported[i++] = prop_atoms.net_wm_icon_geometry; supported[i++] = prop_atoms.net_wm_window_type; supported[i++] = prop_atoms.net_wm_window_type_desktop; supported[i++] = prop_atoms.net_wm_window_type_dock; @@ -265,11 +272,20 @@ gboolean screen_annex() supported[i++] = prop_atoms.net_wm_moveresize; supported[i++] = prop_atoms.net_wm_user_time; supported[i++] = prop_atoms.net_frame_extents; + supported[i++] = prop_atoms.net_startup_id; #ifdef SYNC supported[i++] = prop_atoms.net_wm_sync_request; supported[i++] = prop_atoms.net_wm_sync_request_counter; #endif - supported[i++] = prop_atoms.ob_wm_state_undecorated; + + supported[i++] = prop_atoms.kde_wm_change_state; + supported[i++] = prop_atoms.kde_net_wm_frame_strut; + supported[i++] = prop_atoms.kde_net_wm_window_type_override; + + supported[i++] = prop_atoms.openbox_wm_state_undecorated; + supported[i++] = prop_atoms.openbox_pid; + supported[i++] = prop_atoms.openbox_rc; + supported[i++] = prop_atoms.openbox_control; g_assert(i == num_support); PROP_SETA32(RootWindow(ob_display, ob_screen), -- 2.39.2