Changeset 290a0f0 in mainline


Ignore:
Timestamp:
2012-11-25T19:34:10Z (11 years ago)
Author:
Petr Koupy <petr.koupy@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fa98b26a
Parents:
c4ebe02
Message:

Resolved Ticket #482 (Cannot see which window is active).

Location:
uspace
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/include/io/window.h

    rc4ebe02 r290a0f0  
    7171        ET_POSITION_EVENT,
    7272        ET_SIGNAL_EVENT,
     73        ET_WINDOW_FOCUS,
     74        ET_WINDOW_UNFOCUS,
    7375        ET_WINDOW_RESIZE,
    7476        ET_WINDOW_REFRESH,
  • uspace/lib/gui/window.c

    rc4ebe02 r290a0f0  
    6666
    6767static pixel_t border_color = PIXEL(255, 0, 0, 0);
    68 static pixel_t header_bgcolor = PIXEL(255, 25, 25, 112);
    69 static pixel_t header_fgcolor = PIXEL(255, 255, 255, 255);
     68static pixel_t header_bg_focus_color = PIXEL(255, 25, 25, 112);
     69static pixel_t header_fg_focus_color = PIXEL(255, 255, 255, 255);
     70static pixel_t header_bg_unfocus_color = PIXEL(255, 70, 130, 180);
     71static pixel_t header_fg_unfocus_color = PIXEL(255, 255, 255, 255);
    7072
    7173static void paint_internal(widget_t *w)
     
    9496            w->vpos + w->height - border_thickness, w->width, border_thickness);
    9597
    96         source_set_color(&source, header_bgcolor);
     98        source_set_color(&source,
     99            w->window->is_focused ? header_bg_focus_color : header_bg_unfocus_color);
    97100        drawctx_transfer(&drawctx,
    98101            w->hpos + border_thickness, w->vpos + border_thickness,
     
    106109        char cls_pict[] = "x";
    107110        font_get_box(&font, cls_pict, &cls_width, &cls_height);
    108         source_set_color(&source, header_fgcolor);
     111        source_set_color(&source,
     112            w->window->is_focused ? header_fg_focus_color : header_fg_unfocus_color);
    109113        sysarg_t cls_x = ((close_width - cls_width) / 2) + w->hpos + w->width -
    110114            border_thickness - close_width;
     
    447451                        break;
    448452                case ET_POSITION_EVENT:
     453                        if (!win->is_focused) {
     454                                win->is_focused = true;
     455                                handle_refresh(win);
     456                        }
    449457                        deliver_position_event(win, event->data.pos);
    450458                        break;
     
    454462                case ET_WINDOW_RESIZE:
    455463                        handle_resize(win, event->data.rsz.width, event->data.rsz.height);
     464                        break;
     465                case ET_WINDOW_FOCUS:
     466                        if (!win->is_focused) {
     467                                win->is_focused = true;
     468                                handle_refresh(win);
     469                        }
     470                        break;
     471                case ET_WINDOW_UNFOCUS:
     472                        if (win->is_focused) {
     473                                win->is_focused = false;
     474                                handle_refresh(win);
     475                        }
    456476                        break;
    457477                case ET_WINDOW_REFRESH:
     
    525545        win->is_main = is_main;
    526546        win->is_decorated = is_decorated;
     547        win->is_focused = true;
    527548        prodcons_initialize(&win->events);
    528549        fibril_mutex_initialize(&win->guard);
  • uspace/lib/gui/window.h

    rc4ebe02 r290a0f0  
    5050        bool is_main; /**< True for the main window of the application. */
    5151        bool is_decorated; /**< True if the window decorations should be rendered. */
     52        bool is_focused; /**< True for the top level window of the desktop. */
    5253        char *caption; /**< Text title of the window header. */
    5354        async_sess_t *isess; /**< Input events from compositor. */
  • uspace/srv/hid/compositor/compositor.c

    rc4ebe02 r290a0f0  
    573573                pointer_t *pointer = list_get_instance(link, pointer_t, link);
    574574                if (pointer->id == pos_id) {
    575                         pointer->grab_flags = grab_flags;
     575                        pointer->grab_flags = pointer->pressed ? grab_flags : GF_EMPTY;
    576576                        // TODO change pointer->state according to grab_flags
    577577                        break;
     
    646646}
    647647
     648static void comp_post_event_win(window_event_t *event, window_t *target)
     649{
     650        fibril_mutex_lock(&window_list_mtx);
     651        window_t *window = NULL;
     652        list_foreach(window_list, link) {
     653                window = list_get_instance(link, window_t, link);
     654                if (window == target) {
     655                        prodcons_produce(&window->queue, &event->link);
     656                }
     657        }
     658        if (!window) {
     659                free(event);
     660        }
     661        fibril_mutex_unlock(&window_list_mtx);
     662}
     663
     664static void comp_post_event_top(window_event_t *event)
     665{
     666        fibril_mutex_lock(&window_list_mtx);
     667        window_t *win = (window_t *) list_first(&window_list);
     668        if (win) {
     669                prodcons_produce(&win->queue, &event->link);
     670        } else {
     671                free(event);
     672        }
     673        fibril_mutex_unlock(&window_list_mtx);
     674}
     675
    648676static void comp_window_close(window_t *win, ipc_callid_t iid, ipc_call_t *icall)
    649677{
     
    651679        fibril_mutex_lock(&window_list_mtx);
    652680        list_remove(&win->link);
     681        window_t *win_focus = (window_t *) list_first(&window_list);
     682        window_event_t *event_focus = (window_event_t *) malloc(sizeof(window_event_t));
     683        if (event_focus) {
     684                link_initialize(&event_focus->link);
     685                event_focus->type = ET_WINDOW_FOCUS;
     686        }
    653687        fibril_mutex_unlock(&window_list_mtx);
     688
     689        if (event_focus && win_focus) {
     690                comp_post_event_win(event_focus, win_focus);
     691        }
    654692
    655693        /* Calculate damage. */
     
    735773                        }
    736774
     775                        window_t *win_unfocus = (window_t *) list_first(&window_list);
    737776                        list_prepend(&win->link, &window_list);
     777
     778                        window_event_t *event_unfocus = (window_event_t *) malloc(sizeof(window_event_t));
     779                        if (event_unfocus) {
     780                                link_initialize(&event_unfocus->link);
     781                                event_unfocus->type = ET_WINDOW_UNFOCUS;
     782                        }
    738783                       
    739784                        async_answer_2(callid, EOK, win->in_dsid, win->out_dsid);
    740785                        fibril_mutex_unlock(&window_list_mtx);
     786                       
     787                        if (event_unfocus && win_unfocus) {
     788                                comp_post_event_win(event_unfocus, win_unfocus);
     789                        }
     790
    741791                        return;
    742792                } else {
     
    10581108}
    10591109
    1060 static void comp_post_event(window_event_t *event)
    1061 {
    1062         fibril_mutex_lock(&window_list_mtx);
    1063         window_t *win = (window_t *) list_first(&window_list);
    1064         if (win) {
    1065                 prodcons_produce(&win->queue, &event->link);
    1066         } else {
    1067                 free(event);
    1068         }
    1069         fibril_mutex_unlock(&window_list_mtx);
    1070 }
    1071 
    10721110static void comp_recalc_transform(window_t *win)
    10731111{
     
    11021140{
    11031141        /* window_list_mtx locked by caller */
     1142        /* pointer_list_mtx locked by caller */
    11041143
    11051144        int dx = pointer->accum.x;
     
    11811220    desktop_rect_t *rect1, desktop_rect_t *rect2, desktop_rect_t *rect3, desktop_rect_t *rect4)
    11821221{
     1222        /* window_list_mtx locked by caller */
     1223        /* pointer_list_mtx locked by caller */
     1224
    11831225        int dx = pointer->accum_ghost.x;
    11841226        int dy = pointer->accum_ghost.y;
     
    13361378
    13371379        fibril_mutex_lock(&window_list_mtx);
     1380        fibril_mutex_lock(&pointer_list_mtx);
    13381381        window_t *top = (window_t *) list_first(&window_list);
    13391382        if (top && top->surface) {
     
    13471390                        within_client = comp_coord_to_client(pointer->pos.x, pointer->pos.y,
    13481391                            top->transform, width, height, &point_x, &point_y);
    1349                         fibril_mutex_unlock(&window_list_mtx);
    1350 
     1392
     1393                        window_event_t *event = NULL;
    13511394                        if (within_client) {
    1352                                 window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t));
     1395                                event = (window_event_t *) malloc(sizeof(window_event_t));
    13531396                                if (event) {
    13541397                                        link_initialize(&event->link);
     
    13591402                                        event->data.pos.hpos = point_x;
    13601403                                        event->data.pos.vpos = point_y;
    1361                                         comp_post_event(event);
    13621404                                }
    13631405                        }
     1406
     1407                        fibril_mutex_unlock(&pointer_list_mtx);
     1408                        fibril_mutex_unlock(&window_list_mtx);
     1409
     1410                        if (event) {
     1411                                comp_post_event_top(event);
     1412                        }
     1413
    13641414                } else {
    13651415                        /* Pointer is grabbed by top-level window action. */
     
    13851435                        comp_window_animate(pointer, top, &x, &y, &width, &height);
    13861436#endif
     1437                        fibril_mutex_unlock(&pointer_list_mtx);
    13871438                        fibril_mutex_unlock(&window_list_mtx);
    13881439#if ANIMATE_WINDOW_TRANSFORMS == 0
     
    13971448                }
    13981449        } else {
     1450                fibril_mutex_unlock(&pointer_list_mtx);
    13991451                fibril_mutex_unlock(&window_list_mtx);
    14001452        }
     
    14081460
    14091461        fibril_mutex_lock(&window_list_mtx);
     1462        fibril_mutex_lock(&pointer_list_mtx);
    14101463        window_t *win = NULL;
    14111464        sysarg_t point_x = 0;
     
    14301483        window_t *top = (window_t *) list_first(&window_list);
    14311484        if (!win || !top) {
     1485                fibril_mutex_unlock(&pointer_list_mtx);
    14321486                fibril_mutex_unlock(&window_list_mtx);
    14331487                return EOK;
    14341488        }
    14351489
    1436         window_event_t *event = NULL;
     1490        window_event_t *event_top = NULL;
     1491        window_event_t *event_unfocus = NULL;
     1492        window_t *win_unfocus = NULL;
    14371493        sysarg_t dmg_x, dmg_y;
    14381494        sysarg_t dmg_width = 0;
     
    14501506                /* Bring the window to the foreground. */
    14511507                if ((win != top) && within_client) {
     1508                        win_unfocus = (window_t *) list_first(&window_list);
    14521509                        list_remove(&win->link);
    14531510                        list_prepend(&win->link, &window_list);
     1511                        event_unfocus = (window_event_t *) malloc(sizeof(window_event_t));
     1512                        if (event_unfocus) {
     1513                                link_initialize(&event_unfocus->link);
     1514                                event_unfocus->type = ET_WINDOW_UNFOCUS;
     1515                        }
    14541516                        comp_coord_bounding_rect(0, 0, width, height, win->transform,
    14551517                            &dmg_x, &dmg_y, &dmg_width, &dmg_height);
     
    14581520                /* Notify top-level window about mouse press. */
    14591521                if (within_client) {
    1460                         event = (window_event_t *) malloc(sizeof(window_event_t));
    1461                         if (event) {
    1462                                 link_initialize(&event->link);
    1463                                 event->type = ET_POSITION_EVENT;
    1464                                 event->data.pos.pos_id = pointer->id;
    1465                                 event->data.pos.type = POS_PRESS;
    1466                                 event->data.pos.btn_num = bnum;
    1467                                 event->data.pos.hpos = point_x;
    1468                                 event->data.pos.vpos = point_y;
     1522                        event_top = (window_event_t *) malloc(sizeof(window_event_t));
     1523                        if (event_top) {
     1524                                link_initialize(&event_top->link);
     1525                                event_top->type = ET_POSITION_EVENT;
     1526                                event_top->data.pos.pos_id = pointer->id;
     1527                                event_top->data.pos.type = POS_PRESS;
     1528                                event_top->data.pos.btn_num = bnum;
     1529                                event_top->data.pos.hpos = point_x;
     1530                                event_top->data.pos.vpos = point_y;
    14691531                        }
    14701532                        pointer->grab_flags = GF_EMPTY;
     
    15011563
    15021564                        /* Commit proper resize action. */
    1503                         event = (window_event_t *) malloc(sizeof(window_event_t));
    1504                         if (event) {
    1505                                 link_initialize(&event->link);
    1506                                 event->type = ET_WINDOW_RESIZE;
     1565                        event_top = (window_event_t *) malloc(sizeof(window_event_t));
     1566                        if (event_top) {
     1567                                link_initialize(&event_top->link);
     1568                                event_top->type = ET_WINDOW_RESIZE;
    15071569
    15081570                                int dx = (int) (((double) width) * (scale_back_x - 1.0));
     
    15101572
    15111573                                if (pointer->grab_flags & GF_RESIZE_X) {
    1512                                         event->data.rsz.width =
     1574                                        event_top->data.rsz.width =
    15131575                                                ((((int) width) + dx) >= 0) ? (width + dx) : 0;
    15141576                                } else {
    1515                                         event->data.rsz.width = width;
     1577                                        event_top->data.rsz.width = width;
    15161578                                }
    15171579
    15181580                                if (pointer->grab_flags & GF_RESIZE_Y) {
    1519                                         event->data.rsz.height =
     1581                                        event_top->data.rsz.height =
    15201582                                                ((((int) height) + dy) >= 0) ? (height + dy) : 0;
    15211583                                } else {
    1522                                         event->data.rsz.height = height;
     1584                                        event_top->data.rsz.height = height;
    15231585                                }
    15241586                        }
     
    15291591                       
    15301592                        /* Notify top-level window about mouse release. */
    1531                         event = (window_event_t *) malloc(sizeof(window_event_t));
    1532                         if (event) {
    1533                                 link_initialize(&event->link);
    1534                                 event->type = ET_POSITION_EVENT;
    1535                                 event->data.pos.pos_id = pointer->id;
    1536                                 event->data.pos.type = POS_RELEASE;
    1537                                 event->data.pos.btn_num = bnum;
    1538                                 event->data.pos.hpos = point_x;
    1539                                 event->data.pos.vpos = point_y;
     1593                        event_top = (window_event_t *) malloc(sizeof(window_event_t));
     1594                        if (event_top) {
     1595                                link_initialize(&event_top->link);
     1596                                event_top->type = ET_POSITION_EVENT;
     1597                                event_top->data.pos.pos_id = pointer->id;
     1598                                event_top->data.pos.type = POS_RELEASE;
     1599                                event_top->data.pos.btn_num = bnum;
     1600                                event_top->data.pos.hpos = point_x;
     1601                                event_top->data.pos.vpos = point_y;
    15401602                        }
    15411603                        pointer->grab_flags = GF_EMPTY;
     
    15471609        }
    15481610
     1611        fibril_mutex_unlock(&pointer_list_mtx);
    15491612        fibril_mutex_unlock(&window_list_mtx);
    15501613
     
    15601623        }
    15611624
    1562         if (event) {
    1563                 comp_post_event(event);
     1625        if (event_unfocus && win_unfocus) {
     1626                comp_post_event_win(event_unfocus, win_unfocus);
     1627        }
     1628
     1629        if (event_top) {
     1630                comp_post_event_top(event_top);
    15641631        }
    15651632
     
    16851752
    16861753                        fibril_mutex_unlock(&window_list_mtx);
    1687                         comp_post_event(event);
     1754                        comp_post_event_top(event);
    16881755                } else {
    16891756                        fibril_mutex_unlock(&window_list_mtx);
     
    17271794                event->type = ET_WINDOW_CLOSE;
    17281795
    1729                 comp_post_event(event);
     1796                comp_post_event_top(event);
    17301797        } else if (win_switch) {
    17311798                fibril_mutex_lock(&window_list_mtx);
     
    17351802                        list_append(&win1->link, &window_list);
    17361803                        window_t *win2 = (window_t *) list_first(&window_list);
     1804
     1805                        window_event_t *event1 = (window_event_t *) malloc(sizeof(window_event_t));
     1806                        if (event1) {
     1807                                link_initialize(&event1->link);
     1808                                event1->type = ET_WINDOW_UNFOCUS;
     1809                        }
     1810
     1811                        window_event_t *event2 = (window_event_t *) malloc(sizeof(window_event_t));
     1812                        if (event2) {
     1813                                link_initialize(&event2->link);
     1814                                event2->type = ET_WINDOW_FOCUS;
     1815                        }
    17371816
    17381817                        sysarg_t x1 = 0;
     
    17631842
    17641843                        fibril_mutex_unlock(&window_list_mtx);
     1844
     1845                        if (event1 && win1) {
     1846                                comp_post_event_win(event1, win1);
     1847                        }
     1848
     1849                        if (event2 && win2) {
     1850                                comp_post_event_win(event2, win2);
     1851                        }
     1852
    17651853                        comp_damage(x, y, width, height);
    17661854                } else {
     
    18751963                event->data.kbd.c = c;
    18761964
    1877                 comp_post_event(event);
     1965                comp_post_event_top(event);
    18781966        }
    18791967
     
    19262014static void input_disconnect(void)
    19272015{
    1928         pointer_t *pointer = input->user;
     2016        pointer_t *pointer = input->user;
    19292017        input_close(input);
    19302018        pointer_destroy(pointer);
Note: See TracChangeset for help on using the changeset viewer.