49
49
#include <livewallpaper/core.h>
55
LwBackgroundCustomImage,
56
LwBackgroundSingleColor,
57
LwBackgroundHorizontalGradient,
58
LwBackgroundVerticalGradient
52
61
#define LW_BACKGROUND_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), LW_TYPE_BACKGROUND, LwBackgroundPrivate))
54
63
struct _LwBackgroundPrivate
67
LwBackgroundMode bg_mode;
69
LwTexture *bg_texture;
70
LwBackgroundRenderType bg_render_type;
56
72
LwTexture *default_bg;
57
73
LwBackgroundRenderType default_render_type;
60
LwBackgroundRenderType custom_render_type;
63
76
LwBackgroundRenderType render_type;
64
78
GdkRGBA primary_color;
65
79
GdkRGBA secondary_color;
66
LwBackgroundShadingType shading_type;
84
96
G_DEFINE_TYPE(LwBackground, lw_background, G_TYPE_OBJECT)
98
static void lw_background_changed(GSettings *settings, gchar *key, LwBackground *self);
87
101
* lw_background_new_with_default_image:
88
102
* @filename: Name of the default background image
145
return lw_texture_new_from_data((guchar *) data, width, height, GL_RGBA, GL_UNSIGNED_SHORT);
162
texture = lw_texture_new_from_data((guchar *) data, width, height, GL_RGBA, GL_UNSIGNED_SHORT);
163
lw_texture_set_filter(texture, GL_LINEAR);
148
168
static LwTexture*
182
202
background->priv->default_bg = create_texture_from_color(primary_color, secondary_color, type);
183
203
background->priv->default_render_type = LwBackgroundStretched;
185
lw_texture_set_filter(background->priv->default_bg, GL_LINEAR);
205
lw_background_changed(background->priv->settings, "default-bg", background);
187
207
return background;
191
lw_background_update_custom_bg(LwBackground *self)
193
if(self->priv->image && self->priv->shading_type == LwBackgroundCustomImage)
195
GError *error = NULL;
198
if(self->priv->custom_bg != NULL)
199
g_object_unref(self->priv->custom_bg);
201
self->priv->custom_bg = lw_texture_new_from_file(self->priv->image, &error);
204
if(strlen(self->priv->image) != 0)
205
g_warning("Could not load custom background image: %s", error->message);
208
/* Use color gradient as background */
209
g_free(self->priv->image);
210
self->priv->image = NULL;
211
lw_background_update_custom_bg(self);
215
self->priv->custom_render_type = self->priv->render_type;
219
/* Create color gradient */
220
if(self->priv->custom_bg != NULL)
221
g_object_unref(self->priv->custom_bg);
223
self->priv->custom_bg = create_texture_from_rgba(&self->priv->primary_color,
224
&self->priv->secondary_color,
225
self->priv->shading_type);
226
self->priv->custom_render_type = LwBackgroundStretched;
228
lw_texture_set_filter(self->priv->custom_bg, GL_LINEAR);
233
211
lw_background_set_property(GObject *object,
234
212
guint property_id,
235
213
const GValue *value,
243
221
g_free(self->priv->image);
244
222
self->priv->image = g_strdup(g_value_get_string(value));
245
lw_background_update_custom_bg(self);
223
if(self->priv->bg_mode == LwBackgroundCustomImage)
224
lw_background_changed(self->priv->settings, "bg-image", self);
248
227
case PROP_RENDER_TYPE:
249
228
self->priv->render_type = g_value_get_uint(value);
250
if(self->priv->image != NULL)
251
self->priv->custom_render_type = self->priv->render_type;
229
if(self->priv->bg_mode == LwBackgroundCustomImage)
230
self->priv->bg_render_type = self->priv->render_type;
254
233
case PROP_PRIMARY_COLOR:
255
234
self->priv->primary_color = *((GdkRGBA*) g_value_get_boxed(value));
256
lw_background_update_custom_bg(self);
235
if(self->priv->bg_mode == LwBackgroundSingleColor ||
236
self->priv->bg_mode == LwBackgroundHorizontalGradient ||
237
self->priv->bg_mode == LwBackgroundVerticalGradient)
238
lw_background_changed(self->priv->settings, "bg-primary-color", self);
259
241
case PROP_SECONDARY_COLOR:
260
242
self->priv->secondary_color = *((GdkRGBA*) g_value_get_boxed(value));
261
lw_background_update_custom_bg(self);
264
case PROP_SHADING_TYPE:
265
self->priv->shading_type = g_value_get_uint(value);
266
lw_background_update_custom_bg(self);
243
if(self->priv->bg_mode == LwBackgroundHorizontalGradient ||
244
self->priv->bg_mode == LwBackgroundVerticalGradient)
245
lw_background_changed(self->priv->settings, "bg-secondary-color", self);
322
297
gint width = lw_output_get_width(output),
323
298
height = lw_output_get_height(output);
324
299
gint tex_width, tex_height;
326
LwBackgroundRenderType type;
300
LwTexture* tex = self->priv->bg_texture;
301
LwBackgroundRenderType type = self->priv->bg_render_type;
327
302
LwTextureMatrix m;
329
/* Get the right background */
330
if(self->priv->shading_type == LwBackgroundDefault)
304
if(tex == NULL && self->priv->default_bg != NULL)
306
/* Fallback to default background */
332
307
tex = self->priv->default_bg;
333
308
type = self->priv->default_render_type;
337
tex = self->priv->custom_bg;
338
type = self->priv->custom_render_type;
341
if(tex == NULL) return;
310
else if(tex == NULL) return;
343
312
tex_width = lw_texture_get_width(tex);
344
313
tex_height = lw_texture_get_height(tex);
450
lw_background_bg_render_type_changed(GSettings *settings, gchar *key, LwBackground *self)
419
lw_background_changed(GSettings *settings, gchar *key, LwBackground *self)
423
if(self->priv->bg_texture)
425
g_object_unref(self->priv->bg_texture);
426
self->priv->bg_texture = NULL;
429
self->priv->bg_mode = g_settings_get_enum(settings, "bg-mode");
430
switch(self->priv->bg_mode)
432
case LwBackgroundCustomImage:
434
GError *error = NULL;
437
self->priv->bg_texture = lw_texture_new_from_file(self->priv->image, &error);
441
if(strlen(self->priv->image) != 0)
442
g_warning("Could not load custom background image: %s", error->message);
446
self->priv->bg_render_type = self->priv->render_type;
450
case LwBackgroundSingleColor:
451
self->priv->bg_texture = create_texture_from_rgba(&self->priv->primary_color,
452
&self->priv->secondary_color,
454
self->priv->bg_render_type = LwBackgroundStretched;
457
case LwBackgroundHorizontalGradient:
458
self->priv->bg_texture = create_texture_from_rgba(&self->priv->primary_color,
459
&self->priv->secondary_color,
460
LwBackgroundHorizontal);
461
self->priv->bg_render_type = LwBackgroundStretched;
464
case LwBackgroundVerticalGradient:
465
self->priv->bg_texture = create_texture_from_rgba(&self->priv->primary_color,
466
&self->priv->secondary_color,
467
LwBackgroundVertical);
468
self->priv->bg_render_type = LwBackgroundStretched;
471
case LwBackgroundDefault:
473
self->priv->bg_texture = self->priv->default_bg;
474
if(self->priv->default_bg)
475
g_object_ref(self->priv->default_bg);
476
self->priv->bg_render_type = self->priv->default_render_type;
481
lw_background_render_type_changed(GSettings *settings, gchar *key, LwBackground *self)
458
lw_background_bg_shading_type_changed(GSettings *settings, gchar *key, LwBackground *self)
462
g_object_set(self, "shading-type", g_settings_get_enum(settings, "bg-shading-type"), NULL);
466
489
lw_background_init(LwBackground *self)
468
491
GSettings *settings = g_settings_new("net.launchpad.livewallpaper");
469
492
self->priv = LW_BACKGROUND_GET_PRIVATE(self);
493
self->priv->settings = settings;
495
self->priv->bg_mode = LwBackgroundDefault;
497
self->priv->bg_texture = NULL;
498
self->priv->bg_render_type = LwBackgroundZoom;
471
500
self->priv->default_bg = NULL;
472
501
self->priv->default_render_type = LwBackgroundZoom;
474
self->priv->custom_bg = NULL;
475
self->priv->custom_render_type = LwBackgroundZoom;
477
self->priv->render_type = g_settings_get_enum(settings, "bg-render-type");
478
self->priv->shading_type = g_settings_get_enum(settings, "bg-shading-type");
480
503
/* Bind settings to properties */
504
g_signal_connect(settings, "changed::bg-mode", G_CALLBACK(lw_background_changed), self);
481
506
g_settings_bind(settings, "bg-image", self, "image", G_SETTINGS_BIND_GET);
482
g_signal_connect(settings, "changed::bg-render-type", G_CALLBACK(lw_background_bg_render_type_changed), self);
507
g_signal_connect(settings, "changed::bg-render-type", G_CALLBACK(lw_background_render_type_changed), self);
508
self->priv->render_type = g_settings_get_enum(settings, "bg-render-type");
484
510
g_settings_bind_with_mapping(settings, "bg-primary-color", self, "primary-color", G_SETTINGS_BIND_GET,
485
511
lw_color_get_color_mapping, lw_color_set_color_mapping, NULL, NULL);
486
512
g_settings_bind_with_mapping(settings, "bg-secondary-color", self, "secondary-color", G_SETTINGS_BIND_GET,
487
513
lw_color_get_color_mapping, lw_color_set_color_mapping, NULL, NULL);
488
g_signal_connect(settings, "changed::bg-shading-type", G_CALLBACK(lw_background_bg_shading_type_changed), self);
494
519
LwBackground *self = LW_BACKGROUND(object);
521
if(self->priv->settings)
523
g_object_unref(self->priv->settings);
524
self->priv->settings = NULL;
527
if(self->priv->bg_texture)
529
g_object_unref(self->priv->bg_texture);
530
self->priv->bg_texture = NULL;
496
533
if(self->priv->default_bg)
498
535
g_object_unref(self->priv->default_bg);
499
536
self->priv->default_bg = NULL;
502
if(self->priv->custom_bg)
504
g_object_unref(self->priv->custom_bg);
505
self->priv->custom_bg = NULL;
508
539
/* Chain up to the parent class */
509
540
G_OBJECT_CLASS(lw_background_parent_class)->dispose(object);
533
564
g_type_class_add_private(klass, sizeof(LwBackgroundPrivate));
536
* LwBackground:shading-type:
538
* How to shade the background color
540
obj_properties[PROP_SHADING_TYPE] =
541
g_param_spec_uint("shading-type",
543
"How to shade the background color",
550
567
* LwBackground:image:
552
569
* Path to use for the background image