578
590
uri = g_string_truncate(uri, res+1);
581
g_print("Desktop file: %s\n", uri->str);
582
item = awn_desktop_item_new (uri->str);
585
g_print("Error : Could not load the desktop file!");
590
task = awn_task_new(task_manager, priv->settings);
591
awn_task_set_title (AWN_TASK(task), AWN_TITLE(priv->title_window));
592
if (awn_task_set_launcher (AWN_TASK (task), item)) {
594
g_signal_connect (G_OBJECT(task), "drag-data-received",
595
G_CALLBACK(_task_manager_drag_data_recieved), (gpointer)task_manager);
596
g_signal_connect (G_OBJECT(task), "menu_item_clicked",
597
G_CALLBACK(_task_manager_menu_item_clicked), (gpointer)
599
g_signal_connect (G_OBJECT(task), "check_item_clicked",
600
G_CALLBACK(_task_manager_check_item_clicked), (gpointer)
603
priv->launchers = g_list_append(priv->launchers, (gpointer)task);
604
gtk_box_pack_start(GTK_BOX(priv->launcher_box), task, FALSE, FALSE, 0);
605
gtk_widget_show(task);
606
_refresh_box (task_manager);
607
g_print("LOADED : %s\n", _sdata);
609
/******* Add to config *********/
610
priv->ignore_gconf = TRUE;
611
settings = priv->settings;
612
settings->launchers = g_slist_append(settings->launchers, g_strdup(uri->str));
614
AwnConfigClient *client = awn_config_client_new ();
615
awn_config_client_set_list(client, "window_manager", "launchers",
616
AWN_CONFIG_CLIENT_LIST_TYPE_STRING,
617
settings->launchers, NULL);
618
awn_task_manager_update_separator_position (task_manager);
620
gtk_widget_destroy(task);
621
awn_desktop_item_free (item);
622
g_print("FAILED : %s\n", _sdata);
593
g_print("Desktop file: %s\n", uri->str);
595
/******* Add to config *********/
596
settings = priv->settings;
597
// careful shallow copy
598
GSList *launchers = g_slist_copy(settings->launchers);
599
launchers = g_slist_append(launchers, uri->str);
601
AwnConfigClient *client = awn_config_client_new ();
602
awn_config_client_set_list(client, "window_manager", "launchers",
603
AWN_CONFIG_CLIENT_LIST_TYPE_STRING,
606
g_slist_free (launchers);
626
608
g_string_free(uri, TRUE);
627
//awn_task_manager_update_separator_position (task_manager);
628
_refresh_box(task_manager);
629
609
gtk_drag_finish (context, dnd_success, delete_selection_data, time);
1400
1380
#include "awn-dbus-glue.h"
1383
awn_task_manager_dispose (GObject *object)
1385
AwnTaskManagerPrivate *priv;
1386
priv = AWN_TASK_MANAGER_GET_PRIVATE (object);
1388
if (priv->applet_man_proxy) {
1389
dbus_g_proxy_disconnect_signal (priv->applet_man_proxy,
1391
G_CALLBACK (on_height_changed),
1393
priv->applet_man_proxy = NULL;
1395
if (priv->applet_man_connection) {
1396
dbus_g_connection_unref (priv->applet_man_connection);
1397
priv->applet_man_connection = NULL;
1400
// oh yea, this one is disgusting, but it basically only
1401
// disconnects a few signals
1402
if (priv->signal_handlers[0]) {
1404
for (i = 0; i < G_N_ELEMENTS(priv->signal_handlers); i++) {
1405
gpointer instance = i <= 3 ? (priv->screen) :
1406
(i == 4 ? priv->settings->window : (gpointer)gtk_icon_theme_get_default ());
1407
if (priv->signal_handlers[i]) {
1408
g_signal_handler_disconnect(instance,
1409
priv->signal_handlers[i]);
1410
priv->signal_handlers[i] = 0;
1415
// hide the separator
1416
awn_bar_set_draw_separator (priv->settings->bar, 0);
1418
G_OBJECT_CLASS (awn_task_manager_parent_class)->dispose (object);
1403
1422
awn_task_manager_class_init (AwnTaskManagerClass *class)
1405
1424
GObjectClass *obj_class;
1406
1425
GtkWidgetClass *widget_class;
1408
1427
obj_class = G_OBJECT_CLASS (class);
1428
obj_class->dispose = awn_task_manager_dispose;
1409
1429
widget_class = GTK_WIDGET_CLASS (class);
1411
1431
g_type_class_add_private (obj_class, sizeof (AwnTaskManagerPrivate));
1443
1463
AwnTaskManagerPrivate *priv;
1444
1464
GSList *list, *l;
1446
GSList *launchers = NULL;
1466
GSList *launchers = NULL, *old_launchers;
1468
g_return_if_fail (AWN_IS_TASK_MANAGER (task_manager));
1449
1469
priv = AWN_TASK_MANAGER_GET_PRIVATE (task_manager);
1451
if (priv->ignore_gconf) {
1452
priv->ignore_gconf = FALSE;
1456
1471
list = entry->value.list_val;
1458
1473
for (l = list; l != NULL; l = l->next) {
1459
1474
gchar *string = g_strdup ((gchar*) (l->data));
1460
1475
launchers = g_slist_append (launchers, string);
1463
g_slist_free (priv->settings->launchers);
1478
old_launchers = priv->settings->launchers;
1464
1479
priv->settings->launchers = launchers;
1467
1482
for (l = launchers; l != NULL; l = l->next) {
1468
1483
AwnTask *task = NULL;
1469
1484
for (t = priv->launchers; t != NULL; t = t->next) {
1485
AwnDesktopItem *item, *old_item;
1486
item = awn_task_get_item (AWN_TASK (t->data));
1487
gchar *file = awn_desktop_item_get_filename (item);
1488
if (strcmp (file, l->data) == 0) {
1489
task = AWN_TASK (t->data);
1491
// refresh the desktop item
1493
item = awn_desktop_item_new ((gchar*)l->data);
1495
awn_task_set_launcher(task, item);
1496
awn_desktop_item_free(old_item);
1503
gtk_box_reorder_child (GTK_BOX (priv->launcher_box),
1509
AwnDesktopItem *item = awn_desktop_item_new (l->data);
1512
g_print("Error : Could not load the desktop file!");
1515
g_print("LOADED : %s\n", (char*)l->data);
1517
task = awn_task_new(task_manager, priv->settings);
1518
awn_task_set_title (AWN_TASK(task), AWN_TITLE(priv->title_window));
1519
if (awn_task_set_launcher (AWN_TASK (task), item)) {
1521
g_signal_connect (G_OBJECT(task), "drag-data-received",
1522
G_CALLBACK(_task_manager_drag_data_recieved), (gpointer)task_manager);
1523
g_signal_connect (G_OBJECT(task), "menu_item_clicked",
1524
G_CALLBACK(_task_manager_menu_item_clicked), (gpointer)
1526
g_signal_connect (G_OBJECT(task), "check_item_clicked",
1527
G_CALLBACK(_task_manager_check_item_clicked), (gpointer)
1530
priv->launchers = g_list_append(priv->launchers, (gpointer)task);
1531
gtk_box_pack_start(GTK_BOX(priv->launcher_box), task, FALSE, FALSE, 0);
1532
gtk_box_reorder_child (GTK_BOX (priv->launcher_box),
1535
gtk_widget_show(task);
1537
gtk_widget_destroy(task);
1538
awn_desktop_item_free (item);
1539
g_print("FAILED : %s\n", (char*)l->data);
1544
// make a list of removed launchers
1547
gboolean found = FALSE;
1548
for (list = launchers; list; list = list->next) {
1549
if (strcmp(list->data, l->data) == 0) {
1555
old_launchers = g_slist_delete_link(old_launchers, l);
1561
// old_launchers now contains list of removed paths
1562
for (l = old_launchers; l; l = l->next) {
1563
AwnTask *task = NULL;
1564
for (t = priv->launchers; t != NULL; t = t->next) {
1470
1565
AwnDesktopItem *item;
1471
1566
item = awn_task_get_item (AWN_TASK (t->data));
1472
gchar *file = awn_desktop_item_get_filename (item);
1567
gchar *file = awn_desktop_item_get_filename (item);
1473
1568
if (strcmp (file, l->data) == 0) {
1474
1569
task = AWN_TASK (t->data);
1480
gtk_box_reorder_child (GTK_BOX (priv->launcher_box),
1575
// remove from launchers
1576
g_print("REMOVED : %s\n", (char*)l->data);
1577
if (awn_task_get_window (task)) {
1579
GtkWidget *w = GTK_WIDGET (task);
1580
awn_task_manager_remove_launcher (task_manager, task);
1581
awn_task_set_launcher (task, NULL);
1582
priv->tasks = g_list_append(priv->tasks, (gpointer)task);
1584
gtk_container_remove(GTK_CONTAINER(priv->launcher_box), w);
1585
gtk_box_pack_start(GTK_BOX(priv->tasks_box), w, FALSE, FALSE, 0);
1586
gtk_widget_unref(w);
1588
// destroy completely
1589
awn_task_manager_remove_launcher (task_manager,
1591
awn_task_remove (task);
1596
g_slist_free (old_launchers);
1598
awn_task_manager_update_separator_position (task_manager);
1599
_refresh_box(task_manager);
1603
awn_task_manager_screen_has_viewports (AwnTaskManager *task_manager)
1605
AwnTaskManagerPrivate *priv;
1607
g_return_val_if_fail (AWN_IS_TASK_MANAGER (task_manager), FALSE);
1608
priv = AWN_TASK_MANAGER_GET_PRIVATE (task_manager);
1610
return priv->got_viewport;
1614
awn_task_manager_update_activate_behavior (AwnConfigClientNotifyEntry *entry,
1615
AwnTaskManager *task_manager)
1617
AwnTaskManagerPrivate *priv;
1619
g_return_if_fail (AWN_IS_TASK_MANAGER (task_manager));
1620
priv = AWN_TASK_MANAGER_GET_PRIVATE (task_manager);
1622
priv->activate_behavior = entry->value.int_val;
1626
awn_task_manager_get_activate_behavior (AwnTaskManager *task_manager)
1628
AwnTaskManagerPrivate *priv;
1630
g_return_val_if_fail (AWN_IS_TASK_MANAGER (task_manager), 0);
1631
priv = AWN_TASK_MANAGER_GET_PRIVATE (task_manager);
1633
return priv->activate_behavior;
1521
1669
priv->title_window = NULL;
1522
1670
priv->launchers = NULL;
1523
1671
priv->tasks = NULL;
1524
priv->ignore_gconf = FALSE;
1526
1673
/* Setup GConf to notify us if the launchers list changes */
1527
1674
awn_config_client_notify_add (client, "window_manager", "launchers",
1528
1675
(AwnConfigClientNotifyFunc)awn_task_manager_refresh_launchers,
1678
priv->activate_behavior = awn_config_client_get_int (client,
1679
"window_manager", "activate_behavior", NULL);
1680
awn_config_client_notify_add (client,
1681
"window_manager", "activate_behavior",
1682
(AwnConfigClientNotifyFunc)
1683
awn_task_manager_update_activate_behavior, task_manager);
1531
1685
connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
1532
1686
if (!connection) {
1546
1701
g_warning ("Cannot connect to applet manager\n");
1704
priv->applet_man_proxy = proxy;
1549
1705
dbus_g_proxy_add_signal (proxy, "HeightChanged", G_TYPE_INT, G_TYPE_INVALID);
1550
1706
dbus_g_proxy_connect_signal (proxy,
1551
1707
"HeightChanged",
1552
1708
G_CALLBACK (on_height_changed),
1553
1709
(gpointer)task_manager,
1714
awn_task_manager_realized (gpointer data)
1716
AwnTaskManager *task_manager = AWN_TASK_MANAGER(data);
1717
AwnTaskManagerPrivate *priv = AWN_TASK_MANAGER_GET_PRIVATE (data);
1720
GList *list = wnck_screen_get_windows (priv->screen);
1721
for (l = list; l != NULL; l = l->next) {
1722
_task_manager_window_opened (priv->screen,
1723
(WnckWindow*)l->data,
1727
on_height_changed (NULL, priv->settings->bar_height, task_manager);
1559
1733
awn_task_manager_new (AwnSettings *settings)
1735
TASKMAN_OWN_PID = getpid();
1561
1737
GtkWidget *task_manager;
1562
1738
AwnTaskManagerPrivate *priv;
1568
1744
priv = AWN_TASK_MANAGER_GET_PRIVATE (task_manager);
1746
// this must be here, so get_active_workspace doesn't return NULL
1747
// but it makes us loose the window-opened signals, so we use
1748
// g_idle_add to enumerate the windows
1749
wnck_screen_force_update(priv->screen);
1750
WnckWorkspace *wrksp = wnck_screen_get_active_workspace(priv->screen);
1751
if (wrksp) priv->got_viewport = wnck_workspace_is_virtual(wrksp);
1753
#ifdef HAVE_LIBWNCK_220
1754
if (!priv->got_viewport &&
1755
wnck_screen_get_window_manager_name(priv->screen))
1757
if (strcmp(wnck_screen_get_window_manager_name(priv->screen), "compiz") == 0)
1758
priv->got_viewport = TRUE;
1762
// wnck hack -> we want the window-opened signal
1763
g_idle_add (awn_task_manager_realized, task_manager);
1570
1765
priv->settings = settings;
1571
1766
priv->launcher_box = gtk_hbox_new(FALSE, 0);
1572
1767
priv->tasks_box = gtk_hbox_new(FALSE, 0);
1587
1782
_task_manager_load_launchers(AWN_TASK_MANAGER (task_manager));
1589
1784
/* LIBWNCK SIGNALS */
1590
g_signal_connect (G_OBJECT(priv->screen), "window-opened",
1591
G_CALLBACK (_task_manager_window_opened),
1592
(gpointer)task_manager);
1594
g_signal_connect (G_OBJECT(priv->screen), "window-closed",
1595
G_CALLBACK(_task_manager_window_closed),
1596
(gpointer)task_manager);
1598
g_signal_connect (G_OBJECT(priv->screen), "active-window-changed",
1599
G_CALLBACK(_task_manager_window_activate),
1600
(gpointer)task_manager);
1785
priv->signal_handlers[0] =
1786
g_signal_connect (G_OBJECT(priv->screen), "window-opened",
1787
G_CALLBACK (_task_manager_window_opened),
1788
(gpointer)task_manager);
1790
priv->signal_handlers[1] =
1791
g_signal_connect (G_OBJECT(priv->screen), "window-closed",
1792
G_CALLBACK(_task_manager_window_closed),
1793
(gpointer)task_manager);
1795
priv->signal_handlers[2] =
1796
g_signal_connect (G_OBJECT(priv->screen), "active-window-changed",
1797
G_CALLBACK(_task_manager_window_activate),
1798
(gpointer)task_manager);
1602
1800
#ifdef HAVE_LIBWNCK_220
1603
g_signal_connect (G_OBJECT(priv->screen), "viewports-changed",
1604
G_CALLBACK(_task_manager_viewports_changed),
1605
(gpointer)task_manager);
1801
priv->signal_handlers[3] =
1802
g_signal_connect (G_OBJECT(priv->screen), "viewports-changed",
1803
G_CALLBACK(_task_manager_viewports_changed),
1804
(gpointer)task_manager);
1806
priv->signal_handlers[3] = 0;
1608
1809
/* CONNECT D&D CODE */
1610
g_signal_connect (G_OBJECT(settings->window), "drag-data-received",
1611
G_CALLBACK(_task_manager_drag_data_recieved), (gpointer)task_manager);
1811
priv->signal_handlers[4] =
1812
g_signal_connect (G_OBJECT(settings->window), "drag-data-received",
1813
G_CALLBACK(_task_manager_drag_data_recieved), (gpointer)task_manager);
1613
1815
/* THEME CHANGED CODE */
1614
1816
GtkIconTheme *theme = gtk_icon_theme_get_default ();
1616
g_signal_connect (G_OBJECT(theme), "changed",
1617
G_CALLBACK(_task_manager_icon_theme_changed), (gpointer)task_manager);
1818
priv->signal_handlers[5] =
1819
g_signal_connect (G_OBJECT(theme), "changed",
1820
G_CALLBACK(_task_manager_icon_theme_changed), (gpointer)task_manager);
1619
1822
/* SEP EXPOSE EVENT */
1621
1824
g_signal_connect (G_OBJECT(priv->eb), "expose-event",
1622
1825
G_CALLBACK(awn_bar_separator_expose_event), (gpointer)settings->bar);
1827
#define A_NAMESPACE "com.google.code.Awn"
1828
#define A_OBJECT_PATH "/com/google/code/Awn"
1829
DBusGConnection *connection;
1831
GError *error = NULL;
1834
/* Get the connection and ensure the name is not used yet */
1835
connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
1836
if (connection == NULL) {
1837
g_warning ("Failed to make connection to session bus: %s",
1839
g_error_free (error);
1840
return task_manager;
1843
proxy = dbus_g_proxy_new_for_name (connection, DBUS_SERVICE_DBUS,
1844
DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
1845
if (!org_freedesktop_DBus_request_name (proxy, A_NAMESPACE,
1847
g_warning ("There was an error requesting the name: %s",
1849
g_error_free (error);
1850
return task_manager;
1852
if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
1853
/* Someone else registered the name before us */
1854
return task_manager;
1856
/* Register the task manager on the bus */
1857
dbus_g_connection_register_g_object (connection,
1859
G_OBJECT (task_manager));
1625
1862
return task_manager;