~ubuntu-branches/ubuntu/oneiric/gnome-panel/oneiric

« back to all changes in this revision

Viewing changes to applets/notification_area/na-tray-manager.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher, Sebastien Bacher, Jeremy Bicha
  • Date: 2011-05-30 11:04:49 UTC
  • mfrom: (1.13.10 upstream) (2.2.5 experimental)
  • Revision ID: james.westby@ubuntu.com-20110530110449-hinl17kxkcefjw6x
Tags: 1:3.0.2-0ubuntu1
[ Sebastien Bacher ]
* New upstream version
* debian/control.in:
  - the new libgweather version is in oneiric, use it
  - drop the python and python-gconf depends, 
    they were added for gnome-panel-add which is still using gconf and buggy
* debian/gnome-panel-data.install:
  - don't install the apport hook, it's only getting gconf datas which 
    doesn't work since gnome-panel uses gsettings
* debian/patches/90_build_fixes.patch:
  - restore build fix from git not applied in the new serie
* debian/patches/01_panel_submenus.patch:
  - don't take that Debian diff, the .menus use the upstream naming in Ubuntu
* debian/patches/06_no_resize_grip.patch:
  - dropped, the issue is fixed in the new version
* debian/patches/50_fix-potfiles.patch:
  - dropped, the issue is fixed in the new version
* debian/watch:
  - track unstable series as well

Drop those delta, since gnome-panel is not the default Ubuntu session now we
can go back to an experience closer to the upstream one: 
* debian/control.in:
  - drop the indicators recommends, unity-2d is the ubuntu fallback session
    so we can get back to use an upstream config for gnome-panel and reduce
    the delta we carry
* debian/patches/04_default_panel_config.patch:
  - don't modify the upstream layout
* debian/patches/05_no_session_delay.patch:
  - no need to tweak the upstream session to optimize it
* debian/patches/16_compiz_workspace_switcher.patch:
  - go back to the upstream switcher behaviour    
* debian/patches/25_dynamic_fusa_detection.patch:
  - not needed since we use the upstream layout, could be ported if someone
    is wanting to do the work though
* debian/patches/30_disable-initial-animation.patch, debian/rules:
  - drop the --disable-initial-animation, that was some login optimization
    but since it's not the default desktop you should go back to the 
    upstream behaviour

[ Jeremy Bicha ]   
* New upstream version
* Merge from Debian experimental, remaining Ubuntu changes:
* debian/control:
  - Recommends gnome-settings-daemon which has the timezone polkit service
* debian/rules:
  - Update translations template.
* debian/gnome-panel-data.install:
  - Install apport hook
  - Install the "About Ubuntu" menu item.
* debian/patches/01_layout.patch:
  - Disabled, Help & About Ubuntu don't fit as well in Gnome Panel 3
* debian/patches/01_panel_submenus.patch.
  - Dropped
* debian/patches/03_dnd_places_link.patch:
  - Disabled, when using Drag'n'Drop from Places menu, install a link launcher
    (.desktop file) instead of copying the entire directory.
* debian/patches/17_about-ubuntu-translation.patch:
  - List ubuntu-about.desktop for translation.
* debian/patches/40_unset_menuproxy.patch:
  - Make sure gnome-panel and the applets don't pick up menu proxies.
* debian/patches/50_fix-potfiles.patch
  - Fix i18n
* debian/patches/85_disable_shutdown_on_ltsp.patch:
  - Suppress the shutdown option in the panel if LTSP_CLIENT is set.
* debian/patches/71_change_bookmark_submenu_limit_value.patch
  - Dropped, picked up by Debian
* debian/patches/18_lockdown_lock_editor.patch:
* debian/patches/90_git_wnck_show_realize.patch:
* debian/patches/90_fix_linking_DSO_link.patch:
* debian/patches/91_gir_annotations.patch
* debian/patches/92_git_calendar_day.patch
* debian/patches/92_git_fix_applets_in_multiscreen.patch:
  - Dropped, applied upstream
* debian/watch:
  - watch unstable versions

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
 
27
27
#include "na-tray-manager.h"
28
28
 
29
 
#include <gdkconfig.h>
30
 
#include <glib/gi18n.h>
31
29
#if defined (GDK_WINDOWING_X11)
32
30
#include <gdk/gdkx.h>
33
31
#include <X11/Xatom.h>
98
96
{
99
97
  manager->invisible = NULL;
100
98
  manager->socket_table = g_hash_table_new (NULL, NULL);
 
99
 
 
100
  manager->padding = 0;
 
101
  manager->icon_size = 0;
 
102
 
 
103
  manager->fg.red = 0;
 
104
  manager->fg.green = 0;
 
105
  manager->fg.blue = 0;
 
106
 
 
107
  manager->error.red = 0xffff;
 
108
  manager->error.green = 0;
 
109
  manager->error.blue = 0;
 
110
 
 
111
  manager->warning.red = 0xffff;
 
112
  manager->warning.green = 0xffff;
 
113
  manager->warning.blue = 0;
 
114
 
 
115
  manager->success.red = 0;
 
116
  manager->success.green = 0xffff;
 
117
  manager->success.blue = 0;
101
118
}
102
119
 
103
120
static void
299
316
  if (!gtk_socket_get_plug_window (GTK_SOCKET (child)))
300
317
    {
301
318
      /* Embedding failed, we won't get a plug-removed signal */
 
319
      /* This signal destroys the socket */
302
320
      g_signal_emit (manager, manager_signals[TRAY_ICON_REMOVED], 0, child);
303
 
      gtk_widget_destroy (child);
304
321
      return;
305
322
    }
306
323
 
316
333
  g_free (message);
317
334
}
318
335
 
319
 
static GdkFilterReturn
320
 
na_tray_manager_handle_client_message_message_data (GdkXEvent *xev,
321
 
                                                    GdkEvent  *event,
322
 
                                                    gpointer   data)
 
336
static void
 
337
na_tray_manager_handle_message_data (NaTrayManager       *manager,
 
338
                                     XClientMessageEvent *xevent)
323
339
{
324
 
  XClientMessageEvent *xevent;
325
 
  NaTrayManager       *manager;
326
 
  GList               *p;
327
 
  int                  len;
 
340
  GList *p;
 
341
  int    len;
328
342
  
329
 
  xevent  = (XClientMessageEvent *) xev;
330
 
  manager = data;
331
 
 
332
343
  /* Try to see if we can find the pending message in the list */
333
344
  for (p = manager->messages; p; p = p->next)
334
345
    {
362
373
          break;
363
374
        }
364
375
    }
365
 
 
366
 
  return GDK_FILTER_REMOVE;
367
376
}
368
377
 
369
378
static void
383
392
  if (!socket)
384
393
    return;
385
394
 
 
395
  timeout = xevent->data.l[2];
 
396
  len     = xevent->data.l[3];
 
397
  id      = xevent->data.l[4];
 
398
 
386
399
  /* Check if the same message is already in the queue and remove it if so */
387
400
  for (p = manager->messages; p; p = p->next)
388
401
    {
389
402
      PendingMessage *pmsg = p->data;
390
403
 
391
404
      if (xevent->window == pmsg->window &&
392
 
          xevent->data.l[4] == pmsg->id)
 
405
          id == pmsg->id)
393
406
        {
394
407
          /* Hmm, we found it, now remove it */
395
408
          pending_message_free (pmsg);
399
412
        }
400
413
    }
401
414
 
402
 
  timeout = xevent->data.l[2];
403
 
  len     = xevent->data.l[3];
404
 
  id      = xevent->data.l[4];
405
 
 
406
415
  if (len == 0)
407
416
    {
408
417
      g_signal_emit (manager, manager_signals[MESSAGE_SENT], 0,
429
438
{
430
439
  GList     *p;
431
440
  GtkSocket *socket;
 
441
  long       id;
 
442
 
 
443
  id = xevent->data.l[2];
432
444
  
433
445
  /* Check if the message is in the queue and remove it if so */
434
446
  for (p = manager->messages; p; p = p->next)
436
448
      PendingMessage *msg = p->data;
437
449
 
438
450
      if (xevent->window == msg->window &&
439
 
          xevent->data.l[4] == msg->id)
 
451
          id == msg->id)
440
452
        {
441
453
          pending_message_free (msg);
442
454
          manager->messages = g_list_remove_link (manager->messages, p);
456
468
}
457
469
 
458
470
static GdkFilterReturn
459
 
na_tray_manager_handle_client_message_opcode (GdkXEvent *xev,
460
 
                                              GdkEvent  *event,
461
 
                                              gpointer   data)
462
 
{
463
 
  XClientMessageEvent *xevent;
464
 
  NaTrayManager       *manager;
465
 
 
466
 
  xevent  = (XClientMessageEvent *) xev;
467
 
  manager = data;
468
 
 
469
 
  switch (xevent->data.l[1])
470
 
    {
471
 
    case SYSTEM_TRAY_REQUEST_DOCK:
472
 
      /* Ignore this one since we don't know on which window this was received
473
 
       * and so we can't know for which screen this is. It will be handled
474
 
       * in na_tray_manager_window_filter() since we also receive it there */
475
 
      break;
476
 
 
477
 
    case SYSTEM_TRAY_BEGIN_MESSAGE:
478
 
      na_tray_manager_handle_begin_message (manager, xevent);
479
 
      return GDK_FILTER_REMOVE;
480
 
 
481
 
    case SYSTEM_TRAY_CANCEL_MESSAGE:
482
 
      na_tray_manager_handle_cancel_message (manager, xevent);
483
 
      return GDK_FILTER_REMOVE;
484
 
    default:
485
 
      break;
486
 
    }
487
 
 
488
 
  return GDK_FILTER_CONTINUE;
489
 
}
490
 
 
491
 
static GdkFilterReturn
492
471
na_tray_manager_window_filter (GdkXEvent *xev,
493
472
                               GdkEvent  *event,
494
473
                               gpointer   data)
498
477
 
499
478
  if (xevent->type == ClientMessage)
500
479
    {
501
 
      /* We handle this client message here. See comment in
502
 
       * na_tray_manager_handle_client_message_opcode() for details */
 
480
      /* _NET_SYSTEM_TRAY_OPCODE: SYSTEM_TRAY_REQUEST_DOCK */
503
481
      if (xevent->xclient.message_type == manager->opcode_atom &&
504
482
          xevent->xclient.data.l[1]    == SYSTEM_TRAY_REQUEST_DOCK)
505
483
        {
507
485
                                               (XClientMessageEvent *) xevent);
508
486
          return GDK_FILTER_REMOVE;
509
487
        }
 
488
      /* _NET_SYSTEM_TRAY_OPCODE: SYSTEM_TRAY_BEGIN_MESSAGE */
 
489
      else if (xevent->xclient.message_type == manager->opcode_atom &&
 
490
               xevent->xclient.data.l[1]    == SYSTEM_TRAY_BEGIN_MESSAGE)
 
491
        {
 
492
          na_tray_manager_handle_begin_message (manager,
 
493
                                                (XClientMessageEvent *) event);
 
494
          return GDK_FILTER_REMOVE;
 
495
        }
 
496
      /* _NET_SYSTEM_TRAY_OPCODE: SYSTEM_TRAY_CANCEL_MESSAGE */
 
497
      else if (xevent->xclient.message_type == manager->opcode_atom &&
 
498
               xevent->xclient.data.l[1]    == SYSTEM_TRAY_CANCEL_MESSAGE)
 
499
        {
 
500
          na_tray_manager_handle_cancel_message (manager,
 
501
                                                 (XClientMessageEvent *) event);
 
502
          return GDK_FILTER_REMOVE;
 
503
        }
 
504
      /* _NET_SYSTEM_TRAY_MESSAGE_DATA */
 
505
      else if (xevent->xclient.message_type == manager->message_data_atom)
 
506
        {
 
507
          na_tray_manager_handle_message_data (manager,
 
508
                                               (XClientMessageEvent *) event);
 
509
          return GDK_FILTER_REMOVE;
 
510
        }
510
511
    }
511
512
  else if (xevent->type == SelectionClear)
512
513
    {
564
565
                                           TRUE);
565
566
    }
566
567
 
567
 
  //FIXME: we should also use gdk_remove_client_message_filter when it's
568
 
  //available
569
 
  // See bug #351254
570
568
  gdk_window_remove_filter (window,
571
569
                            na_tray_manager_window_filter, manager);  
572
570
 
585
583
  Atom        orientation_atom;
586
584
  gulong      data[1];
587
585
 
588
 
  if (!manager->invisible)
589
 
    return;
 
586
  g_return_if_fail (manager->invisible != NULL);
590
587
  window = gtk_widget_get_window (manager->invisible);
591
 
  if (!window)
592
 
    return;
 
588
  g_return_if_fail (window != NULL);
593
589
 
594
590
  display = gtk_widget_get_display (manager->invisible);
595
591
  orientation_atom = gdk_x11_get_xatom_by_name_for_display (display,
600
596
                SYSTEM_TRAY_ORIENTATION_VERT;
601
597
 
602
598
  XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
603
 
                   GDK_WINDOW_XWINDOW (window),
 
599
                   GDK_WINDOW_XID (window),
604
600
                   orientation_atom,
605
601
                   XA_CARDINAL, 32,
606
602
                   PropModeReplace,
618
614
  Atom        visual_atom;
619
615
  gulong      data[1];
620
616
 
621
 
  if (!manager->invisible)
622
 
    return;
 
617
  g_return_if_fail (manager->invisible != NULL);
623
618
  window = gtk_widget_get_window (manager->invisible);
624
 
  if (!window)
625
 
    return;
 
619
  g_return_if_fail (window != NULL);
626
620
 
627
621
  /* The visual property is a hint to the tray icons as to what visual they
628
622
   * should use for their windows. If the X server has RGBA colormaps, then
638
632
 
639
633
  if (gdk_screen_get_rgba_visual (manager->screen) != NULL &&
640
634
      gdk_display_supports_composite (display))
641
 
    {
642
 
      xvisual = GDK_VISUAL_XVISUAL (gdk_screen_get_rgba_visual (manager->screen));
643
 
    }
 
635
    xvisual = GDK_VISUAL_XVISUAL (gdk_screen_get_rgba_visual (manager->screen));
644
636
  else
645
637
    {
646
638
      /* We actually want the visual of the tray where the icons will
647
639
       * be embedded. In almost all cases, this will be the same as the visual
648
640
       * of the screen.
649
641
       */
650
 
      GdkColormap *colormap;
651
 
 
652
 
      colormap = gdk_screen_get_default_colormap (manager->screen);
653
 
      xvisual = GDK_VISUAL_XVISUAL (gdk_colormap_get_visual (colormap));
 
642
      xvisual = GDK_VISUAL_XVISUAL (gdk_screen_get_system_visual (manager->screen));
654
643
    }
655
644
 
656
645
  data[0] = XVisualIDFromVisual (xvisual);
657
646
 
658
647
  XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
659
 
                   GDK_WINDOW_XWINDOW (window),
 
648
                   GDK_WINDOW_XID (window),
660
649
                   visual_atom,
661
650
                   XA_VISUALID, 32,
662
651
                   PropModeReplace,
664
653
#endif
665
654
}
666
655
 
 
656
static void
 
657
na_tray_manager_set_padding_property (NaTrayManager *manager)
 
658
{
 
659
#ifdef GDK_WINDOWING_X11
 
660
  GdkWindow  *window;
 
661
  GdkDisplay *display;
 
662
  Atom        atom;
 
663
  gulong      data[1];
 
664
 
 
665
  g_return_if_fail (manager->invisible != NULL);
 
666
  window = gtk_widget_get_window (manager->invisible);
 
667
  g_return_if_fail (window != NULL);
 
668
 
 
669
  display = gtk_widget_get_display (manager->invisible);
 
670
  atom = gdk_x11_get_xatom_by_name_for_display (display,
 
671
                                                "_NET_SYSTEM_TRAY_PADDING");
 
672
 
 
673
  data[0] = manager->padding;
 
674
 
 
675
  XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
 
676
                   GDK_WINDOW_XID (window),
 
677
                   atom,
 
678
                   XA_CARDINAL, 32,
 
679
                   PropModeReplace,
 
680
                   (guchar *) &data, 1);
 
681
#endif
 
682
}
 
683
 
 
684
static void
 
685
na_tray_manager_set_icon_size_property (NaTrayManager *manager)
 
686
{
 
687
#ifdef GDK_WINDOWING_X11
 
688
  GdkWindow  *window;
 
689
  GdkDisplay *display;
 
690
  Atom        atom;
 
691
  gulong      data[1];
 
692
 
 
693
  g_return_if_fail (manager->invisible != NULL);
 
694
  window = gtk_widget_get_window (manager->invisible);
 
695
  g_return_if_fail (window != NULL);
 
696
 
 
697
  display = gtk_widget_get_display (manager->invisible);
 
698
  atom = gdk_x11_get_xatom_by_name_for_display (display,
 
699
                                                "_NET_SYSTEM_TRAY_ICON_SIZE");
 
700
 
 
701
  data[0] = manager->icon_size;
 
702
 
 
703
  XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
 
704
                   GDK_WINDOW_XID (window),
 
705
                   atom,
 
706
                   XA_CARDINAL, 32,
 
707
                   PropModeReplace,
 
708
                   (guchar *) &data, 1);
 
709
#endif
 
710
}
 
711
 
 
712
static void
 
713
na_tray_manager_set_colors_property (NaTrayManager *manager)
 
714
{
 
715
#ifdef GDK_WINDOWING_X11
 
716
  GdkWindow  *window;
 
717
  GdkDisplay *display;
 
718
  Atom        atom;
 
719
  gulong      data[12];
 
720
 
 
721
  g_return_if_fail (manager->invisible != NULL);
 
722
  window = gtk_widget_get_window (manager->invisible);
 
723
  g_return_if_fail (window != NULL);
 
724
 
 
725
  display = gtk_widget_get_display (manager->invisible);
 
726
  atom = gdk_x11_get_xatom_by_name_for_display (display,
 
727
                                                "_NET_SYSTEM_TRAY_COLORS");
 
728
 
 
729
  data[0] = manager->fg.red;
 
730
  data[1] = manager->fg.green;
 
731
  data[2] = manager->fg.blue;
 
732
  data[3] = manager->error.red;
 
733
  data[4] = manager->error.green;
 
734
  data[5] = manager->error.blue;
 
735
  data[6] = manager->warning.red;
 
736
  data[7] = manager->warning.green;
 
737
  data[8] = manager->warning.blue;
 
738
  data[9] = manager->success.red;
 
739
  data[10] = manager->success.green;
 
740
  data[11] = manager->success.blue;
 
741
 
 
742
  XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
 
743
                   GDK_WINDOW_XID (window),
 
744
                   atom,
 
745
                   XA_CARDINAL, 32,
 
746
                   PropModeReplace,
 
747
                   (guchar *) &data, 12);
 
748
#endif
 
749
}
 
750
 
667
751
#ifdef GDK_WINDOWING_X11
668
752
 
669
753
static gboolean
709
793
 
710
794
  na_tray_manager_set_orientation_property (manager);
711
795
  na_tray_manager_set_visual_property (manager);
 
796
  na_tray_manager_set_padding_property (manager);
 
797
  na_tray_manager_set_icon_size_property (manager);
 
798
  na_tray_manager_set_colors_property (manager);
712
799
  
713
800
  window = gtk_widget_get_window (invisible);
714
801
 
734
821
      xev.data.l[0] = timestamp;
735
822
      xev.data.l[1] = gdk_x11_atom_to_xatom_for_display (display,
736
823
                                                         manager->selection_atom);
737
 
      xev.data.l[2] = GDK_WINDOW_XWINDOW (window);
 
824
      xev.data.l[2] = GDK_WINDOW_XID (window);
738
825
      xev.data.l[3] = 0;        /* manager specific data */
739
826
      xev.data.l[4] = 0;        /* manager specific data */
740
827
 
748
835
 
749
836
      message_data_atom = gdk_atom_intern ("_NET_SYSTEM_TRAY_MESSAGE_DATA",
750
837
                                           FALSE);
 
838
      manager->message_data_atom = gdk_x11_atom_to_xatom_for_display (display,
 
839
                                                                      message_data_atom);
751
840
 
752
841
      /* Add a window filter */
753
842
#if 0
756
845
                        G_CALLBACK (na_tray_manager_selection_clear_event),
757
846
                        manager);
758
847
#endif
759
 
      /* This is for SYSTEM_TRAY_REQUEST_DOCK and SelectionClear */
760
848
      gdk_window_add_filter (window,
761
849
                             na_tray_manager_window_filter, manager);
762
 
      /* This is for SYSTEM_TRAY_BEGIN_MESSAGE and SYSTEM_TRAY_CANCEL_MESSAGE */
763
 
      gdk_display_add_client_message_filter (display, opcode_atom,
764
 
                                             na_tray_manager_handle_client_message_opcode,
765
 
                                             manager);
766
 
      /* This is for _NET_SYSTEM_TRAY_MESSAGE_DATA */
767
 
      gdk_display_add_client_message_filter (display, message_data_atom,
768
 
                                             na_tray_manager_handle_client_message_message_data,
769
 
                                             manager);
770
850
      return TRUE;
771
851
    }
772
852
  else
850
930
    }
851
931
}
852
932
 
 
933
void
 
934
na_tray_manager_set_padding (NaTrayManager *manager,
 
935
                             gint           padding)
 
936
{
 
937
  g_return_if_fail (NA_IS_TRAY_MANAGER (manager));
 
938
 
 
939
  if (manager->padding != padding)
 
940
    {
 
941
      manager->padding = padding;
 
942
 
 
943
      na_tray_manager_set_padding_property (manager);
 
944
    }
 
945
}
 
946
 
 
947
void
 
948
na_tray_manager_set_icon_size (NaTrayManager *manager,
 
949
                               gint           icon_size)
 
950
{
 
951
  g_return_if_fail (NA_IS_TRAY_MANAGER (manager));
 
952
 
 
953
  if (manager->icon_size != icon_size)
 
954
    {
 
955
      manager->icon_size = icon_size;
 
956
 
 
957
      na_tray_manager_set_icon_size_property (manager);
 
958
    }
 
959
}
 
960
 
 
961
void
 
962
na_tray_manager_set_colors (NaTrayManager *manager,
 
963
                            GdkColor      *fg,
 
964
                            GdkColor      *error,
 
965
                            GdkColor      *warning,
 
966
                            GdkColor      *success)
 
967
{
 
968
  g_return_if_fail (NA_IS_TRAY_MANAGER (manager));
 
969
 
 
970
  if (!gdk_color_equal (&manager->fg, fg) ||
 
971
      !gdk_color_equal (&manager->error, error) ||
 
972
      !gdk_color_equal (&manager->warning, warning) ||
 
973
      !gdk_color_equal (&manager->success, success))
 
974
    {
 
975
      manager->fg = *fg;
 
976
      manager->error = *error;
 
977
      manager->warning = *warning;
 
978
      manager->success = *success;
 
979
 
 
980
      na_tray_manager_set_colors_property (manager);
 
981
    }
 
982
}
 
983
 
853
984
GtkOrientation
854
985
na_tray_manager_get_orientation (NaTrayManager *manager)
855
986
{