diff options
| author | Joakim Verona | 2012-09-03 17:30:17 +0200 |
|---|---|---|
| committer | Joakim Verona | 2012-09-03 17:30:17 +0200 |
| commit | 4a37733c693d59a9b83a3fb2d0c7f9461d149f60 (patch) | |
| tree | a33402e09342f748baebf0e4f5a1e40538e620f4 /src/nsmenu.m | |
| parent | 5436d1df5e2ba0b4d4f72b03a1cd09b20403654b (diff) | |
| parent | dcde497f27945c3ca4ce8c21f655ef6f627acdd2 (diff) | |
| download | emacs-4a37733c693d59a9b83a3fb2d0c7f9461d149f60.tar.gz emacs-4a37733c693d59a9b83a3fb2d0c7f9461d149f60.zip | |
upstream
Diffstat (limited to 'src/nsmenu.m')
| -rw-r--r-- | src/nsmenu.m | 101 |
1 files changed, 67 insertions, 34 deletions
diff --git a/src/nsmenu.m b/src/nsmenu.m index e8a0b43a01b..9e290486213 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m | |||
| @@ -1497,6 +1497,8 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header) | |||
| 1497 | FlippedView *contentView; | 1497 | FlippedView *contentView; |
| 1498 | NSImage *img; | 1498 | NSImage *img; |
| 1499 | 1499 | ||
| 1500 | dialog_return = Qundefined; | ||
| 1501 | button_values = NULL; | ||
| 1500 | area.origin.x = 3*SPACER; | 1502 | area.origin.x = 3*SPACER; |
| 1501 | area.origin.y = 2*SPACER; | 1503 | area.origin.y = 2*SPACER; |
| 1502 | area.size.width = ICONSIZE; | 1504 | area.size.width = ICONSIZE; |
| @@ -1578,44 +1580,65 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header) | |||
| 1578 | [self setOneShot: YES]; | 1580 | [self setOneShot: YES]; |
| 1579 | [self setReleasedWhenClosed: YES]; | 1581 | [self setReleasedWhenClosed: YES]; |
| 1580 | [self setHidesOnDeactivate: YES]; | 1582 | [self setHidesOnDeactivate: YES]; |
| 1583 | [self setStyleMask: | ||
| 1584 | NSTitledWindowMask|NSClosableWindowMask|NSUtilityWindowMask]; | ||
| 1585 | |||
| 1581 | return self; | 1586 | return self; |
| 1582 | } | 1587 | } |
| 1583 | 1588 | ||
| 1584 | 1589 | ||
| 1585 | - (BOOL)windowShouldClose: (id)sender | 1590 | - (BOOL)windowShouldClose: (id)sender |
| 1586 | { | 1591 | { |
| 1587 | [NSApp stopModalWithCode: XHASH (Qnil)]; // FIXME: BIG UGLY HACK!! | 1592 | window_closed = YES; |
| 1593 | [NSApp stop:self]; | ||
| 1588 | return NO; | 1594 | return NO; |
| 1589 | } | 1595 | } |
| 1590 | 1596 | ||
| 1597 | - (void)dealloc | ||
| 1598 | { | ||
| 1599 | xfree (button_values); | ||
| 1600 | [super dealloc]; | ||
| 1601 | } | ||
| 1591 | 1602 | ||
| 1592 | void process_dialog (id window, Lisp_Object list) | 1603 | - (void)process_dialog: (Lisp_Object) list |
| 1593 | { | 1604 | { |
| 1594 | Lisp_Object item; | 1605 | Lisp_Object item, lst = list; |
| 1595 | int row = 0; | 1606 | int row = 0; |
| 1607 | int buttons = 0, btnnr = 0; | ||
| 1608 | |||
| 1609 | for (; XTYPE (lst) == Lisp_Cons; lst = XCDR (lst)) | ||
| 1610 | { | ||
| 1611 | item = XCAR (list); | ||
| 1612 | if (XTYPE (item) == Lisp_Cons) | ||
| 1613 | ++buttons; | ||
| 1614 | } | ||
| 1615 | |||
| 1616 | if (buttons > 0) | ||
| 1617 | button_values = (Lisp_Object *) xmalloc (buttons * sizeof (*button_values)); | ||
| 1596 | 1618 | ||
| 1597 | for (; XTYPE (list) == Lisp_Cons; list = XCDR (list)) | 1619 | for (; XTYPE (list) == Lisp_Cons; list = XCDR (list)) |
| 1598 | { | 1620 | { |
| 1599 | item = XCAR (list); | 1621 | item = XCAR (list); |
| 1600 | if (XTYPE (item) == Lisp_String) | 1622 | if (XTYPE (item) == Lisp_String) |
| 1601 | { | 1623 | { |
| 1602 | [window addString: SSDATA (item) row: row++]; | 1624 | [self addString: SSDATA (item) row: row++]; |
| 1603 | } | 1625 | } |
| 1604 | else if (XTYPE (item) == Lisp_Cons) | 1626 | else if (XTYPE (item) == Lisp_Cons) |
| 1605 | { | 1627 | { |
| 1606 | [window addButton: SSDATA (XCAR (item)) | 1628 | button_values[btnnr] = XCDR (item); |
| 1607 | value: XCDR (item) row: row++]; | 1629 | [self addButton: SSDATA (XCAR (item)) value: btnnr row: row++]; |
| 1630 | ++btnnr; | ||
| 1608 | } | 1631 | } |
| 1609 | else if (NILP (item)) | 1632 | else if (NILP (item)) |
| 1610 | { | 1633 | { |
| 1611 | [window addSplit]; | 1634 | [self addSplit]; |
| 1612 | row = 0; | 1635 | row = 0; |
| 1613 | } | 1636 | } |
| 1614 | } | 1637 | } |
| 1615 | } | 1638 | } |
| 1616 | 1639 | ||
| 1617 | 1640 | ||
| 1618 | - addButton: (char *)str value: (Lisp_Object)val row: (int)row | 1641 | - (void)addButton: (char *)str value: (int)tag row: (int)row |
| 1619 | { | 1642 | { |
| 1620 | id cell; | 1643 | id cell; |
| 1621 | 1644 | ||
| @@ -1628,15 +1651,13 @@ void process_dialog (id window, Lisp_Object list) | |||
| 1628 | [cell setTarget: self]; | 1651 | [cell setTarget: self]; |
| 1629 | [cell setAction: @selector (clicked: )]; | 1652 | [cell setAction: @selector (clicked: )]; |
| 1630 | [cell setTitle: [NSString stringWithUTF8String: str]]; | 1653 | [cell setTitle: [NSString stringWithUTF8String: str]]; |
| 1631 | [cell setTag: XHASH (val)]; // FIXME: BIG UGLY HACK!! | 1654 | [cell setTag: tag]; |
| 1632 | [cell setBordered: YES]; | 1655 | [cell setBordered: YES]; |
| 1633 | [cell setEnabled: YES]; | 1656 | [cell setEnabled: YES]; |
| 1634 | |||
| 1635 | return self; | ||
| 1636 | } | 1657 | } |
| 1637 | 1658 | ||
| 1638 | 1659 | ||
| 1639 | - addString: (char *)str row: (int)row | 1660 | - (void)addString: (char *)str row: (int)row |
| 1640 | { | 1661 | { |
| 1641 | id cell; | 1662 | id cell; |
| 1642 | 1663 | ||
| @@ -1649,32 +1670,28 @@ void process_dialog (id window, Lisp_Object list) | |||
| 1649 | [cell setTitle: [NSString stringWithUTF8String: str]]; | 1670 | [cell setTitle: [NSString stringWithUTF8String: str]]; |
| 1650 | [cell setBordered: YES]; | 1671 | [cell setBordered: YES]; |
| 1651 | [cell setEnabled: NO]; | 1672 | [cell setEnabled: NO]; |
| 1652 | |||
| 1653 | return self; | ||
| 1654 | } | 1673 | } |
| 1655 | 1674 | ||
| 1656 | 1675 | ||
| 1657 | - addSplit | 1676 | - (void)addSplit |
| 1658 | { | 1677 | { |
| 1659 | [matrix addColumn]; | 1678 | [matrix addColumn]; |
| 1660 | cols++; | 1679 | cols++; |
| 1661 | return self; | ||
| 1662 | } | 1680 | } |
| 1663 | 1681 | ||
| 1664 | 1682 | ||
| 1665 | - clicked: sender | 1683 | - (void)clicked: sender |
| 1666 | { | 1684 | { |
| 1667 | NSArray *sellist = nil; | 1685 | NSArray *sellist = nil; |
| 1668 | EMACS_INT seltag; | 1686 | EMACS_INT seltag; |
| 1669 | 1687 | ||
| 1670 | sellist = [sender selectedCells]; | 1688 | sellist = [sender selectedCells]; |
| 1671 | if ([sellist count]<1) | 1689 | if ([sellist count] < 1) |
| 1672 | return self; | 1690 | return; |
| 1673 | 1691 | ||
| 1674 | seltag = [[sellist objectAtIndex: 0] tag]; | 1692 | seltag = [[sellist objectAtIndex: 0] tag]; |
| 1675 | if (seltag != XHASH (Qundefined)) // FIXME: BIG UGLY HACK!! | 1693 | dialog_return = button_values[seltag]; |
| 1676 | [NSApp stopModalWithCode: seltag]; | 1694 | [NSApp stop:self]; |
| 1677 | return self; | ||
| 1678 | } | 1695 | } |
| 1679 | 1696 | ||
| 1680 | 1697 | ||
| @@ -1686,7 +1703,7 @@ void process_dialog (id window, Lisp_Object list) | |||
| 1686 | if (XTYPE (contents) == Lisp_Cons) | 1703 | if (XTYPE (contents) == Lisp_Cons) |
| 1687 | { | 1704 | { |
| 1688 | head = Fcar (contents); | 1705 | head = Fcar (contents); |
| 1689 | process_dialog (self, Fcdr (contents)); | 1706 | [self process_dialog: Fcdr (contents)]; |
| 1690 | } | 1707 | } |
| 1691 | else | 1708 | else |
| 1692 | head = contents; | 1709 | head = contents; |
| @@ -1706,7 +1723,7 @@ void process_dialog (id window, Lisp_Object list) | |||
| 1706 | if (cols == 1 && rows > 1) /* Never told where to split */ | 1723 | if (cols == 1 && rows > 1) /* Never told where to split */ |
| 1707 | { | 1724 | { |
| 1708 | [matrix addColumn]; | 1725 | [matrix addColumn]; |
| 1709 | for (i = 0; i<rows/2; i++) | 1726 | for (i = 0; i < rows/2; i++) |
| 1710 | { | 1727 | { |
| 1711 | [matrix putCell: [matrix cellAtRow: (rows+1)/2 column: 0] | 1728 | [matrix putCell: [matrix cellAtRow: (rows+1)/2 column: 0] |
| 1712 | atRow: i column: 1]; | 1729 | atRow: i column: 1]; |
| @@ -1756,13 +1773,27 @@ void process_dialog (id window, Lisp_Object list) | |||
| 1756 | 1773 | ||
| 1757 | - (void)timeout_handler: (NSTimer *)timedEntry | 1774 | - (void)timeout_handler: (NSTimer *)timedEntry |
| 1758 | { | 1775 | { |
| 1759 | timer_fired = 1; | 1776 | NSEvent *nxev = [NSEvent otherEventWithType: NSApplicationDefined |
| 1760 | [NSApp abortModal]; | 1777 | location: NSMakePoint (0, 0) |
| 1778 | modifierFlags: 0 | ||
| 1779 | timestamp: 0 | ||
| 1780 | windowNumber: [[NSApp mainWindow] windowNumber] | ||
| 1781 | context: [NSApp context] | ||
| 1782 | subtype: 0 | ||
| 1783 | data1: 0 | ||
| 1784 | data2: 0]; | ||
| 1785 | |||
| 1786 | timer_fired = YES; | ||
| 1787 | /* We use sto because stopModal/abortModal out of the main loop does not | ||
| 1788 | seem to work in 10.6. But as we use stop we must send a real event so | ||
| 1789 | the stop is seen and acted upon. */ | ||
| 1790 | [NSApp stop:self]; | ||
| 1791 | [NSApp postEvent: nxev atStart: NO]; | ||
| 1761 | } | 1792 | } |
| 1762 | 1793 | ||
| 1763 | - (Lisp_Object)runDialogAt: (NSPoint)p | 1794 | - (Lisp_Object)runDialogAt: (NSPoint)p |
| 1764 | { | 1795 | { |
| 1765 | NSInteger ret = 0; | 1796 | Lisp_Object ret = Qundefined; |
| 1766 | 1797 | ||
| 1767 | while (popup_activated_flag) | 1798 | while (popup_activated_flag) |
| 1768 | { | 1799 | { |
| @@ -1780,8 +1811,10 @@ void process_dialog (id window, Lisp_Object list) | |||
| 1780 | [[NSRunLoop currentRunLoop] addTimer: tmo | 1811 | [[NSRunLoop currentRunLoop] addTimer: tmo |
| 1781 | forMode: NSModalPanelRunLoopMode]; | 1812 | forMode: NSModalPanelRunLoopMode]; |
| 1782 | } | 1813 | } |
| 1783 | timer_fired = 0; | 1814 | timer_fired = NO; |
| 1784 | ret = [NSApp runModalForWindow: self]; | 1815 | dialog_return = Qundefined; |
| 1816 | [NSApp runModalForWindow: self]; | ||
| 1817 | ret = dialog_return; | ||
| 1785 | if (! timer_fired) | 1818 | if (! timer_fired) |
| 1786 | { | 1819 | { |
| 1787 | if (tmo != nil) [tmo invalidate]; /* Cancels timer */ | 1820 | if (tmo != nil) [tmo invalidate]; /* Cancels timer */ |
| @@ -1789,11 +1822,11 @@ void process_dialog (id window, Lisp_Object list) | |||
| 1789 | } | 1822 | } |
| 1790 | } | 1823 | } |
| 1791 | 1824 | ||
| 1792 | { /* FIXME: BIG UGLY HACK!!! */ | 1825 | if (EQ (ret, Qundefined) && window_closed) |
| 1793 | Lisp_Object tmp; | 1826 | /* Make close button pressed equivalent to C-g. */ |
| 1794 | *(EMACS_INT*)(&tmp) = ret; | 1827 | Fsignal (Qquit, Qnil); |
| 1795 | return tmp; | 1828 | |
| 1796 | } | 1829 | return ret; |
| 1797 | } | 1830 | } |
| 1798 | 1831 | ||
| 1799 | @end | 1832 | @end |