~unity8-desktop-session-team/indicator-session/indicator-session-using-upstart

« back to all changes in this revision

Viewing changes to src/user-widget.c

  • Committer: Charles Kerr
  • Date: 2012-07-05 15:40:24 UTC
  • Revision ID: charles.kerr@canonical.com-20120705154024-2ay685pqbusuzp76
Remove the etched border effect for user icons.

They looked good before, but look cluttered with the new reduced icon size, and lessening clutter was the reason for shrinking the icons in the first place.

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
{
41
41
  DbusmenuMenuitem* twin_item;
42
42
  GtkWidget* user_image;
43
 
  gboolean using_personal_icon;
44
43
  GtkWidget* user_name;
45
44
  GtkWidget* container;
46
45
  GtkWidget* tick_icon;
66
65
static void user_widget_set_twin_item (UserWidget* self,
67
66
                                       DbusmenuMenuitem* twin_item);
68
67
 
69
 
static void _color_shade (const CairoColorRGB *a,
70
 
                          float k,
71
 
                          CairoColorRGB *b);
72
 
 
73
 
static void draw_album_border (GtkWidget *widget, gboolean selected);
74
 
 
75
68
static gboolean user_widget_primitive_draw_cb_gtk_3 (GtkWidget *image,
76
69
                                                         cairo_t* cr,
77
70
                                                         gpointer user_data);
78
 
static gboolean user_widget_draw_usericon_gtk_3 (GtkWidget *widget,
79
 
                                                 cairo_t* cr,
80
 
                                                 gpointer user_data);
81
71
 
82
72
G_DEFINE_TYPE (UserWidget, user_widget, GTK_TYPE_MENU_ITEM);
83
73
 
113
103
 
114
104
  priv->user_name = gtk_label_new ("");
115
105
 
116
 
  priv->container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
106
  priv->container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
117
107
 
118
108
  priv->tick_icon = gtk_image_new_from_icon_name ("account-logged-in",
119
109
                                                   GTK_ICON_SIZE_MENU);
146
136
  g_signal_connect_after (GTK_WIDGET(self), "draw",
147
137
                          G_CALLBACK(user_widget_primitive_draw_cb_gtk_3),
148
138
                          GTK_WIDGET(self));
149
 
 
150
 
  g_signal_connect_after (GTK_WIDGET(priv->user_image), "draw",
151
 
                          G_CALLBACK(user_widget_draw_usericon_gtk_3),
152
 
                          GTK_WIDGET(self));
153
139
}
154
140
 
155
141
static void
179
165
  UserWidgetPrivate * priv = USER_WIDGET_GET_PRIVATE(meta);
180
166
 
181
167
  // Draw dot only when user is the current user.
182
 
  if (!dbusmenu_menuitem_property_get_bool (priv->twin_item,
183
 
                                            USER_ITEM_PROP_IS_CURRENT_USER)){
184
 
    return FALSE;
185
 
  }
186
 
 
187
 
  GtkStyle *style;
188
 
  gdouble x, y;
189
 
  style = gtk_widget_get_style (widget);
190
 
 
191
 
  GtkAllocation allocation;
192
 
  gtk_widget_get_allocation (widget, &allocation);
193
 
  x = allocation.x + 13;
194
 
  y = allocation.height / 2;
195
 
 
196
 
  cairo_arc (cr, x, y, 3.0, 0.0, 2 * G_PI);
197
 
 
198
 
  cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0,
199
 
                            style->fg[gtk_widget_get_state(widget)].green/65535.0,
200
 
                            style->fg[gtk_widget_get_state(widget)].blue/65535.0);
201
 
  cairo_fill (cr);
202
 
 
203
 
  return FALSE;
204
 
}
205
 
 
206
 
static gboolean
207
 
user_widget_draw_usericon_gtk_3 (GtkWidget *widget,
208
 
                                 cairo_t* cr,
209
 
                                 gpointer user_data)
210
 
{
211
 
  g_return_val_if_fail(IS_USER_WIDGET(user_data), FALSE);
212
 
  UserWidget* meta = USER_WIDGET(user_data);
213
 
  UserWidgetPrivate * priv = USER_WIDGET_GET_PRIVATE(meta);
214
 
 
215
 
  if (priv->using_personal_icon)
 
168
  if (dbusmenu_menuitem_property_get_bool (priv->twin_item, USER_ITEM_PROP_IS_CURRENT_USER))
216
169
    {
217
 
      draw_album_border (widget, FALSE);
 
170
      gdouble x, y;
 
171
      GtkStyle * style = gtk_widget_get_style (widget);
 
172
 
 
173
      GtkAllocation allocation;
 
174
      gtk_widget_get_allocation (widget, &allocation);
 
175
      x = allocation.x + 13;
 
176
      y = allocation.height / 2;
 
177
 
 
178
      cairo_arc (cr, x, y, 3.0, 0.0, 2 * G_PI);
 
179
 
 
180
      cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0,
 
181
                                style->fg[gtk_widget_get_state(widget)].green/65535.0,
 
182
                                style->fg[gtk_widget_get_state(widget)].blue/65535.0);
 
183
      cairo_fill (cr);
218
184
    }
219
185
 
220
186
  return FALSE;
221
187
}
222
188
 
223
 
static void
224
 
draw_album_border(GtkWidget *widg, gboolean selected)
225
 
{
226
 
  cairo_t *cr;
227
 
  cr = gdk_cairo_create (gtk_widget_get_window (widg));
228
 
  gtk_style_context_add_class (gtk_widget_get_style_context (widg),
229
 
                               "menu");
230
 
 
231
 
  GtkStyle *style;
232
 
  style = gtk_widget_get_style (widg);
233
 
 
234
 
  GtkAllocation alloc;
235
 
  gtk_widget_get_allocation (widg, &alloc);
236
 
  gint offset = 0;
237
 
  gint v_offset = 4;
238
 
 
239
 
  alloc.width = alloc.width + (offset * 2);
240
 
  alloc.height = alloc.height - v_offset - 2;
241
 
  alloc.x = alloc.x - offset;
242
 
  alloc.y = alloc.y + v_offset/2 +1;
243
 
 
244
 
  CairoColorRGB bg_normal, fg_normal;
245
 
 
246
 
  bg_normal.r = style->bg[0].red/65535.0;
247
 
  bg_normal.g = style->bg[0].green/65535.0;
248
 
  bg_normal.b = style->bg[0].blue/65535.0;
249
 
 
250
 
  gint state = selected ? 5 : 0;
251
 
 
252
 
  fg_normal.r = style->fg[state].red/65535.0;
253
 
  fg_normal.g = style->fg[state].green/65535.0;
254
 
  fg_normal.b = style->fg[state].blue/65535.0;
255
 
 
256
 
  CairoColorRGB dark_top_color;
257
 
  CairoColorRGB light_bottom_color;
258
 
  CairoColorRGB background_color;
259
 
 
260
 
  _color_shade ( &bg_normal, 0.93, &background_color );
261
 
  _color_shade ( &bg_normal, 0.23, &dark_top_color );
262
 
  _color_shade ( &fg_normal, 0.55, &light_bottom_color );
263
 
 
264
 
  cairo_rectangle (cr,
265
 
                   alloc.x, alloc.y,
266
 
                   alloc.width, alloc.height);
267
 
 
268
 
  cairo_set_line_width (cr, 1.0);
269
 
 
270
 
  cairo_clip ( cr );
271
 
 
272
 
  cairo_move_to (cr, alloc.x, alloc.y );
273
 
  cairo_line_to (cr, alloc.x + alloc.width,
274
 
                alloc.y );
275
 
  cairo_line_to ( cr, alloc.x + alloc.width,
276
 
                  alloc.y + alloc.height );
277
 
  cairo_line_to ( cr, alloc.x, alloc.y + alloc.height );
278
 
  cairo_line_to ( cr, alloc.x, alloc.y);
279
 
  cairo_close_path (cr);
280
 
 
281
 
  cairo_set_source_rgba ( cr,
282
 
                          background_color.r,
283
 
                          background_color.g,
284
 
                          background_color.b,
285
 
                          1.0 );
286
 
 
287
 
  cairo_stroke ( cr );
288
 
 
289
 
  cairo_move_to (cr, alloc.x, alloc.y );
290
 
  cairo_line_to (cr, alloc.x + alloc.width,
291
 
                alloc.y );
292
 
 
293
 
  cairo_close_path (cr);
294
 
  cairo_set_source_rgba ( cr,
295
 
                          dark_top_color.r,
296
 
                          dark_top_color.g,
297
 
                          dark_top_color.b,
298
 
                          1.0 );
299
 
 
300
 
  cairo_stroke ( cr );
301
 
 
302
 
  cairo_move_to ( cr, alloc.x + alloc.width,
303
 
                  alloc.y + alloc.height );
304
 
  cairo_line_to ( cr, alloc.x, alloc.y + alloc.height );
305
 
 
306
 
  cairo_close_path (cr);
307
 
  cairo_set_source_rgba ( cr,
308
 
                         light_bottom_color.r,
309
 
                         light_bottom_color.g,
310
 
                         light_bottom_color.b,
311
 
                         1.0);
312
 
 
313
 
  cairo_stroke ( cr );
314
 
  cairo_destroy (cr);
315
 
}
316
 
 
317
 
static void
318
 
_color_rgb_to_hls (gdouble *r,
319
 
                   gdouble *g,
320
 
                   gdouble *b)
321
 
{
322
 
  gdouble min;
323
 
  gdouble max;
324
 
  gdouble red;
325
 
  gdouble green;
326
 
  gdouble blue;
327
 
  gdouble h = 0;
328
 
  gdouble l;
329
 
  gdouble s;
330
 
  gdouble delta;
331
 
 
332
 
  red = *r;
333
 
  green = *g;
334
 
  blue = *b;
335
 
 
336
 
  if (red > green)
337
 
  {
338
 
    if (red > blue)
339
 
      max = red;
340
 
    else
341
 
      max = blue;
342
 
 
343
 
    if (green < blue)
344
 
      min = green;
345
 
    else
346
 
    min = blue;
347
 
  }
348
 
  else
349
 
  {
350
 
    if (green > blue)
351
 
      max = green;
352
 
    else
353
 
    max = blue;
354
 
 
355
 
    if (red < blue)
356
 
      min = red;
357
 
    else
358
 
      min = blue;
359
 
  }
360
 
  l = (max+min)/2;
361
 
  if (fabs (max-min) < 0.0001)
362
 
  {
363
 
    h = 0;
364
 
    s = 0;
365
 
  }
366
 
  else
367
 
  {
368
 
    if (l <= 0.5)
369
 
    s = (max-min)/(max+min);
370
 
    else
371
 
    s = (max-min)/(2-max-min);
372
 
 
373
 
    delta = (max -min) != 0 ? (max -min) : 1;
374
 
 
375
 
    if(delta == 0)
376
 
      delta = 1;
377
 
    if (red == max)
378
 
      h = (green-blue)/delta;
379
 
    else if (green == max)
380
 
      h = 2+(blue-red)/delta;
381
 
    else if (blue == max)
382
 
      h = 4+(red-green)/delta;
383
 
 
384
 
    h *= 60;
385
 
    if (h < 0.0)
386
 
      h += 360;
387
 
  }
388
 
 
389
 
  *r = h;
390
 
  *g = l;
391
 
  *b = s;
392
 
}
393
 
 
394
 
static void
395
 
_color_hls_to_rgb (gdouble *h,
396
 
                   gdouble *l,
397
 
                   gdouble *s)
398
 
{
399
 
  gdouble hue;
400
 
  gdouble lightness;
401
 
  gdouble saturation;
402
 
  gdouble m1, m2;
403
 
  gdouble r, g, b;
404
 
 
405
 
  lightness = *l;
406
 
  saturation = *s;
407
 
 
408
 
  if (lightness <= 0.5)
409
 
    m2 = lightness*(1+saturation);
410
 
  else
411
 
    m2 = lightness+saturation-lightness*saturation;
412
 
 
413
 
  m1 = 2*lightness-m2;
414
 
 
415
 
  if (saturation == 0)
416
 
  {
417
 
    *h = lightness;
418
 
    *l = lightness;
419
 
    *s = lightness;
420
 
  }
421
 
  else
422
 
  {
423
 
    hue = *h+120;
424
 
    while (hue > 360)
425
 
      hue -= 360;
426
 
    while (hue < 0)
427
 
      hue += 360;
428
 
 
429
 
    if (hue < 60)
430
 
      r = m1+(m2-m1)*hue/60;
431
 
    else if (hue < 180)
432
 
      r = m2;
433
 
    else if (hue < 240)
434
 
      r = m1+(m2-m1)*(240-hue)/60;
435
 
    else
436
 
      r = m1;
437
 
 
438
 
    hue = *h;
439
 
    while (hue > 360)
440
 
      hue -= 360;
441
 
    while (hue < 0)
442
 
      hue += 360;
443
 
 
444
 
    if (hue < 60)
445
 
      g = m1+(m2-m1)*hue/60;
446
 
    else if (hue < 180)
447
 
      g = m2;
448
 
    else if (hue < 240)
449
 
      g = m1+(m2-m1)*(240-hue)/60;
450
 
    else
451
 
      g = m1;
452
 
 
453
 
    hue = *h-120;
454
 
    while (hue > 360)
455
 
      hue -= 360;
456
 
    while (hue < 0)
457
 
      hue += 360;
458
 
 
459
 
    if (hue < 60)
460
 
      b = m1+(m2-m1)*hue/60;
461
 
    else if (hue < 180)
462
 
      b = m2;
463
 
    else if (hue < 240)
464
 
      b = m1+(m2-m1)*(240-hue)/60;
465
 
    else
466
 
      b = m1;
467
 
 
468
 
    *h = r;
469
 
    *l = g;
470
 
    *s = b;
471
 
  }
472
 
}
473
 
 
474
 
static void
475
 
_color_shade (const CairoColorRGB *a, float k, CairoColorRGB *b)
476
 
{
477
 
  double red;
478
 
  double green;
479
 
  double blue;
480
 
 
481
 
  red   = a->r;
482
 
  green = a->g;
483
 
  blue  = a->b;
484
 
 
485
 
  if (k == 1.0)
486
 
  {
487
 
    b->r = red;
488
 
    b->g = green;
489
 
    b->b = blue;
490
 
    return;
491
 
  }
492
 
 
493
 
  _color_rgb_to_hls (&red, &green, &blue);
494
 
 
495
 
  green *= k;
496
 
  if (green > 1.0)
497
 
    green = 1.0;
498
 
  else if (green < 0.0)
499
 
    green = 0.0;
500
 
 
501
 
  blue *= k;
502
 
  if (blue > 1.0)
503
 
    blue = 1.0;
504
 
  else if (blue < 0.0)
505
 
    blue = 0.0;
506
 
 
507
 
  _color_hls_to_rgb (&red, &green, &blue);
508
 
 
509
 
  b->r = red;
510
 
  b->g = green;
511
 
  b->b = blue;
512
 
}
513
 
 
514
189
/***
515
190
****
516
191
***/
536
211
    }
537
212
 
538
213
  /* as a fallback, try to use the default user icon */
539
 
  if (pixbuf != NULL)
540
 
    {
541
 
      self->priv->using_personal_icon = TRUE;
542
 
    }
543
 
  else
544
 
    {
545
 
      self->priv->using_personal_icon = FALSE;
546
 
 
 
214
  if (pixbuf == NULL)
 
215
    {
547
216
      pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
548
217
                                         USER_ITEM_ICON_DEFAULT,
549
218
                                         ICON_SIZE,