Awn

Merge lp:~rcryderman/awn/multi-panel-intellihide into lp:awn/0.4

Proposed by moonbeam
Status: Superseded
Proposed branch: lp:~rcryderman/awn/multi-panel-intellihide
Merge into: lp:awn/0.4
Diff against target: 1269 lines (+711/-160)
7 files modified
applets/taskmanager/Makefile.am (+2/-0)
applets/taskmanager/awn-applet-taskmanager.schema-ini.in (+0/-10)
applets/taskmanager/task-manager-panel-connector.c (+358/-0)
applets/taskmanager/task-manager-panel-connector.h (+44/-0)
applets/taskmanager/task-manager.c (+293/-145)
data/avant-window-navigator.schema-ini.in.in (+5/-0)
src/awn-app.vala (+9/-5)
To merge this branch: bzr merge lp:~rcryderman/awn/multi-panel-intellihide
Reviewer Review Type Date Requested Status
Michal Hruby (community) Approve
Review via email: mp+39189@code.launchpad.net

This proposal has been superseded by a proposal from 2010-10-25.

Description of the change

Not perfect but I'd like to get this into trunk so it gets some testing.

To post a comment you must log in.
Revision history for this message
Michal Hruby (mhr3) wrote :

Few comments:
Please get rid of 304, and also the other occurrences of priv->source.
96: Will cause lots of criticals because panel has properties which PanelConnector doesn't.
664: Make sure you remove the notification on panel removed signal.

review: Needs Fixing
769. By moonbeam

* applets/taskmanager/task-manager-panel-connector.c:
* applets/taskmanager/task-manager.c:
 Fixes. removed source, removed a notify

770. By moonbeam

* applets/taskmanager/task-manager-panel-connector.c:
 Suppress debug's due to panel connector not recognizing all the
 exported properties of panel.

Revision history for this message
moonbeam (rcryderman) wrote :

> Few comments:
> Please get rid of 304, and also the other occurrences of priv->source.
> 96: Will cause lots of criticals because panel has properties which
> PanelConnector doesn't.
> 664: Make sure you remove the notification on panel removed signal.

Done.

Revision history for this message
Michal Hruby (mhr3) :
review: Approve

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'applets/taskmanager/Makefile.am'
--- applets/taskmanager/Makefile.am 2010-09-09 23:55:56 +0000
+++ applets/taskmanager/Makefile.am 2010-10-25 13:06:06 +0000
@@ -67,6 +67,8 @@
67 task-manager-api-wrapper.c \67 task-manager-api-wrapper.c \
68 task-manager-api-wrapper.h \68 task-manager-api-wrapper.h \
69 task-manager-api-wrapper-glue.h \69 task-manager-api-wrapper-glue.h \
70 task-manager-panel-connector.c \
71 task-manager-panel-connector.h \
70 task-settings.c \72 task-settings.c \
71 task-settings.h \73 task-settings.h \
72 task-window.c \74 task-window.c \
7375
=== modified file 'applets/taskmanager/awn-applet-taskmanager.schema-ini.in'
--- applets/taskmanager/awn-applet-taskmanager.schema-ini.in 2010-10-22 18:33:54 +0000
+++ applets/taskmanager/awn-applet-taskmanager.schema-ini.in 2010-10-25 13:06:06 +0000
@@ -63,16 +63,6 @@
63default = false63default = false
64_description= Allow grouping of windows together that have different WM_CLIENT_NAME values.64_description= Allow grouping of windows together that have different WM_CLIENT_NAME values.
6565
66[DEFAULT/intellihide]
67type = boolean
68default = true
69_description=Intellihide if hide is enabled for the panel. This will inhibit autohide of the panel if there are no intersecting windows in the relevant window list (see intellihide_mode).
70
71[DEFAULT/intellihide_mode]
72type = integer
73default = 1
74_description=How to generate the list of windows tested for intersection when Intellihide is active. 0.. use windows on active workspace, 1.. use windows of currently focused app.
75
76[DEFAULT/launcher_paths]66[DEFAULT/launcher_paths]
77type = list-string67type = list-string
78default = /usr/share/applications/firefox.desktop;68default = /usr/share/applications/firefox.desktop;
7969
=== added file 'applets/taskmanager/task-manager-panel-connector.c'
--- applets/taskmanager/task-manager-panel-connector.c 1970-01-01 00:00:00 +0000
+++ applets/taskmanager/task-manager-panel-connector.c 2010-10-25 13:06:06 +0000
@@ -0,0 +1,358 @@
1/* task-manager-panel-connector.c */
2
3#include <dbus/dbus-glib.h>
4#include <dbus/dbus-glib-bindings.h>
5#include <unistd.h>
6#include <stdlib.h>
7#include <string.h>
8#include <glib/gstdio.h>
9#include <glib/gi18n.h>
10#include <X11/Xlib.h>
11#include <math.h>
12
13#include "libawn/awn-defines.h"
14#include "libawn/libawn-marshal.h"
15
16#include "task-manager-panel-connector.h"
17
18#ifdef HAVE_CONFIG_H
19#include <config.h>
20#endif
21
22
23G_DEFINE_TYPE (TaskManagerPanelConnector, task_manager_panel_connector, G_TYPE_OBJECT)
24
25#define GET_PRIVATE(o) \
26 (G_TYPE_INSTANCE_GET_PRIVATE ((o), TASK_MANAGER_TYPE_PANEL_CONNECTOR, TaskManagerPanelConnectorPrivate))
27
28typedef struct _TaskManagerPanelConnectorPrivate TaskManagerPanelConnectorPrivate;
29
30struct _TaskManagerPanelConnectorPrivate
31{
32 gint panel_id;
33 gint64 panel_xid;
34
35 DBusGConnection *connection;
36 DBusGProxy *proxy;
37};
38
39
40enum
41{
42 PROP_0,
43 PROP_PANEL_ID,
44 PROP_PANEL_XID,
45};
46
47
48
49static void
50on_prop_changed (DBusGProxy *proxy, const gchar *prop_name,
51 GValue *value, TaskManagerPanelConnector * conn)
52{
53 TaskManagerPanelConnectorPrivate * priv;
54 g_return_if_fail (TASK_MANAGER_IS_PANEL_CONNECTOR (conn));
55 priv = GET_PRIVATE(conn);
56
57 g_object_set_property (G_OBJECT (conn), prop_name, value);
58}
59
60
61static void
62task_manager_panel_connector_get_property (GObject *object, guint property_id,
63 GValue *value, GParamSpec *pspec)
64{
65 TaskManagerPanelConnectorPrivate * priv = GET_PRIVATE(object);
66 switch (property_id)
67 {
68 case PROP_PANEL_ID:
69 g_value_set_int (value, priv->panel_id);
70 break;
71
72 case PROP_PANEL_XID:
73 g_value_set_int64 (value, priv->panel_xid);
74 break;
75 default:
76 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
77 }
78}
79
80static void
81task_manager_panel_connector_set_property (GObject *object, guint property_id,
82 const GValue *value, GParamSpec *pspec)
83{
84 TaskManagerPanelConnectorPrivate * priv = GET_PRIVATE(object);
85 switch (property_id)
86 {
87 case PROP_PANEL_ID:
88 priv->panel_id = g_value_get_int (value);
89 break;
90#ifdef DEBUG
91 /*Debug'd out. Remove this if TaskManagerPanelConnector ever becomes a generic object that
92 supports all the props in panel*/
93 default:
94 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
95#endif
96 }
97}
98
99static void
100task_manager_panel_connector_dispose (GObject *object)
101{
102 G_OBJECT_CLASS (task_manager_panel_connector_parent_class)->dispose (object);
103}
104
105static void
106task_manager_panel_connector_finalize (GObject *object)
107{
108 TaskManagerPanelConnectorPrivate * priv = GET_PRIVATE(object);
109 if (priv->connection)
110 {
111 if (priv->proxy)
112 {
113 g_object_unref (priv->proxy);
114 }
115 dbus_g_connection_unref (priv->connection);
116 priv->connection = NULL;
117 priv->proxy = NULL;
118 }
119
120 G_OBJECT_CLASS (task_manager_panel_connector_parent_class)->finalize (object);
121}
122
123static void
124task_manager_panel_connector_init (TaskManagerPanelConnector *self)
125{
126 TaskManagerPanelConnectorPrivate * priv = GET_PRIVATE(self);
127 GError *error = NULL;
128
129 priv->connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
130 priv->proxy = NULL;
131 priv->panel_xid = 0;
132
133 if (error)
134 {
135 g_warning ("%s", error->message);
136 g_error_free(error);
137 }
138}
139
140static gboolean
141task_manager_panel_connector_do_connect_dbus (GObject * conn)
142{
143 TaskManagerPanelConnectorPrivate * priv = GET_PRIVATE(conn);
144
145 gchar *object_path = g_strdup_printf ("/org/awnproject/Awn/Panel%d",
146 priv->panel_id);
147 if (!priv->proxy)
148 {
149 priv->proxy = dbus_g_proxy_new_for_name (priv->connection,
150 "org.awnproject.Awn",
151 object_path,
152 "org.awnproject.Awn.Panel");
153 }
154 if (!priv->proxy)
155 {
156 g_warning("Could not connect to mothership! Bailing\n");
157 return TRUE;
158 }
159
160 dbus_g_object_register_marshaller (
161 libawn_marshal_VOID__STRING_BOXED,
162 G_TYPE_NONE, G_TYPE_STRING, G_TYPE_VALUE,
163 G_TYPE_INVALID
164 );
165
166 dbus_g_proxy_add_signal (priv->proxy, "PropertyChanged",
167 G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
168 dbus_g_proxy_connect_signal (priv->proxy, "PropertyChanged",
169 G_CALLBACK (on_prop_changed), conn,
170 NULL);
171 // get prop values from Panel
172 DBusGProxy *prop_proxy = dbus_g_proxy_new_from_proxy (
173 priv->proxy, "org.freedesktop.DBus.Properties", NULL
174 );
175
176 if (!prop_proxy)
177 {
178 g_warning("Could not get property values! Bailing\n");
179 }
180
181 GError *error = NULL;
182
183#if HAVE_DBUS_GLIB_080
184 GHashTable *all_props = NULL;
185
186 // doing GetAll reduces DBus lag significantly
187 dbus_g_proxy_call (prop_proxy, "GetAll", &error,
188 G_TYPE_STRING, "org.awnproject.Awn.Panel",
189 G_TYPE_INVALID,
190 dbus_g_type_get_map ("GHashTable", G_TYPE_STRING,
191 G_TYPE_VALUE), &all_props,
192 G_TYPE_INVALID);
193
194 if (error) goto crap_out;
195
196 GHashTableIter iter;
197 gpointer key, value;
198
199 g_hash_table_iter_init (&iter, all_props);
200 while (g_hash_table_iter_next (&iter, &key, &value))
201 {
202 if (strcmp (key, "PanelXid") == 0)
203 {
204 priv->panel_xid = g_value_get_int64 (value);
205 }
206 }
207
208#else
209 GValue panel_xid = {0,};
210
211 dbus_g_proxy_call (prop_proxy, "Get", &error,
212 G_TYPE_STRING, "org.awnproject.Awn.Panel",
213 G_TYPE_STRING, "PanelXid",
214 G_TYPE_INVALID,
215 G_TYPE_VALUE, &panel_xid,
216 G_TYPE_INVALID);
217
218 if (error) goto crap_out;
219
220 if (G_VALUE_HOLDS_INT64 (&panel_xid))
221 {
222 priv->panel_xid = g_value_get_int64 (&panel_xid);
223 }
224
225 g_value_unset (&panel_xid);
226#endif
227 if (prop_proxy) g_object_unref (prop_proxy);
228
229 g_free (object_path);
230 return FALSE;
231
232 crap_out:
233
234 g_warning ("%s", error->message);
235 g_error_free (error);
236 g_free (object_path);
237 if (prop_proxy)
238 {
239 g_object_unref (prop_proxy);
240 }
241 return TRUE;
242}
243
244static void
245task_manager_panel_connector_constructed (GObject *obj)
246{
247 TaskManagerPanelConnector *conn = TASK_MANAGER_PANEL_CONNECTOR(obj);
248 TaskManagerPanelConnectorPrivate *priv = GET_PRIVATE(conn);
249
250 if (priv->panel_id > 0)
251 {
252 task_manager_panel_connector_do_connect_dbus (obj);
253 }
254}
255
256static void
257task_manager_panel_connector_class_init (TaskManagerPanelConnectorClass *klass)
258{
259 GObjectClass *object_class = G_OBJECT_CLASS (klass);
260
261 object_class->get_property = task_manager_panel_connector_get_property;
262 object_class->set_property = task_manager_panel_connector_set_property;
263 object_class->dispose = task_manager_panel_connector_dispose;
264 object_class->finalize = task_manager_panel_connector_finalize;
265 object_class->constructed = task_manager_panel_connector_constructed;
266
267 g_object_class_install_property (object_class,
268 PROP_PANEL_ID,
269 g_param_spec_int ("panel-id",
270 "Panel ID",
271 "The id of AwnPanel this connector connects to",
272 0, G_MAXINT, 0,
273 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
274 G_PARAM_STATIC_STRINGS));
275
276 g_object_class_install_property ( object_class,
277 PROP_PANEL_XID,
278 g_param_spec_int64 ("panel-xid",
279 "Panel XID",
280 "The XID of AwnPanel this connector is connected to",
281 G_MININT64, G_MAXINT64, 0,
282 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
283
284 g_type_class_add_private (klass, sizeof (TaskManagerPanelConnectorPrivate));
285}
286
287TaskManagerPanelConnector*
288task_manager_panel_connector_new (gint id)
289{
290 return g_object_new (TASK_MANAGER_TYPE_PANEL_CONNECTOR,
291 "panel_id",id,
292 NULL);
293}
294
295guint
296task_manager_panel_connector_inhibit_autohide (TaskManagerPanelConnector *conn, const gchar *reason)
297{
298 TaskManagerPanelConnectorPrivate *priv;
299 GError *error = NULL;
300 guint ret = 0;
301
302 g_return_val_if_fail (TASK_MANAGER_IS_PANEL_CONNECTOR (conn), 0);
303 priv = GET_PRIVATE(conn);
304
305 if (!priv->proxy)
306 {
307 return 0;
308 }
309
310 gchar *app_name = g_strdup_printf ("%s:%d", g_get_prgname(), getpid());
311
312 dbus_g_proxy_call (priv->proxy, "InhibitAutohide",
313 &error,
314 G_TYPE_STRING, app_name,
315 G_TYPE_STRING, reason,
316 G_TYPE_INVALID,
317 G_TYPE_UINT, &ret,
318 G_TYPE_INVALID);
319
320 if (app_name) g_free (app_name);
321
322 if (error)
323 {
324 g_warning ("%s", error->message);
325 g_error_free (error);
326 }
327
328 return ret;
329}
330
331void
332task_manager_panel_connector_uninhibit_autohide (TaskManagerPanelConnector *conn, guint cookie)
333{
334 TaskManagerPanelConnectorPrivate *priv;
335 GError *error = NULL;
336
337 g_return_if_fail (TASK_MANAGER_IS_PANEL_CONNECTOR (conn));
338 priv = GET_PRIVATE(conn);
339
340 if (!priv->proxy)
341 {
342 return;
343 }
344
345 dbus_g_proxy_call (priv->proxy, "UninhibitAutohide",
346 &error,
347 G_TYPE_UINT, cookie,
348 G_TYPE_INVALID,
349 G_TYPE_INVALID);
350
351 if (error)
352 {
353 g_warning ("%s", error->message);
354 g_error_free (error);
355 }
356}
357
358
0359
=== added file 'applets/taskmanager/task-manager-panel-connector.h'
--- applets/taskmanager/task-manager-panel-connector.h 1970-01-01 00:00:00 +0000
+++ applets/taskmanager/task-manager-panel-connector.h 2010-10-25 13:06:06 +0000
@@ -0,0 +1,44 @@
1/* task-manager-panel-connector.h */
2
3#ifndef _TASK_MANAGER_PANEL_CONNECTOR
4#define _TASK_MANAGER_PANEL_CONNECTOR
5
6#include <glib-object.h>
7
8G_BEGIN_DECLS
9
10#define TASK_MANAGER_TYPE_PANEL_CONNECTOR task_manager_panel_connector_get_type()
11
12#define TASK_MANAGER_PANEL_CONNECTOR(obj) \
13 (G_TYPE_CHECK_INSTANCE_CAST ((obj), TASK_MANAGER_TYPE_PANEL_CONNECTOR, TaskManagerPanelConnector))
14
15#define TASK_MANAGER_PANEL_CONNECTOR_CLASS(klass) \
16 (G_TYPE_CHECK_CLASS_CAST ((klass), TASK_MANAGER_TYPE_PANEL_CONNECTOR, TaskManagerPanelConnectorClass))
17
18#define TASK_MANAGER_IS_PANEL_CONNECTOR(obj) \
19 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TASK_MANAGER_TYPE_PANEL_CONNECTOR))
20
21#define TASK_MANAGER_IS_PANEL_CONNECTOR_CLASS(klass) \
22 (G_TYPE_CHECK_CLASS_TYPE ((klass), TASK_MANAGER_TYPE_PANEL_CONNECTOR))
23
24#define TASK_MANAGER_PANEL_CONNECTOR_GET_CLASS(obj) \
25 (G_TYPE_INSTANCE_GET_CLASS ((obj), TASK_MANAGER_TYPE_PANEL_CONNECTOR, TaskManagerPanelConnectorClass))
26
27typedef struct {
28 GObject parent;
29} TaskManagerPanelConnector;
30
31typedef struct {
32 GObjectClass parent_class;
33} TaskManagerPanelConnectorClass;
34
35GType task_manager_panel_connector_get_type (void);
36
37guint task_manager_panel_connector_inhibit_autohide (TaskManagerPanelConnector *conn, const gchar *reason);
38void task_manager_panel_connector_uninhibit_autohide (TaskManagerPanelConnector *conn, guint cookie);
39
40TaskManagerPanelConnector* task_manager_panel_connector_new (gint id);
41
42G_END_DECLS
43
44#endif /* _TASK_MANAGER_PANEL_CONNECTOR */
045
=== modified file 'applets/taskmanager/task-manager.c'
--- applets/taskmanager/task-manager.c 2010-07-19 22:28:12 +0000
+++ applets/taskmanager/task-manager.c 2010-10-25 13:06:06 +0000
@@ -47,6 +47,8 @@
47#include "libawn/awn-pixbuf-cache.h"47#include "libawn/awn-pixbuf-cache.h"
48#include "awn-desktop-lookup-cached.h"48#include "awn-desktop-lookup-cached.h"
49#include "task-manager.h"49#include "task-manager.h"
50#include "task-manager-panel-connector.h"
51
50#include "dock-manager-api.h"52#include "dock-manager-api.h"
5153
52#include "task-drag-indicator.h"54#include "task-drag-indicator.h"
@@ -69,20 +71,26 @@
6971
70static GQuark win_quark = 0;72static GQuark win_quark = 0;
7173
74typedef struct
75{
76 DesktopAgnosticConfigClient *panel_instance_client;
77 GdkWindow * foreign_window;
78 GdkRegion * foreign_region;
79 TaskManagerPanelConnector * connector;
80 gint intellihide_mode;
81 guint autohide_cookie;
82} TaskManagerAwnPanelInfo;
83
72struct _TaskManagerPrivate84struct _TaskManagerPrivate
73{85{
74 DesktopAgnosticConfigClient *client;86 DesktopAgnosticConfigClient *client;
87
88 DBusGConnection *connection;
89 DBusGProxy *proxy;
90
75 TaskSettings *settings;91 TaskSettings *settings;
76 WnckScreen *screen;92 WnckScreen *screen;
7793
78 /*Used by Intellihide*/
79 guint autohide_cookie;
80 GdkWindow *awn_gdk_window;
81 GdkRegion * awn_gdk_region;
82
83 guint attention_cookie;
84 guint attention_source;
85
86 /* Dragging properties */94 /* Dragging properties */
87 TaskIcon *dragged_icon;95 TaskIcon *dragged_icon;
88 TaskDragIndicator *drag_indicator;96 TaskDragIndicator *drag_indicator;
@@ -97,19 +105,23 @@
97 105
98 GHashTable *win_table;106 GHashTable *win_table;
99 GHashTable *desktops_table;107 GHashTable *desktops_table;
108 GHashTable *intellihide_panel_instances;
109
100 /*110 /*
101 Used during grouping configuration changes for optimization purposes111 Used during grouping configuration changes for optimization purposes
102 */112 */
103 GList *grouping_list;113 GList *grouping_list;
104 /* Properties */114 /* Properties */
105 GValueArray *launcher_paths;115 GValueArray *launcher_paths;
116
117 guint attention_cookie;
118 guint attention_source;
119
106 gboolean show_all_windows;120 gboolean show_all_windows;
107 gboolean only_show_launchers;121 gboolean only_show_launchers;
108 gboolean drag_and_drop;122 gboolean drag_and_drop;
109 gboolean grouping;123 gboolean grouping;
110 gboolean intellihide;
111 gboolean icon_grouping;124 gboolean icon_grouping;
112 gint intellihide_mode;
113 gint match_strength;125 gint match_strength;
114 gint attention_autohide_timer;126 gint attention_autohide_timer;
115 127
@@ -128,6 +140,7 @@
128140
129enum141enum
130{142{
143 INTELLIHIDE_NONE,
131 INTELLIHIDE_WORKSPACE,144 INTELLIHIDE_WORKSPACE,
132 INTELLIHIDE_APP,145 INTELLIHIDE_APP,
133 INTELLIHIDE_GROUP 146 INTELLIHIDE_GROUP
@@ -144,11 +157,8 @@
144 PROP_GROUPING,157 PROP_GROUPING,
145 PROP_ICON_GROUPING,158 PROP_ICON_GROUPING,
146 PROP_MATCH_STRENGTH,159 PROP_MATCH_STRENGTH,
147 PROP_INTELLIHIDE,
148 PROP_INTELLIHIDE_MODE,
149 PROP_ATTENTION_AUTOHIDE_TIMER,160 PROP_ATTENTION_AUTOHIDE_TIMER,
150 PROP_ATTENTION_REQUIRED_REMINDER,161 PROP_ATTENTION_REQUIRED_REMINDER
151 PROP_ATTENTION_REQUIED_REMINDER_ID
152};162};
153163
154164
@@ -205,6 +215,10 @@
205static void task_manager_active_workspace_changed_cb (WnckScreen *screen,215static void task_manager_active_workspace_changed_cb (WnckScreen *screen,
206 WnckWorkspace *previous_space,216 WnckWorkspace *previous_space,
207 TaskManager * manager);217 TaskManager * manager);
218static void task_manager_check_for_intersection (TaskManager * manager,
219 WnckWorkspace * space,
220 WnckApplication * app);
221
208static void task_manager_win_geom_changed_cb (WnckWindow *window, 222static void task_manager_win_geom_changed_cb (WnckWindow *window,
209 TaskManager * manager);223 TaskManager * manager);
210static void task_manager_win_closed_cb (WnckScreen *screen,224static void task_manager_win_closed_cb (WnckScreen *screen,
@@ -219,6 +233,11 @@
219233
220static gboolean _attention_required_reminder_cb (TaskManager * manager);234static gboolean _attention_required_reminder_cb (TaskManager * manager);
221235
236static void task_manager_intellihide_change_cb (const char* group,
237 const char* key,
238 GValue* value,
239 int * user_data);
240
222typedef enum 241typedef enum
223{242{
224 TASK_MANAGER_ERROR_UNSUPPORTED_WINDOW_TYPE,243 TASK_MANAGER_ERROR_UNSUPPORTED_WINDOW_TYPE,
@@ -282,14 +301,6 @@
282 g_value_set_boolean (value, manager->priv->icon_grouping);301 g_value_set_boolean (value, manager->priv->icon_grouping);
283 break;302 break;
284303
285 case PROP_INTELLIHIDE:
286 g_value_set_boolean (value, manager->priv->intellihide);
287 break;
288
289 case PROP_INTELLIHIDE_MODE:
290 g_value_set_int (value, manager->priv->intellihide_mode);
291 break;
292
293 case PROP_MATCH_STRENGTH:304 case PROP_MATCH_STRENGTH:
294 g_value_set_int (value, manager->priv->match_strength);305 g_value_set_int (value, manager->priv->match_strength);
295 break;306 break;
@@ -315,6 +326,8 @@
315{326{
316 TaskManager *manager = TASK_MANAGER (object);327 TaskManager *manager = TASK_MANAGER (object);
317328
329 g_return_if_fail (TASK_IS_MANAGER (object));
330
318 switch (prop_id)331 switch (prop_id)
319 {332 {
320 case PROP_SHOW_ALL_WORKSPACES:333 case PROP_SHOW_ALL_WORKSPACES:
@@ -351,25 +364,7 @@
351 case PROP_ICON_GROUPING:364 case PROP_ICON_GROUPING:
352 manager->priv->icon_grouping = g_value_get_boolean (value);365 manager->priv->icon_grouping = g_value_get_boolean (value);
353 break;366 break;
354 367
355 case PROP_INTELLIHIDE:
356 /* TODO move into a function */
357 manager->priv->intellihide = g_value_get_boolean (value);
358 if (!manager->priv->intellihide && manager->priv->autohide_cookie)
359 {
360 awn_applet_uninhibit_autohide (AWN_APPLET(manager), manager->priv->autohide_cookie);
361 manager->priv->autohide_cookie = 0;
362 }
363 if (manager->priv->intellihide && !manager->priv->autohide_cookie)
364 {
365 manager->priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager),"Intellihide" );
366 }
367 break;
368
369 case PROP_INTELLIHIDE_MODE:
370 manager->priv->intellihide_mode = g_value_get_int (value);
371 break;
372
373 case PROP_ATTENTION_AUTOHIDE_TIMER:368 case PROP_ATTENTION_AUTOHIDE_TIMER:
374 manager->priv->attention_autohide_timer = g_value_get_int (value);369 manager->priv->attention_autohide_timer = g_value_get_int (value);
375 break;370 break;
@@ -395,16 +390,108 @@
395}390}
396391
397static void392static void
393_delete_panel_info_cb (TaskManagerAwnPanelInfo * panel_info)
394{
395 g_object_unref (panel_info->connector);
396 g_free (panel_info);
397}
398
399static void
400_on_panel_added (DBusGProxy *proxy,guint panel_id,TaskManager *applet)
401{
402 TaskManagerPrivate *priv = TASK_MANAGER_GET_PRIVATE (applet);
403 GError * error = NULL;
404 TaskManagerAwnPanelInfo * panel_info = NULL;
405 gchar * uid = g_strdup_printf("-999%d",panel_id);
406
407 g_assert (!g_hash_table_lookup (priv->intellihide_panel_instances,GINT_TO_POINTER (panel_id)));
408 panel_info = g_malloc0 (sizeof (TaskManagerAwnPanelInfo) );
409 panel_info->connector = task_manager_panel_connector_new (panel_id);
410 g_free (uid);
411 panel_info->panel_instance_client = awn_config_get_default (panel_id, NULL);
412 panel_info->intellihide_mode = desktop_agnostic_config_client_get_int (
413 panel_info->panel_instance_client,
414 "panel",
415 "intellihide_mode",
416 &error);
417 if (error)
418 {
419 g_debug ("%s: error accessing intellihide_mode. \"%s\"",__func__,error->message);
420 g_error_free (error);
421 error = NULL;
422 }
423 desktop_agnostic_config_client_notify_add (panel_info->panel_instance_client,
424 "panel",
425 "intellihide_mode",
426 (DesktopAgnosticConfigNotifyFunc)task_manager_intellihide_change_cb,
427 &panel_info->intellihide_mode,
428 &error);
429 if (error)
430 {
431 g_debug ("%s: error binding intellihide_mode. \"%s\"",__func__,error->message);
432 g_error_free (error);
433 error = NULL;
434 }
435
436 if (!panel_info->intellihide_mode && panel_info->autohide_cookie)
437 {
438 task_manager_panel_connector_uninhibit_autohide (panel_info->connector, panel_info->autohide_cookie);
439 panel_info->autohide_cookie = 0;
440 }
441 if (panel_info->intellihide_mode && !panel_info->autohide_cookie)
442 {
443 panel_info->autohide_cookie = task_manager_panel_connector_inhibit_autohide (panel_info->connector,"Intellihide" );
444 }
445
446 g_hash_table_insert (priv->intellihide_panel_instances,GINT_TO_POINTER(panel_id),panel_info);
447}
448
449static void
450_on_panel_removed (DBusGProxy *proxy,guint panel_id,TaskManager * applet)
451{
452 TaskManagerPrivate *priv = TASK_MANAGER_GET_PRIVATE (applet);
453 TaskManagerAwnPanelInfo * panel_info = g_hash_table_lookup (priv->intellihide_panel_instances,GINT_TO_POINTER (panel_id));
454
455 desktop_agnostic_config_client_remove_instance (panel_info->panel_instance_client);
456 g_assert (g_hash_table_remove (priv->intellihide_panel_instances,GINT_TO_POINTER (panel_id)));
457}
458
459static void
398task_manager_constructed (GObject *object)460task_manager_constructed (GObject *object)
399{461{
400 TaskManagerPrivate *priv;462 TaskManagerPrivate *priv;
401 GtkWidget *widget;463 GtkWidget *widget;
464 GError *error=NULL;
465 GStrv panel_paths;
402 466
403 G_OBJECT_CLASS (task_manager_parent_class)->constructed (object);467 G_OBJECT_CLASS (task_manager_parent_class)->constructed (object);
404 468
405 priv = TASK_MANAGER_GET_PRIVATE (object);469 priv = TASK_MANAGER_GET_PRIVATE (object);
406 widget = GTK_WIDGET (object);470 widget = GTK_WIDGET (object);
407471
472 priv->proxy = dbus_g_proxy_new_for_name (priv->connection,
473 "org.awnproject.Awn",
474 "/org/awnproject/Awn",
475 "org.awnproject.Awn.App");
476 if (!priv->proxy)
477 {
478 g_warning("%s: Could not connect to mothership!\n",__func__);
479 }
480 else
481 {
482 dbus_g_proxy_add_signal (priv->proxy, "PanelAdded",
483 G_TYPE_INT, G_TYPE_INVALID);
484 dbus_g_proxy_add_signal (priv->proxy, "PanelRemoved",
485 G_TYPE_INT, G_TYPE_INVALID);
486 dbus_g_proxy_connect_signal (priv->proxy, "PanelAdded",
487 G_CALLBACK (_on_panel_added), object,
488 NULL);
489 dbus_g_proxy_connect_signal (priv->proxy, "PanelRemoved",
490 G_CALLBACK (_on_panel_removed), object,
491 NULL);
492
493 }
494
408 /*495 /*
409 Set the cache size of our AwnPixbufCache to something a bit bigger.496 Set the cache size of our AwnPixbufCache to something a bit bigger.
410497
@@ -415,9 +502,12 @@
415 NULL);502 NULL);
416503
417 priv->desktops_table = g_hash_table_new_full (g_str_hash,g_str_equal,g_free,g_free);504 priv->desktops_table = g_hash_table_new_full (g_str_hash,g_str_equal,g_free,g_free);
505 priv->intellihide_panel_instances = g_hash_table_new_full (g_direct_hash,g_direct_equal,
506 NULL,
507 (GDestroyNotify)_delete_panel_info_cb);
418508
419 priv->client = awn_config_get_default_for_applet (AWN_APPLET (object), NULL);509 priv->client = awn_config_get_default_for_applet (AWN_APPLET (object), NULL);
420510
421 /* Connect up the important bits */511 /* Connect up the important bits */
422 desktop_agnostic_config_client_bind (priv->client,512 desktop_agnostic_config_client_bind (priv->client,
423 DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,513 DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
@@ -454,21 +544,9 @@
454 "icon_grouping",544 "icon_grouping",
455 object, "icon_grouping", TRUE,545 object, "icon_grouping", TRUE,
456 DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,546 DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
457 NULL);
458 desktop_agnostic_config_client_bind (priv->client,
459 DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
460 "intellihide",
461 object, "intellihide", TRUE,
462 DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
463 NULL); 547 NULL);
464 desktop_agnostic_config_client_bind (priv->client,548 desktop_agnostic_config_client_bind (priv->client,
465 DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,549 DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
466 "intellihide_mode",
467 object, "intellihide_mode", TRUE,
468 DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
469 NULL);
470 desktop_agnostic_config_client_bind (priv->client,
471 DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
472 "match_strength",550 "match_strength",
473 object, "match_strength", TRUE,551 object, "match_strength", TRUE,
474 DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,552 DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
@@ -495,6 +573,32 @@
495573
496 /* DBus interface */574 /* DBus interface */
497 priv->dbus_proxy = task_manager_dispatcher_new (TASK_MANAGER (object));575 priv->dbus_proxy = task_manager_dispatcher_new (TASK_MANAGER (object));
576
577 if (priv->proxy)
578 {
579 dbus_g_proxy_call (priv->proxy, "GetPanels",
580 &error,
581 G_TYPE_INVALID,
582 G_TYPE_STRV, &panel_paths,
583 G_TYPE_INVALID);
584 if (error)
585 {
586 g_debug ("%s: %s",__func__,error->message);
587 g_error_free (error);
588 error = NULL;
589 }
590 else
591 {
592 for (gint i=0; panel_paths[i];i++)
593 {
594 //strlen is like this as a reminder.
595 _on_panel_added (priv->proxy,
596 atoi(panel_paths[i] + strlen("/org/awnproject/Awn/Panel")),
597 TASK_MANAGER(object));
598
599 }
600 }
601 }
498}602}
499603
500static void604static void
@@ -555,22 +659,6 @@
555 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);659 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
556 g_object_class_install_property (obj_class, PROP_ICON_GROUPING, pspec);660 g_object_class_install_property (obj_class, PROP_ICON_GROUPING, pspec);
557661
558 pspec = g_param_spec_boolean ("intellihide",
559 "intellihide",
560 "Intellihide",
561 TRUE,
562 G_PARAM_READWRITE);
563 g_object_class_install_property (obj_class, PROP_INTELLIHIDE, pspec);
564
565 pspec = g_param_spec_int ("intellihide_mode",
566 "intellihide mode",
567 "Intellihide mode",
568 0,
569 2,
570 1,
571 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
572 g_object_class_install_property (obj_class, PROP_INTELLIHIDE_MODE, pspec);
573
574 pspec = g_param_spec_int ("match_strength",662 pspec = g_param_spec_int ("match_strength",
575 "match_strength",663 "match_strength",
576 "How radical matching is applied for grouping items",664 "How radical matching is applied for grouping items",
@@ -619,9 +707,10 @@
619task_manager_init (TaskManager *manager)707task_manager_init (TaskManager *manager)
620{708{
621 TaskManagerPrivate *priv;709 TaskManagerPrivate *priv;
622 710 GError *error = NULL;
711
623 priv = manager->priv = TASK_MANAGER_GET_PRIVATE (manager);712 priv = manager->priv = TASK_MANAGER_GET_PRIVATE (manager);
624713
625 priv->screen = wnck_screen_get_default ();714 priv->screen = wnck_screen_get_default ();
626 priv->launcher_paths = NULL;715 priv->launcher_paths = NULL;
627 priv->hidden_list = NULL;716 priv->hidden_list = NULL;
@@ -647,6 +736,14 @@
647 priv->dragged_icon = NULL;736 priv->dragged_icon = NULL;
648 priv->drag_timeout = 0;737 priv->drag_timeout = 0;
649738
739 priv->connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
740 priv->proxy = NULL;
741 if (error)
742 {
743 g_warning ("%s", error->message);
744 g_error_free(error);
745 }
746
650 /* connect to the relevent WnckScreen signals */747 /* connect to the relevent WnckScreen signals */
651 g_signal_connect (priv->screen, "window-opened", 748 g_signal_connect (priv->screen, "window-opened",
652 G_CALLBACK (on_window_opened), manager);749 G_CALLBACK (on_window_opened), manager);
@@ -755,16 +852,25 @@
755 desktop_agnostic_config_client_unbind_all_for_object (priv->client,852 desktop_agnostic_config_client_unbind_all_for_object (priv->client,
756 object,853 object,
757 NULL);854 NULL);
855 if (priv->connection)
856 {
857 if (priv->proxy) g_object_unref (priv->proxy);
858 dbus_g_connection_unref (priv->connection);
859 priv->connection = NULL;
860 priv->proxy = NULL;
861 }
862
863 /*
758 if (priv->autohide_cookie)864 if (priv->autohide_cookie)
759 { 865 {
760 awn_applet_uninhibit_autohide (AWN_APPLET(object), priv->autohide_cookie);866 awn_applet_uninhibit_autohide (AWN_APPLET(object), priv->autohide_cookie);
761 priv->autohide_cookie = 0;867 priv->autohide_cookie = 0;
762 }868 }*/
763 if (priv->awn_gdk_window)869/* if (priv->awn_gdk_window)
764 {870 {
765 g_object_unref (priv->awn_gdk_window);871 g_object_unref (priv->awn_gdk_window);
766 priv->awn_gdk_window = NULL;872 priv->awn_gdk_window = NULL;
767 }873 }*/
768874
769 G_OBJECT_CLASS (task_manager_parent_class)->dispose (object);875 G_OBJECT_CLASS (task_manager_parent_class)->dispose (object);
770}876}
@@ -1734,14 +1840,22 @@
1734 g_value_array_free (launcher_paths);1840 g_value_array_free (launcher_paths);
1735}1841}
17361842
1843static void
1844task_manager_intellihide_change_cb (const char* group,
1845 const char* key,
1846 GValue* value,
1847 int * user_data)
1848{
1849 *user_data = g_value_get_int (value);
1850}
1851
1737/*1852/*
1738 * Checks when launchers got added/removed in the list in gconf/file.1853 * Checks when launchers got added/removed in the list in gconf/file.
1739 * It removes the launchers from the task-icons and add those1854 * It removes the launchers from the task-icons and add those
1740 * that aren't already on the bar.1855 * that aren't already on the bar.
1741 */1856 */
1742static void1857static void
1743task_manager_refresh_launcher_paths (TaskManager *manager,1858task_manager_refresh_launcher_paths (TaskManager *manager, GValueArray *list)
1744 GValueArray *list)
1745{1859{
1746 TaskManagerPrivate *priv;1860 TaskManagerPrivate *priv;
17471861
@@ -2434,14 +2548,9 @@
2434 return region;2548 return region;
2435}2549}
24362550
2437/*
2438 Governs the panel autohide when Intellihide is enabled.
2439 If a window in the relevant window list intersects with the awn panel then
2440 autohide will be uninhibited otherwise it will be inhibited.
2441 */
2442
2443static void2551static void
2444task_manager_check_for_intersection (TaskManager * manager,2552task_manager_check_for_panel_instance_intersection (TaskManager * manager,
2553 TaskManagerAwnPanelInfo * panel_info,
2445 WnckWorkspace * space,2554 WnckWorkspace * space,
2446 WnckApplication * app)2555 WnckApplication * app)
2447{2556{
@@ -2451,35 +2560,24 @@
2451 gboolean intersect = FALSE;2560 gboolean intersect = FALSE;
2452 GdkRectangle awn_rect;2561 GdkRectangle awn_rect;
2453 gint depth;2562 gint depth;
2454 gint64 xid;
2455 GdkRegion * updated_region;2563 GdkRegion * updated_region;
2456
2457 g_return_if_fail (TASK_IS_MANAGER (manager));2564 g_return_if_fail (TASK_IS_MANAGER (manager));
2458 priv = manager->priv;2565 priv = manager->priv;
24592566
2460 /*2567 gdk_window_get_geometry (panel_info->foreign_window,&awn_rect.x,
2461 Generate a GdkRegion for the awn panel_size
2462 */
2463 if (!priv->awn_gdk_window)
2464 {
2465 g_object_get (manager, "panel-xid", &xid, NULL);
2466 priv->awn_gdk_window = gdk_window_foreign_new ( xid);
2467 }
2468 g_return_if_fail (priv->awn_gdk_window);
2469 gdk_window_get_geometry (priv->awn_gdk_window,&awn_rect.x,
2470 &awn_rect.y,&awn_rect.width,2568 &awn_rect.y,&awn_rect.width,
2471 &awn_rect.height,&depth); 2569 &awn_rect.height,&depth);
2472 /*2570 /*
2473 gdk_window_get_geometry gives us an x,y or 0,02571 gdk_window_get_geometry gives us an x,y or 0,0
2474 Fix that using get root origin.2572 Fix that using get root origin.
2475 */2573 */
2476 gdk_window_get_root_origin (priv->awn_gdk_window,&awn_rect.x,&awn_rect.y);2574 gdk_window_get_root_origin (panel_info->foreign_window,&awn_rect.x,&awn_rect.y);
2477 /*2575 /*
2478 We cache the region for reuse for situations where the input mask is an empty2576 We cache the region for reuse for situations where the input mask is an empty
2479 region when the panel is hidden. In that case we reuse the last good 2577 region when the panel is hidden. In that case we reuse the last good
2480 region.2578 region.
2481 */2579 */
2482 updated_region = xutils_get_input_shape (priv->awn_gdk_window);2580 updated_region = xutils_get_input_shape (panel_info->foreign_window);
2483 g_return_if_fail (updated_region);2581 g_return_if_fail (updated_region);
2484 if (gdk_region_empty(updated_region))2582 if (gdk_region_empty(updated_region))
2485 {2583 {
@@ -2487,18 +2585,18 @@
2487 }2585 }
2488 else2586 else
2489 {2587 {
2490 if (priv->awn_gdk_region)2588 if (panel_info->foreign_region)
2491 {2589 {
2492 gdk_region_destroy (priv->awn_gdk_region);2590 gdk_region_destroy (panel_info->foreign_region);
2493 }2591 }
2494 priv->awn_gdk_region = updated_region; 2592 panel_info->foreign_region = updated_region;
2495 gdk_region_offset (priv->awn_gdk_region,awn_rect.x,awn_rect.y); 2593 gdk_region_offset (panel_info->foreign_region,awn_rect.x,awn_rect.y);
2496 }2594 }
2497 2595
2498 /*2596 /*
2499 Get the list of windows to check for intersection2597 Get the list of windows to check for intersection
2500 */2598 */
2501 switch (priv->intellihide_mode)2599 switch (panel_info->intellihide_mode)
2502 {2600 {
2503 case INTELLIHIDE_WORKSPACE:2601 case INTELLIHIDE_WORKSPACE:
2504 windows = wnck_screen_get_windows (priv->screen);2602 windows = wnck_screen_get_windows (priv->screen);
@@ -2506,7 +2604,14 @@
2506 case INTELLIHIDE_GROUP: /*TODO... Implement this for now same as app*/2604 case INTELLIHIDE_GROUP: /*TODO... Implement this for now same as app*/
2507 case INTELLIHIDE_APP:2605 case INTELLIHIDE_APP:
2508 default:2606 default:
2509 windows = wnck_application_get_windows (app);2607 if (app)
2608 {
2609 windows = wnck_application_get_windows (app);
2610 }
2611 else
2612 {
2613 windows = wnck_screen_get_windows (priv->screen);
2614 }
2510 break;2615 break;
2511 }2616 }
2512 2617
@@ -2543,7 +2648,7 @@
2543 &win_rect.y,&win_rect.width,2648 &win_rect.y,&win_rect.width,
2544 &win_rect.height);2649 &win_rect.height);
25452650
2546 if (gdk_region_rect_in (priv->awn_gdk_region, &win_rect) != 2651 if (gdk_region_rect_in (panel_info->foreign_region, &win_rect) !=
2547 GDK_OVERLAP_RECTANGLE_OUT)2652 GDK_OVERLAP_RECTANGLE_OUT)
2548 {2653 {
2549#ifdef DEBUG2654#ifdef DEBUG
@@ -2558,28 +2663,94 @@
2558 /*2663 /*
2559 Allow panel to hide (if necessary)2664 Allow panel to hide (if necessary)
2560 */2665 */
2561 if (intersect && priv->autohide_cookie)2666 if (intersect && panel_info->autohide_cookie)
2562 { 2667 {
2563 awn_applet_uninhibit_autohide (AWN_APPLET(manager), priv->autohide_cookie);2668 task_manager_panel_connector_uninhibit_autohide (panel_info->connector, panel_info->autohide_cookie);
2564#ifdef DEBUG2669#ifdef DEBUG
2565 g_debug ("me eat cookie: %u",priv->autohide_cookie);2670 g_debug ("me eat cookie: %u",panel_info->autohide_cookie);
2566#endif2671#endif
2567 priv->autohide_cookie = 0;2672 panel_info->autohide_cookie = 0;
2568 }2673 }
2569 2674
2570 /*2675 /*
2571 Inhibit Hide if not already doing so2676 Inhibit Hide if not already doing so
2572 */2677 */
2573 if (!intersect && !priv->autohide_cookie)2678 if (!intersect && !panel_info->autohide_cookie)
2574 {2679 {
2575 priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager), "Intellihide");2680 gchar * identifier = g_strdup_printf ("Intellihide:applet_conector=%p",panel_info->connector);
2681 panel_info->autohide_cookie = task_manager_panel_connector_inhibit_autohide (panel_info->connector, identifier);
2682 g_free (identifier);
2576#ifdef DEBUG 2683#ifdef DEBUG
2577 g_debug ("cookie is %u",priv->autohide_cookie);2684 g_debug ("cookie is %u",panel_info->autohide_cookie);
2578#endif2685#endif
2579 }2686 }
25802687
2581}2688}
25822689
2690static gboolean
2691_waiting_for_panel_dbus (TaskManager * manager)
2692{
2693 TaskManagerPrivate *priv;
2694
2695 g_return_val_if_fail (TASK_IS_MANAGER (manager),FALSE);
2696 priv = manager->priv;
2697
2698 task_manager_check_for_intersection (manager,
2699 wnck_screen_get_active_workspace (priv->screen),
2700 wnck_application_get (wnck_window_get_xid(wnck_screen_get_active_window (priv->screen))));
2701 return FALSE;
2702}
2703/*
2704 Governs the panel autohide when Intellihide is enabled.
2705 If a window in the relevant window list intersects with the awn panel then
2706 autohide will be uninhibited otherwise it will be inhibited.
2707 */
2708
2709static void
2710task_manager_check_for_intersection (TaskManager * manager,
2711 WnckWorkspace * space,
2712 WnckApplication * app)
2713{
2714 TaskManagerPrivate *priv;
2715 gint64 xid;
2716 GHashTableIter iter;
2717 gpointer key,value;
2718
2719 g_return_if_fail (TASK_IS_MANAGER (manager));
2720 priv = manager->priv;
2721
2722 g_hash_table_iter_init (&iter, priv->intellihide_panel_instances);
2723 while (g_hash_table_iter_next (&iter, &key, &value) )
2724 {
2725 TaskManagerAwnPanelInfo * panel_info = value;
2726 g_object_get (panel_info->connector, "panel-xid", &xid, NULL);
2727 if (!xid)
2728 {
2729 g_timeout_add (1000,(GSourceFunc)_waiting_for_panel_dbus,manager);
2730 }
2731 else
2732 {
2733 if (!panel_info->foreign_window)
2734 {
2735 panel_info->foreign_window = gdk_window_foreign_new ( xid);
2736 }
2737 if (panel_info->intellihide_mode)
2738 {
2739 task_manager_check_for_panel_instance_intersection(manager,
2740 panel_info,
2741 space,
2742 app);
2743 }
2744 else if ( !panel_info->intellihide_mode && panel_info->autohide_cookie)
2745 {
2746 task_manager_panel_connector_uninhibit_autohide (panel_info->connector, panel_info->autohide_cookie);
2747 panel_info->autohide_cookie = 0;
2748 }
2749 }
2750 }
2751 return;
2752}
2753
2583/*2754/*
2584 Active window has changed. If intellhide is active we need to check for 2755 Active window has changed. If intellhide is active we need to check for
2585 window instersections2756 window instersections
@@ -2596,12 +2767,6 @@
25962767
2597 g_return_if_fail (TASK_IS_MANAGER (manager));2768 g_return_if_fail (TASK_IS_MANAGER (manager));
2598 priv = manager->priv;2769 priv = manager->priv;
2599
2600 if (!priv->intellihide)
2601 {
2602/* g_warning ("%s: Intellihide callback invoked with Intellihide off",__func__);*/
2603 return;
2604 }
2605 2770
2606 win = wnck_screen_get_active_window (screen);2771 win = wnck_screen_get_active_window (screen);
2607 if (!win)2772 if (!win)
@@ -2612,13 +2777,17 @@
2612 we had intersection and the panel was hidden, it will continue hide.2777 we had intersection and the panel was hidden, it will continue hide.
2613 So inhibit the autohide if there is no active window.2778 So inhibit the autohide if there is no active window.
2614 */2779 */
2780 task_manager_check_for_intersection (manager,
2781 wnck_screen_get_active_workspace(screen),
2782 NULL);
2783/*
2615 if (!priv->autohide_cookie)2784 if (!priv->autohide_cookie)
2616 {2785 {
2617 priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager), "Intellihide");2786 priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager), "Intellihide");
2618#ifdef DEBUG 2787#ifdef DEBUG
2619 g_debug ("%s: cookie is %u",__func__,priv->autohide_cookie);2788 g_debug ("%s: cookie is %u",__func__,priv->autohide_cookie);
2620#endif2789#endif
2621 }2790 }*/
2622 return;2791 return;
2623 }2792 }
2624 app = wnck_window_get_application (win);2793 app = wnck_window_get_application (win);
@@ -2641,21 +2810,13 @@
26412810
2642 g_return_if_fail (TASK_IS_MANAGER (manager));2811 g_return_if_fail (TASK_IS_MANAGER (manager));
2643 priv = manager->priv;2812 priv = manager->priv;
2644 if (!priv->intellihide)2813
2645 {
2646/* g_warning ("%s: Intellihide callback invoked with Intellihide off",__func__); */
2647 return;
2648 }
2649 win = wnck_screen_get_active_window (screen);2814 win = wnck_screen_get_active_window (screen);
2650 if (!win)2815 if (!win)
2651 {2816 {
2652 if (!priv->autohide_cookie)2817 task_manager_check_for_intersection (manager,
2653 {2818 wnck_screen_get_active_workspace(screen),
2654 priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager), "Intellihide");2819 NULL);
2655#ifdef DEBUG
2656 g_debug ("%s: cookie is %u",__func__,priv->autohide_cookie);
2657#endif
2658 }
2659 return;2820 return;
2660 }2821 }
2661 2822
@@ -2671,13 +2832,9 @@
2671 WnckWindow *win;2832 WnckWindow *win;
2672 WnckApplication *app;2833 WnckApplication *app;
2673 WnckWorkspace *space;2834 WnckWorkspace *space;
2835
2674 g_return_if_fail (TASK_IS_MANAGER (manager));2836 g_return_if_fail (TASK_IS_MANAGER (manager));
2675 priv = manager->priv;2837 priv = manager->priv;
2676 if (!priv->intellihide)
2677 {
2678/* g_warning ("%s: Intellihide callback invoked with Intellihide off",__func__);*/
2679 return;
2680 }
2681 win = wnck_screen_get_active_window (priv->screen);2838 win = wnck_screen_get_active_window (priv->screen);
2682 if (!win)2839 if (!win)
2683 {2840 {
@@ -2703,11 +2860,6 @@
2703 WnckWorkspace *space;2860 WnckWorkspace *space;
2704 g_return_if_fail (TASK_IS_MANAGER (manager));2861 g_return_if_fail (TASK_IS_MANAGER (manager));
2705 priv = manager->priv;2862 priv = manager->priv;
2706 if (!priv->intellihide)
2707 {
2708/* g_warning ("%s: Intellihide callback invoked with Intellihide off",__func__);*/
2709 return;
2710 }
2711 win = wnck_screen_get_active_window (priv->screen);2863 win = wnck_screen_get_active_window (priv->screen);
2712 if (!win)2864 if (!win)
2713 {2865 {
@@ -2730,10 +2882,6 @@
2730 g_return_if_fail (TASK_IS_MANAGER (manager));2882 g_return_if_fail (TASK_IS_MANAGER (manager));
2731 priv = manager->priv;2883 priv = manager->priv;
2732 2884
2733 if (!priv->intellihide)
2734 {
2735 return;
2736 }
2737 win = wnck_screen_get_active_window (priv->screen);2885 win = wnck_screen_get_active_window (priv->screen);
2738 if (!win)2886 if (!win)
2739 {2887 {
27402888
=== modified file 'data/avant-window-navigator.schema-ini.in.in'
--- data/avant-window-navigator.schema-ini.in.in 2010-07-19 22:28:12 +0000
+++ data/avant-window-navigator.schema-ini.in.in 2010-10-25 13:06:06 +0000
@@ -86,6 +86,11 @@
86default = false86default = false
87_description=If true, the panel will expand to full monitor width/height.87_description=If true, the panel will expand to full monitor width/height.
8888
89[panel/intellihide_mode]
90type = integer
91default = 2
92_description= Intellihide mode. 0.. Disabled, 1.. use windows on active workspace, 2.. use windows of currently focused app.
93
89[panel/monitor_align]94[panel/monitor_align]
90type = float95type = float
91default = 0.596default = 0.5
9297
=== modified file 'src/awn-app.vala'
--- src/awn-app.vala 2010-07-24 12:58:39 +0000
+++ src/awn-app.vala 2010-10-25 13:06:06 +0000
@@ -26,8 +26,10 @@
26 [DBus (name="org.awnproject.Awn.App")]26 [DBus (name="org.awnproject.Awn.App")]
27 public interface AppDBusInterface: GLib.Object27 public interface AppDBusInterface: GLib.Object
28 {28 {
29 public abstract ObjectPath[] get_panels () throws DBus.Error;29 public abstract string[] get_panels () throws DBus.Error;
30 public abstract void remove_panel (int panel_id) throws DBus.Error;30 public abstract void remove_panel (int panel_id) throws DBus.Error;
31 public signal void panel_added (int panel_id);
32 public signal void panel_removed (int panel_id);
31 }33 }
3234
33 public class Application: GLib.Object, AppDBusInterface35 public class Application: GLib.Object, AppDBusInterface
@@ -107,6 +109,7 @@
107 this.panels.insert ((owned)path, panel);109 this.panels.insert ((owned)path, panel);
108110
109 panel.show ();111 panel.show ();
112 this.panel_added (panel_id);
110 }113 }
111 else114 else
112 {115 {
@@ -116,24 +119,25 @@
116119
117 foreach (unowned Panel p in untouched_panels)120 foreach (unowned Panel p in untouched_panels)
118 {121 {
122 int panel_id = p.panel_id;
119 string path = "/org/awnproject/Awn/Panel%d".printf (p.panel_id);123 string path = "/org/awnproject/Awn/Panel%d".printf (p.panel_id);
120 this.panels.remove (path);124 this.panels.remove (path);
125 this.panel_removed (panel_id);
121 p.destroy ();126 p.destroy ();
122 }127 }
123 }128 }
124129
125 public ObjectPath[] get_panels () throws DBus.Error130 public string[] get_panels () throws DBus.Error
126 {131 {
127 var keys = this.panels.get_keys ();132 var keys = this.panels.get_keys ();
128 keys.sort (strcmp);133 keys.sort (strcmp);
129134
130 ObjectPath[] paths = new ObjectPath[keys.length ()];135 string[] paths = new string[keys.length ()];
131 int i = 0;136 int i = 0;
132 foreach (unowned string path in keys)137 foreach (unowned string path in keys)
133 {138 {
134 paths[i++] = new ObjectPath (path);139 paths[i++] = path;
135 }140 }
136
137 return paths;141 return paths;
138 }142 }
139143

Subscribers

People subscribed via source and target branches