2
* Copyright (C) 2007 Neil Jagdish Patel <njpatel@gmail.com>
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
* Author : Neil Jagdish Patel <njpatel@gmail.com>
28
#ifdef LIBAWN_USE_GNOME
29
#include <libgnome/libgnome.h>
31
#include <glib/gi18n.h>
34
#if !GTK_CHECK_VERSION(2,14,0)
35
#define g_timeout_add_seconds(seconds, callback, user_data) g_timeout_add(seconds * 1000, callback, user_data)
38
#include <libawn/awn-config-client.h>
39
#include <libawn/awn-effects.h>
40
#include <libawn/awn-vfs.h>
45
#include "awn-utils.h"
46
#include "awn-marshallers.h"
48
#define AWN_TASK_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), AWN_TYPE_TASK, AwnTaskPrivate))
50
G_DEFINE_TYPE(AwnTask, awn_task, GTK_TYPE_DRAWING_AREA);
52
#define M_PI 3.14159265358979323846
53
#define AWN_CLICK_IDLE_TIME 450
54
#define PIXBUF_SAVE_PATH ".config/awn/custom-icons"
56
/* FORWARD DECLERATIONS */
58
static gboolean awn_task_expose(GtkWidget *task, GdkEventExpose *event);
59
static gboolean awn_task_button_press(GtkWidget *task, GdkEventButton *event);
60
static gboolean awn_task_scroll_event(GtkWidget *task, GdkEventScroll *event); //Ceceppa
61
static gboolean awn_task_drag_motion(GtkWidget *task,
62
GdkDragContext *context, gint x, gint y, guint t);
64
awn_task_drag_leave(GtkWidget *widget, GdkDragContext *drag_context,
66
static void awn_task_create_menu(AwnTask *task, GtkMenu *menu);
68
static const gchar* awn_task_get_title(GtkWidget *);
69
static void _task_refresh(GtkWidget *obj);
76
AWN_TASK_MENU_TYPE_NORMAL,
77
AWN_TASK_MENU_TYPE_CHECK
90
typedef struct _AwnTaskPrivate AwnTaskPrivate;
92
struct _AwnTaskPrivate
94
AwnTaskManager *task_manager;
95
AwnSettings *settings;
102
gboolean is_launcher;
103
AwnSmartLauncher launcher;
120
/* EFFECT VARIABLE */
121
AwnEffects * effects;
124
AwnTaskMenuItem *menu_items[5];
128
/* signal handler ID's, for clean close */
130
gulong state_changed;
132
gulong geometry_changed;
134
/* Ceceppa: old window position */
139
gboolean dispose_has_run;
149
static guint awn_task_signals[LAST_SIGNAL] = { 0 };
153
static gpointer global_awn_task_parent_class = NULL;
154
static gint menu_item_id = 100;
155
static WnckWindow *last_active_window = NULL; //Ceceppa
157
static const GtkTargetEntry drop_types[] =
160
{ "text/plain", 0, 0},
161
{ "text/uri-list", 0, 0}
163
static const gint n_drop_types = G_N_ELEMENTS(drop_types);
166
awn_task_dispose(GObject *obj)
168
AwnTaskPrivate *priv = AWN_TASK_GET_PRIVATE(AWN_TASK(obj));
170
if (priv->dispose_has_run) return;
172
priv->dispose_has_run = TRUE;
174
awn_effects_finalize(priv->effects);
177
if (priv->icon_changed) {
178
g_signal_handler_disconnect((gpointer)priv->window,
180
priv->icon_changed = 0;
182
if (priv->state_changed) {
183
g_signal_handler_disconnect((gpointer)priv->window,
184
priv->state_changed);
185
priv->state_changed = 0;
187
if (priv->name_changed) {
188
g_signal_handler_disconnect((gpointer)priv->window,
190
priv->name_changed = 0;
192
if (priv->geometry_changed) {
193
g_signal_handler_disconnect((gpointer)priv->window,
194
priv->geometry_changed);
195
priv->geometry_changed = 0;
199
G_OBJECT_CLASS(global_awn_task_parent_class)->dispose(obj);
203
awn_task_finalize(GObject *obj)
205
AwnTaskPrivate *priv = AWN_TASK_GET_PRIVATE(AWN_TASK(obj));
207
awn_effects_free(priv->effects);
209
G_OBJECT_CLASS(global_awn_task_parent_class)->finalize(obj);
213
awn_task_class_init(AwnTaskClass *class)
215
GObjectClass *obj_class;
216
GtkWidgetClass *widget_class;
218
obj_class = G_OBJECT_CLASS(class);
219
widget_class = GTK_WIDGET_CLASS(class);
221
obj_class->dispose = awn_task_dispose;
222
obj_class->finalize = awn_task_finalize;
224
global_awn_task_parent_class = g_type_class_peek_parent(class);
226
/* GtkWidget signals */
227
widget_class->expose_event = awn_task_expose;
228
widget_class->button_press_event = awn_task_button_press;
229
widget_class->scroll_event = awn_task_scroll_event; //Ceceppa: mouse wheel
230
widget_class->drag_motion = awn_task_drag_motion;
231
widget_class->drag_leave = awn_task_drag_leave;
233
g_type_class_add_private(obj_class, sizeof(AwnTaskPrivate));
235
awn_task_signals[MENU_ITEM_CLICKED] =
236
g_signal_new("menu_item_clicked",
237
G_OBJECT_CLASS_TYPE(obj_class),
239
G_STRUCT_OFFSET(AwnTaskClass, menu_item_clicked),
241
g_cclosure_marshal_VOID__UINT,
246
awn_task_signals[CHECK_ITEM_CLICKED] =
247
g_signal_new("check_item_clicked",
248
G_OBJECT_CLASS_TYPE(obj_class),
250
G_STRUCT_OFFSET(AwnTaskClass, check_item_clicked),
252
_awn_marshal_VOID__UINT_BOOLEAN,
255
G_TYPE_UINT, G_TYPE_BOOLEAN);
259
awn_task_init(AwnTask *task)
261
gtk_widget_add_events(GTK_WIDGET(task), GDK_ALL_EVENTS_MASK);
263
gtk_drag_dest_set(GTK_WIDGET(task),
264
GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
265
drop_types, n_drop_types,
266
GDK_ACTION_MOVE | GDK_ACTION_COPY);
269
#if !GTK_CHECK_VERSION(2,9,0)
270
/* TODO: equivalent of following function: */
272
//gtk_drag_dest_set_track_motion (GTK_WIDGET (task),TRUE);
274
gtk_drag_dest_add_uri_targets(GTK_WIDGET(task));
275
/* set all priv variables */
276
AwnTaskPrivate *priv;
277
priv = AWN_TASK_GET_PRIVATE(task);
281
priv->application = NULL;
282
priv->is_launcher = FALSE;
283
priv->is_starter = FALSE;
287
priv->reflect = NULL;
288
priv->progress = 100;
290
priv->info_text = NULL;
291
priv->is_active = FALSE;
292
priv->drag_hover = FALSE;
293
priv->menu_items[0] = NULL;
294
priv->menu_items[1] = NULL;
295
priv->menu_items[2] = NULL;
296
priv->menu_items[3] = NULL;
297
priv->menu_items[4] = NULL;
298
priv->timer_count = 0;
304
priv->dispose_has_run = FALSE;
306
priv->effects = awn_effects_new_for_widget(GTK_WIDGET(task));
307
awn_effects_register(priv->effects, GTK_WIDGET(task));
310
static const gchar* awn_task_get_title(GtkWidget *obj)
312
return awn_task_get_name(AWN_TASK(obj));
315
/************* EFFECTS *****************/
318
_task_refresh(GtkWidget *obj)
320
AwnTask *task = AWN_TASK(obj);
321
AwnTaskPrivate *priv;
322
priv = AWN_TASK_GET_PRIVATE(task);
323
gtk_widget_set_size_request(GTK_WIDGET(obj),
324
(priv->settings->task_width),
325
(priv->settings->bar_height + 2) * 2);
328
Note: Timeout will only happen once. awn_task_manager_refresh_box() always
331
g_timeout_add(50, (GSourceFunc)awn_task_manager_refresh_box,
336
launch_launched_effect(AwnTask *task)
338
AwnTaskPrivate *priv;
339
priv = AWN_TASK_GET_PRIVATE(task);
340
awn_effects_start_ex(priv->effects, AWN_EFFECT_LAUNCHING, NULL, NULL, 10);
344
_shrink_widget(AwnTask *task)
346
AwnTaskPrivate *priv;
348
g_return_val_if_fail(AWN_IS_TASK(task), FALSE);
349
priv = AWN_TASK_GET_PRIVATE(task);
351
if (priv->timer_count)
356
if (priv->is_launcher)
357
awn_task_manager_remove_launcher(priv->task_manager, task);
359
awn_task_manager_remove_task(priv->task_manager, task);
363
g_free(priv->application);
365
gtk_widget_hide(GTK_WIDGET(task));
369
gdk_pixbuf_unref(priv->icon);
374
gdk_pixbuf_unref(priv->reflect);
377
g_timeout_add_seconds(1, (GSourceFunc)awn_task_manager_refresh_box,
381
gtk_object_destroy(GTK_OBJECT(task));
388
_task_destroy(GtkWidget *obj)
390
g_timeout_add(40, (GSourceFunc)_shrink_widget, obj);
393
/********************** CALLBACKS **********************/
397
_rounded_rectangle(cairo_t *cr, double w, double h, double x, double y)
399
const float RADIUS_CORNERS = 1.5;
401
cairo_move_to(cr, x + RADIUS_CORNERS, y);
402
cairo_line_to(cr, x + w - RADIUS_CORNERS, y);
403
cairo_move_to(cr, w + x, y + RADIUS_CORNERS);
404
cairo_line_to(cr, w + x, h + y - RADIUS_CORNERS);
405
cairo_move_to(cr, w + x - RADIUS_CORNERS, h + y);
406
cairo_line_to(cr, x + RADIUS_CORNERS, h + y);
407
cairo_move_to(cr, x, h + y - RADIUS_CORNERS);
408
cairo_line_to(cr, x, y + RADIUS_CORNERS);
414
_rounded_corners(cairo_t *cr, double w, double h, double x, double y)
417
cairo_move_to(cr, x + radius, y);
418
cairo_arc(cr, x + w - radius, y + radius, radius, M_PI * 1.5, M_PI * 2);
419
cairo_arc(cr, x + w - radius, y + h - radius, radius, 0, M_PI * 0.5);
420
cairo_arc(cr, x + radius, y + h - radius, radius, M_PI * 0.5, M_PI);
421
cairo_arc(cr, x + radius, y + radius, radius, M_PI, M_PI * 1.5);
426
_rounded_rect(cairo_t *cr, gint x, gint y, gint w, gint h)
428
double radius, RADIUS_CORNERS;
429
radius = RADIUS_CORNERS = 6;
431
cairo_move_to(cr, x + radius, y);
432
cairo_arc(cr, x + w - radius, y + radius, radius, M_PI * 1.5, M_PI * 2);
433
cairo_arc(cr, x + w - radius, y + h - radius, radius, 0, M_PI * 0.5);
434
cairo_arc(cr, x + radius, y + h - radius, radius, M_PI * 0.5, M_PI);
435
cairo_arc(cr, x + radius, y + radius, radius, M_PI, M_PI * 1.5);
436
cairo_move_to(cr, x + RADIUS_CORNERS, y);
437
cairo_line_to(cr, x + w - RADIUS_CORNERS, y);
438
cairo_move_to(cr, w + x, y + RADIUS_CORNERS);
439
cairo_line_to(cr, w + x, h + y - RADIUS_CORNERS);
440
cairo_move_to(cr, w + x - RADIUS_CORNERS, h + y);
441
cairo_line_to(cr, x + RADIUS_CORNERS, h + y);
442
cairo_move_to(cr, x, h + y - RADIUS_CORNERS);
443
cairo_line_to(cr, x, y + RADIUS_CORNERS);
448
draw(GtkWidget *task, cairo_t *cr)
450
AwnTaskPrivate *priv;
451
AwnSettings *settings;
452
double width, height;
454
priv = AWN_TASK_GET_PRIVATE(task);
455
settings = priv->settings;
457
width = task->allocation.width;
458
height = task->allocation.height;
460
awn_effects_draw_set_window_size(priv->effects, width, height);
462
gint resize_offset = settings->bar_height + 12 - settings->task_width;
465
cairo_set_source_rgba(cr, 1, 0, 0, 0.0);
466
cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
467
cairo_rectangle(cr, -1, -1, width + 1, height + 1);
470
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
474
if (priv->window && wnck_window_is_active(priv->window))
476
cairo_set_source_rgba(cr, settings->border_color.red,
477
settings->border_color.green,
478
settings->border_color.blue,
481
if (settings->bar_angle < 0)
483
_rounded_rect(cr, 0 , settings->bar_height + resize_offset - priv->effects->curve_offset,
484
width, settings->bar_height - resize_offset);
490
_rounded_rect(cr, 0 , settings->bar_height + resize_offset,
491
width, settings->bar_height - resize_offset);
495
cairo_set_source_rgba(cr, settings->border_color.red,
496
settings->border_color.green,
497
settings->border_color.blue,
499
_rounded_rect(cr, 0 , settings->bar_height*2,
500
width, settings->icon_offset);
505
/* use libawn to draw */
506
awn_effects_draw_background(priv->effects, cr);
508
awn_effects_draw_icons(priv->effects, cr, priv->icon, priv->reflect);
510
awn_effects_draw_foreground(priv->effects, cr);
519
if (settings->bar_angle >= 0)
521
arrow_top = (settings->bar_height * 2) + settings->arrow_offset;
522
cairo_set_source_rgba(cr, settings->arrow_color.red,
523
settings->arrow_color.green,
524
settings->arrow_color.blue,
525
settings->arrow_color.alpha);
526
cairo_move_to(cr, x1 - 5, arrow_top);
527
cairo_line_to(cr, x1, arrow_top - 5);
528
cairo_line_to(cr, x1 + 5, arrow_top);
529
cairo_close_path(cr);
533
cairo_set_source_rgba(cr, settings->arrow_color.red,
534
settings->arrow_color.green,
535
settings->arrow_color.blue,
536
settings->arrow_color.alpha);
537
cairo_arc(cr, width / 2., (settings->bar_height * 2) - 5, 3., 0., 2 * M_PI);
540
if (settings->tasks_have_arrows)
542
if (priv->window != NULL)
546
else if (priv->is_launcher && (priv->window == NULL))
556
if (priv->progress != 100)
558
cairo_move_to(cr, width / 2.0, settings->bar_height *1.5);
559
cairo_set_source_rgba(cr, settings->background.red,
560
settings->background.green,
561
settings->background.blue,
562
settings->background.alpha);
564
cairo_arc(cr, width / 2.0, settings->bar_height *1.5, 15, 0, 360.0 * (M_PI / 180.0));
567
cairo_move_to(cr, width / 2.0, settings->bar_height *1.5);
568
cairo_set_source_rgba(cr, settings->text_color.red,
569
settings->text_color.green,
570
settings->text_color.blue,
572
cairo_arc(cr, width / 2.0,
573
settings->bar_height * 1.5,
574
12, 270.0 * (M_PI / 180.0),
575
(270.0 + ((double)(priv->progress / 100.0) * 360.0)) * (M_PI / 180.0));
579
if ((priv->progress == 100) && priv->info)
582
cairo_text_extents_t extents;
583
cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
584
CAIRO_FONT_WEIGHT_BOLD);
585
gint len = strlen(priv->info_text);
588
cairo_set_font_size(cr, 8);
590
cairo_set_font_size(cr, 10);
592
cairo_set_font_size(cr, 12);
594
cairo_text_extents(cr, priv->info_text, &extents);
596
cairo_move_to(cr, width / 2.0, settings->bar_height *1.5);
598
cairo_set_source_rgba(cr, settings->background.red,
599
settings->background.green,
600
settings->background.blue,
601
settings->background.alpha);
603
_rounded_rectangle(cr, (double) extents.width + 8.0,
604
(double) extents.height + 84.0,
605
(width / 2.0) - 4.0 - ((extents.width + extents.x_bearing) / 2.0),
606
(settings->bar_height *1.5) - (extents.height / 2.0) - 4.0);
608
_rounded_corners(cr, (double) extents.width + 8.0,
609
(double) extents.height + 8.0,
610
(width / 2.0) - 4.0 - ((extents.width + extents.x_bearing) / 2.0),
611
(settings->bar_height *1.5) - (extents.height / 2.0) - 4.0);
616
cairo_set_source_rgba(cr, settings->text_color.red,
617
settings->text_color.green,
618
settings->text_color.blue,
621
cairo_move_to(cr, (width / 2.0) - ((extents.width + extents.x_bearing) / 2.0) - 1, (settings->bar_height *1.5) + (extents.height / 2.0));
623
cairo_show_text(cr, priv->info_text);
628
awn_task_expose(GtkWidget *task, GdkEventExpose *event)
630
AwnTaskPrivate *priv;
632
priv = AWN_TASK_GET_PRIVATE(task);
635
cr = gdk_cairo_create(task->window);
645
awn_task_launch_unique(AwnTask *task, const char *arg_str)
647
AwnTaskPrivate *priv;
648
priv = AWN_TASK_GET_PRIVATE(task);;
651
int pid = awn_desktop_item_launch(priv->item, NULL, &err);
655
g_print("Error: %s", err->message);
659
g_print("Launched application : %d\n", pid);
664
awn_task_launch(AwnTask *task, const char *arg_str)
666
AwnTaskPrivate *priv;
667
priv = AWN_TASK_GET_PRIVATE(task);;
670
priv->pid = awn_desktop_item_launch(priv->item, NULL, &err);
674
g_print("Error: %s", err->message);
678
g_print("Launched application : %d\n", priv->pid);
682
/*Callback to start awn-manager. */
684
awn_start_awn_manager(GtkMenuItem *menuitem, gpointer null)
687
g_spawn_command_line_async("awn-manager", &err);
691
g_warning("Failed to start awn-manager: %s\n", err->message);
699
awn_task_activate_transient (AwnTask *task, guint32 time)
701
AwnTaskPrivate *priv = AWN_TASK_GET_PRIVATE(task);
703
WnckWorkspace *active_workspace, *window_workspace;
705
if (!priv->window) return;
707
gint activate_behavior =
708
awn_task_manager_get_activate_behavior (priv->task_manager);
710
switch (activate_behavior)
712
case AWN_ACTIVATE_MOVE_TO_TASK_VIEWPORT:
713
screen = wnck_window_get_screen(priv->window);
714
active_workspace = wnck_screen_get_active_workspace (screen);
715
window_workspace = wnck_window_get_workspace (priv->window);
717
if (active_workspace && window_workspace &&
718
!wnck_window_is_on_workspace(priv->window, active_workspace))
719
wnck_workspace_activate(window_workspace, time);
723
case AWN_ACTIVATE_MOVE_TASK_TO_ACTIVE_VIEWPORT:
724
screen = wnck_window_get_screen(priv->window);
725
active_workspace = wnck_screen_get_active_workspace (screen);
727
if (active_workspace &&
728
!wnck_window_is_on_workspace(priv->window, active_workspace))
729
wnck_window_move_to_workspace(priv->window, active_workspace);
733
case AWN_ACTIVATE_DEFAULT:
737
// last step is always activating the window
738
wnck_window_activate_transient (priv->window, time);
742
awn_task_button_press(GtkWidget *task, GdkEventButton *event)
744
static guint32 past_time; // 3v1n0 double-click (or more) prevention
745
AwnTaskPrivate *priv;
746
GtkWidget *menu = NULL;
748
priv = AWN_TASK_GET_PRIVATE(task);
754
switch (event->button)
759
if (event->time - past_time > AWN_CLICK_IDLE_TIME)
761
past_time = event->time;
763
if (wnck_window_is_active(priv->window))
765
wnck_window_minimize(priv->window);
769
awn_task_activate_transient (AWN_TASK (task), event->time);
776
if (priv->is_launcher)
777
awn_task_launch_unique(AWN_TASK(task), NULL);
782
menu = wnck_create_window_action_menu(priv->window);
784
awn_task_create_menu(AWN_TASK(task), GTK_MENU(menu));
786
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL,
787
NULL, 3, event->time);
795
else if (priv->is_launcher)
797
switch (event->button)
802
if (event->time - past_time > AWN_CLICK_IDLE_TIME)
804
past_time = event->time;
805
awn_task_launch(AWN_TASK(task), NULL);
806
launch_launched_effect(AWN_TASK(task));
812
// // Manage middle click on launchers
813
// g_print("Middle click pressed for launcher\n");
817
menu = gtk_menu_new();
818
awn_task_create_menu(AWN_TASK(task), GTK_MENU(menu));
820
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL,
821
NULL, 3, event->time);
839
awn_task_scroll_event(GtkWidget *task, GdkEventScroll *event)
841
AwnTaskPrivate *priv;
842
gboolean in_viewport;
845
WnckWindow *focus = NULL;
847
WnckWorkspace *space;
849
priv = AWN_TASK_GET_PRIVATE(task);
851
if (priv->is_launcher)
854
screen = wnck_screen_get_default();
856
space = wnck_screen_get_active_workspace(screen);
858
if (event->direction == GDK_SCROLL_UP)
860
if (wnck_window_is_active(priv->window))
863
//Save current position
864
wnck_window_get_geometry(priv->window,
870
if (priv->old_x == -1 && priv->old_y == -1)
876
//Window is in current viewport? If no, center window
877
in_viewport = wnck_window_is_in_viewport(priv->window, space);
879
x = in_viewport ? x : (wnck_screen_get_width(screen) - w) / 2;
881
y = in_viewport ? y : (wnck_screen_get_height(screen) - h) / 2;
883
//Save last active window
884
last_active_window = wnck_screen_get_active_window(wnck_screen_get_default());
886
focus = priv->window;
888
else if (event->direction == GDK_SCROLL_DOWN)
890
if (priv->old_x == -1 && priv->old_y == -1)
897
focus = wnck_window_is_active(priv->window) ?
899
wnck_screen_get_active_window(screen);
905
last_active_window = NULL;
908
wnck_window_set_geometry(priv->window,
910
WNCK_WINDOW_GRAVITY_CURRENT,
911
WNCK_WINDOW_CHANGE_X | WNCK_WINDOW_CHANGE_Y,
916
wnck_window_activate_transient(focus, event->time);
923
_task_drag_data_recieved(GtkWidget *widget, GdkDragContext *context,
924
gint x, gint y, GtkSelectionData *selection_data,
925
guint target_type, guint time,
931
gboolean delete_selection_data = FALSE;
933
AwnTaskPrivate *priv;
934
priv = AWN_TASK_GET_PRIVATE(task);
935
gtk_drag_finish(context, TRUE, FALSE, time);
937
if (!priv->is_launcher)
939
gtk_drag_finish(context, FALSE, delete_selection_data, time);
945
res = strstr((char *)selection_data->data, ".desktop");
952
list = awn_vfs_get_pathlist_from_string((gchar *)selection_data->data, &err);
954
priv->pid = awn_desktop_item_launch(priv->item, list, &err);
958
g_print("Error: %s", err->message);
962
g_print("Launched application : %d\n", priv->pid);
964
g_slist_foreach(list, (GFunc)g_free, NULL);
973
activate_window(AwnTask *task)
975
AwnTaskPrivate *priv;
976
priv = AWN_TASK_GET_PRIVATE(task);
978
if (priv->drag_hover && !wnck_window_is_active(priv->window))
979
awn_task_activate_transient(task, priv->timestamp);
985
awn_task_drag_motion(GtkWidget *task,
986
GdkDragContext *context, gint x, gint y, guint t)
988
AwnTaskPrivate *priv;
989
priv = AWN_TASK_GET_PRIVATE(task);
991
if (priv->settings->auto_hide && priv->settings->hidden)
993
awn_show(priv->settings);
998
if (!wnck_window_is_active(priv->window))
1000
priv->drag_hover = TRUE;
1001
priv->timestamp = gtk_get_current_event_time();
1002
g_timeout_add_seconds(1, (GSourceFunc)activate_window, (gpointer)task);
1005
awn_effects_start_ex(priv->effects, AWN_EFFECT_LAUNCHING, NULL, NULL, 1);
1012
awn_task_drag_leave(GtkWidget *task, GdkDragContext *drag_context,
1015
AwnTaskPrivate *priv;
1016
priv = AWN_TASK_GET_PRIVATE(task);
1017
priv->drag_hover = FALSE;
1019
if (priv->settings->auto_hide && !priv->settings->hidden)
1021
awn_hide(priv->settings);
1026
_task_wnck_icon_changed(WnckWindow *window, AwnTask *task)
1028
AwnTaskPrivate *priv;
1029
priv = AWN_TASK_GET_PRIVATE(task);
1031
if (priv->is_launcher)
1034
GdkPixbuf *old = NULL;
1036
GdkPixbuf *old_reflect = NULL;
1040
old_reflect = priv->reflect;
1042
int height = priv->settings->bar_height;
1044
if ((priv->settings->task_width - 12) < height)
1046
height = priv->settings->task_width - 12;
1049
priv->icon = awn_x_get_icon_for_window(priv->window,
1052
priv->reflect = gdk_pixbuf_flip(priv->icon, FALSE);
1054
awn_effects_draw_set_icon_size(priv->effects, gdk_pixbuf_get_width(priv->icon), gdk_pixbuf_get_height(priv->icon));
1056
gdk_pixbuf_unref(old);
1057
gdk_pixbuf_unref(old_reflect);
1058
gtk_widget_queue_draw(GTK_WIDGET(task));
1062
_task_wnck_name_hide(AwnTask *task)
1064
AwnTaskPrivate *priv;
1065
priv = AWN_TASK_GET_PRIVATE(task);
1066
awn_title_hide(AWN_TITLE(priv->title), GTK_WIDGET(task));
1067
awn_effects_stop(priv->effects, AWN_EFFECT_ATTENTION);
1068
/* If wanted, this could be done in a GDestroyNotify callback if
1069
we added the timer using g_timeout_add_full () */
1070
priv->timer_count--;
1075
_task_wnck_name_changed(WnckWindow *window, AwnTask *task)
1077
g_return_if_fail(AWN_IS_TASK(task));
1079
AwnTaskPrivate *priv;
1080
priv = AWN_TASK_GET_PRIVATE(task);
1082
if (!priv->window || !priv->settings->name_change_notify)
1088
g_print("Name changed on window '%s'\n",
1089
wnck_window_get_name (priv->window));
1092
if (!wnck_window_is_active(priv->window))
1095
gdk_window_get_origin(GTK_WIDGET(task)->window, &x, &y);
1097
awn_effects_start_ex(priv->effects, AWN_EFFECT_ATTENTION, NULL, NULL, 10);
1099
awn_title_show(AWN_TITLE(priv->title),
1101
awn_task_get_name(AWN_TASK(task)));
1103
priv->timer_count++;
1104
g_timeout_add(2500, (GSourceFunc)_task_wnck_name_hide, (gpointer)task);
1110
_task_wnck_state_changed(WnckWindow *window, WnckWindowState old,
1111
WnckWindowState new, AwnTask *task)
1113
AwnTaskPrivate *priv;
1114
priv = AWN_TASK_GET_PRIVATE(task);
1116
if (priv->window == NULL)
1119
if (wnck_window_is_skip_tasklist(priv->window))
1120
gtk_widget_hide(GTK_WIDGET(task));
1122
gtk_widget_show(GTK_WIDGET(task));
1124
if (wnck_window_needs_attention(priv->window))
1126
awn_effects_start(priv->effects, AWN_EFFECT_ATTENTION);
1130
awn_effects_stop(priv->effects, AWN_EFFECT_ATTENTION);
1134
gboolean updating = FALSE;
1136
_viewport_changed_so_update(AwnTaskManager *task_manager)
1139
awn_task_manager_refresh_box(task_manager);
1144
_task_wnck_geometry_changed(WnckWindow *window, AwnTask *task)
1146
AwnTaskPrivate *priv;
1148
int x,y,width,height;
1150
g_return_if_fail(AWN_IS_TASK(task));
1152
priv = AWN_TASK_GET_PRIVATE(task);
1154
if (priv->window == NULL)
1157
screen = wnck_window_get_screen(priv->window);
1158
wnck_window_get_geometry(priv->window,
1164
if( x <= -width || x >= wnck_screen_get_width(screen) )
1166
/* Window is moved off viewport, so update the list of tasks */
1170
g_timeout_add(50, (GSourceFunc)_viewport_changed_so_update, priv->task_manager);
1175
/**********************Gets & Sets **********************/
1178
awn_task_get_is_launcher(AwnTask *task)
1180
AwnTaskPrivate *priv;
1181
priv = AWN_TASK_GET_PRIVATE(task);
1182
return priv->is_launcher;
1186
awn_task_set_window(AwnTask *task, WnckWindow *window)
1188
g_return_val_if_fail(WNCK_IS_WINDOW(window), 0);
1190
AwnTaskPrivate *priv;
1191
priv = AWN_TASK_GET_PRIVATE(task);
1193
if (priv->window != NULL)
1196
gboolean connect_geom_signal =
1197
awn_task_manager_screen_has_viewports (priv->task_manager);
1199
priv->window = window;
1201
if (!priv->is_launcher)
1203
gint size = priv->settings->task_width - 12;
1204
if (size <= 0) size = 1;
1205
priv->icon = awn_x_get_icon_for_window(priv->window,
1207
if (GDK_IS_PIXBUF (priv->icon))
1208
priv->reflect = gdk_pixbuf_flip(priv->icon, FALSE);
1210
priv->reflect = NULL;
1212
awn_effects_draw_set_icon_size(priv->effects, gdk_pixbuf_get_width(priv->icon), gdk_pixbuf_get_height(priv->icon));
1216
priv->icon_changed = g_signal_connect(G_OBJECT(priv->window), "icon_changed",
1218
G_CALLBACK(_task_wnck_icon_changed), (gpointer)task);
1220
priv->state_changed = g_signal_connect(G_OBJECT(priv->window), "state_changed",
1221
G_CALLBACK(_task_wnck_state_changed), (gpointer)task);
1223
priv->name_changed = g_signal_connect(G_OBJECT(priv->window), "name_changed",
1224
G_CALLBACK(_task_wnck_name_changed), (gpointer)task);
1226
if (connect_geom_signal)
1228
priv->geometry_changed = g_signal_connect(G_OBJECT(priv->window), "geometry_changed",
1229
G_CALLBACK(_task_wnck_geometry_changed), (gpointer)task);
1232
/* if launcher, set a launch_sequence
1233
else if starter, stop the launch_sequence, disable starter flag*/
1235
//awn_task_refresh_icon_geometry(task);
1237
if (wnck_window_is_skip_tasklist(window))
1240
if (priv->is_launcher)
1242
awn_effects_stop(priv->effects, AWN_EFFECT_LAUNCHING);
1246
awn_effects_start_ex(priv->effects, AWN_EFFECT_OPENING, NULL, _task_refresh, 1);
1252
awn_task_set_launcher(AwnTask *task, AwnDesktopItem *item)
1254
AwnTaskPrivate *priv;
1255
gchar *icon_name = NULL;
1257
priv = AWN_TASK_GET_PRIVATE(task);
1259
priv->is_launcher = item != NULL;
1260
if (item == NULL) return FALSE;
1262
gboolean was_null = priv->item == NULL;
1264
icon_name = awn_desktop_item_get_icon(item, priv->settings->icon_theme);
1272
priv->icon = awn_x_get_icon_for_launcher(item,
1273
priv->settings->task_width - 12,
1274
priv->settings->task_width - 12);
1281
priv->reflect = gdk_pixbuf_flip(priv->icon, FALSE);
1283
awn_effects_draw_set_icon_size(priv->effects, gdk_pixbuf_get_width(priv->icon), gdk_pixbuf_get_height(priv->icon));
1287
awn_effects_start_ex(priv->effects, AWN_EFFECT_OPENING,
1288
NULL, _task_refresh, 1);
1295
awn_task_is_launcher(AwnTask *task)
1297
AwnTaskPrivate *priv;
1298
priv = AWN_TASK_GET_PRIVATE(task);
1299
return priv->is_launcher;
1303
awn_task_get_window(AwnTask *task)
1305
AwnTaskPrivate *priv;
1306
priv = AWN_TASK_GET_PRIVATE(task);
1307
return priv->window;
1311
awn_task_get_xid(AwnTask *task)
1313
AwnTaskPrivate *priv;
1314
priv = AWN_TASK_GET_PRIVATE(task);
1316
if (priv->window == NULL)
1319
g_return_val_if_fail(WNCK_IS_WINDOW(priv->window), 0);
1321
return wnck_window_get_xid(priv->window);
1325
awn_task_get_pid(AwnTask *task)
1327
AwnTaskPrivate *priv;
1328
priv = AWN_TASK_GET_PRIVATE(task);
1330
if (priv->window != NULL)
1331
return wnck_window_get_pid(priv->window);
1337
awn_task_set_is_active(AwnTask *task, gboolean is_active)
1339
AwnTaskPrivate *priv;
1340
priv = AWN_TASK_GET_PRIVATE(task);
1342
if (priv->window == NULL)
1345
priv->is_active = wnck_window_is_active(priv->window);
1347
gtk_widget_queue_draw(GTK_WIDGET(task));
1351
awn_task_set_needs_attention(AwnTask *task, gboolean needs_attention)
1353
// wow, it's never called
1354
AwnTaskPrivate *priv;
1355
priv = AWN_TASK_GET_PRIVATE(task);
1357
if (needs_attention)
1358
awn_effects_start(priv->effects, AWN_EFFECT_ATTENTION);
1360
awn_effects_stop(priv->effects, AWN_EFFECT_ATTENTION);
1364
awn_task_get_name(AwnTask *task)
1366
AwnTaskPrivate *priv;
1367
priv = AWN_TASK_GET_PRIVATE(task);
1369
const char *name = NULL;
1373
name = wnck_window_get_name(priv->window);
1375
else if (priv->is_launcher)
1376
name = awn_desktop_item_get_name(priv->item);
1384
awn_task_get_application(AwnTask *task)
1386
AwnTaskPrivate *priv;
1387
WnckApplication *wnck_app;
1391
priv = AWN_TASK_GET_PRIVATE(task);
1394
if (priv->application)
1395
return priv->application;
1397
if (priv->is_launcher)
1400
str = g_string_new(awn_desktop_item_get_exec(priv->item));
1403
for (i = 0; i < str->len; i++)
1405
if (str->str[i] == ' ')
1410
str = g_string_truncate(str, i);
1412
priv->application = g_strdup(str->str);
1414
app = g_string_free(str, TRUE);
1417
else if (priv->window)
1419
wnck_app = wnck_window_get_application(priv->window);
1421
if (WNCK_IS_APPLICATION(wnck_app))
1423
str = g_string_new(wnck_application_get_name(wnck_app));
1427
str = g_string_new(NULL);
1430
str = g_string_ascii_down(str);
1432
priv->application = g_strdup(str->str);
1433
app = g_string_free(str, TRUE);
1437
priv->application = NULL;
1439
return priv->application;
1443
awn_task_set_title(AwnTask *task, AwnTitle *title)
1445
AwnTaskPrivate *priv;
1446
priv = AWN_TASK_GET_PRIVATE(task);
1448
priv->title = title;
1449
awn_effects_set_title(priv->effects, title, awn_task_get_title);
1453
awn_task_get_settings(AwnTask *task)
1455
AwnTaskPrivate *priv;
1456
priv = AWN_TASK_GET_PRIVATE(task);
1457
return priv->settings;
1461
awn_task_refresh_icon_geometry(AwnTask *task)
1463
AwnTaskPrivate *priv;
1464
static gint old_x = 0;
1465
static gint old_y = 0;
1469
priv = AWN_TASK_GET_PRIVATE(task);
1471
if (priv->window == NULL)
1474
gdk_window_get_origin(GTK_WIDGET(task)->window, &x, &y);
1476
gdk_drawable_get_size(GDK_DRAWABLE(GTK_WIDGET(task)->window),
1479
//width = priv->icon_width;
1480
//height = priv->icon_height;
1482
//printf("width: %d, height: %d\n", width, height);
1484
if ((x != old_x) || (y != old_y))
1495
wnck_window_set_icon_geometry(priv->window, x, y, width, height);
1506
awn_task_update_icon(AwnTask *task)
1508
AwnTaskPrivate *priv;
1509
GdkPixbuf *old = NULL;
1510
GdkPixbuf *old_reflect = NULL;
1511
priv = AWN_TASK_GET_PRIVATE(task);
1514
old_reflect = priv->reflect;
1516
int height = priv->settings->bar_height;
1518
if ((priv->settings->task_width - 12) < height)
1520
height = priv->settings->task_width - 12;
1523
priv->icon = awn_x_get_icon_for_launcher(priv->item,
1533
priv->reflect = gdk_pixbuf_flip(priv->icon, FALSE);
1535
awn_effects_draw_set_icon_size(priv->effects,
1536
gdk_pixbuf_get_width(priv->icon),
1537
gdk_pixbuf_get_height(priv->icon));
1539
gdk_pixbuf_unref(old);
1540
gdk_pixbuf_unref(old_reflect);
1544
awn_task_set_width(AwnTask *task, gint width)
1546
AwnTaskPrivate *priv;
1547
GdkPixbuf *old = NULL;
1548
GdkPixbuf *old_reflect = NULL;
1550
if (!AWN_IS_TASK(task))
1553
g_return_if_fail(AWN_IS_TASK(task));
1555
priv = AWN_TASK_GET_PRIVATE(task);
1557
//if (priv->effects.is_closing.state) {
1563
old_reflect = priv->reflect;
1565
if (priv->is_launcher)
1567
char * icon_name = awn_desktop_item_get_icon(priv->item, priv->settings->icon_theme);
1571
priv->icon = awn_x_get_icon_for_window(priv->window, width - 12, width - 12);
1575
priv->icon = awn_x_get_icon_for_launcher(priv->item, width - 12, width - 12);
1582
if (WNCK_IS_WINDOW(priv->window))
1584
priv->icon = awn_x_get_icon_for_window(priv->window, width - 12, width - 12);
1588
if (G_IS_OBJECT(priv->icon))
1590
priv->reflect = gdk_pixbuf_flip(priv->icon, FALSE);
1591
awn_effects_draw_set_icon_size(priv->effects, gdk_pixbuf_get_width(priv->icon), gdk_pixbuf_get_height(priv->icon));
1594
if (G_IS_OBJECT(old) && (priv->is_launcher || WNCK_IS_WINDOW(priv->window)))
1595
gdk_pixbuf_unref(old);
1597
if (G_IS_OBJECT(old_reflect))
1598
gdk_pixbuf_unref(old_reflect);
1600
gtk_widget_set_size_request(GTK_WIDGET(task),
1602
(priv->settings->bar_height + 2) * 2);
1608
awn_task_get_item(AwnTask *task)
1610
AwnTaskPrivate *priv;
1611
g_return_val_if_fail(AWN_IS_TASK(task), NULL);
1612
priv = AWN_TASK_GET_PRIVATE(task);
1617
/********************* DBUS FUNCTIONS *******************/
1620
awn_task_set_custom_icon(AwnTask *task, GdkPixbuf *icon)
1622
AwnTaskPrivate *priv;
1623
GdkPixbuf *old_icon;
1624
GdkPixbuf *old_reflect;
1626
g_return_if_fail(AWN_IS_TASK(task));
1628
priv = AWN_TASK_GET_PRIVATE(task);
1629
old_icon = priv->icon;
1630
old_reflect = priv->reflect;
1633
priv->reflect = gdk_pixbuf_flip(priv->icon, FALSE);
1635
awn_effects_draw_set_icon_size(priv->effects, gdk_pixbuf_get_width(priv->icon), gdk_pixbuf_get_height(priv->icon));
1637
g_object_unref(G_OBJECT(old_icon));
1638
g_object_unref(G_OBJECT(old_reflect));
1640
gtk_widget_queue_draw(GTK_WIDGET(task));
1644
awn_task_unset_custom_icon(AwnTask *task)
1646
AwnTaskPrivate *priv;
1647
GdkPixbuf *old_icon;
1648
GdkPixbuf *old_reflect;
1649
char *icon_name = NULL;
1651
g_return_if_fail(AWN_IS_TASK(task));
1653
priv = AWN_TASK_GET_PRIVATE(task);
1654
old_icon = priv->icon;
1655
old_reflect = priv->reflect;
1657
if (priv->is_launcher)
1659
icon_name = awn_desktop_item_get_icon(priv->item, priv->settings->icon_theme);
1663
priv->icon = awn_x_get_icon_for_window(priv->window, priv->settings->task_width - 12, priv->settings->task_width - 12);
1667
priv->icon = awn_x_get_icon_for_launcher(priv->item, priv->settings->task_width - 12, priv->settings->task_width - 12);
1674
priv->icon = awn_x_get_icon_for_window(priv->window, priv->settings->bar_height, priv->settings->bar_height);
1677
priv->reflect = gdk_pixbuf_flip(priv->icon, FALSE);
1679
awn_effects_draw_set_icon_size(priv->effects, gdk_pixbuf_get_width(priv->icon), gdk_pixbuf_get_height(priv->icon));
1681
g_object_unref(G_OBJECT(old_icon));
1682
g_object_unref(G_OBJECT(old_reflect));
1684
gtk_widget_queue_draw(GTK_WIDGET(task));
1688
awn_task_set_progress(AwnTask *task, gint progress)
1690
AwnTaskPrivate *priv;
1692
g_return_if_fail(AWN_IS_TASK(task));
1694
priv = AWN_TASK_GET_PRIVATE(task);
1696
if ((progress < 101) && (progress >= 0))
1697
priv->progress = progress;
1699
priv->progress = 100;
1701
gtk_widget_queue_draw(GTK_WIDGET(task));
1705
awn_task_set_info(AwnTask *task, const gchar *info)
1707
AwnTaskPrivate *priv;
1709
g_return_if_fail(AWN_IS_TASK(task));
1711
priv = AWN_TASK_GET_PRIVATE(task);
1713
if (priv->info_text)
1715
g_free(priv->info_text);
1716
priv->info_text = NULL;
1721
priv->info_text = g_strdup(info);
1723
gtk_widget_queue_draw(GTK_WIDGET(task));
1727
awn_task_unset_info(AwnTask *task)
1729
AwnTaskPrivate *priv;
1731
g_return_if_fail(AWN_IS_TASK(task));
1733
priv = AWN_TASK_GET_PRIVATE(task);
1737
if (priv->info_text)
1739
g_free(priv->info_text);
1740
priv->info_text = NULL;
1743
gtk_widget_queue_draw(GTK_WIDGET(task));
1747
awn_task_add_menu_item(AwnTask *task, GtkMenuItem *item)
1749
AwnTaskPrivate *priv;
1750
AwnTaskMenuItem *menu_item;
1752
g_return_val_if_fail(AWN_IS_TASK(task), 0);
1754
priv = AWN_TASK_GET_PRIVATE(task);
1758
for (i = 0; i < 5; i++)
1760
if (priv->menu_items[i] == NULL)
1762
g_object_ref(G_OBJECT(item));
1763
menu_item = g_new0(AwnTaskMenuItem, 1);
1764
menu_item->type = AWN_TASK_MENU_TYPE_NORMAL;
1765
menu_item->item = GTK_WIDGET(item);
1766
menu_item->active = FALSE;
1767
priv->menu_items[i] = menu_item;
1768
menu_item->id = menu_item_id++;
1769
return menu_item->id;
1777
awn_task_add_check_item(AwnTask *task, GtkMenuItem *item)
1779
AwnTaskPrivate *priv;
1780
AwnTaskMenuItem *menu_item;
1782
g_return_val_if_fail(AWN_IS_TASK(task), 0);
1784
priv = AWN_TASK_GET_PRIVATE(task);
1788
for (i = 0; i < 5; i++)
1790
if (priv->menu_items[i] == NULL)
1792
g_object_ref(G_OBJECT(item));
1793
menu_item = g_new0(AwnTaskMenuItem, 1);
1794
menu_item->type = AWN_TASK_MENU_TYPE_CHECK;
1795
menu_item->item = GTK_WIDGET(item);
1796
menu_item->active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item));
1797
priv->menu_items[i] = menu_item;
1798
menu_item->id = menu_item_id++;
1799
return menu_item->id;
1807
awn_task_set_check_item(AwnTask *task, gint id, gboolean active)
1809
AwnTaskPrivate *priv;
1810
AwnTaskMenuItem *menu_item;
1812
g_return_if_fail(AWN_IS_TASK(task));
1814
priv = AWN_TASK_GET_PRIVATE(task);
1817
for (i = 0; i < 5; i++)
1819
menu_item = priv->menu_items[i];
1821
if (menu_item != NULL)
1823
if (menu_item->id == id)
1825
menu_item->active = active;
1831
/********************* MISC FUNCTIONS *******************/
1833
typedef struct _FileChooserAndTask FileChooserAndTask;
1835
struct _FileChooserAndTask
1837
GtkWidget *filechooser;
1842
static void _task_choose_custom_icon_performed(GtkWidget *dialog, gint res, FileChooserAndTask *fct)
1845
AwnTaskPrivate *priv;
1846
GdkPixbuf *pixbuf = NULL;
1848
gchar *filename = NULL;
1851
AwnTask *task = fct->task;
1854
g_return_if_fail(AWN_IS_TASK(task));
1855
priv = AWN_TASK_GET_PRIVATE(task);
1857
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fct->filechooser));
1859
gtk_widget_hide(dialog);
1860
gtk_widget_destroy(dialog);
1862
/* If not accept, clean up and return */
1864
if (res != GTK_RESPONSE_ACCEPT)
1869
/* Okay, the user has chosen a new icon, so lets load it up */
1871
pixbuf = gdk_pixbuf_new_from_file_at_size(filename, priv->settings->bar_height, priv->settings->bar_height, &err);
1875
/* Check if is actually a pixbuf */
1878
g_warning("Failed to load pixbuf (%s)\n", err->message);
1883
/* So we have a nice new pixbuf, we now want to save it's location
1885
if (priv->is_launcher)
1887
name = g_strdup(awn_desktop_item_get_exec(priv->item));
1891
WnckApplication *app = NULL;
1892
app = wnck_window_get_application(priv->window);
1900
GString *gname = awn_x_get_application_name(priv->window, app);
1901
name = g_strdup(gname->str);
1902
g_string_free(gname, TRUE);
1908
/* Somethings gone very wrong */
1912
/* Replace spaces with dashs */
1913
for (i = 0; i < strlen(name); i++)
1915
if (name[i] == ' ' || name[i] == '/')
1919
/* Now lets build the save-filename and save it */
1920
save = g_build_filename(g_get_home_dir(),
1925
gdk_pixbuf_save(pixbuf, save, "png", &err, NULL);
1931
g_print("%s\n", err->message);
1936
/* Now we have saved the new pixbuf, lets actually set it as the main
1937
pixbuf and refresh the view */
1938
g_object_unref(G_OBJECT(priv->icon));
1940
g_object_unref(G_OBJECT(priv->reflect));
1942
priv->icon = pixbuf;
1944
priv->reflect = gdk_pixbuf_flip(priv->icon, FALSE);
1946
awn_effects_draw_set_icon_size(priv->effects, gdk_pixbuf_get_width(priv->icon), gdk_pixbuf_get_height(priv->icon));
1948
gtk_widget_queue_draw(GTK_WIDGET(task));
1954
_task_choose_custom_icon(AwnTask *task)
1956
#define PIXBUF_SAVE_PATH ".config/awn/custom-icons"
1958
AwnTaskPrivate *priv;
1961
g_return_if_fail(AWN_IS_TASK(task));
1962
priv = AWN_TASK_GET_PRIVATE(task);
1964
/* Create the dialog */
1965
file = gtk_file_chooser_dialog_new(_("Choose New Image..."),
1966
GTK_WINDOW(priv->settings->window),
1967
GTK_FILE_CHOOSER_ACTION_OPEN,
1968
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1969
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
1972
FileChooserAndTask *fct = g_new(FileChooserAndTask, 1);
1973
fct->filechooser = file;
1976
g_signal_connect(file, "response", G_CALLBACK(_task_choose_custom_icon_performed), (gpointer)fct);
1979
gtk_widget_show_all(file);
1983
_task_menu_item_clicked(GtkMenuItem *item, AwnTask *task)
1985
AwnTaskPrivate *priv;
1986
AwnTaskMenuItem *menu_item;
1989
priv = AWN_TASK_GET_PRIVATE(task);
1991
for (i = 0; i < 5; i++)
1993
menu_item = priv->menu_items[i];
1995
if (menu_item != NULL)
1997
if (GTK_MENU_ITEM(menu_item->item) == item)
1999
g_signal_emit(G_OBJECT(task), awn_task_signals[MENU_ITEM_CLICKED], 0,
2000
(guint) menu_item->id);
2009
_task_check_item_clicked(GtkMenuItem *item, AwnTask *task)
2011
AwnTaskPrivate *priv;
2012
AwnTaskMenuItem *menu_item;
2016
priv = AWN_TASK_GET_PRIVATE(task);
2018
active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item));
2020
for (i = 0; i < 5; i++)
2022
menu_item = priv->menu_items[i];
2024
if (menu_item != NULL)
2026
if (GTK_MENU_ITEM(menu_item->item) == item)
2028
g_signal_emit(G_OBJECT(task), awn_task_signals[CHECK_ITEM_CLICKED], 0,
2029
(guint) menu_item->id, active);
2030
menu_item->active = active;
2038
on_change_icon_clicked(GtkButton *button, AwnTask *task)
2040
_task_choose_custom_icon(task);
2044
_task_show_prefs(GtkMenuItem *item, AwnTask *task)
2046
_task_choose_custom_icon(task);
2049
AwnTaskPrivate *priv;
2050
priv = AWN_TASK_GET_PRIVATE(task);
2055
GtkWidget *button, *label;
2057
dialog = gtk_dialog_new_with_buttons(_("Preferences"),
2058
GTK_WINDOW(priv->settings->window),
2059
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
2060
_("Change Icon..."),
2063
GTK_RESPONSE_REJECT,
2065
GTK_RESPONSE_ACCEPT,
2067
hbox = gtk_hbox_new(FALSE, 10);
2068
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0);
2070
image = gtk_image_new_from_pixbuf(priv->icon);
2072
button = gtk_button_new_with_label(_("Change Image..."));
2073
gtk_button_set_image(GTK_BUTTON(button), image);
2074
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 0);
2076
g_signal_connect(G_OBJECT(button), "clicked",
2077
G_CALLBACK(on_change_icon_clicked), task);
2079
label = gtk_label_new(" ");
2080
char *app_name = (char*)awn_task_get_application(task);
2084
gchar *markup = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", app_name);
2085
gtk_label_set_markup(GTK_LABEL(label), markup);
2089
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
2091
gtk_widget_show_all(hbox);
2093
gint res = gtk_dialog_run(GTK_DIALOG(dialog));
2099
_task_choose_custom_icon(task);
2106
gtk_widget_destroy(dialog);
2114
AwnSettings *settings;
2119
_slist_foreach(char *uri, AwnListTerm *term)
2121
AwnSettings *settings = term->settings;
2123
if (strcmp(uri, term->uri) == 0)
2125
//g_print ("URI : %s\n", uri);
2126
settings->launchers = g_slist_remove(settings->launchers, uri);
2127
//g_slist_foreach(settings->launchers, (GFunc)_slist_print, (gpointer)term);
2131
void awn_task_remove(AwnTask *task)
2133
AwnTaskPrivate *priv = AWN_TASK_GET_PRIVATE(task);
2135
priv->window = NULL;
2136
/* start closing effect */
2137
awn_effects_start_ex(priv->effects,
2138
AWN_EFFECT_CLOSING, NULL, _task_destroy, 1);
2142
_task_remove_launcher(GtkMenuItem *item, AwnTask *task)
2144
AwnTaskPrivate *priv;
2145
AwnSettings *settings;
2149
priv = AWN_TASK_GET_PRIVATE(task);
2150
settings = priv->settings;
2152
uri = awn_desktop_item_get_filename(priv->item);
2154
g_print("Remove : %s\n", uri);
2156
term.settings = settings;
2157
g_slist_foreach(settings->launchers, (GFunc)_slist_foreach, (gpointer)&term);
2159
AwnConfigClient *client = awn_config_client_new();
2160
awn_config_client_set_list(client, "window_manager", "launchers",
2161
AWN_CONFIG_CLIENT_LIST_TYPE_STRING, settings->launchers, NULL);
2163
awn_task_remove (task);
2167
_shell_done(GtkMenuShell *shell, AwnTask *task)
2169
AwnTaskPrivate *priv;
2170
priv = AWN_TASK_GET_PRIVATE(task);
2172
if (priv->settings->auto_hide == FALSE)
2174
if (priv->settings->hidden == TRUE)
2176
awn_show(priv->settings);
2182
awn_hide(priv->settings);
2186
awn_task_create_menu(AwnTask *task, GtkMenu *menu)
2188
AwnTaskPrivate *priv;
2191
priv = AWN_TASK_GET_PRIVATE(task);
2194
g_signal_connect(GTK_MENU_SHELL(menu), "selection-done",
2195
G_CALLBACK(_shell_done), (gpointer)task);
2197
if (priv->is_launcher && priv->window == NULL)
2201
item = gtk_image_menu_item_new_from_stock("gtk-remove",
2203
gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
2204
gtk_widget_show(item);
2205
g_signal_connect(G_OBJECT(item), "activate",
2206
G_CALLBACK(_task_remove_launcher), (gpointer)task);
2209
item = gtk_separator_menu_item_new();
2211
gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
2212
gtk_widget_show(item);
2214
item = gtk_menu_item_new_with_label(_("Change Icon"));
2215
gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
2216
gtk_widget_show(item);
2217
g_signal_connect(G_OBJECT(item), "activate",
2218
G_CALLBACK(_task_show_prefs), (gpointer)task);
2220
AwnTaskMenuItem *menu_item;
2223
for (i = 0; i < 5; i++)
2225
menu_item = priv->menu_items[i];
2227
if (menu_item != NULL)
2232
item = gtk_separator_menu_item_new();
2233
gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
2234
gtk_widget_show(item);
2238
g_signal_handlers_disconnect_by_func(G_OBJECT(menu_item->item),
2240
_task_menu_item_clicked, (gpointer)task);
2241
g_signal_handlers_disconnect_by_func(G_OBJECT(menu_item->item),
2242
_task_check_item_clicked, (gpointer)task);
2243
gtk_widget_unparent(menu_item->item);
2244
gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menu_item->item);
2246
if (menu_item->type == AWN_TASK_MENU_TYPE_CHECK)
2248
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item->item),
2250
g_signal_connect(G_OBJECT(menu_item->item), "activate",
2251
G_CALLBACK(_task_check_item_clicked), (gpointer)task);
2255
g_signal_connect(G_OBJECT(menu_item->item), "activate",
2256
G_CALLBACK(_task_menu_item_clicked), (gpointer) task);
2259
gtk_widget_show(menu_item->item);
2264
item = gtk_image_menu_item_new_with_label(_("Dock Preferences"));
2266
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
2267
gtk_image_new_from_stock(GTK_STOCK_PREFERENCES,
2268
GTK_ICON_SIZE_MENU));
2270
gtk_widget_show_all(item);
2271
gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
2272
g_signal_connect(G_OBJECT(item), "activate",
2273
G_CALLBACK(awn_start_awn_manager), NULL);
2278
/********************* awn_task_new * *******************/
2281
awn_task_new(AwnTaskManager *task_manager, AwnSettings *settings)
2284
AwnTaskPrivate *priv;
2285
task = g_object_new(AWN_TYPE_TASK, NULL);
2286
priv = AWN_TASK_GET_PRIVATE(task);
2288
priv->task_manager = task_manager;
2289
priv->settings = settings;
2291
/* This is code which I will add later for better hover effects over
2293
g_signal_connect(G_OBJECT(task), "drag-data-received",
2294
G_CALLBACK(_task_drag_data_recieved), (gpointer)task);
2295
g_signal_connect(G_OBJECT(task), "drag-end",
2296
G_CALLBACK(_task_drag_data_recieved), (gpointer)task);
2298
_task_refresh(GTK_WIDGET(task));
2304
awn_task_close(AwnTask *task)
2306
AwnTaskPrivate *priv;
2307
priv = AWN_TASK_GET_PRIVATE(task);
2309
if (priv->icon_changed) {
2310
g_signal_handler_disconnect((gpointer)priv->window,
2311
priv->icon_changed);
2312
priv->icon_changed = 0;
2314
if (priv->state_changed) {
2315
g_signal_handler_disconnect((gpointer)priv->window,
2316
priv->state_changed);
2317
priv->state_changed = 0;
2319
if (priv->name_changed) {
2320
g_signal_handler_disconnect((gpointer)priv->window,
2321
priv->name_changed);
2322
priv->name_changed = 0;
2324
if (priv->geometry_changed) {
2325
g_signal_handler_disconnect((gpointer)priv->window,
2326
priv->geometry_changed);
2327
priv->geometry_changed = 0;
2330
priv->window = NULL;
2332
AwnTaskMenuItem *item;
2335
for (i = 0; i < 5; i++)
2337
item = priv->menu_items[i];
2341
if (GTK_IS_WIDGET(item->item))
2342
gtk_widget_destroy(item->item);
2347
item = priv->menu_items[i] = NULL;
2353
if (priv->is_launcher)
2355
gtk_widget_queue_draw(GTK_WIDGET(task));
2359
/* start closing effect */
2360
awn_effects_start_ex(priv->effects, AWN_EFFECT_CLOSING,
2361
NULL, _task_destroy, 1);