1 #include "kernel/openbox.h"
2 #include "kernel/menu.h"
3 #include "kernel/action.h"
4 #include "kernel/screen.h"
5 #include "kernel/client.h"
6 #include "kernel/focus.h"
8 #include "render/theme.h"
12 static char *PLUGIN_NAME
= "client_list_menu";
16 } Client_List_Menu_Data
;
20 } Client_List_Desktop_Menu_Data
;
22 #define CLIENT_LIST_MENU(m) ((ObMenu *)m)
23 #define CLIENT_LIST_MENU_DATA(m) ((Client_List_Menu_Data *)((ObMenu *)m)->plugin_data)
25 #define CLIENT_LIST_DESKTOP_MENU(m) ((ObMenu *)m)
26 #define CLIENT_LIST_DESKTOP_MENU_DATA(m) ((Client_List_Desktop_Menu_Data *)((ObMenu *)m)->plugin_data)
28 static void self_update(ObMenu
*self
);
29 static void self_destroy(ObMenu
*self
);
31 void plugin_setup_config() { }
32 void plugin_shutdown() { }
33 void plugin_destroy (ObMenu
*m
) { }
37 ObMenu
*menu
= menu_new_full("Desktops", "client-list-menu", NULL
,
38 NULL
, self_update
, NULL
,
39 NULL
, NULL
, self_destroy
);
41 menu
->plugin
= PLUGIN_NAME
;
42 menu
->plugin_data
= g_new(Client_List_Menu_Data
, 1);
43 CLIENT_LIST_MENU_DATA(menu
)->submenus
= NULL
;
50 plugin_create("client_list_menu");
54 static void desk_update(ObMenu
*self
)
61 desk
= CLIENT_LIST_DESKTOP_MENU_DATA(self
)->desktop
;
63 for (it
= focus_order
[desk
]; it
; it
= g_list_next(it
)) {
64 ObClient
*c
= (ObClient
*)it
->data
;
65 if (client_normal(c
)) {
66 ObAction
* a
= action_from_string("activate");
67 a
->data
.activate
.c
= c
;
68 menu_add_entry(self
, menu_entry_new((c
->iconic
?
77 static void desk_selected(ObMenuEntry
*entry
,
78 unsigned int button
, unsigned int x
, unsigned int y
)
80 entry
->action
->data
.activate
.here
= (button
== 2);
81 entry
->parent
->client
= entry
->action
->data
.activate
.c
;
82 menu_entry_fire(entry
, button
, x
, y
);
85 static void desk_destroy(ObMenu
*self
)
87 g_free(self
->plugin_data
);
90 static void self_update(ObMenu
*self
)
98 n
= g_slist_length(CLIENT_LIST_MENU_DATA(self
)->submenus
);
100 for (i
= 0; i
< screen_num_desktops
; ++i
) {
102 s
= g_strdup_printf("client-list-menu-desktop-%d", i
);
103 deskmenu
= menu_new_full(screen_desktop_names
[i
], s
, self
,
105 desk_update
, desk_selected
, NULL
, NULL
,
109 deskmenu
->plugin
= PLUGIN_NAME
;
110 deskmenu
->plugin_data
= g_new(Client_List_Desktop_Menu_Data
, 1);
111 CLIENT_LIST_DESKTOP_MENU_DATA(deskmenu
)->desktop
= i
;
113 CLIENT_LIST_MENU_DATA(self
)->submenus
=
114 g_slist_append(CLIENT_LIST_MENU_DATA(self
)->submenus
,
118 menu_add_entry(self
, menu_entry_new_submenu(screen_desktop_names
[i
],
122 for (eit
= g_list_nth(self
->entries
, i
); eit
; eit
= enext
) {
123 enext
= g_list_next(eit
);
124 menu_entry_free(eit
->data
);
125 self
->entries
= g_list_delete_link(self
->entries
, eit
);
128 for (sit
= g_slist_nth(CLIENT_LIST_MENU_DATA(self
)->submenus
, i
);
130 snext
= g_slist_next(sit
);
131 menu_free(sit
->data
);
132 CLIENT_LIST_MENU_DATA(self
)->submenus
=
133 g_slist_delete_link(CLIENT_LIST_MENU_DATA(self
)->submenus
, sit
);
139 static void self_destroy(ObMenu
*self
)
141 g_free(self
->plugin_data
);