21
21
22
22
#include "exm-extension-row.h"
23
23
24
+ #include "exm-config.h"
24
25
#include "exm-enums.h"
25
26
#include "exm-types.h"
26
27
27
- #include "exm-config.h"
28
+ #include <glib/gi18n.h>
28
29
29
30
struct _ExmExtensionRow
30
31
{
@@ -44,12 +45,13 @@ struct _ExmExtensionRow
44
45
45
46
AdwActionRow * description_row ;
46
47
AdwActionRow * version_row ;
48
+ AdwActionRow * session_modes_row ;
49
+ GtkImage * info_icon ;
47
50
AdwActionRow * error_row ;
48
51
49
52
GtkImage * update_icon ;
50
53
GtkImage * error_icon ;
51
54
GtkImage * out_of_date_icon ;
52
- GtkImage * info_icon ;
53
55
};
54
56
55
57
G_DEFINE_FINAL_TYPE (ExmExtensionRow , exm_extension_row , ADW_TYPE_EXPANDER_ROW )
@@ -153,6 +155,62 @@ unbind_extension (ExmExtensionRow *self)
153
155
}
154
156
}
155
157
158
+ static void
159
+ add_session_modes (GPtrArray * session_modes ,
160
+ ExmExtensionRow * self )
161
+ {
162
+ if (!session_modes || session_modes -> len == 0 )
163
+ return ;
164
+
165
+ GPtrArray * subtitles = g_ptr_array_new_with_free_func (g_free );
166
+ gboolean has_unlock_dialog = FALSE;
167
+ gboolean has_gdm = FALSE;
168
+
169
+ for (guint i = 0 ; i < session_modes -> len ; i ++ )
170
+ {
171
+ gchar * mode = g_ptr_array_index (session_modes , i );
172
+
173
+ if (g_strcmp0 (mode , "unlock-dialog" ) == 0 )
174
+ {
175
+ g_ptr_array_add (subtitles , g_strdup (_ ("Unlock Dialog" )));
176
+ has_unlock_dialog = TRUE;
177
+ }
178
+ else if (g_strcmp0 (mode , "gdm" ) == 0 )
179
+ {
180
+ // Translators: GNOME Display Manager
181
+ g_ptr_array_add (subtitles , g_strdup (_ ("GDM" )));
182
+ has_gdm = TRUE;
183
+ }
184
+ }
185
+
186
+ if (has_unlock_dialog && has_gdm )
187
+ {
188
+ // Translators: Icon's tooltip when an extension runs on both, login and lock screens
189
+ gtk_widget_set_tooltip_text (GTK_WIDGET (self -> info_icon ), _ ("This extension will run while the screen is locked and no user is logged in" ));
190
+ }
191
+ else if (has_unlock_dialog )
192
+ {
193
+ // Translators: Icon's tooltip when an extension runs on the lock screen
194
+ gtk_widget_set_tooltip_text (GTK_WIDGET (self -> info_icon ), _ ("This extension will run while the screen is locked" ));
195
+ }
196
+ else if (has_gdm )
197
+ {
198
+ // Translators: Icon's tooltip when an extension runs on the login screen
199
+ gtk_widget_set_tooltip_text (GTK_WIDGET (self -> info_icon ), _ ("This extension will run while no user is logged in" ));
200
+ }
201
+
202
+ if (subtitles -> len > 0 )
203
+ {
204
+ g_ptr_array_add (subtitles , NULL );
205
+ gchar * subtitle = g_strjoinv (" / " , (gchar * * )subtitles -> pdata );
206
+ adw_action_row_set_subtitle (self -> session_modes_row , subtitle );
207
+ gtk_widget_set_visible (GTK_WIDGET (self -> session_modes_row ), TRUE);
208
+ g_free (subtitle );
209
+ }
210
+
211
+ g_ptr_array_free (subtitles , TRUE);
212
+ }
213
+
156
214
static void
157
215
bind_extension (ExmExtensionRow * self ,
158
216
ExmExtension * extension )
@@ -173,49 +231,45 @@ bind_extension (ExmExtensionRow *self,
173
231
if (self -> extension == NULL )
174
232
return ;
175
233
176
- gchar * name , * uuid , * description , * version , * version_name , * error_msg ;
234
+ gchar * name , * uuid , * description , * version , * error ;
177
235
gboolean enabled , has_prefs , is_user ;
178
236
ExmExtensionState state ;
237
+ GPtrArray * session_modes ;
179
238
g_object_get (self -> extension ,
180
- "display- name" , & name ,
239
+ "name" , & name ,
181
240
"uuid" , & uuid ,
182
241
"description" , & description ,
183
242
"state" , & state ,
184
243
"enabled" , & enabled ,
244
+ "version" , & version ,
245
+ "error" , & error ,
185
246
"has-prefs" , & has_prefs ,
186
247
"is-user" , & is_user ,
187
- "version" , & version ,
188
- "version-name" , & version_name ,
189
- "error-msg" , & error_msg ,
248
+ "session-modes" , & session_modes ,
190
249
NULL );
191
250
192
251
self -> uuid = g_strdup (uuid );
193
252
194
- g_object_set (self , "title" , g_markup_escape_text (name , -1 ), NULL );
195
- adw_action_row_set_subtitle (self -> version_row , version_name ? g_strdup_printf ("%s (%s)" , version_name , version )
196
- : version );
253
+ g_object_set (self , "title" , g_markup_escape_text (name , -1 ), NULL );
197
254
198
255
// Trim description label's leading and trailing whitespace
199
256
char * description_trimmed = g_strchomp (g_strstrip (description ));
200
257
adw_action_row_set_subtitle (self -> description_row , description_trimmed );
201
258
g_free (description_trimmed );
202
259
203
- // Only show if error_msg exists and is not empty
204
- gboolean has_error = (error_msg != NULL ) && (strlen ( error_msg ) != 0 );
260
+ // Only show if error exists and is not empty
261
+ gboolean has_error = (error != NULL ) && (strlen ( error ) != 0 );
205
262
gtk_widget_set_visible (GTK_WIDGET (self -> error_row ), has_error );
206
263
207
264
gtk_widget_set_visible (GTK_WIDGET (self -> error_icon ), state == EXM_EXTENSION_STATE_ERROR );
208
265
gtk_widget_set_visible (GTK_WIDGET (self -> out_of_date_icon ), state == EXM_EXTENSION_STATE_OUT_OF_DATE );
209
266
210
- gtk_widget_set_visible (GTK_WIDGET (self -> info_icon ),
211
- (state == EXM_EXTENSION_STATE_INITIALIZED
212
- || state == EXM_EXTENSION_STATE_INACTIVE )
213
- && enabled );
214
-
215
267
gtk_widget_set_visible (GTK_WIDGET (self -> version_row ), version != NULL );
216
268
217
269
gtk_actionable_set_action_target (GTK_ACTIONABLE (self -> details_btn ), "s" , uuid );
218
270
271
+ add_session_modes (session_modes , self );
272
+
219
273
GAction * action ;
220
274
221
275
action = g_action_map_lookup_action (G_ACTION_MAP (self -> action_group ), "open-prefs" );
@@ -300,6 +354,8 @@ exm_extension_row_class_init (ExmExtensionRowClass *klass)
300
354
301
355
gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , description_row );
302
356
gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , version_row );
357
+ gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , session_modes_row );
358
+ gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , info_icon );
303
359
gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , error_row );
304
360
305
361
gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , prefs_btn );
@@ -309,7 +365,6 @@ exm_extension_row_class_init (ExmExtensionRowClass *klass)
309
365
gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , update_icon );
310
366
gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , error_icon );
311
367
gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , out_of_date_icon );
312
- gtk_widget_class_bind_template_child (widget_class , ExmExtensionRow , info_icon );
313
368
314
369
gtk_widget_class_bind_template_callback (widget_class , on_state_changed );
315
370
}
0 commit comments