source: trunk/third/gnome-core/applets/tasklist/tasklist_menu.c @ 17152

Revision 17152, 18.4 KB checked in by ghudson, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17151, which included commits to RCS files with non-trunk default branches.
Line 
1#include <config.h>
2#include <gtk/gtk.h>
3#include <gnome.h>
4#include "tasklist_applet.h"
5#include "pixmaps.h"
6
7/* define to x for debug output */
8#define d(x)
9
10/* Callback for menu positioning */
11static void
12cb_menu_position (GtkMenu *menu, gint *x, gint *y, gpointer user_data)
13{
14        GtkRequisition mreq;
15        gint wx, wy;
16        TasklistTask *task = gtk_object_get_data (GTK_OBJECT (menu), "task");
17
18        /* this is just sanity, it is concievable that this is now null */
19        if (task == NULL) {
20                *x = 0;
21                *y = 0;
22                return;
23        }
24
25        gtk_widget_get_child_requisition (GTK_WIDGET (menu), &mreq);
26        gdk_window_get_origin (task->tasklist->area->window, &wx, &wy);
27
28        switch (applet_widget_get_panel_orient (APPLET_WIDGET (task->tasklist->applet))) {
29        case ORIENT_UP:
30                *x = wx + task->x;
31                *y = wy - mreq.height + task->y;
32                break;
33        case ORIENT_DOWN:
34                *x = wx + task->x;
35                *y = wy + task->y + task->height;
36                break;
37        case ORIENT_LEFT:
38                *y = wy + task->y;
39                *x = wx - mreq.width + task->x;
40                break;
41        case ORIENT_RIGHT:
42                *y = wy + task->y;
43                *x = wx + task->width;
44                printf ("right\n");
45                break;
46        }
47
48        *x = CLAMP (*x, 0, gdk_screen_width () - mreq.width);
49        *y = CLAMP (*y, 0, gdk_screen_height () - mreq.height);
50}
51
52static gboolean
53do_action (TasklistTask *task, gpointer data)
54{
55        MenuAction action = GPOINTER_TO_INT (data);
56        Tasklist *tasklist = task->tasklist;
57        GtkWidget *dialog;
58        gint retval;
59
60        switch (action) {
61        case MENU_ACTION_SHADE_UNSHADE:
62                action = GWMH_TASK_SHADED (task->gwmh_task) ? MENU_ACTION_UNSHADE : MENU_ACTION_SHADE;
63                break;
64        case MENU_ACTION_STICK_UNSTICK:
65                action = GWMH_TASK_STICKY (task->gwmh_task) ? MENU_ACTION_UNSTICK : MENU_ACTION_STICK;
66                break;
67        case MENU_ACTION_SHOW_HIDE:
68                action = GWMH_TASK_ICONIFIED (task->gwmh_task) ? MENU_ACTION_SHOW : MENU_ACTION_HIDE;
69                break;
70        default:
71                break;
72        }
73
74        switch (action) {
75        case MENU_ACTION_UNSHADE:
76                gwmh_task_unset_gstate_flags (task->gwmh_task,
77                                              GWMH_STATE_SHADED);
78                break;
79        case MENU_ACTION_SHADE:
80                gwmh_task_set_gstate_flags (task->gwmh_task,
81                                            GWMH_STATE_SHADED);
82                break;
83        case MENU_ACTION_UNSTICK:
84                gwmh_task_unset_gstate_flags (task->gwmh_task,
85                                              GWMH_STATE_STICKY);
86                break;
87        case MENU_ACTION_STICK:
88                gwmh_task_set_gstate_flags (task->gwmh_task,
89                                            GWMH_STATE_STICKY);
90                break;
91        case MENU_ACTION_KILL:
92                if (!tasklist->config.confirm_before_kill && task->destroyed == FALSE) {
93                        gwmh_task_kill (task->gwmh_task);
94                        break;
95                }
96                dialog = gnome_message_box_new(_("Warning! Unsaved changes will be lost!\nProceed?"),
97                                               GNOME_MESSAGE_BOX_WARNING,
98                                               GNOME_STOCK_BUTTON_YES,
99                                               GNOME_STOCK_BUTTON_NO,
100                                               NULL);
101                gtk_widget_show(dialog);
102                retval = gnome_dialog_run(GNOME_DIALOG(dialog));
103               
104                if (retval)
105                        return TRUE;
106
107                if (task->destroyed == FALSE)
108                        gwmh_task_kill(task->gwmh_task);
109                break;
110        case MENU_ACTION_SHOW:
111                gwmh_desk_set_current_area (task->gwmh_task->desktop,
112                                            task->gwmh_task->harea,
113                                            task->gwmh_task->varea);
114                gwmh_task_show (task->gwmh_task);
115                gwmh_task_raise (task->gwmh_task);
116                gwmh_task_focus (task->gwmh_task);
117                break;
118        case MENU_ACTION_HIDE:
119                gwmh_task_iconify (task->gwmh_task);
120                break;
121        case MENU_ACTION_CLOSE:
122                gwmh_task_close (task->gwmh_task);
123                break;
124               
125        default:
126                d(g_print ("Menu Callback: %d\n", GPOINTER_TO_INT (data)));
127        }
128        return FALSE;
129
130}
131
132/* Callback for menus */
133static gboolean
134cb_menu (GtkWidget *widget, gpointer data)
135{
136        MenuAction action = GPOINTER_TO_INT (data);
137        GtkWidget *dialog;
138        gint retval;
139        int config_save = 0;
140
141        TasklistTask *task = gtk_object_get_data (GTK_OBJECT (widget), "task");
142
143        if (task == NULL)
144                return FALSE;
145
146        if (!task->task_group)
147                return do_action (task, data);
148
149        if (!task->vtasks)
150                return FALSE;
151       
152        if (action == MENU_ACTION_KILL) {
153                config_save = task->tasklist->config.confirm_before_kill;
154                if (config_save) {
155                        dialog = gnome_message_box_new(_("Warning! Unsaved changes will be lost!\nProceed?"),
156                                                       GNOME_MESSAGE_BOX_WARNING,
157                                                       GNOME_STOCK_BUTTON_YES,
158                                                       GNOME_STOCK_BUTTON_NO,
159                                                       NULL);
160                        gtk_widget_show(dialog);
161                        retval = gnome_dialog_run(GNOME_DIALOG(dialog));
162                       
163                        if (retval)
164                                return TRUE;
165                       
166                        task->tasklist->config.confirm_before_kill = FALSE;
167                }
168        }
169        g_slist_foreach (task->vtasks, (GFunc)do_action, data);
170
171        if (action == MENU_ACTION_KILL)
172                task->tasklist->config.confirm_before_kill = config_save;
173
174        return FALSE;
175}
176
177/* Add a menu item to the popup menu */
178static void
179add_menu_item (TasklistTask *task, gchar *name, GtkWidget *menu, MenuAction action, gchar **xpm)
180{
181        GtkWidget *menuitem;
182        GdkPixmap *pixmap;
183        GtkWidget *label;
184        GdkBitmap *mask;
185        GtkWidget *gtkpixmap;
186
187        menuitem = gtk_pixmap_menu_item_new ();
188        label = gtk_label_new (name);
189        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
190        gtk_container_add (GTK_CONTAINER (menuitem), label);
191        if (xpm) {
192                pixmap = gdk_pixmap_create_from_xpm_d (task->tasklist->area->window, &mask, NULL, xpm);
193                gtkpixmap = gtk_pixmap_new (pixmap, mask);
194                gtk_pixmap_menu_item_set_pixmap (GTK_PIXMAP_MENU_ITEM (menuitem), gtkpixmap);
195        }
196
197        gtk_object_set_data (GTK_OBJECT (menuitem), "task", task);
198        gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
199                            GTK_SIGNAL_FUNC (cb_menu), GINT_TO_POINTER (action));
200       
201        if (task->group && task->group->menu)
202                gtk_signal_connect_object (GTK_OBJECT (menuitem), "activate",
203                                           GTK_SIGNAL_FUNC (gtk_menu_shell_deactivate),
204                                           GTK_OBJECT (task->group->menu));
205
206        gtk_widget_show_all (menuitem);
207        gtk_menu_append (GTK_MENU (menu), menuitem);
208
209}
210
211#if 0
212/* Called when "Send to desktop" is used */
213static void
214cb_to_desktop (GtkWidget *widget, gpointer data)
215{
216        TasklistTask *task = gtk_object_get_data (GTK_OBJECT (widget), "task");
217
218        if (task == NULL)
219                return;
220       
221        gwmh_task_set_desktop (task->gwmh_task,
222                               GPOINTER_TO_INT (data));
223        gwmh_task_set_desktop (task->gwmh_task,
224                               GPOINTER_TO_INT (data));
225        tasklist_layout_tasklist (task->tasklist);
226}
227#endif
228
229static void
230destroy_menu (GtkWidget *w, gpointer null)
231{
232        d(g_print ("Destroying menu\n"));
233        gtk_widget_unref (w);
234}
235
236/* Create a popup menu */
237static GtkWidget *
238get_popup_menu (TasklistTask *task)
239{
240        GtkWidget *menu, *menuitem; /*, *desktop, *label, *gtkpixmap;*/
241        /*GdkPixmap *pixmap;*/
242        /*GdkBitmap *mask;*/
243        /*GwmhDesk *desk_info;*/
244
245        /*gchar *wsname;*/
246        /*int i, curworkspace;*/
247
248        menu = gtk_menu_new ();
249        gtk_signal_connect (GTK_OBJECT (menu), "deactivate",
250                            GTK_SIGNAL_FUNC (destroy_menu),
251                            NULL);
252
253        gtk_widget_show (menu);
254
255        gtk_object_set_data (GTK_OBJECT (menu), "task", task);
256
257        add_menu_item (task, GWMH_TASK_ICONIFIED (task->gwmh_task)
258                       ? _("Restore") : _("Iconify"),
259                       menu, MENU_ACTION_SHOW_HIDE,
260                       GWMH_TASK_ICONIFIED (task->gwmh_task)
261                       ? tasklist_restore_xpm : tasklist_iconify_xpm);
262
263        add_menu_item (task, GWMH_TASK_SHADED (task->gwmh_task)
264                       ? _("Unshade") : _("Shade"),
265                       menu, MENU_ACTION_SHADE_UNSHADE,
266                       GWMH_TASK_SHADED (task->gwmh_task)
267                       ? tasklist_unshade_xpm: tasklist_shade_xpm);
268
269        add_menu_item (task, GWMH_TASK_STICKY (task->gwmh_task)
270                       ? _("Unstick") : _("Stick"),
271                       menu, MENU_ACTION_STICK_UNSTICK,
272                       GWMH_TASK_STICKY (task->gwmh_task)
273                       ? tasklist_unstick_xpm : tasklist_stick_xpm);
274#if 0
275        menuitem = gtk_pixmap_menu_item_new ();
276        label = gtk_label_new (_("To desktop"));
277        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
278        gtk_container_add (GTK_CONTAINER (menuitem), label);
279        pixmap = gdk_pixmap_create_from_xpm_d (tasklist->area->window, &mask, NULL,
280                                               tasklist_send_to_desktop_xpm);
281        gtkpixmap = gtk_pixmap_new (pixmap, mask);
282        gtk_pixmap_menu_item_set_pixmap (GTK_PIXMAP_MENU_ITEM (menuitem), gtkpixmap);
283        gtk_widget_show_all (menuitem);
284        gtk_menu_append (GTK_MENU (menu), menuitem);
285
286        if (!GWMH_TASK_STICKY (task->gwmh_task)) {
287                desktop = gtk_menu_new ();
288                gtk_widget_show (desktop);
289                gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), desktop);
290               
291                desk_info = gwmh_desk_get_config ();
292                curworkspace = desk_info->current_desktop;
293
294                for (i=0; i<desk_info->n_desktops;i++) {
295                        if (desk_info->desktop_names[i])
296                                wsname = g_strdup_printf ("%s", desk_info->desktop_names[i]);
297                        else
298                                wsname = g_strdup_printf ("%d", i);
299                        menuitem = gtk_menu_item_new_with_label (wsname);
300                        gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
301                                            GTK_SIGNAL_FUNC (cb_to_desktop), i);
302                        gtk_object_set_user_data (GTK_OBJECT (menuitem), tasklist);
303                        if (i == curworkspace)
304                                gtk_widget_set_sensitive (menuitem, FALSE);
305                        gtk_widget_show (menuitem);
306                        gtk_menu_append (GTK_MENU (desktop), menuitem);
307                        g_free (wsname);
308                }
309        } else
310                gtk_widget_set_sensitive (menuitem, FALSE);
311
312        menuitem = gtk_menu_item_new ();
313        gtk_widget_show (menuitem);
314        gtk_menu_append (GTK_MENU (menu), menuitem);
315#endif
316        add_menu_item (task, _("Close window"), menu, MENU_ACTION_CLOSE,
317                       tasklist_close_xpm);
318
319        menuitem = gtk_menu_item_new ();
320        gtk_widget_show (menuitem);
321        gtk_menu_append (GTK_MENU (menu), menuitem);
322       
323        add_menu_item (task, _("Kill app"), menu, MENU_ACTION_KILL, tasklist_kill_xpm);
324       
325        return menu;
326}
327
328/* Create a popup menu */
329static GtkWidget *
330get_group_popup_menu (TasklistTask *task)
331{
332        GtkWidget *menu, *menuitem; /*, *desktop, *label, *gtkpixmap;*/
333        /*GdkPixmap *pixmap;*/
334        /*GdkBitmap *mask;*/
335        /*GwmhDesk *desk_info;*/
336
337        /*gchar *wsname;*/
338        /*int i, curworkspace;*/
339
340        menu = gtk_menu_new ();
341        gtk_signal_connect (GTK_OBJECT (menu), "deactivate",
342                            GTK_SIGNAL_FUNC (destroy_menu),
343                            NULL);
344        gtk_widget_show (menu);
345
346        gtk_object_set_data (GTK_OBJECT (menu), "task", task);
347
348        /* if (iconified window in group) */
349        add_menu_item (task, _("Restore All"), menu,
350                       MENU_ACTION_SHOW, tasklist_restore_xpm);
351
352        add_menu_item (task, _("Iconify All"), menu,
353                       MENU_ACTION_HIDE, tasklist_iconify_xpm);
354
355        add_menu_item (task, _("Unshade All"), menu,
356                       MENU_ACTION_UNSHADE, tasklist_unshade_xpm);
357
358        add_menu_item (task, _("Shade All"), menu,
359                       MENU_ACTION_SHADE, tasklist_shade_xpm);
360
361        add_menu_item (task, _("Unstick All"), menu,
362                       MENU_ACTION_UNSTICK, tasklist_unstick_xpm);
363
364        add_menu_item (task, _("Stick All"), menu,
365                       MENU_ACTION_STICK, tasklist_stick_xpm);
366
367#if 0
368        menuitem = gtk_pixmap_menu_item_new ();
369        label = gtk_label_new (_("To desktop"));
370        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
371        gtk_container_add (GTK_CONTAINER (menuitem), label);
372        pixmap = gdk_pixmap_create_from_xpm_d (tasklist->area->window, &mask, NULL,
373                                               tasklist_send_to_desktop_xpm);
374        gtkpixmap = gtk_pixmap_new (pixmap, mask);
375        gtk_pixmap_menu_item_set_pixmap (GTK_PIXMAP_MENU_ITEM (menuitem), gtkpixmap);
376        gtk_widget_show_all (menuitem);
377        gtk_menu_append (GTK_MENU (menu), menuitem);
378
379        if (!GWMH_TASK_STICKY (task->gwmh_task)) {
380                desktop = gtk_menu_new ();
381                gtk_widget_show (desktop);
382                gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), desktop);
383               
384                desk_info = gwmh_desk_get_config ();
385                curworkspace = desk_info->current_desktop;
386
387                for (i=0; i<desk_info->n_desktops;i++) {
388                        if (desk_info->desktop_names[i])
389                                wsname = g_strdup_printf ("%s", desk_info->desktop_names[i]);
390                        else
391                                wsname = g_strdup_printf ("%d", i);
392                        menuitem = gtk_menu_item_new_with_label (wsname);
393                        gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
394                                            GTK_SIGNAL_FUNC (cb_to_desktop), i);
395                        gtk_object_set_user_data (GTK_OBJECT (menuitem), tasklist);
396                        if (i == curworkspace)
397                                gtk_widget_set_sensitive (menuitem, FALSE);
398                        gtk_widget_show (menuitem);
399                        gtk_menu_append (GTK_MENU (desktop), menuitem);
400                        g_free (wsname);
401                }
402        } else
403                gtk_widget_set_sensitive (menuitem, FALSE);
404
405        menuitem = gtk_menu_item_new ();
406        gtk_widget_show (menuitem);
407        gtk_menu_append (GTK_MENU (menu), menuitem);
408#endif
409        add_menu_item (task, _("Close All"), menu,
410                       MENU_ACTION_CLOSE, tasklist_close_xpm);
411                       
412
413        menuitem = gtk_menu_item_new ();
414        gtk_widget_show (menuitem);
415        gtk_menu_append (GTK_MENU (menu), menuitem);
416       
417        add_menu_item (task, _("Kill All"), menu, MENU_ACTION_KILL, tasklist_kill_xpm);
418       
419        return menu;
420}
421
422static void
423redraw_task (GtkWidget *w, TasklistTask *task)
424{
425        tasklist_draw_task (task, NULL);
426}
427
428/* Open a popup menu with window operations */
429void
430tasklist_menu_popup (TasklistTask *task, guint button, guint32 activate_time)
431{
432        tasklist_clean_menu (task);
433
434        task->menu = task->task_group
435                ? get_group_popup_menu (task)
436                : get_popup_menu (task);
437
438        gtk_signal_connect(GTK_OBJECT(task->menu), "destroy",
439                           GTK_SIGNAL_FUNC(gtk_widget_destroyed),
440                           &task->menu);
441
442        tasklist_draw_task (task, NULL);
443        gtk_signal_connect (GTK_OBJECT (task->menu), "destroy",
444                            GTK_SIGNAL_FUNC (redraw_task), task);
445
446        gtk_menu_popup (GTK_MENU (task->menu), NULL, NULL,
447                        cb_menu_position, task,
448                        button, activate_time);
449}
450
451/*most of this function stolen from the real gtk_menu_popup*/
452static void
453restore_grabs(GtkWidget *w, gpointer data)
454{
455        GtkWidget *menu_item = data;
456        GtkMenu *menu = GTK_MENU(menu_item->parent);
457        GtkWidget *xgrab_shell;
458        GtkWidget *parent;
459
460        d(g_print ("restore_grabs\n"));
461        /* Find the last viewable ancestor, and make an X grab on it
462         */
463        parent = GTK_WIDGET (menu);
464        xgrab_shell = NULL;
465        while (parent) {
466                gboolean viewable = TRUE;
467                GtkWidget *tmp = parent;
468
469                while (tmp) {
470                        if (!GTK_WIDGET_MAPPED (tmp)) {
471                                viewable = FALSE;
472                                break;
473                        }
474                        tmp = tmp->parent;
475                }
476
477                if (viewable)
478                        xgrab_shell = parent;
479
480                parent = GTK_MENU_SHELL (parent)->parent_menu_shell;
481        }
482
483        /*only grab if this HAD a grab before*/
484        if (xgrab_shell && (GTK_MENU_SHELL (xgrab_shell)->have_xgrab)) {
485                GdkCursor *cursor = gdk_cursor_new (GDK_ARROW);
486
487                GTK_MENU_SHELL (xgrab_shell)->have_xgrab =
488                        (gdk_pointer_grab (xgrab_shell->window, TRUE,
489                                           GDK_BUTTON_PRESS_MASK |
490                                           GDK_BUTTON_RELEASE_MASK |
491                                           GDK_ENTER_NOTIFY_MASK |
492                                           GDK_LEAVE_NOTIFY_MASK,
493                                           NULL, cursor, 0) == 0);
494                gdk_cursor_destroy (cursor);
495        }
496       
497        gtk_grab_add (GTK_WIDGET (menu));
498}
499
500static gboolean
501cb_activate_task (GtkWidget *w, GdkEventButton *event, gpointer data)
502{
503        TasklistTask *task = gtk_object_get_data (GTK_OBJECT (w), "task");
504        if (task == NULL)
505                return FALSE;
506
507        gwmh_desk_set_current_area (task->gwmh_task->desktop,
508                                    task->gwmh_task->harea,
509                                    task->gwmh_task->varea);
510        gwmh_task_show (task->gwmh_task);
511        gwmh_task_raise (task->gwmh_task);
512        gwmh_task_focus (task->gwmh_task);
513
514        return FALSE;
515}
516
517static gboolean
518cb_show_popup (GtkWidget *w, GdkEventButton *event, gpointer data)
519{
520        TasklistTask *task = gtk_object_get_data (GTK_OBJECT (w), "task");
521        if (task == NULL)
522                return FALSE;
523
524        if (event->type != GDK_BUTTON_PRESS) return FALSE;
525
526        if (event->button == 1) {
527                d(g_print ("click!\n"));
528                gwmh_desk_set_current_area (task->gwmh_task->desktop,
529                                            task->gwmh_task->harea,
530                                            task->gwmh_task->varea);
531                gwmh_task_show (task->gwmh_task);
532                gwmh_task_raise (task->gwmh_task);
533                gwmh_task_focus (task->gwmh_task);
534                return TRUE;
535        }
536       
537        if (event->button == 3) {
538                /*gtk_signal_emit_stop_by_name (GTK_OBJECT (w), "button_press_event");*/
539                tasklist_clean_menu (task);
540
541                task->menu = get_popup_menu (task);
542
543                gtk_signal_connect (GTK_OBJECT(task->menu), "destroy",
544                                    GTK_SIGNAL_FUNC(gtk_widget_destroyed),
545                                    &task->menu);
546
547                gtk_signal_connect(GTK_OBJECT(task->menu),"deactivate",
548                                   GTK_SIGNAL_FUNC(restore_grabs), w);
549
550                gtk_menu_popup (GTK_MENU (task->menu), NULL, NULL,
551                                NULL, NULL, event->button, event->time);
552
553                return FALSE;
554        }
555        return FALSE;
556}
557
558static void
559cb_menuitem_destroyed (GtkWidget *menuitem, gpointer data)
560{
561        TasklistTask *task = gtk_object_get_data (GTK_OBJECT (menuitem),
562                                                  "task");
563        if (task == NULL)
564                return;
565
566        task->menuitem = NULL;
567}
568
569static void
570create_task_item (TasklistTask *task, TasklistTask *group)
571{
572        GtkWidget *pixmap, *label;
573        GdkPixmap *pix;
574        GdkBitmap *bit;
575        gchar *label_string, *tooltip;
576        int width;
577
578        static GwmhDesk *desk = NULL;
579
580        gdk_pixbuf_render_pixmap_and_mask (
581                task->gwmh_task->iconified
582                ? task->icon->minimized
583                : task->icon->normal, &pix, &bit, 128);
584
585        pixmap = gtk_pixmap_new (pix, bit);
586
587        gdk_pixmap_unref (pix);
588        gdk_bitmap_unref (bit);
589
590        /* are we leaking the pixmap and bitmap? */
591       
592        task->menuitem = gtk_pixmap_menu_item_new ();
593        gtk_pixmap_menu_item_set_pixmap (GTK_PIXMAP_MENU_ITEM (task->menuitem), pixmap);
594
595        tooltip = tasklist_task_get_label (task, 0, FALSE);
596
597        width = gdk_screen_width () / 3;
598        if (group->width > width)
599                width = group->width;
600        label_string = tasklist_task_get_label (task, width, FALSE);
601        label = gtk_label_new (label_string);
602        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
603        gtk_container_add (GTK_CONTAINER (task->menuitem), label);
604
605        /* only set a tip if the label didn't fit properly */
606        if (strcmp (tooltip, label_string) != 0)
607                gtk_tooltips_set_tip (task->tasklist->tooltips, task->menuitem,
608                                      tooltip, NULL);
609        g_free (tooltip);
610        g_free (label_string);
611
612        if (!desk)
613                desk = gwmh_desk_get_config ();
614
615        if (task->gwmh_task->desktop == desk->current_desktop &&
616            task->gwmh_task->harea   == desk->current_harea   &&
617            task->gwmh_task->varea   == desk->current_varea)
618                gtk_menu_prepend (GTK_MENU (group->menu), task->menuitem);
619        else
620                gtk_menu_append (GTK_MENU (group->menu), task->menuitem);
621
622        gtk_object_set_data (GTK_OBJECT (task->menuitem), "task", task);
623
624        gtk_signal_connect (GTK_OBJECT (task->menuitem), "button_release_event",
625                            GTK_SIGNAL_FUNC (cb_activate_task), NULL);
626        gtk_signal_connect (GTK_OBJECT (task->menuitem), "button_press_event",
627                            GTK_SIGNAL_FUNC (cb_show_popup), NULL);
628        gtk_signal_connect (GTK_OBJECT (task->menuitem), "destroy",
629                            GTK_SIGNAL_FUNC (cb_menuitem_destroyed), NULL);
630}
631
632/* Open a popup menu with windows in a group */
633void
634tasklist_group_popup (TasklistTask *task, guint button, guint32 activate_time)
635{
636        GtkWidget *menuitem;
637
638        tasklist_clean_menu (task);
639
640        task->menu = gtk_menu_new ();
641        gtk_signal_connect (GTK_OBJECT (task->menu), "deactivate",
642                            GTK_SIGNAL_FUNC (destroy_menu),
643                            NULL);
644
645        if (task->tasklist->config.all_desks_normal ||
646            task->tasklist->config.all_desks_minimized) {
647                /* seperator */
648                menuitem = gtk_menu_item_new ();
649                gtk_widget_set_sensitive (menuitem, FALSE);
650                gtk_widget_show (menuitem);
651                gtk_menu_append (GTK_MENU (task->menu), menuitem);
652        }
653
654        g_slist_foreach (task->vtasks, (GFunc)create_task_item, task);
655
656        gtk_widget_show_all (task->menu);
657        gtk_signal_connect (GTK_OBJECT (task->menu), "destroy",
658                            GTK_SIGNAL_FUNC (gtk_widget_destroyed),
659                            &task->menu);
660
661        tasklist_draw_task (task, NULL);
662        gtk_signal_connect (GTK_OBJECT (task->menu), "destroy",
663                            GTK_SIGNAL_FUNC (redraw_task), task);
664
665        gtk_object_set_data (GTK_OBJECT (task->menu), "task", task);
666
667        tasklist_draw_task (task, NULL);
668
669        gtk_menu_popup (GTK_MENU (task->menu), NULL, NULL,
670                        cb_menu_position, task,
671                        button, activate_time);
672}
Note: See TracBrowser for help on using the repository browser.