LCOV - code coverage report
Current view: top level - src/plugins/gnome - valent-gnome-application.c (source / functions) Coverage Total Hit
Test: Code Coverage Lines: 18.8 % 117 22
Test Date: 2024-12-02 22:49:30 Functions: 31.2 % 16 5
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 8.8 % 68 6

             Branch data     Line data    Source code
       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
       3                 :             : 
       4                 :             : #include "config.h"
       5                 :             : 
       6                 :             : #include <gio/gio.h>
       7                 :             : #include <gtk/gtk.h>
       8                 :             : #include <valent.h>
       9                 :             : 
      10                 :             : #include "valent-input-remote.h"
      11                 :             : #include "valent-media-window.h"
      12                 :             : #include "valent-messages-window.h"
      13                 :             : #include "valent-share-dialog.h"
      14                 :             : #include "valent-ui-utils-private.h"
      15                 :             : #include "valent-window.h"
      16                 :             : 
      17                 :             : #include "valent-gnome-application.h"
      18                 :             : 
      19                 :             : 
      20                 :             : struct _ValentGNOMEApplication
      21                 :             : {
      22                 :             :   ValentApplicationPlugin  parent_instance;
      23                 :             : 
      24                 :             :   GtkWindow               *main_window;
      25                 :             :   GtkWindow               *input_remote;
      26                 :             :   GtkWindow               *media_window;
      27                 :             :   GtkWindow               *messages_window;
      28                 :             :   GPtrArray               *windows;
      29                 :             : };
      30                 :             : 
      31   [ +  +  +  - ]:          68 : G_DEFINE_FINAL_TYPE (ValentGNOMEApplication, valent_gnome_application, VALENT_TYPE_APPLICATION_PLUGIN)
      32                 :             : 
      33                 :             : 
      34                 :             : /*
      35                 :             :  * GActions
      36                 :             :  */
      37                 :             : static void
      38                 :           0 : main_window_action (GSimpleAction *action,
      39                 :             :                     GVariant      *parameter,
      40                 :             :                     gpointer       user_data)
      41                 :             : {
      42                 :           0 :   ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
      43                 :             : 
      44         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (self));
      45                 :             : 
      46         [ #  # ]:           0 :   if (self->main_window == NULL)
      47                 :             :     {
      48                 :           0 :       ValentDeviceManager *devices = valent_device_manager_get_default ();
      49                 :           0 :       GApplication *application = valent_extension_get_object (VALENT_EXTENSION (self));
      50                 :             : 
      51                 :           0 :       self->main_window = g_object_new (VALENT_TYPE_WINDOW,
      52                 :             :                                         "default-width",  600,
      53                 :             :                                         "default-height", 480,
      54                 :             :                                         "device-manager", devices,
      55                 :             :                                         NULL);
      56                 :           0 :       g_object_add_weak_pointer (G_OBJECT (self->main_window),
      57                 :           0 :                                  (gpointer)&self->main_window);
      58                 :             : 
      59                 :           0 :       gtk_widget_insert_action_group (GTK_WIDGET (self->main_window),
      60                 :             :                                       "app",
      61                 :             :                                       G_ACTION_GROUP (application));
      62                 :             :     }
      63                 :             : 
      64                 :           0 :   gtk_window_present (self->main_window);
      65                 :           0 :   gtk_widget_activate_action_variant (GTK_WIDGET (self->main_window),
      66                 :             :                                       "win.page",
      67                 :             :                                       parameter);
      68                 :           0 : }
      69                 :             : 
      70                 :             : static void
      71                 :           0 : input_remote_action (GSimpleAction *action,
      72                 :             :                      GVariant      *parameter,
      73                 :             :                      gpointer       user_data)
      74                 :             : {
      75                 :           0 :   ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
      76                 :             : 
      77         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (self));
      78                 :             : 
      79         [ #  # ]:           0 :   if (self->input_remote == NULL)
      80                 :             :     {
      81                 :           0 :       self->input_remote = g_object_new (VALENT_TYPE_INPUT_REMOTE,
      82                 :             :                                          "adapters", valent_input_get_default (),
      83                 :             :                                          NULL);
      84                 :           0 :       g_object_add_weak_pointer (G_OBJECT (self->input_remote),
      85                 :           0 :                                  (gpointer)&self->input_remote);
      86                 :             :     }
      87                 :             : 
      88                 :           0 :   gtk_window_present (self->input_remote);
      89                 :           0 : }
      90                 :             : 
      91                 :             : static void
      92                 :           0 : media_window_action (GSimpleAction *action,
      93                 :             :                      GVariant      *parameter,
      94                 :             :                      gpointer       user_data)
      95                 :             : {
      96                 :           0 :   ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
      97                 :             : 
      98         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (self));
      99                 :             : 
     100         [ #  # ]:           0 :   if (self->media_window == NULL)
     101                 :             :     {
     102                 :           0 :       self->media_window = g_object_new (VALENT_TYPE_MEDIA_WINDOW,
     103                 :             :                                          "mixers",  valent_mixer_get_default (),
     104                 :             :                                          "players", valent_media_get_default (),
     105                 :             :                                          NULL);
     106                 :           0 :       g_object_add_weak_pointer (G_OBJECT (self->media_window),
     107                 :           0 :                                  (gpointer)&self->media_window);
     108                 :             :     }
     109                 :             : 
     110                 :           0 :   gtk_window_present (self->media_window);
     111                 :           0 : }
     112                 :             : 
     113                 :             : static void
     114                 :           0 : messages_window_action (GSimpleAction *action,
     115                 :             :                         GVariant      *parameter,
     116                 :             :                         gpointer       user_data)
     117                 :             : {
     118                 :           0 :   ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
     119                 :             : 
     120         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (self));
     121                 :             : 
     122         [ #  # ]:           0 :   if (self->messages_window == NULL)
     123                 :             :     {
     124                 :           0 :       self->messages_window = g_object_new (VALENT_TYPE_MESSAGES_WINDOW, NULL);
     125                 :           0 :       g_object_add_weak_pointer (G_OBJECT (self->messages_window),
     126                 :           0 :                                  (gpointer)&self->messages_window);
     127                 :             :     }
     128                 :             : 
     129                 :           0 :   gtk_window_present (self->messages_window);
     130                 :           0 : }
     131                 :             : 
     132                 :             : static void
     133                 :           0 : on_destroy (GtkWindow       *window,
     134                 :             :             ValentGNOMEApplication *self)
     135                 :             : {
     136                 :           0 :   unsigned int index;
     137                 :             : 
     138   [ #  #  #  #  :           0 :   g_assert (GTK_IS_WINDOW (window));
             #  #  #  # ]
     139         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (self));
     140                 :             : 
     141                 :             :   /* The signal was emitted because we're disposing or being disabled */
     142         [ #  # ]:           0 :   if (self->windows == NULL)
     143                 :           0 :     return;
     144                 :             : 
     145         [ #  # ]:           0 :   if (g_ptr_array_find (self->windows, window, &index))
     146                 :           0 :     g_ptr_array_steal_index (self->windows, index);
     147                 :             : }
     148                 :             : 
     149                 :             : static void
     150                 :           0 : valent_share_target_present (ValentGNOMEApplication *self,
     151                 :             :                              GListModel      *files)
     152                 :             : {
     153                 :           0 :   GtkWindow *window = NULL;
     154                 :             : 
     155         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (self));
     156   [ #  #  #  # ]:           0 :   g_assert (files == NULL || G_IS_LIST_MODEL (files));
     157                 :             : 
     158                 :           0 :   window = g_object_new (VALENT_TYPE_SHARE_DIALOG,
     159                 :             :                          "files", files,
     160                 :             :                          NULL);
     161                 :           0 :   g_signal_connect_object (G_OBJECT (window),
     162                 :             :                            "destroy",
     163                 :             :                            G_CALLBACK (on_destroy),
     164                 :             :                            self,
     165                 :             :                            G_CONNECT_DEFAULT);
     166                 :           0 :   g_ptr_array_add (self->windows, window);
     167                 :             : 
     168                 :           0 :   gtk_window_present (window);
     169                 :           0 : }
     170                 :             : 
     171                 :             : static inline void
     172                 :           0 : share_dialog_action (GSimpleAction *action,
     173                 :             :                      GVariant      *parameters,
     174                 :             :                      gpointer       user_data)
     175                 :             : {
     176                 :           0 :   ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
     177                 :             : 
     178         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (self));
     179                 :             : 
     180                 :           0 :   valent_share_target_present (self, NULL);
     181                 :           0 : }
     182                 :             : 
     183                 :             : static const GActionEntry app_actions[] = {
     184                 :             :   { "input-remote",    input_remote_action,    NULL, NULL, NULL },
     185                 :             :   { "media-window",    media_window_action,    NULL, NULL, NULL },
     186                 :             :   { "messages-window", messages_window_action, NULL, NULL, NULL },
     187                 :             :   { "share-dialog",    share_dialog_action,    NULL, NULL, NULL },
     188                 :             :   { "window",          main_window_action,     "s",  NULL, NULL },
     189                 :             : };
     190                 :             : 
     191                 :             : 
     192                 :             : /*
     193                 :             :  * ValentApplicationPlugin
     194                 :             :  */
     195                 :             : static gboolean
     196                 :           0 : valent_gnome_application_activate (ValentApplicationPlugin *plugin)
     197                 :             : {
     198                 :           0 :   GApplication *application = NULL;
     199                 :             : 
     200         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (plugin));
     201                 :             : 
     202                 :           0 :   application = valent_extension_get_object (VALENT_EXTENSION (plugin));
     203                 :           0 :   g_action_group_activate_action (G_ACTION_GROUP (application),
     204                 :             :                                   "window",
     205                 :             :                                   g_variant_new_string ("main"));
     206                 :             : 
     207                 :           0 :   return TRUE;
     208                 :             : }
     209                 :             : 
     210                 :             : static gboolean
     211                 :           0 : valent_gnome_application_open (ValentApplicationPlugin  *plugin,
     212                 :             :                         GFile                   **files,
     213                 :             :                         int                       n_files,
     214                 :             :                         const char               *hint)
     215                 :             : {
     216                 :           0 :   ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (plugin);
     217                 :           0 :   g_autoptr (GListStore) files_list = NULL;
     218                 :             : 
     219         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (plugin));
     220         [ #  # ]:           0 :   g_assert (files != NULL);
     221         [ #  # ]:           0 :   g_assert (n_files > 0);
     222         [ #  # ]:           0 :   g_assert (hint != NULL);
     223                 :             : 
     224                 :           0 :   files_list = g_list_store_new (G_TYPE_FILE);
     225                 :           0 :   g_list_store_splice (files_list, 0, 0, (gpointer *)files, n_files);
     226                 :           0 :   valent_share_target_present (self, G_LIST_MODEL (files_list));
     227                 :             : 
     228         [ #  # ]:           0 :   return TRUE;
     229                 :             : }
     230                 :             : 
     231                 :             : static void
     232                 :           0 : valent_gnome_application_shutdown (ValentApplicationPlugin *plugin)
     233                 :             : {
     234                 :           0 :   ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (plugin);
     235                 :           0 :   GApplication *application = NULL;
     236                 :             : 
     237         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (plugin));
     238                 :             : 
     239                 :           0 :   application = valent_extension_get_object (VALENT_EXTENSION (plugin));
     240                 :             : 
     241         [ #  # ]:           0 :   for (size_t i = 0; i < G_N_ELEMENTS (app_actions); i++)
     242                 :           0 :     g_action_map_remove_action (G_ACTION_MAP (application), app_actions[i].name);
     243                 :             : 
     244         [ #  # ]:           0 :   g_clear_pointer (&self->media_window, gtk_window_destroy);
     245         [ #  # ]:           0 :   g_clear_pointer (&self->main_window, gtk_window_destroy);
     246                 :           0 : }
     247                 :             : 
     248                 :             : static void
     249                 :           0 : valent_gnome_application_startup (ValentApplicationPlugin *plugin)
     250                 :             : {
     251                 :           0 :   GApplication *application = NULL;
     252                 :             : 
     253         [ #  # ]:           0 :   g_assert (VALENT_IS_GNOME_APPLICATION (plugin));
     254                 :             : 
     255                 :           0 :   application = valent_extension_get_object (VALENT_EXTENSION (plugin));
     256                 :           0 :   g_action_map_add_action_entries (G_ACTION_MAP (application),
     257                 :             :                                    app_actions,
     258                 :             :                                    G_N_ELEMENTS (app_actions),
     259                 :             :                                    plugin);
     260                 :           0 : }
     261                 :             : 
     262                 :             : /*
     263                 :             :  * ValentObject
     264                 :             :  */
     265                 :             : static void
     266                 :           1 : valent_gnome_application_destroy (ValentObject *object)
     267                 :             : {
     268                 :           1 :   ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (object);
     269                 :           1 :   GApplication *application = NULL;
     270                 :             : 
     271                 :           1 :   application = valent_extension_get_object (VALENT_EXTENSION (self));
     272                 :             : 
     273         [ +  + ]:           6 :   for (size_t i = 0; i < G_N_ELEMENTS (app_actions); i++)
     274                 :           5 :     g_action_map_remove_action (G_ACTION_MAP (application), app_actions[i].name);
     275                 :             : 
     276         [ +  - ]:           1 :   g_clear_pointer (&self->windows, g_ptr_array_unref);
     277                 :             : 
     278                 :           1 :   VALENT_OBJECT_CLASS (valent_gnome_application_parent_class)->destroy (object);
     279                 :           1 : }
     280                 :             : 
     281                 :             : /*
     282                 :             :  * GObject
     283                 :             :  */
     284                 :             : static void
     285                 :          17 : valent_gnome_application_class_init (ValentGNOMEApplicationClass *klass)
     286                 :             : {
     287                 :          17 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
     288                 :          17 :   ValentApplicationPluginClass *plugin_class = VALENT_APPLICATION_PLUGIN_CLASS (klass);
     289                 :             : 
     290                 :          17 :   vobject_class->destroy = valent_gnome_application_destroy;
     291                 :             : 
     292                 :          17 :   plugin_class->activate = valent_gnome_application_activate;
     293                 :          17 :   plugin_class->open = valent_gnome_application_open;
     294                 :          17 :   plugin_class->shutdown = valent_gnome_application_shutdown;
     295                 :          17 :   plugin_class->startup = valent_gnome_application_startup;
     296                 :             : 
     297                 :          17 :   valent_ui_init ();
     298                 :             : }
     299                 :             : 
     300                 :             : static void
     301                 :           1 : valent_gnome_application_init (ValentGNOMEApplication *self)
     302                 :             : {
     303                 :           1 :   self->windows = g_ptr_array_new_with_free_func ((GDestroyNotify)gtk_window_destroy);
     304                 :           1 : }
     305                 :             : 
        

Generated by: LCOV version 2.0-1