70
72
static GQuark win_quark = 0;
74
static const GtkTargetEntry drop_types[] =
76
{ (gchar*)"text/uri-list", 0, 0 },
77
{ (gchar*)"STRING", 0, 0 },
78
{ (gchar*)"text/plain", 0, },
79
{ (gchar*)"awn/task-icon", 0, 0 }
81
static const gint n_drop_types = G_N_ELEMENTS (drop_types);
86
DesktopAgnosticConfigClient *panel_instance_client;
87
GdkWindow * foreign_window;
88
GdkRegion * foreign_region;
89
TaskManagerPanelConnector * connector;
90
gint intellihide_mode;
91
guint autohide_cookie;
92
} TaskManagerAwnPanelInfo;
72
94
struct _TaskManagerPrivate
74
96
DesktopAgnosticConfigClient *client;
98
DBusGConnection *connection;
75
101
TaskSettings *settings;
76
102
WnckScreen *screen;
78
/*Used by Intellihide*/
79
guint autohide_cookie;
80
GdkWindow *awn_gdk_window;
81
GdkRegion * awn_gdk_region;
83
guint attention_cookie;
84
guint attention_source;
86
104
/* Dragging properties */
87
105
TaskIcon *dragged_icon;
88
106
TaskDragIndicator *drag_indicator;
98
116
GHashTable *win_table;
99
117
GHashTable *desktops_table;
118
GHashTable *intellihide_panel_instances;
101
121
Used during grouping configuration changes for optimization purposes
103
123
GList *grouping_list;
105
125
GValueArray *launcher_paths;
127
guint attention_cookie;
128
guint attention_source;
106
130
gboolean show_all_windows;
107
131
gboolean only_show_launchers;
108
132
gboolean drag_and_drop;
109
133
gboolean grouping;
110
gboolean intellihide;
111
134
gboolean icon_grouping;
112
gint intellihide_mode;
113
135
gint match_strength;
114
136
gint attention_autohide_timer;
116
139
guint attention_required_reminder_id;
117
140
gint attention_required_reminder;
119
142
AwnDesktopLookupCached * desktop_lookup;
120
143
TaskManagerDispatcher *dbus_proxy;
145
GtkWidget * add_icon;
146
guint add_icon_source;
351
399
case PROP_ICON_GROUPING:
352
400
manager->priv->icon_grouping = g_value_get_boolean (value);
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)
360
awn_applet_uninhibit_autohide (AWN_APPLET(manager), manager->priv->autohide_cookie);
361
manager->priv->autohide_cookie = 0;
363
if (manager->priv->intellihide && !manager->priv->autohide_cookie)
365
manager->priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager),"Intellihide" );
369
case PROP_INTELLIHIDE_MODE:
370
manager->priv->intellihide_mode = g_value_get_int (value);
373
403
case PROP_ATTENTION_AUTOHIDE_TIMER:
374
404
manager->priv->attention_autohide_timer = g_value_get_int (value);
421
case PROP_DESKTOP_COPY:
422
manager->priv->desktop_copy = g_value_get_int (value);
393
425
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
430
_delete_panel_info_cb (TaskManagerAwnPanelInfo * panel_info)
432
g_object_unref (panel_info->connector);
433
g_object_unref (panel_info->foreign_window);
434
gdk_region_destroy (panel_info->foreign_region);
439
_on_panel_added (DBusGProxy *proxy,guint panel_id,TaskManager *applet)
441
TaskManagerPrivate *priv = TASK_MANAGER_GET_PRIVATE (applet);
442
GError * error = NULL;
443
TaskManagerAwnPanelInfo * panel_info = NULL;
444
gchar * uid = g_strdup_printf("-999%d",panel_id);
446
g_assert (!g_hash_table_lookup (priv->intellihide_panel_instances,GINT_TO_POINTER (panel_id)));
447
panel_info = g_malloc0 (sizeof (TaskManagerAwnPanelInfo) );
448
panel_info->connector = task_manager_panel_connector_new (panel_id);
450
panel_info->panel_instance_client = awn_config_get_default (panel_id, NULL);
451
panel_info->intellihide_mode = desktop_agnostic_config_client_get_int (
452
panel_info->panel_instance_client,
458
g_debug ("%s: error accessing intellihide_mode. \"%s\"",__func__,error->message);
459
g_error_free (error);
462
desktop_agnostic_config_client_notify_add (panel_info->panel_instance_client,
465
(DesktopAgnosticConfigNotifyFunc)task_manager_intellihide_change_cb,
466
&panel_info->intellihide_mode,
470
g_debug ("%s: error binding intellihide_mode. \"%s\"",__func__,error->message);
471
g_error_free (error);
475
if (!panel_info->intellihide_mode && panel_info->autohide_cookie)
477
task_manager_panel_connector_uninhibit_autohide (panel_info->connector, panel_info->autohide_cookie);
478
panel_info->autohide_cookie = 0;
480
if (panel_info->intellihide_mode && !panel_info->autohide_cookie)
482
panel_info->autohide_cookie = task_manager_panel_connector_inhibit_autohide (panel_info->connector,"Intellihide" );
485
g_hash_table_insert (priv->intellihide_panel_instances,GINT_TO_POINTER(panel_id),panel_info);
489
_on_panel_removed (DBusGProxy *proxy,guint panel_id,TaskManager * applet)
491
TaskManagerPrivate *priv = TASK_MANAGER_GET_PRIVATE (applet);
492
TaskManagerAwnPanelInfo * panel_info = g_hash_table_lookup (priv->intellihide_panel_instances,GINT_TO_POINTER (panel_id));
494
desktop_agnostic_config_client_remove_instance (panel_info->panel_instance_client);
495
g_assert (g_hash_table_remove (priv->intellihide_panel_instances,GINT_TO_POINTER (panel_id)));
398
499
task_manager_constructed (GObject *object)
400
501
TaskManagerPrivate *priv;
401
502
GtkWidget *widget;
403
506
G_OBJECT_CLASS (task_manager_parent_class)->constructed (object);
405
508
priv = TASK_MANAGER_GET_PRIVATE (object);
406
509
widget = GTK_WIDGET (object);
511
priv->proxy = dbus_g_proxy_new_for_name (priv->connection,
512
"org.awnproject.Awn",
513
"/org/awnproject/Awn",
514
"org.awnproject.Awn.App");
517
g_warning("%s: Could not connect to mothership!\n",__func__);
521
dbus_g_proxy_add_signal (priv->proxy, "PanelAdded",
522
G_TYPE_INT, G_TYPE_INVALID);
523
dbus_g_proxy_add_signal (priv->proxy, "PanelRemoved",
524
G_TYPE_INT, G_TYPE_INVALID);
525
dbus_g_proxy_connect_signal (priv->proxy, "PanelAdded",
526
G_CALLBACK (_on_panel_added), object,
528
dbus_g_proxy_connect_signal (priv->proxy, "PanelRemoved",
529
G_CALLBACK (_on_panel_removed), object,
409
535
Set the cache size of our AwnPixbufCache to something a bit bigger.
417
543
priv->desktops_table = g_hash_table_new_full (g_str_hash,g_str_equal,g_free,g_free);
544
priv->intellihide_panel_instances = g_hash_table_new_full (g_direct_hash,g_direct_equal,
546
(GDestroyNotify)_delete_panel_info_cb);
419
548
priv->client = awn_config_get_default_for_applet (AWN_APPLET (object), NULL);
421
550
/* Connect up the important bits */
422
551
desktop_agnostic_config_client_bind (priv->client,
423
552
DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
455
584
object, "icon_grouping", TRUE,
456
585
DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
458
desktop_agnostic_config_client_bind (priv->client,
459
DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
461
object, "intellihide", TRUE,
462
DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
464
587
desktop_agnostic_config_client_bind (priv->client,
465
588
DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
467
object, "intellihide_mode", TRUE,
468
DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
470
desktop_agnostic_config_client_bind (priv->client,
471
DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
472
589
"match_strength",
473
590
object, "match_strength", TRUE,
474
591
DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
485
602
object, "attention_required_reminder", TRUE,
486
603
DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
605
desktop_agnostic_config_client_bind (priv->client,
606
DESKTOP_AGNOSTIC_CONFIG_GROUP_DEFAULT,
608
object, "desktop copy", TRUE,
609
DESKTOP_AGNOSTIC_CONFIG_BIND_METHOD_FALLBACK,
489
612
g_signal_connect (priv->screen,"active-window-changed",
490
613
G_CALLBACK(task_manager_active_window_changed_cb),object);
496
619
/* DBus interface */
497
620
priv->dbus_proxy = task_manager_dispatcher_new (TASK_MANAGER (object));
624
dbus_g_proxy_call (priv->proxy, "GetPanels",
627
G_TYPE_STRV, &panel_paths,
631
g_debug ("%s: %s",__func__,error->message);
632
g_error_free (error);
637
for (gint i=0; panel_paths[i];i++)
639
//strlen is like this as a reminder.
640
_on_panel_added (priv->proxy,
641
atoi(panel_paths[i] + strlen("/org/awnproject/Awn/Panel")),
642
TASK_MANAGER(object));
647
priv->add_icon = awn_themed_icon_new ();
648
awn_themed_icon_set_size (AWN_THEMED_ICON(priv->add_icon),awn_applet_get_size (AWN_APPLET(object)));
649
awn_themed_icon_set_info_simple (AWN_THEMED_ICON (priv->add_icon),
650
"::no_drop::taskmanager",
653
gtk_container_add (GTK_CONTAINER (priv->box),priv->add_icon);
654
gtk_widget_hide (priv->add_icon);
655
gtk_widget_add_events (GTK_WIDGET (priv->add_icon), GDK_ALL_EVENTS_MASK);
656
gtk_drag_dest_set (GTK_WIDGET (priv->add_icon),
657
GTK_DEST_DEFAULT_ALL & (~GTK_DEST_DEFAULT_HIGHLIGHT),
658
drop_types, n_drop_types,
659
GDK_ACTION_COPY | GDK_ACTION_MOVE);
660
g_signal_connect (priv->add_icon,
661
"drag-data-received",
662
G_CALLBACK(_icon_dest_drag_data_received),
555
722
G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
556
723
g_object_class_install_property (obj_class, PROP_ICON_GROUPING, pspec);
558
pspec = g_param_spec_boolean ("intellihide",
563
g_object_class_install_property (obj_class, PROP_INTELLIHIDE, pspec);
565
pspec = g_param_spec_int ("intellihide_mode",
571
G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
572
g_object_class_install_property (obj_class, PROP_INTELLIHIDE_MODE, pspec);
574
725
pspec = g_param_spec_int ("match_strength",
575
726
"match_strength",
576
727
"How radical matching is applied for grouping items",
598
749
G_PARAM_READWRITE);
599
750
g_object_class_install_property (obj_class, PROP_ATTENTION_REQUIRED_REMINDER, pspec);
752
pspec = g_param_spec_int ("desktop_copy",
753
"When/if to copy desktop files",
754
"When/if to copy desktop files",
758
G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
759
g_object_class_install_property (obj_class, PROP_DESKTOP_COPY, pspec);
601
761
/* Install signals */
602
762
_taskman_signals[GROUPING_CHANGED] =
603
763
g_signal_new ("grouping_changed",
619
779
task_manager_init (TaskManager *manager)
621
781
TaskManagerPrivate *priv;
782
GError *error = NULL;
623
783
priv = manager->priv = TASK_MANAGER_GET_PRIVATE (manager);
625
785
priv->screen = wnck_screen_get_default ();
626
786
priv->launcher_paths = NULL;
627
priv->hidden_list = NULL;
787
priv->hidden_list = NULL;
788
priv->add_icon_source = 0;
789
priv->add_icon = NULL;
629
791
wnck_set_client_type (WNCK_CLIENT_TYPE_PAGER);
631
793
win_quark = g_quark_from_string ("task-window-quark");
633
795
priv->settings = task_settings_get_default (AWN_APPLET(manager));
635
796
/* Create the icon box */
636
797
priv->box = awn_icon_box_new_for_applet (AWN_APPLET (manager));
637
798
gtk_container_add (GTK_CONTAINER (manager), priv->box);
641
802
priv->drag_indicator = TASK_DRAG_INDICATOR(task_drag_indicator_new());
642
803
gtk_container_add (GTK_CONTAINER (priv->box), GTK_WIDGET(priv->drag_indicator));
643
804
gtk_widget_hide (GTK_WIDGET(priv->drag_indicator));
644
806
if(priv->drag_and_drop)
645
807
_drag_add_signals(manager, GTK_WIDGET(priv->drag_indicator));
646
808
/* TODO: free !!! */
647
809
priv->dragged_icon = NULL;
648
810
priv->drag_timeout = 0;
812
priv->connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
816
g_warning ("%s", error->message);
650
820
/* connect to the relevent WnckScreen signals */
651
821
g_signal_connect (priv->screen, "window-opened",
652
822
G_CALLBACK (on_window_opened), manager);
755
925
desktop_agnostic_config_client_unbind_all_for_object (priv->client,
928
if (priv->connection)
930
if (priv->proxy) g_object_unref (priv->proxy);
931
dbus_g_connection_unref (priv->connection);
932
priv->connection = NULL;
758
937
if (priv->autohide_cookie)
760
939
awn_applet_uninhibit_autohide (AWN_APPLET(object), priv->autohide_cookie);
761
940
priv->autohide_cookie = 0;
763
if (priv->awn_gdk_window)
942
/* if (priv->awn_gdk_window)
765
944
g_object_unref (priv->awn_gdk_window);
766
945
priv->awn_gdk_window = NULL;
769
948
G_OBJECT_CLASS (task_manager_parent_class)->dispose (object);
1639
if (wnck_window_is_skip_pager (window))
1454
1644
g_signal_connect (window, "state-changed",
1455
1645
G_CALLBACK (check_attention_requested), manager);
1457
1647
/* create a new TaskWindow containing the WnckWindow*/
1458
item = task_window_new (AWN_APPLET(manager), window);
1648
item = task_window_new (AWN_APPLET(manager), NULL, window);
1459
1649
g_object_set_qdata (G_OBJECT (window), win_quark, TASK_WINDOW (item));
1461
1651
priv->windows = g_slist_append (priv->windows, item);
1507
1724
icon = task_icon_new (AWN_APPLET (manager));
1509
1726
found_desktop = search_for_desktop (TASK_ICON(icon),item,TRUE);
1728
"proxy",task_icon_get_proxy(TASK_ICON(icon)),
1510
1730
if (found_desktop)
1512
1732
TaskItem * launcher = get_launcher (manager,found_desktop);
1515
task_icon_append_ephemeral_item (TASK_ICON (icon), launcher);
1735
if (task_icon_count_items (TASK_ICON (icon))==0)
1737
g_object_unref (task_icon_get_proxy(TASK_ICON(icon)));
1739
task_icon_append_item (TASK_ICON (icon), launcher);
1740
task_icon_append_item (TASK_ICON (icon), item);
1744
task_icon_append_item (TASK_ICON (icon), item);
1749
task_icon_append_item (TASK_ICON (icon), item);
1519
1752
if ( !found_desktop)
1521
1754
g_signal_connect (item,"name-changed",G_CALLBACK(window_name_changed_cb), icon);
1523
task_icon_append_item (TASK_ICON (icon), item);
1524
1756
task_manager_add_icon (manager,TASK_ICON (icon));
1574
1806
_wnck_get_wmclass (wnck_window_get_xid (window),
1575
1807
&res_name, &class_name);
1576
if (get_special_wait_from_window_data (res_name,
1578
wnck_window_get_name(window) ) )
1580
win_timeout_data = g_malloc (sizeof (WindowOpenTimeoutData));
1581
win_timeout_data->window = window;
1582
win_timeout_data->manager = manager;
1583
g_signal_connect (window,"name-changed",G_CALLBACK(process_window_opened),manager);
1584
g_timeout_add (2000,(GSourceFunc)_wait_for_name_change_timeout,win_timeout_data);
1588
process_window_opened (window,manager);
1808
if ( g_strcmp0(res_name,"awn-applet") != 0)
1810
if (get_special_wait_from_window_data (res_name,
1812
wnck_window_get_name(window) ) )
1814
win_timeout_data = g_malloc (sizeof (WindowOpenTimeoutData));
1815
win_timeout_data->window = window;
1816
win_timeout_data->manager = manager;
1817
g_signal_connect (window,"name-changed",G_CALLBACK(process_window_opened),manager);
1818
g_timeout_add (2000,(GSourceFunc)_wait_for_name_change_timeout,win_timeout_data);
1822
process_window_opened (window,manager);
1590
1825
g_free (res_name);
1591
1826
g_free (class_name);
1734
1969
g_value_array_free (launcher_paths);
1973
task_manager_intellihide_change_cb (const char* group,
1978
*user_data = g_value_get_int (value);
1738
1982
* Checks when launchers got added/removed in the list in gconf/file.
1739
1983
* It removes the launchers from the task-icons and add those
1740
1984
* that aren't already on the bar.
1743
task_manager_refresh_launcher_paths (TaskManager *manager,
1987
task_manager_refresh_launcher_paths (TaskManager *manager, GValueArray *list)
1746
1989
TaskManagerPrivate *priv;
1990
gboolean ephemeral = TRUE;
1748
1992
g_return_if_fail (TASK_IS_MANAGER (manager));
1749
1993
priv = manager->priv;
1995
task_manager_add_icon_hide (manager);
1751
1997
Find launchers in the the launcher list do not yet have a TaskIcon and
2039
if (found && launcher)
2041
ephemeral = task_icon_is_ephemeral (icon_iter->data);
2042
if (ephemeral) /*then it shouldn't be*/
2044
g_object_set (G_OBJECT(task_icon_get_launcher (icon_iter->data)),
2045
"proxy",task_icon_get_proxy (icon_iter->data),
2047
icon_iter = priv->icons;
1798
TaskItem *launcher = NULL;
1799
2054
GtkWidget *icon;
1801
2056
if (usable_desktop_file_from_path (path) )
2058
TaskItem *launcher = NULL;
1803
2059
launcher = task_launcher_new_for_desktop_file (AWN_APPLET(manager),path);
1806
2062
icon = task_icon_new (AWN_APPLET (manager));
2063
g_object_set (G_OBJECT(launcher),
2064
"proxy",task_icon_get_proxy (TASK_ICON(icon)),
1807
2066
task_icon_append_item (TASK_ICON (icon), launcher);
1808
2067
gtk_container_add (GTK_CONTAINER (priv->box), icon);
1809
2068
gtk_box_reorder_child (GTK_BOX (priv->box), icon, idx);
2451
2707
gboolean intersect = FALSE;
2452
2708
GdkRectangle awn_rect;
2455
2709
GdkRegion * updated_region;
2457
2710
g_return_if_fail (TASK_IS_MANAGER (manager));
2458
2711
priv = manager->priv;
2461
Generate a GdkRegion for the awn panel_size
2463
if (!priv->awn_gdk_window)
2465
g_object_get (manager, "panel-xid", &xid, NULL);
2466
priv->awn_gdk_window = gdk_window_foreign_new ( xid);
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,
2471
&awn_rect.height,&depth);
2713
gdk_error_trap_push ();
2715
gdk_window_get_position (panel_info->foreign_window,&awn_rect.x,&awn_rect.y);
2716
gdk_drawable_get_size (panel_info->foreign_window,&awn_rect.width,&awn_rect.height);
2473
2718
gdk_window_get_geometry gives us an x,y or 0,0
2474
2719
Fix that using get root origin.
2476
gdk_window_get_root_origin (priv->awn_gdk_window,&awn_rect.x,&awn_rect.y);
2721
gdk_window_get_root_origin (panel_info->foreign_window,&awn_rect.x,&awn_rect.y);
2478
2723
We cache the region for reuse for situations where the input mask is an empty
2479
2724
region when the panel is hidden. In that case we reuse the last good
2482
updated_region = xutils_get_input_shape (priv->awn_gdk_window);
2727
updated_region = xutils_get_input_shape (panel_info->foreign_window);
2483
2728
g_return_if_fail (updated_region);
2484
2729
if (gdk_region_empty(updated_region))
2490
if (priv->awn_gdk_region)
2735
if (panel_info->foreign_region)
2492
gdk_region_destroy (priv->awn_gdk_region);
2737
gdk_region_destroy (panel_info->foreign_region);
2494
priv->awn_gdk_region = updated_region;
2495
gdk_region_offset (priv->awn_gdk_region,awn_rect.x,awn_rect.y);
2739
panel_info->foreign_region = updated_region;
2740
gdk_region_offset (panel_info->foreign_region,awn_rect.x,awn_rect.y);
2499
2744
Get the list of windows to check for intersection
2501
switch (priv->intellihide_mode)
2746
switch (panel_info->intellihide_mode)
2503
2748
case INTELLIHIDE_WORKSPACE:
2504
2749
windows = wnck_screen_get_windows (priv->screen);
2559
2811
Allow panel to hide (if necessary)
2561
if (intersect && priv->autohide_cookie)
2813
if (intersect && panel_info->autohide_cookie)
2563
awn_applet_uninhibit_autohide (AWN_APPLET(manager), priv->autohide_cookie);
2815
task_manager_panel_connector_uninhibit_autohide (panel_info->connector, panel_info->autohide_cookie);
2565
g_debug ("me eat cookie: %u",priv->autohide_cookie);
2817
g_debug ("me eat cookie: %u",panel_info->autohide_cookie);
2567
priv->autohide_cookie = 0;
2819
panel_info->autohide_cookie = 0;
2571
2823
Inhibit Hide if not already doing so
2573
if (!intersect && !priv->autohide_cookie)
2825
if (!intersect && !panel_info->autohide_cookie)
2575
priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager), "Intellihide");
2827
gchar * identifier = g_strdup_printf ("Intellihide:applet_conector=%p",panel_info->connector);
2828
panel_info->autohide_cookie = task_manager_panel_connector_inhibit_autohide (panel_info->connector, identifier);
2829
g_free (identifier);
2577
g_debug ("cookie is %u",priv->autohide_cookie);
2831
g_debug ("cookie is %u",panel_info->autohide_cookie);
2834
gdk_error_trap_pop();
2838
_waiting_for_panel_dbus (TaskManager * manager)
2840
TaskManagerPrivate *priv;
2842
g_return_val_if_fail (TASK_IS_MANAGER (manager),FALSE);
2843
priv = manager->priv;
2845
task_manager_check_for_intersection (manager,
2846
wnck_screen_get_active_workspace (priv->screen),
2847
wnck_application_get (wnck_window_get_xid(wnck_screen_get_active_window (priv->screen))));
2851
Governs the panel autohide when Intellihide is enabled.
2852
If a window in the relevant window list intersects with the awn panel then
2853
autohide will be uninhibited otherwise it will be inhibited.
2857
task_manager_check_for_intersection (TaskManager * manager,
2858
WnckWorkspace * space,
2859
WnckApplication * app)
2861
TaskManagerPrivate *priv;
2863
GHashTableIter iter;
2866
g_return_if_fail (TASK_IS_MANAGER (manager));
2867
priv = manager->priv;
2869
g_hash_table_iter_init (&iter, priv->intellihide_panel_instances);
2870
while (g_hash_table_iter_next (&iter, &key, &value) )
2872
TaskManagerAwnPanelInfo * panel_info = value;
2873
g_object_get (panel_info->connector, "panel-xid", &xid, NULL);
2876
g_timeout_add (1000,(GSourceFunc)_waiting_for_panel_dbus,manager);
2880
if (!panel_info->foreign_window)
2882
panel_info->foreign_window = gdk_window_foreign_new ( xid);
2884
if (panel_info->intellihide_mode)
2886
task_manager_check_for_panel_instance_intersection(manager,
2891
else if ( !panel_info->intellihide_mode && panel_info->autohide_cookie)
2893
task_manager_panel_connector_uninhibit_autohide (panel_info->connector, panel_info->autohide_cookie);
2894
panel_info->autohide_cookie = 0;
2612
2924
we had intersection and the panel was hidden, it will continue hide.
2613
2925
So inhibit the autohide if there is no active window.
2927
task_manager_check_for_intersection (manager,
2928
wnck_screen_get_active_workspace(screen),
2615
2931
if (!priv->autohide_cookie)
2617
2933
priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager), "Intellihide");
2619
2935
g_debug ("%s: cookie is %u",__func__,priv->autohide_cookie);
2624
2940
app = wnck_window_get_application (win);
2642
2958
g_return_if_fail (TASK_IS_MANAGER (manager));
2643
2959
priv = manager->priv;
2644
if (!priv->intellihide)
2646
/* g_warning ("%s: Intellihide callback invoked with Intellihide off",__func__); */
2649
2961
win = wnck_screen_get_active_window (screen);
2652
if (!priv->autohide_cookie)
2654
priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(manager), "Intellihide");
2656
g_debug ("%s: cookie is %u",__func__,priv->autohide_cookie);
2964
task_manager_check_for_intersection (manager,
2965
wnck_screen_get_active_workspace(screen),
3243
task_manager_add_icon_show ( TaskManager * manager)
3245
TaskManagerPrivate *priv;
3246
g_return_if_fail (TASK_IS_MANAGER (manager));
3248
priv = manager->priv;
3252
gtk_box_reorder_child (GTK_BOX(priv->box),priv->add_icon,-1);
3253
gtk_widget_show_all (priv->add_icon);
3258
task_manager_add_icon_hide ( TaskManager * manager)
3260
TaskManagerPrivate *priv;
3261
g_return_val_if_fail (TASK_IS_MANAGER (manager),FALSE);
3263
priv = manager->priv;
3266
gtk_widget_hide (priv->add_icon);
3267
if (priv->add_icon_source)
3269
g_source_remove (priv->add_icon_source);
3270
priv->add_icon_source = 0;
2949
3277
* Position Icons through dragging
3249
3600
g_signal_handlers_disconnect_by_func(icon, G_CALLBACK (_drag_dest_motion), manager);
3250
3601
g_signal_handlers_disconnect_by_func(icon, G_CALLBACK (_drag_dest_leave), manager);
3606
copy_over (const gchar *src, const gchar *dest)
3608
DesktopAgnosticVFSFile *from = NULL;
3609
DesktopAgnosticVFSFile *to = NULL;
3610
GError *error = NULL;
3612
from = desktop_agnostic_vfs_file_new_for_path (src, &error);
3615
goto copy_over_error;
3617
to = desktop_agnostic_vfs_file_new_for_path (dest, &error);
3620
goto copy_over_error;
3623
desktop_agnostic_vfs_file_copy (from, to, TRUE, &error);
3629
g_warning ("Unable to copy %s to %s: %s", src, dest, error->message);
3630
g_error_free (error);
3635
g_object_unref (to);
3639
g_object_unref (from);
3644
_icon_dest_drag_data_received (GtkWidget *widget,
3645
GdkDragContext *context,
3648
GtkSelectionData *sdata,
3651
TaskManager *manager)
3653
TaskManagerPrivate * priv;
3658
GStrv tokens = NULL;
3661
g_return_if_fail (AWN_IS_THEMED_ICON (widget) );
3663
priv = TASK_MANAGER_GET_PRIVATE (manager);
3664
task_manager_add_icon_hide (TASK_MANAGER(manager));
3666
target = gtk_drag_dest_find_target (widget, context, NULL);
3667
target_name = gdk_atom_name (target);
3669
/* If it is dragging of the task icon, there is actually no data */
3670
if (g_strcmp0("awn/task-icon", target_name) == 0)
3672
gtk_drag_finish (context, TRUE, TRUE, time_);
3675
sdata_data = (gchar*)gtk_selection_data_get_data (sdata);
3677
/* If we are dealing with a desktop file, then we want to do something else
3678
* FIXME: This is a crude way of checking
3680
if (strstr (sdata_data, ".desktop"))
3682
/*TODO move into a separate function */
3683
tokens = g_strsplit (sdata_data, "\n",-1);
3684
for (i=tokens; *i;i++)
3686
gchar * filename = g_filename_from_uri ((gchar*) *i,NULL,NULL);
3687
if (!filename && ((gchar *)*i))
3689
filename = g_strdup ((gchar*)*i);
3693
g_strstrip(filename);
3695
if (filename && strlen(filename) && strstr (filename,".desktop"))
3699
gboolean make_copy = FALSE;
3700
struct stat stat_buf;
3701
switch (priv->desktop_copy)
3703
case DESKTOP_COPY_ALL:
3706
case DESKTOP_COPY_OWNER:
3707
g_stat (filename,&stat_buf);
3708
if ( stat_buf.st_uid == getuid())
3713
case DESKTOP_COPY_NONE:
3719
gchar * launcher_dir = NULL;
3720
gchar * file_basename;
3722
launcher_dir = g_strdup_printf ("%s/.config/awn/launchers",
3724
g_mkdir_with_parents (launcher_dir,0755);
3725
file_basename = g_path_get_basename (filename);
3726
dest = g_strdup_printf("%s/%lu-%s",launcher_dir,(gulong)time(NULL),file_basename);
3727
copy_over (filename,dest);
3728
g_free (file_basename);
3730
g_free (launcher_dir);
3733
task_manager_append_launcher (TASK_MANAGER(manager),filename);
3741
g_strfreev (tokens);
3742
gtk_drag_finish (context, TRUE, FALSE, time_);
3747
gtk_drag_finish (context, TRUE, FALSE, time_);